<?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>Tue, 29 Sep 2026 14:17:50 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-44899 — Mistune Image Directive CSS Injection Vulnerability</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-44899</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; lepture mistune&lt;/p&gt;
&lt;p&gt;Mistune is a Python Markdown parser with renderers and plugins. Prior to 3.2.1, the Image directive plugin validates the :width: and :height: options with a regex compiled as _num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;). When the validated value is not a plain integer, render_block_image() inserts it directly into a style=&amp;#34;width:...;&amp;#34; or style=&amp;#34;height:...;&amp;#34; attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the style= attribute verbatim and without escaping. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; lepture mistune&lt;/p&gt;
&lt;p&gt;Mistune is a Python Markdown parser with renderers and plugins. Prior to 3.2.1, the Image directive plugin validates the :width: and :height: options with a regex compiled as _num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;). When the validated value is not a plain integer, render_block_image() inserts it directly into a style=&amp;#34;width:...;&amp;#34; or style=&amp;#34;height:...;&amp;#34; attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the style= attribute verbatim and without escaping. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-44899</guid>
    </item>
    <item>
      <title>GHSA-ccfx-mfmx-2fx9 — Mistune Image Directive CSS Injection Vulnerability</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-ccfx-mfmx-2fx9</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: mistune&lt;/p&gt;
&lt;p&gt;## Summary
The Image directive plugin validates the `:width:` and `:height:` options with a regex compiled as `_num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;)`. This pattern is applied via `re.match()` (which anchors only at the **start** of the string, not the end). Any value that begins with one or more digits passes validation, regardless of what follows.&lt;/p&gt;
&lt;p&gt;When the validated value is not a plain integer, `render_block_image()` inserts it directly into a `style=&amp;#34;width:...;&amp;#34;` or `style=&amp;#34;height:...;&amp;#34;` attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the `style=` attribute verbatim and without escaping.&lt;/p&gt;
&lt;p&gt;An attacker can therefore inject an arbitrary chain of CSS properties — including `position:fixed`, `background-color`, `z-index`, `outline`, and `opacity` — using nothing more than a single `:width:` option in a fenced image directive. The resulting element can visually cover the entire browser viewport, enabling full-page phishing overlays and UI redressing attacks.&lt;/p&gt;
&lt;p&gt;## Details
**File:** `src/mistune/directives/image.py`&lt;/p&gt;
&lt;p&gt;```python
_num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;)   # no $ anchor — prefix match only&lt;/p&gt;
&lt;p&gt;def _parse_attrs(options):
    height = options.get(&amp;#34;height&amp;#34;)
    width  = options.get(&amp;#34;width&amp;#34;)
    if height and _num_re.match(height):   # passes if value STARTS with a digit
        attrs[&amp;#34;height&amp;#34;] = height           # full value stored, not just digits
    if width and _num_re.match(width):     # same — prefix-only…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: mistune&lt;/p&gt;
&lt;p&gt;## Summary
The Image directive plugin validates the `:width:` and `:height:` options with a regex compiled as `_num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;)`. This pattern is applied via `re.match()` (which anchors only at the **start** of the string, not the end). Any value that begins with one or more digits passes validation, regardless of what follows.&lt;/p&gt;
&lt;p&gt;When the validated value is not a plain integer, `render_block_image()` inserts it directly into a `style=&amp;#34;width:...;&amp;#34;` or `style=&amp;#34;height:...;&amp;#34;` attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the `style=` attribute verbatim and without escaping.&lt;/p&gt;
&lt;p&gt;An attacker can therefore inject an arbitrary chain of CSS properties — including `position:fixed`, `background-color`, `z-index`, `outline`, and `opacity` — using nothing more than a single `:width:` option in a fenced image directive. The resulting element can visually cover the entire browser viewport, enabling full-page phishing overlays and UI redressing attacks.&lt;/p&gt;
&lt;p&gt;## Details
**File:** `src/mistune/directives/image.py`&lt;/p&gt;
&lt;p&gt;```python
_num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;)   # no $ anchor — prefix match only&lt;/p&gt;
&lt;p&gt;def _parse_attrs(options):
    height = options.get(&amp;#34;height&amp;#34;)
    width  = options.get(&amp;#34;width&amp;#34;)
    if height and _num_re.match(height):   # passes if value STARTS with a digit
        attrs[&amp;#34;height&amp;#34;] = height           # full value stored, not just digits
    if width and _num_re.match(width):     # same — prefix-only…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-ccfx-mfmx-2fx9</guid>
    </item>
    <item>
      <title>PYSEC-2026-2209</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-2209</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: mistune&lt;/p&gt;
&lt;p&gt;Mistune is a Python Markdown parser with renderers and plugins. Prior to 3.2.1, the Image directive plugin validates the :width: and :height: options with a regex compiled as _num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;). When the validated value is not a plain integer, render_block_image() inserts it directly into a style=&amp;#34;width:...;&amp;#34; or style=&amp;#34;height:...;&amp;#34; attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the style= attribute verbatim and without escaping. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: mistune&lt;/p&gt;
&lt;p&gt;Mistune is a Python Markdown parser with renderers and plugins. Prior to 3.2.1, the Image directive plugin validates the :width: and :height: options with a regex compiled as _num_re = re.compile(r&amp;#34;^\d+(?:\.\d*)?&amp;#34;). When the validated value is not a plain integer, render_block_image() inserts it directly into a style=&amp;#34;width:...;&amp;#34; or style=&amp;#34;height:...;&amp;#34; attribute. Because the value was accepted by the prefix-only regex, any CSS after the leading digits reaches the style= attribute verbatim and without escaping. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-2209</guid>
    </item>
  </channel>
</rss>
