<?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>Wed, 30 Sep 2026 08:37:29 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-44897 — Mistune Heading ID Attribute Injection XSS</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-44897</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, HTMLRenderer.heading() builds the opening &amp;lt;hN&amp;gt; tag by string-concatenating the id attribute value directly into the HTML — with no call to escape(), safe_entity(), or any other sanitisation function. A double-quote character &amp;#34; in the id value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, src=, href=, etc.) into the heading element. 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, HTMLRenderer.heading() builds the opening &amp;lt;hN&amp;gt; tag by string-concatenating the id attribute value directly into the HTML — with no call to escape(), safe_entity(), or any other sanitisation function. A double-quote character &amp;#34; in the id value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, src=, href=, etc.) into the heading element. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-44897</guid>
    </item>
    <item>
      <title>GHSA-v87v-83h2-53w7 — Mistune Heading ID Attribute has Injection XSS</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-v87v-83h2-53w7</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: mistune&lt;/p&gt;
&lt;p&gt;## Summary
`HTMLRenderer.heading()` builds the opening `&amp;lt;hN&amp;gt;` tag by string-concatenating the `id` attribute value directly into the HTML — with no call to `escape()`, `safe_entity()`, or any other sanitisation function. A double-quote character `&amp;#34;` in the `id` value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, `src=`, `href=`, etc.) into the heading element.&lt;/p&gt;
&lt;p&gt;The default TOC hook assigns safe auto-incremented IDs (`toc_1`, `toc_2`, …) that never contain user text. However, the `add_toc_hook()` API accepts a caller-supplied `heading_id` callback. Deriving heading IDs from the heading text itself — to produce human-readable slug anchors like `#installation` or `#getting-started` — is by far the most common real-world usage of this callback (every major documentation generator does this). When the callback returns raw heading text, an attacker who controls heading content can break out of the `id=` attribute.&lt;/p&gt;
&lt;p&gt;## Details
**File:** `src/mistune/renderers/html.py`&lt;/p&gt;
&lt;p&gt;```python
def heading(self, text: str, level: int, **attrs: Any) -&amp;gt; str:
    tag = &amp;#34;h&amp;#34; + str(level)
    html = &amp;#34;&amp;lt;&amp;#34; + tag
    _id = attrs.get(&amp;#34;id&amp;#34;)
    if _id:
        html += &amp;#39; id=&amp;#34;&amp;#39; + _id + &amp;#39;&amp;#34;&amp;#39;    # ← _id is never escaped
    return html + &amp;#34;&amp;gt;&amp;#34; + text + &amp;#34;&amp;lt;/&amp;#34; + tag + &amp;#34;&amp;gt;\n&amp;#34;
```&lt;/p&gt;
&lt;p&gt;The `text` body (line content) *is* escaped upstream by the inline token renderer, which is why `text` arrives as `&amp;amp;quot;` etc. But `_id` arrives as a raw string directly from whatever…&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
`HTMLRenderer.heading()` builds the opening `&amp;lt;hN&amp;gt;` tag by string-concatenating the `id` attribute value directly into the HTML — with no call to `escape()`, `safe_entity()`, or any other sanitisation function. A double-quote character `&amp;#34;` in the `id` value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, `src=`, `href=`, etc.) into the heading element.&lt;/p&gt;
&lt;p&gt;The default TOC hook assigns safe auto-incremented IDs (`toc_1`, `toc_2`, …) that never contain user text. However, the `add_toc_hook()` API accepts a caller-supplied `heading_id` callback. Deriving heading IDs from the heading text itself — to produce human-readable slug anchors like `#installation` or `#getting-started` — is by far the most common real-world usage of this callback (every major documentation generator does this). When the callback returns raw heading text, an attacker who controls heading content can break out of the `id=` attribute.&lt;/p&gt;
&lt;p&gt;## Details
**File:** `src/mistune/renderers/html.py`&lt;/p&gt;
&lt;p&gt;```python
def heading(self, text: str, level: int, **attrs: Any) -&amp;gt; str:
    tag = &amp;#34;h&amp;#34; + str(level)
    html = &amp;#34;&amp;lt;&amp;#34; + tag
    _id = attrs.get(&amp;#34;id&amp;#34;)
    if _id:
        html += &amp;#39; id=&amp;#34;&amp;#39; + _id + &amp;#39;&amp;#34;&amp;#39;    # ← _id is never escaped
    return html + &amp;#34;&amp;gt;&amp;#34; + text + &amp;#34;&amp;lt;/&amp;#34; + tag + &amp;#34;&amp;gt;\n&amp;#34;
```&lt;/p&gt;
&lt;p&gt;The `text` body (line content) *is* escaped upstream by the inline token renderer, which is why `text` arrives as `&amp;amp;quot;` etc. But `_id` arrives as a raw string directly from whatever…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-v87v-83h2-53w7</guid>
    </item>
    <item>
      <title>PYSEC-2026-2207</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-2207</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, HTMLRenderer.heading() builds the opening &amp;lt;hN&amp;gt; tag by string-concatenating the id attribute value directly into the HTML — with no call to escape(), safe_entity(), or any other sanitisation function. A double-quote character &amp;#34; in the id value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, src=, href=, etc.) into the heading element. 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, HTMLRenderer.heading() builds the opening &amp;lt;hN&amp;gt; tag by string-concatenating the id attribute value directly into the HTML — with no call to escape(), safe_entity(), or any other sanitisation function. A double-quote character &amp;#34; in the id value terminates the attribute, allowing an attacker to inject arbitrary additional attributes (event handlers, src=, href=, etc.) into the heading element. This vulnerability is fixed in 3.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-2207</guid>
    </item>
  </channel>
</rss>
