AngusKit Security Report (Sample)

Engineering Remediation Report
Risk grade
D
Risk score 72 · High
Scope1 selected scan · 1 asset
Data cutoff2026-10-16 18:03 (Asia/Shanghai)
Generated2026-10-16 18:03
Report No.SR-20261016-LFNGDQ
AudienceEngineering
ClassificationInternal

1. Executive Summary

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
Affected assets
1
Critical + high
61
Exploited in the wild (KEV)
0
Gate pass rate
0%

Severity distribution

Critical 2High 59Medium 46Low 13Info 0 Total 120
Counting basis:Counts SAST, secret and SCA findings of the selected scans, matching the scan detail page.

Priority actions

  1. Resolve the blocking findings of 1 asset to unblock releases
  2. Escalate 55 alerts past their SLA
  3. Upgrade axios to 1.20.0 to fix 12 vulnerabilities (1 asset)

2. Risk Posture

Severity distribution (security findings)

Critical 2High 59Medium 46Low 13Info 0 Total 120

Severity distribution (security findings)

Capability × severity

Dependency vulnerabilities 120
Licenses 1,187
CapabilityCriticalHighMediumLowInfoTotal
Dependency vulnerabilities 2 59 46 13 0 120
Licenses 0 0 0 1,183 4 1,187

Capability × severity

Asset types

TypeAssetsFindings
Repository1120

Engines

EngineCriticalHighMediumLowInfoTotal
TRIVY25946130120

Security findings are code vulnerabilities, secrets and dependency vulnerabilities; licenses and code quality are counted separately.

3. Top Risks

# 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.

4. Asset Risk Ranking

# 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

5. Gates and Coverage

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 × capability coverage

Asset Gate Secrets Dependency vulnerabilities Licenses Code quality
https://git.anguskit.com/anguskit/AngusKit.git Failed Done Done Done Done

Asset × capability coverage

Failed gates

AssetGateReasonTime
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.

6. Remediation Plan

https://git.anguskit.com/anguskit/AngusKit.git Repository · Findings 120

Dependency upgrades

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.

7. Findings

Grouped by rule: 70 groups.

shell-quote: shell-quote: Arbitrary command execution via improper line terminator handling CVE-2026-102422 1 finding · 1 asset

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
Details
Description
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

shell-quote: shell-quote: Arbitrary code execution via command injection due to unescaped line terminators CVE-2026-9277 1 finding · 1 asset

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
Details
Description
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

postcss: PostCSS: Information disclosure and denial of service via crafted CSS input CVE-2026-45623 1 finding · 1 asset

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
Details
Description
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

JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported GHSA-5p4m-2wfm-xmqj 4 findings · 1 asset

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
Details
Description
# 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
Details
Description
# 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
Details
Description
# 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