<?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, 22 Oct 2026 22:02:45 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-113650</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-113650</link>
      <description>&lt;p&gt;ApostropheCMS is an open-source Node.js content management system. In sanitize-html 2.18.0, when an &amp;lt;iframe&amp;gt; is not allowed and disallowedTagsMode is &amp;#39;discard&amp;#39; (the defaults), its raw-text content is re-sanitized by a recursive call to sanitizeHtml(text, options). The recursion has no bound and starts each nested call with a fresh state. This vulnerability is fixed in 2.18.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ApostropheCMS is an open-source Node.js content management system. In sanitize-html 2.18.0, when an &amp;lt;iframe&amp;gt; is not allowed and disallowedTagsMode is &amp;#39;discard&amp;#39; (the defaults), its raw-text content is re-sanitized by a recursive call to sanitizeHtml(text, options). The recursion has no bound and starts each nested call with a fresh state. This vulnerability is fixed in 2.18.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-113650</guid>
    </item>
    <item>
      <title>GHSA-c9rx-x947-fp3h — ApostropheCMS sanitize-html: unbounded recursion when re-sanitizing the fallback of a discarded iframe (stack overflow,…</title>
      <link>https://db.gcve.eu/vuln/ghsa-c9rx-x947-fp3h</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: sanitize-html&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;Since 2.18.0, when an `&amp;lt;iframe&amp;gt;` is not allowed and `disallowedTagsMode` is `&amp;#39;discard&amp;#39;` (the defaults),
its raw-text content is re-sanitized by a recursive call to `sanitizeHtml(text, options)` (the change
from #5564, fixing #5550). The recursion has no bound and starts each nested call with a fresh state.
Two consequences, both absent from 2.17.7 and 2.17.4:&lt;/p&gt;
&lt;p&gt;1. A few kilobytes of unclosed `&amp;lt;iframe&amp;gt;` tags throw `RangeError: Maximum call stack size exceeded`
   with the default options. Any application that sanitizes untrusted HTML with 2.18.0 can be made to
   throw on a small crafted input.
2. `nestingLimit` is not enforced across a discarded iframe: each nested iframe restarts the depth
   count at zero, so the output can be nested arbitrarily deep regardless of the configured limit.&lt;/p&gt;
&lt;p&gt;### Affected versions&lt;/p&gt;
&lt;p&gt;- 2.18.0 (the current `latest`), and the `main` branch at the time of writing (the recursive call is
  still in `packages/sanitize-html/index.js`, in the `ontext` handler, branch
  `tag === &amp;#39;iframe&amp;#39; &amp;amp;&amp;amp; !tagAllowed(tag) &amp;amp;&amp;amp; options.disallowedTagsMode === &amp;#39;discard&amp;#39;`).
- Not affected: 2.17.7 and 2.17.4 (tested with the same inputs below).&lt;/p&gt;
&lt;p&gt;Tested with Node.js v26.7.0.&lt;/p&gt;
&lt;p&gt;### Reproduction 1: stack overflow with the default options&lt;/p&gt;
&lt;p&gt;```js
const sanitizeHtml = require(&amp;#39;sanitize-html&amp;#39;);&lt;/p&gt;
&lt;p&gt;// with 2.18.0:
sanitizeHtml(&amp;#39;&amp;lt;iframe&amp;gt;&amp;#39;.repeat(1000));  // 8,000 chars: returns &amp;#39;&amp;#39;
sanitizeHtml(&amp;#39;&amp;lt;iframe&amp;gt;&amp;#39;.repeat(2000));  // 16,000 chars: throws RangeError: Maximum call stack siz…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: sanitize-html&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;Since 2.18.0, when an `&amp;lt;iframe&amp;gt;` is not allowed and `disallowedTagsMode` is `&amp;#39;discard&amp;#39;` (the defaults),
its raw-text content is re-sanitized by a recursive call to `sanitizeHtml(text, options)` (the change
from #5564, fixing #5550). The recursion has no bound and starts each nested call with a fresh state.
Two consequences, both absent from 2.17.7 and 2.17.4:&lt;/p&gt;
&lt;p&gt;1. A few kilobytes of unclosed `&amp;lt;iframe&amp;gt;` tags throw `RangeError: Maximum call stack size exceeded`
   with the default options. Any application that sanitizes untrusted HTML with 2.18.0 can be made to
   throw on a small crafted input.
2. `nestingLimit` is not enforced across a discarded iframe: each nested iframe restarts the depth
   count at zero, so the output can be nested arbitrarily deep regardless of the configured limit.&lt;/p&gt;
&lt;p&gt;### Affected versions&lt;/p&gt;
&lt;p&gt;- 2.18.0 (the current `latest`), and the `main` branch at the time of writing (the recursive call is
  still in `packages/sanitize-html/index.js`, in the `ontext` handler, branch
  `tag === &amp;#39;iframe&amp;#39; &amp;amp;&amp;amp; !tagAllowed(tag) &amp;amp;&amp;amp; options.disallowedTagsMode === &amp;#39;discard&amp;#39;`).
- Not affected: 2.17.7 and 2.17.4 (tested with the same inputs below).&lt;/p&gt;
&lt;p&gt;Tested with Node.js v26.7.0.&lt;/p&gt;
&lt;p&gt;### Reproduction 1: stack overflow with the default options&lt;/p&gt;
&lt;p&gt;```js
const sanitizeHtml = require(&amp;#39;sanitize-html&amp;#39;);&lt;/p&gt;
&lt;p&gt;// with 2.18.0:
sanitizeHtml(&amp;#39;&amp;lt;iframe&amp;gt;&amp;#39;.repeat(1000));  // 8,000 chars: returns &amp;#39;&amp;#39;
sanitizeHtml(&amp;#39;&amp;lt;iframe&amp;gt;&amp;#39;.repeat(2000));  // 16,000 chars: throws RangeError: Maximum call stack siz…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-c9rx-x947-fp3h</guid>
    </item>
  </channel>
</rss>
