|
Risk grade
D
Risk score 72 · High
|
| Scope | 1 selected scan · 1 asset |
| Data cutoff | 2026-10-16 18:03 (Asia/Shanghai) |
| Generated | 2026-10-16 18:03 |
| Report No. | SR-20261016-LFNGDQ |
| Audience | Engineering |
| Classification | Internal |
1 of 1 asset carries high or critical risk, with 2 critical and 59 high findings (120 security findings in total). 1 asset fails the gate.
|
D
72 · High
|
|
Severity distribution (security findings)
|
Dependency vulnerabilities 120 Licenses 1,187 |
Capability × severity |
Asset types
|
Engines
|
Security findings are code vulnerabilities, secrets and dependency vulnerabilities; licenses and code quality are counted separately.
| # | Title | Severity | EPSS | CVSS | Assets | Why |
|---|---|---|---|---|---|---|
| 1 |
CVE-2026-102422
shell-quote: shell-quote: Arbitrary command execution via improper line terminator handling
Component: shell-quote@1.8.4
Fixed in: 1.11.0
|
Critical | – | 8.1 | 1 | Critical severity |
| 2 |
CVE-2026-9277
shell-quote: shell-quote: Arbitrary code execution via command injection due to unescaped line terminators
Component: shell-quote@1.8.3
Fixed in: 1.8.4
|
Critical | – | 8.1 | 1 | Critical severity |
| 3 |
CVE-2026-45623
postcss: PostCSS: Information disclosure and denial of service via crafted CSS input
Component: postcss@8.5.10
Fixed in: 8.5.12
|
High | – | 9.1 | 1 | CVSS 9.1 |
| 4 |
CVE-2026-59869
js-yaml: js-yaml: Denial of Service via crafted YAML documents
Component: js-yaml@3.14.2, js-yaml@4.1.1
Fixed in: 3.15.0, 4.3.0
|
High | – | 7.5 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 5 |
CVE-2026-84375
js-yaml: js-yaml: Denial of Service vulnerability in YAML parsing
Component: js-yaml@3.14.2, js-yaml@4.1.1
Fixed in: 4.3.2, 3.15.2
|
High | – | 7.5 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 6 |
GHSA-5P4M-2WFM-XMQJ
JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported
Component: js-yaml@3.14.2, js-yaml@4.1.1
Fixed in: 4.3.1, 3.15.1
|
High | – | 7.5 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 7 |
CVE-2026-67214
nanoid: nanoid: Denial of Service via negative size input in non-secure module functions
Component: nanoid@3.3.11, nanoid@3.3.12, nanoid@5.1.11, nanoid@5.1.9
Fixed in: 3.3.16, 5.1.16
|
High | – | 7.5 | 4 | Affects 4 assets |
| 8 |
CVE-2026-101898
axios: axios: Security control bypass via unapplied HTTP/2 proxy and DNS settings
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 9 |
CVE-2026-101901
axios: Axios: Denial of Service via unhandled error in HTTP/2 session initialization
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 10 |
CVE-2026-101903
axios: Axios: Denial of Service via malformed data URLs
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 11 |
CVE-2026-101905
axios: axios: Request socket hijacking via inherited createConnection property
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 12 |
CVE-2026-101906
axios: axios: Denial of Service via crafted redirect hostname
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 13 |
CVE-2026-101907
axios: Axios: Server-Side Request Forgery via bypassed redirect restrictions in fetch adapter
Component: axios@1.19.0
Fixed in: 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 14 |
CVE-2026-101909
axios: axios: Denial of Service via prototype pollution gadget in form serialization
Component: axios@1.19.0
Fixed in: 0.34.0, 1.20.0
|
High | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 15 |
CVE-2026-13311
shell-quote: shell-quote/parse: shell-quote: Denial of Service due to inefficient input parsing
Component: shell-quote@1.8.3, shell-quote@1.8.4
Fixed in: 1.9.0
|
High | – | 7.5 | 2 | Affects 2 assets |
| 16 |
CVE-2026-13676
fast-uri: fast-uri: Security policy bypass due to improper Unicode hostname canonicalization
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 4.0.1, 3.1.3, 2.4.2
|
High | – | 7.5 | 2 | Affects 2 assets |
| 17 |
CVE-2026-16221
fast-uri: Fast-uri: Security policy bypass due to URL parsing inconsistency
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.3, 3.1.4, 4.1.1
|
High | – | 7.5 | 2 | Affects 2 assets |
| 18 |
CVE-2026-18446
fast-uri: fast-uri: Host confusion vulnerability via backslash in URI authority
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.4, 3.1.5, 4.1.2
|
High | – | 7.5 | 2 | Affects 2 assets |
| 19 |
CVE-2026-67213
nanoid: nanoid: Denial of Service via infinite loop in random ID generation
Component: nanoid@3.3.11, nanoid@3.3.12
Fixed in: 3.3.18, 5.1.6
|
High | – | 7.5 | 2 | Affects 2 assets |
| 20 |
CVE-2026-73646
postcss: PostCSS: Information disclosure via path traversal in source map auto-loading
Component: postcss@8.5.10, postcss@8.5.15
Fixed in: 8.5.18
|
High | – | 7.5 | 2 | Affects 2 assets |
| 21 |
CVE-2026-75975
fast-uri: fast-uri: Server-side request forgery via malformed IPv6 normalization
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.5, 3.1.6, 4.1.3
|
High | – | 7.5 | 2 | Affects 2 assets |
| 22 |
CVE-2026-76172
fast-uri: fast-uri: URI parsing flaw enables server-side request forgery and redirects
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.5, 3.1.6, 4.1.3
|
High | – | 7.5 | 2 | Affects 2 assets |
| 23 |
CVE-2026-84292
fast-uri: fast-uri: Authority Injection via Unvalidated Port Serialization
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.6, 3.1.7, 4.1.4
|
High | – | 7.5 | 2 | Affects 2 assets |
| 24 |
CVE-2026-73086
nanoid: nanoid: Predictable ID generation due to integer overflow
Component: nanoid@3.3.11, nanoid@5.1.9
Fixed in: 3.3.12, 5.1.11
|
High | – | 7.4 | 2 | Affects 2 assets |
| 25 |
GHSA-G2V6-RQMX-R4W6
@vue/server-renderer: XSS via missing CR in attribute-name blacklist
Component: @vue/server-renderer@3.5.33, @vue/server-renderer@3.5.38
Fixed in: 3.5.42, 3.6.0-rc.6
|
High | – | 7.2 | 2 | Affects 2 assets |
| 26 |
CVE-2025-71329
image-size: image-size: Denial of Service via crafted image buffer with zero-valued size field
Component: image-size@2.0.2
Fixed in: 2.0.3
|
High | – | 7.5 | 1 | High severity |
| 27 |
CVE-2025-71330
image-size: image-size: Denial of Service via crafted ICNS image buffer
Component: image-size@2.0.2
Fixed in: 2.0.3
|
High | – | 7.5 | 1 | High severity |
| 28 |
CVE-2026-55685
react-router: @remix-run/server-runtime: React Router: Denial of Service via unauthenticated manifest endpoint requests
Component: react-router@7.17.0
Fixed in: 7.18.0
|
High | – | 7.5 | 1 | High severity |
| 29 |
CVE-2026-6321
fast-uri: fast-uri: Path traversal vulnerability allows bypass of security policies
Component: fast-uri@3.1.0
Fixed in: 3.1.1, 2.4.1
|
High | – | 7.5 | 1 | High severity |
| 30 |
CVE-2026-6322
fast-uri: fast-uri: URI authority bypass due to improper delimiter handling
Component: fast-uri@3.1.0
Fixed in: 3.1.2, 2.4.1
|
High | – | 7.5 | 1 | High severity |
| 31 |
CVE-2026-75899
fast-uri: fast-uri: Server-Side Request Forgery via repeated hostname percent-decoding
Component: fast-uri@3.1.2
Fixed in: 2.4.5, 3.1.6, 4.1.3
|
High | – | 7.5 | 1 | High severity |
| 32 |
CVE-2026-93749
source-map-js: source-map-js: Denial of Service via malformed indexed source maps
Component: source-map-js@1.2.1
Fixed in: 1.2.2
|
High | – | 7.5 | 1 | High severity |
| 33 |
GHSA-QWWW-VCR4-C8H2
React Router: RSC Mode CSRF Bypass Allows Action Execution Before 400 Response
Component: react-router@7.17.0
Fixed in: 7.18.2, 8.3.0
|
High | – | 0 | 1 | High severity |
| 34 |
CVE-2026-53550
js-yaml: js-yaml: Denial of Service via crafted YAML merge keys
Component: js-yaml@3.14.2, js-yaml@4.1.1
Fixed in: 4.2.0, 3.15.0
|
Medium | – | 5.3 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 35 |
CVE-2026-50159
mermaid: Mermaid: CSS injection allows altering page elements via diagram input
Component: mermaid@11.14.0, mermaid@11.15.0
Fixed in: 11.16.1, 10.9.8
|
Medium | – | 0 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 36 |
CVE-2026-71436
mermaid: Mermaid XY Charts: Denial of Service via invalid X-Axis parameters
Component: mermaid@11.14.0, mermaid@11.15.0
Fixed in: 10.9.8, 11.16.1
|
Medium | – | 0 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 37 |
CVE-2026-71437
mermaid: Mermaid: Prototype pollution vulnerability allows potential arbitrary code execution
Component: mermaid@11.14.0, mermaid@11.15.0
Fixed in: 11.16.1
|
Medium | – | 0 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 38 |
CVE-2026-71439
mermaid: Mermaid: Denial of Service via Radar Diagrams 'ticks' parameter
Component: mermaid@11.14.0, mermaid@11.15.0
Fixed in: 11.16.1
|
Medium | – | 0 | 2 | Affects 2 assets;Direct dependency, cheap to upgrade |
| 39 |
CVE-2026-41150
mermaid: Mermaid: Denial of Service via specially crafted gantt charts
Component: mermaid@11.14.0
Fixed in: 11.15.0, 10.9.6
|
Medium | – | 5.3 | 1 | Direct dependency, cheap to upgrade |
| 40 |
CVE-2026-41159
mermaid: Mermaid: Information disclosure and page defacement via CSS injection
Component: mermaid@11.14.0
Fixed in: 11.15.0, 10.9.6
|
Medium | – | 5.3 | 1 | Direct dependency, cheap to upgrade |
| 41 |
CVE-2026-101899
axios: Axios: Information disclosure via improper CIDR proxy bypass handling
Component: axios@1.19.0
Fixed in: 1.20.0
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 42 |
CVE-2026-101900
axios: Axios: Outbound HTTP header injection via prototype pollution in fetch adapter
Component: axios@1.19.0
Fixed in: 1.20.0
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 43 |
CVE-2026-101902
axios: axios: Unintended HTTP method override via prototype pollution gadget
Component: axios@1.19.0
Fixed in: 0.34.0, 1.20.0
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 44 |
CVE-2026-101904
axios: Axios: HTTP header injection via inherited prototype properties
Component: axios@1.19.0
Fixed in: 1.20.0
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 45 |
CVE-2026-101908
axios: Axios: Outbound HTTP request manipulation via fetch adapter prototype pollution
Component: axios@1.19.0
Fixed in: 1.20.0
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 46 |
CVE-2026-41148
mermaid: Mermaid: CSS injection vulnerability allows page defacement and information disclosure
Component: mermaid@11.14.0
Fixed in: 11.15.0, 10.9.6
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 47 |
CVE-2026-41149
mermaid: Mermaid: HTML injection via classDef directive in state diagrams
Component: mermaid@11.14.0
Fixed in: 11.15.0, 10.9.6
|
Medium | – | 0 | 1 | Direct dependency, cheap to upgrade |
| 48 |
CVE-2026-69153
postcss: PostCSS: Information disclosure via crafted sourceMappingURL
Component: postcss@8.5.10, postcss@8.5.15
Fixed in: 8.5.23
|
Medium | – | 5.3 | 2 | Affects 2 assets |
| 49 |
CVE-2026-86472
fast-uri: fast-uri: Security bypass due to inconsistent host case normalization
Component: fast-uri@3.1.0, fast-uri@3.1.2
Fixed in: 2.4.7, 3.1.8, 4.1.5
|
Medium | – | 4.8 | 2 | Affects 2 assets |
| 50 |
CVE-2026-65898
dompurify: DOMPurify: Cross-site scripting via permanent attribute allowlist pollution
Component: dompurify@3.4.1, dompurify@3.4.10
Fixed in: 3.4.11
|
Medium | – | 0 | 2 | Affects 2 assets |
Showing 50 of 70; see CSV / JSON for the full data.
Merged across assets by CVE or rule; see the priority formula in the appendix.
| # | Asset | Risk score | Critical | High | Medium | Low | Gate | Last scan | |
|---|---|---|---|---|---|---|---|---|---|
| 1 |
https://git.anguskit.com/anguskit/AngusKit.git
Repository
|
72 | 2 | 59 | 46 | 13 | Failed | 2026-10-16 18:03 |
Gate pass rate 0% |
Blocked scans 1 |
Asset coverage – |
Capability coverage 100% |
Known assets 1
| Result | Gate results of all scans in the period | Current gate per asset | License gate |
|---|---|---|---|
| Passed | 0 | 0 | 1 |
| Failed | 1 | 1 | 0 |
| Error | 0 | 0 | 0 |
| Skipped | 0 | 0 | 0 |
| Asset | Gate | Secrets | Dependency vulnerabilities | Licenses | Code quality |
|---|---|---|---|---|---|
| https://git.anguskit.com/anguskit/AngusKit.git | Failed | Done | Done | Done | Done |
Asset × capability coverage
| Asset | Gate | Reason | Time |
|---|---|---|---|
| https://git.anguskit.com/anguskit/AngusKit.git | Failed | Above the gate threshold (Low): critical 2, high 59, medium 46 | 2026-10-16 18:03 |
Code quality findings do not count toward the security gate.
| Component | Upgrade to | Severity | Vulnerabilities | Direct | Due |
|---|---|---|---|---|---|
| shell-quote@1.8.3 | 1.9.0 | Critical | 2 | No | 2026-10-23 |
| shell-quote@1.8.4 | 1.11.0 | Critical | 2 | No | 2026-10-23 |
| axios@1.19.0 | 1.20.0 | High | 12 | Yes | 2026-11-15 |
| fast-uri@3.1.0 | 3.1.8 | High | 9 | No | 2026-11-15 |
| fast-uri@3.1.2 | 3.1.8 | High | 8 | No | 2026-11-15 |
| react-router@7.17.0 | 7.18.2 | High | 5 | No | 2026-11-15 |
| js-yaml@3.14.2 | 3.15.2 | High | 4 | No | 2026-11-15 |
| js-yaml@4.1.1 | 4.3.2 | High | 4 | Yes | 2026-11-15 |
| nanoid@3.3.11 | 3.3.18 | High | 3 | No | 2026-11-15 |
| postcss@8.5.10 | 8.5.23 | High | 3 | No | 2026-11-15 |
17 more not listed.
Due dates follow the SLA from the data cutoff.
Grouped by rule: 70 groups.
Critical 1 Dependency vulnerabilities
| Severity | Title | Asset | Location | Priority |
|---|---|---|---|---|
| Critical |
shell-quote: shell-quote: Arbitrary command execution via improper line terminator handling
Dependency vulnerabilities
· CVE-2026-102422
· CVE-2026-102422
· CVSS 8.1
shell-quote@1.8.4
→ 1.11.0
DetailsDescription
shell-quote's `quote()` function emits a `{ comment }` token as `#` followed by its text, which comments out the rest of the shell line, including the opening quote of any later string token. A line terminator (\n, \r, U+2028, U+2029) in that later string therefore ends the comment, and the rest of the string is parsed as shell input: `quote(['echo', 'ok', { comment: 'x' }, 'a\nid;#'])` runs `id` in sh, bash, dash, ksh and zsh. `parse()` emits a comment token for a `#` in the middle of a word (for example `http://example.com/#frag`), so callers that combine `parse()` output with another untrusted string, such as `quote(parse(untrustedCommand).concat(untrustedArg))`, are affected. The fix for CVE-2026-9277 rejected line terminators in the comment's own text, but not in the tokens after it. Fixed in 1.11.0: `quote()` throws a `TypeError` when a string after a `{ comment }` token contains a line terminator. Remediation
Upgrade to 1.11.0 |
https://git.anguskit.com/anguskit/AngusKit.git | website/package-lock.json:shell-quote | 100 |
Critical 1 Dependency vulnerabilities
| Severity | Title | Asset | Location | Priority |
|---|---|---|---|---|
| Critical |
shell-quote: shell-quote: Arbitrary code execution via command injection due to unescaped line terminators
Dependency vulnerabilities
· CVE-2026-9277
· CVE-2026-9277
· CVSS 8.1
shell-quote@1.8.3
→ 1.8.4
DetailsDescription
shell-quote's `quote()` function did not validate object-token inputs against the operator model used by `parse()`. The `.op` field was backslash-escaped character by character using `/(.)/g`, which in JavaScript does not match line terminators (\n, \r, U+2028, U+2029). A line terminator in `.op` therefore passed through unescaped into the output; POSIX shells treat a literal newline as a command separator, so any content after it would execute as a second command. The vulnerable code path is reachable in two ways: (1) direct construction of `{ op: '...\n...' }` from external input, and (2) via `parse(cmd, envFn)` when `envFn` returns object tokens whose `.op` is attacker-influenced. Both are documented API surface. Fixed by replacing the per-character escape with strict shape validation: `.op` must match the parser's control-operator allowlist; `{ op: 'glob', pattern }` validates `pattern` and forbids line terminators; `{ comment }` validates `comment` and forbids line terminators; any other object shape throws `TypeError`. Remediation
Upgrade to 1.8.4 |
https://git.anguskit.com/anguskit/AngusKit.git | packages/docx/package-lock.json:shell-quote | 100 |
High 1 Dependency vulnerabilities
| Severity | Title | Asset | Location | Priority |
|---|---|---|---|---|
| High |
postcss: PostCSS: Information disclosure and denial of service via crafted CSS input
Dependency vulnerabilities
· CVE-2026-45623
· CVE-2026-45623
· CVSS 9.1
postcss@8.5.10
→ 8.5.12
DetailsDescription
PostCSS takes a CSS file and provides an API to analyze and modify its rules by transforming the rules into an Abstract Syntax Tree. In versions 8.5.11 and prior, the PreviousMap parses the /*# sourceMappingURL=PATH */ comment from any CSS string passed to process() and dereferences PATH against the local filesystem with no scheme, allowlist, or traversal check. An attacker who controls the CSS input can cause the host process to read any file readable by Node and leak the first ~10 bytes of its content through the resulting JSON.parse SyntaxError message. The bug also yields a precise file-existence oracle and a controllable-read primitive that may be combined with large-file targets for DoS. The behaviour is triggered with PostCSS's default options — no from, no map, no plugins required — and is therefore reachable from any pipeline that runs untrusted CSS through PostCSS (CMS themes, user-uploaded styles, browser-extension/userstyle processors, build pipelines for third-party packages, blog comment renderers, etc.). This issue has been fixed in version 8.5.12. Remediation
Upgrade to 8.5.12 |
https://git.anguskit.com/anguskit/AngusKit.git | packages/docx/package-lock.json:postcss | 80 |
High 4 Dependency vulnerabilities
| Severity | Title | Asset | Location | Priority |
|---|---|---|---|---|
| High |
JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported
Dependency vulnerabilities
· GHSA-5p4m-2wfm-xmqj
· GHSA-5p4m-2wfm-xmqj
· CVSS 7.5
js-yaml@4.1.1
→ 4.3.1, 3.15.1
DetailsDescription
# Quadratic CPU consumption in `!!omap` resolution (js-yaml 3.x and 4.x)
## Summary
`resolveYamlOmap()` enforces key uniqueness for `!!omap` sequences with a linear
scan (`objectKeys.indexOf(...)`) inside the per-element loop, making resolution
**O(n²)** in the number of entries. A modestly sized YAML document therefore
consumes disproportionate CPU inside `yaml.load()`, giving a denial of service
against any consumer that parses untrusted YAML.
`!!omap` is registered in the **default schema**
(`lib/schema/default.js` → `require('../type/omap')`), so a plain
`yaml.load(untrustedInput)` with no options is affected — no custom schema or
non-default configuration is required.
**This is the same weakness as CVE-2026-59870 / GHSA-724g-mxrg-4qvm**, which was
fixed in the 5.x line in 5.2.1. That fix was never backported: both currently
maintained legacy lines still carry the original implementation.
## Affected versions
| Line | Latest tested | Status |
|---|---|---|
| 3.x | **3.15.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:29` |
| 4.x | **4.3.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:30` |
| 5.x | 5.2.2 | **Not affected** — fixed in 5.2.1 (uses a `Set`) |
Both figures are the newest release of each line at the time of writing, so
this is not a "you are on an old version" issue.
## Details
`lib/type/omap.js` (js-yaml 4.3.0):
```js
if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey)
else return false
```
`objectKeys` grows by one element per entry, and `Array.prototype.indexOf` is a
linear scan, so resolving an `n`-entry `!!omap` performs roughly
`1 + 2 + … + n` comparisons — quadratic in `n`. The work happens synchronously
inside `yaml.load()`, blocking the event loop for its whole duration.
The 5.x line already solves exactly this by tracking seen keys in a `Set`
(`src/tag/sequence/omap.ts`):
```ts
if (carrier.seen.has(key)) return 'duplicate key in ordered map'
carrier.seen.add(key)
```
## Proo… Remediation
Upgrade to 4.3.1, 3.15.1 |
https://git.anguskit.com/anguskit/AngusKit.git | website/package-lock.json:js-yaml | 75 |
| High |
JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported
Dependency vulnerabilities
· GHSA-5p4m-2wfm-xmqj
· GHSA-5p4m-2wfm-xmqj
· CVSS 7.5
js-yaml@3.14.2
→ 4.3.1, 3.15.1
DetailsDescription
# Quadratic CPU consumption in `!!omap` resolution (js-yaml 3.x and 4.x)
## Summary
`resolveYamlOmap()` enforces key uniqueness for `!!omap` sequences with a linear
scan (`objectKeys.indexOf(...)`) inside the per-element loop, making resolution
**O(n²)** in the number of entries. A modestly sized YAML document therefore
consumes disproportionate CPU inside `yaml.load()`, giving a denial of service
against any consumer that parses untrusted YAML.
`!!omap` is registered in the **default schema**
(`lib/schema/default.js` → `require('../type/omap')`), so a plain
`yaml.load(untrustedInput)` with no options is affected — no custom schema or
non-default configuration is required.
**This is the same weakness as CVE-2026-59870 / GHSA-724g-mxrg-4qvm**, which was
fixed in the 5.x line in 5.2.1. That fix was never backported: both currently
maintained legacy lines still carry the original implementation.
## Affected versions
| Line | Latest tested | Status |
|---|---|---|
| 3.x | **3.15.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:29` |
| 4.x | **4.3.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:30` |
| 5.x | 5.2.2 | **Not affected** — fixed in 5.2.1 (uses a `Set`) |
Both figures are the newest release of each line at the time of writing, so
this is not a "you are on an old version" issue.
## Details
`lib/type/omap.js` (js-yaml 4.3.0):
```js
if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey)
else return false
```
`objectKeys` grows by one element per entry, and `Array.prototype.indexOf` is a
linear scan, so resolving an `n`-entry `!!omap` performs roughly
`1 + 2 + … + n` comparisons — quadratic in `n`. The work happens synchronously
inside `yaml.load()`, blocking the event loop for its whole duration.
The 5.x line already solves exactly this by tracking seen keys in a `Set`
(`src/tag/sequence/omap.ts`):
```ts
if (carrier.seen.has(key)) return 'duplicate key in ordered map'
carrier.seen.add(key)
```
## Proo… Remediation
Upgrade to 4.3.1, 3.15.1 |
https://git.anguskit.com/anguskit/AngusKit.git | website/package-lock.json:js-yaml | 70 |
| High |
JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported
Dependency vulnerabilities
· GHSA-5p4m-2wfm-xmqj
· GHSA-5p4m-2wfm-xmqj
· CVSS 7.5
js-yaml@4.1.1
→ 4.3.1, 3.15.1
DetailsDescription
# Quadratic CPU consumption in `!!omap` resolution (js-yaml 3.x and 4.x)
## Summary
`resolveYamlOmap()` enforces key uniqueness for `!!omap` sequences with a linear
scan (`objectKeys.indexOf(...)`) inside the per-element loop, making resolution
**O(n²)** in the number of entries. A modestly sized YAML document therefore
consumes disproportionate CPU inside `yaml.load()`, giving a denial of service
against any consumer that parses untrusted YAML.
`!!omap` is registered in the **default schema**
(`lib/schema/default.js` → `require('../type/omap')`), so a plain
`yaml.load(untrustedInput)` with no options is affected — no custom schema or
non-default configuration is required.
**This is the same weakness as CVE-2026-59870 / GHSA-724g-mxrg-4qvm**, which was
fixed in the 5.x line in 5.2.1. That fix was never backported: both currently
maintained legacy lines still carry the original implementation.
## Affected versions
| Line | Latest tested | Status |
|---|---|---|
| 3.x | **3.15.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:29` |
| 4.x | **4.3.0** | Affected — `objectKeys.indexOf(pairKey)` at `lib/type/omap.js:30` |
| 5.x | 5.2.2 | **Not affected** — fixed in 5.2.1 (uses a `Set`) |
Both figures are the newest release of each line at the time of writing, so
this is not a "you are on an old version" issue.
## Details
`lib/type/omap.js` (js-yaml 4.3.0):
```js
if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey)
else return false
```
`objectKeys` grows by one element per entry, and `Array.prototype.indexOf` is a
linear scan, so resolving an `n`-entry `!!omap` performs roughly
`1 + 2 + … + n` comparisons — quadratic in `n`. The work happens synchronously
inside `yaml.load()`, blocking the event loop for its whole duration.
The 5.x line already solves exactly this by tracking seen keys in a `Set`
(`src/tag/sequence/omap.ts`):
```ts
if (carrier.seen.has(key)) return 'duplicate key in ordered map'
carrier.seen.add(key)
```
## Proo… Remediation
Upgrade to 4.3.1, 3.15.1 |
https://git.anguskit.com/anguskit/AngusKit.git | packages/docx/package-lock.json:js-yaml | 70 |
| High |