<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 29 Oct 2026 08:38:03 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-114501 — Pillow: Arrow export leaks stale heap memory when PILLOW_ALIGNMENT &gt; 1</title>
      <link>https://db.gcve.eu/vuln/cve-2026-114501</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; python-pillow Pillow&lt;/p&gt;
&lt;p&gt;Pillow is a Python imaging library. From 11.2.1 until 13.0.0, Arrow export assumes that an image&amp;#39;s rows are tightly contiguous and exports from im-&amp;gt;blocks[0].ptr even when PILLOW_ALIGNMENT makes aligned_linesize include row padding or an aligned offset before the first row. The resulting Arrow buffer can include uninitialized padding, bytes preceding the first row, or stale heap contents from previously freed images. Applications that configure alignment and export images to Arrow can therefore disclose one user&amp;#39;s pixels or other process memory to another user. This issue is fixed in version 13.0.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; python-pillow Pillow&lt;/p&gt;
&lt;p&gt;Pillow is a Python imaging library. From 11.2.1 until 13.0.0, Arrow export assumes that an image&amp;#39;s rows are tightly contiguous and exports from im-&amp;gt;blocks[0].ptr even when PILLOW_ALIGNMENT makes aligned_linesize include row padding or an aligned offset before the first row. The resulting Arrow buffer can include uninitialized padding, bytes preceding the first row, or stale heap contents from previously freed images. Applications that configure alignment and export images to Arrow can therefore disclose one user&amp;#39;s pixels or other process memory to another user. This issue is fixed in version 13.0.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-114501</guid>
    </item>
    <item>
      <title>GHSA-654x-cwwv-5j9c — Pillow: Arrow export leaks stale heap memory when PILLOW_ALIGNMENT &gt; 1</title>
      <link>https://db.gcve.eu/vuln/ghsa-654x-cwwv-5j9c</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: Pillow&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;When [`PILLOW_ALIGNMENT`](https://pillow.readthedocs.io/en/stable/reference/block_allocator.html#memory-pools) is set above 1, exporting an image to Arrow returns uninitialized heap memory mixed in with the pixel data. That memory can include pixels from images the process freed earlier.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;With an alignment above 1, the default allocator pads each row up to `aligned_linesize` and starts the first row at an aligned offset into the block. It then exports `im-&amp;gt;blocks[0].ptr` as `xsize * ysize` tightly packed pixels, so exported data includes the padding bytes, and can include a few bytes from before the first row.&lt;/p&gt;
&lt;p&gt;Tested vulnerable on 11.2.1, 12.3.0, 4c1ed27a5.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;Whether things leak may depend on allocator configuration. This does show a leak on my Mac.&lt;/p&gt;
&lt;p&gt;```python
import os&lt;/p&gt;
&lt;p&gt;os.environ[&amp;#34;PILLOW_ALIGNMENT&amp;#34;] = &amp;#34;64&amp;#34;&lt;/p&gt;
&lt;p&gt;from PIL import Image&lt;/p&gt;
&lt;p&gt;# Image A: 64 px wide, so its rows fill the whole aligned stride
a = Image.new(&amp;#34;L&amp;#34;, (64, 40), 0x41).transpose(Image.Transpose.FLIP_LEFT_RIGHT)
del a&lt;/p&gt;
&lt;p&gt;# Image B: 61 px wide, so each row has 3 bytes of padding; its pixels are all 0
b = Image.new(&amp;#34;L&amp;#34;, (61, 40), 0).transpose(Image.Transpose.FLIP_LEFT_RIGHT)&lt;/p&gt;
&lt;p&gt;try:
    exported = Image.fromarrow(b, b.mode, b.size).tobytes()
except ValueError as e:
    print(&amp;#34;Not vulnerable:&amp;#34;, e)
else:
    if leaked := len(exported) - exported.count(0):
        raise RuntimeError(f&amp;#34;{leaked} of {len(exported)} exported bytes are not B&amp;#39;s pixels&amp;#34;)
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Information disclosure f…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: Pillow&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;When [`PILLOW_ALIGNMENT`](https://pillow.readthedocs.io/en/stable/reference/block_allocator.html#memory-pools) is set above 1, exporting an image to Arrow returns uninitialized heap memory mixed in with the pixel data. That memory can include pixels from images the process freed earlier.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;With an alignment above 1, the default allocator pads each row up to `aligned_linesize` and starts the first row at an aligned offset into the block. It then exports `im-&amp;gt;blocks[0].ptr` as `xsize * ysize` tightly packed pixels, so exported data includes the padding bytes, and can include a few bytes from before the first row.&lt;/p&gt;
&lt;p&gt;Tested vulnerable on 11.2.1, 12.3.0, 4c1ed27a5.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;Whether things leak may depend on allocator configuration. This does show a leak on my Mac.&lt;/p&gt;
&lt;p&gt;```python
import os&lt;/p&gt;
&lt;p&gt;os.environ[&amp;#34;PILLOW_ALIGNMENT&amp;#34;] = &amp;#34;64&amp;#34;&lt;/p&gt;
&lt;p&gt;from PIL import Image&lt;/p&gt;
&lt;p&gt;# Image A: 64 px wide, so its rows fill the whole aligned stride
a = Image.new(&amp;#34;L&amp;#34;, (64, 40), 0x41).transpose(Image.Transpose.FLIP_LEFT_RIGHT)
del a&lt;/p&gt;
&lt;p&gt;# Image B: 61 px wide, so each row has 3 bytes of padding; its pixels are all 0
b = Image.new(&amp;#34;L&amp;#34;, (61, 40), 0).transpose(Image.Transpose.FLIP_LEFT_RIGHT)&lt;/p&gt;
&lt;p&gt;try:
    exported = Image.fromarrow(b, b.mode, b.size).tobytes()
except ValueError as e:
    print(&amp;#34;Not vulnerable:&amp;#34;, e)
else:
    if leaked := len(exported) - exported.count(0):
        raise RuntimeError(f&amp;#34;{leaked} of {len(exported)} exported bytes are not B&amp;#39;s pixels&amp;#34;)
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Information disclosure f…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-654x-cwwv-5j9c</guid>
    </item>
  </channel>
</rss>
