<?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://vulnerability.circl.lu</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, 01 Oct 2026 22:08:07 +0000</lastBuildDate>
    <item>
      <title>BIT-pillow-2026-54058 — Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)</title>
      <link>https://vulnerability.circl.lu/vuln/bit-pillow-2026-54058</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Bitnami: pillow&lt;/p&gt;
&lt;p&gt;Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Bitnami: pillow&lt;/p&gt;
&lt;p&gt;Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/bit-pillow-2026-54058</guid>
    </item>
    <item>
      <title>CVE-2026-54058 — Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-54058</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. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.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. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-54058</guid>
    </item>
    <item>
      <title>GHSA-62p4-gmf7-7g93 — Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-62p4-gmf7-7g93</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 loads an uncompressed image whose tile uses the `raw` codec and a mode in `Image._MAPMODES`, and the image was opened **from a filename**, it memory-maps the file and builds the image&amp;#39;s row pointers directly into the mapping via `PyImaging_MapBuffer` (`src/map.c`). The per-row spacing (`stride`) is taken from the tile arguments. `map.c` validates `offset + ysize*stride &amp;lt;= buffer_len` but **never checks that `stride` is at least the natural row width `xsize * pixelsize`**.&lt;/p&gt;
&lt;p&gt;The **McIdas** AREA plugin (`McIdasImagePlugin.py`) derives `stride`, `offset`, `xsize`, and `ysize` directly from attacker-controlled 32-bit header words with no validation. By supplying a `stride` far smaller than the row width, an attacker makes each row pointer read `xsize*pixelsize` bytes that run past the mapped region. Accessing the pixels (e.g. `Image.tobytes()`,
`getpixel`, `convert`, `save`) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).&lt;/p&gt;
&lt;p&gt;## Complete Code Trace&lt;/p&gt;
&lt;p&gt;**Step 1: `McIdasImageFile._open`** - turns attacker header words into image size, file offset, and row stride with no validation.&lt;/p&gt;
&lt;p&gt;```python
# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b&amp;#34;\x00\x00\x00\x00\x00\x00\x00\x04&amp;#34;
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack(&amp;#34;!64i&amp;#34;, s)]   # w[1..64] = signed BE int32, ALL attacker-controlled&lt;/p&gt;
&lt;p&gt;if w[11] == 1:
    mode…&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 loads an uncompressed image whose tile uses the `raw` codec and a mode in `Image._MAPMODES`, and the image was opened **from a filename**, it memory-maps the file and builds the image&amp;#39;s row pointers directly into the mapping via `PyImaging_MapBuffer` (`src/map.c`). The per-row spacing (`stride`) is taken from the tile arguments. `map.c` validates `offset + ysize*stride &amp;lt;= buffer_len` but **never checks that `stride` is at least the natural row width `xsize * pixelsize`**.&lt;/p&gt;
&lt;p&gt;The **McIdas** AREA plugin (`McIdasImagePlugin.py`) derives `stride`, `offset`, `xsize`, and `ysize` directly from attacker-controlled 32-bit header words with no validation. By supplying a `stride` far smaller than the row width, an attacker makes each row pointer read `xsize*pixelsize` bytes that run past the mapped region. Accessing the pixels (e.g. `Image.tobytes()`,
`getpixel`, `convert`, `save`) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).&lt;/p&gt;
&lt;p&gt;## Complete Code Trace&lt;/p&gt;
&lt;p&gt;**Step 1: `McIdasImageFile._open`** - turns attacker header words into image size, file offset, and row stride with no validation.&lt;/p&gt;
&lt;p&gt;```python
# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b&amp;#34;\x00\x00\x00\x00\x00\x00\x00\x04&amp;#34;
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack(&amp;#34;!64i&amp;#34;, s)]   # w[1..64] = signed BE int32, ALL attacker-controlled&lt;/p&gt;
&lt;p&gt;if w[11] == 1:
    mode…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-62p4-gmf7-7g93</guid>
    </item>
    <item>
      <title>PYSEC-2026-3493 — Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3493</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 loads an uncompressed image whose tile uses the `raw` codec and a mode in `Image._MAPMODES`, and the image was opened **from a filename**, it memory-maps the file and builds the image&amp;#39;s row pointers directly into the mapping via `PyImaging_MapBuffer` (`src/map.c`). The per-row spacing (`stride`) is taken from the tile arguments. `map.c` validates `offset + ysize*stride &amp;lt;= buffer_len` but **never checks that `stride` is at least the natural row width `xsize * pixelsize`**.&lt;/p&gt;
&lt;p&gt;The **McIdas** AREA plugin (`McIdasImagePlugin.py`) derives `stride`, `offset`, `xsize`, and `ysize` directly from attacker-controlled 32-bit header words with no validation. By supplying a `stride` far smaller than the row width, an attacker makes each row pointer read `xsize*pixelsize` bytes that run past the mapped region. Accessing the pixels (e.g. `Image.tobytes()`,
`getpixel`, `convert`, `save`) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).&lt;/p&gt;
&lt;p&gt;## Complete Code Trace&lt;/p&gt;
&lt;p&gt;**Step 1: `McIdasImageFile._open`** - turns attacker header words into image size, file offset, and row stride with no validation.&lt;/p&gt;
&lt;p&gt;```python
# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b&amp;#34;\x00\x00\x00\x00\x00\x00\x00\x04&amp;#34;
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack(&amp;#34;!64i&amp;#34;, s)]   # w[1..64] = signed BE int32, ALL attacker-controlled&lt;/p&gt;
&lt;p&gt;if w[11] == 1:
    mode…&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 loads an uncompressed image whose tile uses the `raw` codec and a mode in `Image._MAPMODES`, and the image was opened **from a filename**, it memory-maps the file and builds the image&amp;#39;s row pointers directly into the mapping via `PyImaging_MapBuffer` (`src/map.c`). The per-row spacing (`stride`) is taken from the tile arguments. `map.c` validates `offset + ysize*stride &amp;lt;= buffer_len` but **never checks that `stride` is at least the natural row width `xsize * pixelsize`**.&lt;/p&gt;
&lt;p&gt;The **McIdas** AREA plugin (`McIdasImagePlugin.py`) derives `stride`, `offset`, `xsize`, and `ysize` directly from attacker-controlled 32-bit header words with no validation. By supplying a `stride` far smaller than the row width, an attacker makes each row pointer read `xsize*pixelsize` bytes that run past the mapped region. Accessing the pixels (e.g. `Image.tobytes()`,
`getpixel`, `convert`, `save`) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).&lt;/p&gt;
&lt;p&gt;## Complete Code Trace&lt;/p&gt;
&lt;p&gt;**Step 1: `McIdasImageFile._open`** - turns attacker header words into image size, file offset, and row stride with no validation.&lt;/p&gt;
&lt;p&gt;```python
# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b&amp;#34;\x00\x00\x00\x00\x00\x00\x00\x04&amp;#34;
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack(&amp;#34;!64i&amp;#34;, s)]   # w[1..64] = signed BE int32, ALL attacker-controlled&lt;/p&gt;
&lt;p&gt;if w[11] == 1:
    mode…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3493</guid>
    </item>
  </channel>
</rss>
