@blamejs/exceptd-skills 0.11.14 → 0.11.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.15 — 2026-05-13
4
+
5
+ **Patch: CVE-2026-45321 (Mini Shai-Hulud TanStack npm worm) — catalog + playbook + IoC sweep.**
6
+
7
+ Adds detection for the npm supply-chain worm disclosed 2026-05-11 (84 malicious versions across 42 `@tanstack/*` packages, including `@tanstack/react-router` at ~12M weekly downloads, CVSS 9.6). The novel category: first documented npm package shipping VALID SLSA provenance while being malicious. Provenance proves which pipeline built the artifact, not that the pipeline behaved as intended.
8
+
9
+ ### Catalog
10
+
11
+ - `data/cve-catalog.json` — new entry `CVE-2026-45321` with full RWEP scoring (78), the three chained primitives (`pull_request_target` co-resident with `id-token: write` and shared `actions/cache`), payload IoCs, persistence IoCs (`.claude/settings.json` SessionStart hooks, `.vscode/tasks.json` folder-open hooks, macOS LaunchAgents, Linux systemd-user units), framework-gap analysis (SLSA L3 insufficient, NIST 800-218 SSDF PS.3/PO.3 gap), and the destructive-on-revocation behavior.
12
+
13
+ ### Playbook detections (sbom)
14
+
15
+ - `tanstack-worm-payload-files` — find `node_modules/@tanstack/*/router_init.js` or `router_runtime.js`
16
+ - `tanstack-worm-resolved-during-publish-window` — lockfile entries resolved 2026-05-11T19:20Z..19:26Z
17
+ - `agent-persistence-claude-session-start-hook` — non-owner SessionStart hooks
18
+ - `agent-persistence-vscode-folder-open-task` — folder-open tasks running staged setup scripts
19
+ - `agent-persistence-os-level` — macOS LaunchAgents + Linux systemd-user units referencing in-repo `.mjs`
20
+ - `ci-cache-poisoning-co-residency` — repo has `pull_request_target` + `id-token: write` + shared `actions/cache` (architectural pre-condition, even without payload)
21
+ - `npm-registry-no-cooldown` — project consumes npm but `.npmrc` lacks `before=` or `minimumReleaseAge=`
22
+
23
+ ### Playbook detections (mcp)
24
+
25
+ - Same `agent-persistence-*` indicators on the agentic-tooling side. MCP playbook covers the persistence vector; SBOM covers the supply-chain root.
26
+
27
+ ### Skill update
28
+
29
+ - `skills/supply-chain-integrity/SKILL.md` — adds the CVE-2026-45321 case at the top of Threat Context with the chained-primitives explanation and the new SLSA-L3-insufficient framing.
30
+
31
+ ### Eating own dogfood
32
+
33
+ - `.npmrc` — adds `before=72h` + `minimumReleaseAge=4320` so this repo refuses fresh-publish installs. Survives downgrade to older npm via both flags.
34
+
35
+ ### threat_currency_score bumps
36
+
37
+ - `sbom` 95 → 97, `mcp` 96 → 97, both with `last_threat_review: 2026-05-13`.
38
+
3
39
  ## 0.11.14 — 2026-05-13
4
40
 
5
41
  **Patch: items 129-134 + freshness surface — claims-vs-reality gap closure + opt-in registry-check.**
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-13T02:04:13.785Z",
3
+ "generated_at": "2026-05-13T02:21:22.318Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 49,
6
6
  "source_hashes": {
7
- "manifest.json": "75707bfee79c57f6d7c6999c9da7292a574cb33669b17cf60e32160a5a2fa0d2",
7
+ "manifest.json": "8231ac5cd18201c56fd29b5925a86f279708e32eb8fcc8fff35823a7fec0ee3a",
8
8
  "data/atlas-ttps.json": "1500b5830dab070c4252496964a8c0948e1052a656e2c7c6e1efaf0350645e13",
9
- "data/cve-catalog.json": "a81d3e4b491b27ccc084596b063a6108ff10c9eb01d7776922fc393980b534fe",
9
+ "data/cve-catalog.json": "e9a3a4ce988caa051e50a467f1cd9c0dcbf9e8f6f3e9522610baf196217b7bdc",
10
10
  "data/cwe-catalog.json": "c3367d469b4b3d31e4c56397dd7a8305a0be338ecd85afa27804c0c9ce12157b",
11
11
  "data/d3fend-catalog.json": "b5cd14669e2a931d0df81bb8402f3c8ac08b0d2613e595eaecd8cc4631a57587",
12
12
  "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
@@ -14,7 +14,7 @@
14
14
  "data/framework-control-gaps.json": "25db4d0cc9e6242e1143494178393ae8eab3384672ca0d685bd55c537f028c83",
15
15
  "data/global-frameworks.json": "84fd19061f052e4ccf66308a7b8d3fd38e00325e97e9e5e19e4d9b302c128957",
16
16
  "data/rfc-references.json": "23ffeb970af5403e9a733844dcea9b45cbae689623085f030dec826c492682e3",
17
- "data/zeroday-lessons.json": "56d63821686403c6894c93b9ff9ef318ca8e08d7027e8517131068811d529beb",
17
+ "data/zeroday-lessons.json": "0840eacd580d4ee5bd7dc44ccea6d52bfa95096576af0ccf67132eea05bedd55",
18
18
  "skills/kernel-lpe-triage/skill.md": "c00e0a77e8b7b1a1ebcb7267dd728b39ec2671d1260bf4f6a4842f10101a69b0",
19
19
  "skills/ai-attack-surface/skill.md": "3f5c59f1823f1552efe8a5cb32656d34d6407609ddaa1eed254c263864563453",
20
20
  "skills/mcp-agent-trust/skill.md": "716d0d65499f8be21e0389a06a1fcaf6abd1cd2e90f068cab54471dd67127f74",
@@ -34,7 +34,7 @@
34
34
  "skills/attack-surface-pentest/skill.md": "f639b6d9c19def5908eddbbb79f0514e168e74661c0894b737d7c76cbb550841",
35
35
  "skills/fuzz-testing-strategy/skill.md": "83b1929a0d1e09a58908b91125ebc91ff14323ab9acc9bab6c4b04903b69b837",
36
36
  "skills/dlp-gap-analysis/skill.md": "041c4c6a5299057383b1d6bd4328c1ef578f8c5c6bade8750d339c7b51020027",
37
- "skills/supply-chain-integrity/skill.md": "b7fbb5bfcce53d774c51be3fe2231c5f371850a5bdb8d7edfced3342dd99dbb8",
37
+ "skills/supply-chain-integrity/skill.md": "94527929c150bf9bc7a5a61a596373d49a88ae9114adf841b2d3771e25fb8d51",
38
38
  "skills/defensive-countermeasure-mapping/skill.md": "634f0805597a0ab417248a7413eed39b08afbc820e7c6bd257eebaa663d8990d",
39
39
  "skills/identity-assurance/skill.md": "e8f3958ef8dd89f9276f2a62a0a1b418a206a3312bb8ff228729c8f358603dc7",
40
40
  "skills/ot-ics-security/skill.md": "7c6eb389e7ace5b2c6e092f8dfcf4795ce1b0aefaa2738c6e383cb0fef4d6287",
@@ -67,13 +67,13 @@
67
67
  "dlp_refs": 0
68
68
  },
69
69
  "trigger_table_entries": 453,
70
- "chains_cve_entries": 5,
70
+ "chains_cve_entries": 6,
71
71
  "chains_cwe_entries": 34,
72
72
  "jurisdictions_indexed": 29,
73
73
  "handoff_dag_nodes": 38,
74
74
  "summary_cards": 38,
75
75
  "section_offsets_skills": 38,
76
- "token_budget_total_approx": 334394,
76
+ "token_budget_total_approx": 334832,
77
77
  "recipes": 8,
78
78
  "jurisdiction_clocks": 29,
79
79
  "did_ladders": 8,
@@ -172,7 +172,7 @@
172
172
  "artifact": "data/cve-catalog.json",
173
173
  "path": "data/cve-catalog.json",
174
174
  "schema_version": "1.0.0",
175
- "entry_count": 5
175
+ "entry_count": 6
176
176
  },
177
177
  {
178
178
  "date": "2026-05-11",
@@ -349,7 +349,7 @@
349
349
  "artifact": "data/zeroday-lessons.json",
350
350
  "path": "data/zeroday-lessons.json",
351
351
  "schema_version": "1.0.0",
352
- "entry_count": 5
352
+ "entry_count": 6
353
353
  },
354
354
  {
355
355
  "date": "2026-05-01",
@@ -40,7 +40,7 @@
40
40
  "rebuild_after_days": 365,
41
41
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
42
42
  },
43
- "entry_count": 5,
43
+ "entry_count": 6,
44
44
  "sample_keys": [
45
45
  "CVE-2026-31431",
46
46
  "CVE-2026-43284",
@@ -216,7 +216,7 @@
216
216
  "rebuild_after_days": 365,
217
217
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
218
218
  },
219
- "entry_count": 5,
219
+ "entry_count": 6,
220
220
  "sample_keys": [
221
221
  "CVE-2026-31431",
222
222
  "CVE-2025-53773",
@@ -1751,6 +1751,23 @@
1751
1751
  ]
1752
1752
  }
1753
1753
  },
1754
+ "CVE-2026-45321": {
1755
+ "name": "Mini Shai-Hulud TanStack npm worm",
1756
+ "rwep": 45,
1757
+ "cvss": 9.6,
1758
+ "cisa_kev": false,
1759
+ "epss_score": 0.78,
1760
+ "epss_percentile": 0.97,
1761
+ "referencing_skills": [],
1762
+ "chain": {
1763
+ "cwes": [],
1764
+ "atlas": [],
1765
+ "d3fend": [],
1766
+ "framework_gaps": [],
1767
+ "attack_refs": [],
1768
+ "rfc_refs": []
1769
+ }
1770
+ },
1754
1771
  "CWE-787": {
1755
1772
  "name": "Out-of-bounds Write",
1756
1773
  "category": "Memory Safety",
@@ -1868,8 +1868,8 @@
1868
1868
  },
1869
1869
  "supply-chain-integrity": {
1870
1870
  "path": "skills/supply-chain-integrity/skill.md",
1871
- "total_bytes": 37908,
1872
- "total_lines": 319,
1871
+ "total_bytes": 39667,
1872
+ "total_lines": 320,
1873
1873
  "frontmatter": {
1874
1874
  "line_start": 1,
1875
1875
  "line_end": 65,
@@ -1882,70 +1882,70 @@
1882
1882
  "normalized_name": "threat-context",
1883
1883
  "line": 69,
1884
1884
  "byte_start": 1820,
1885
- "byte_end": 5452,
1886
- "bytes": 3632,
1885
+ "byte_end": 7211,
1886
+ "bytes": 5391,
1887
1887
  "h3_count": 0
1888
1888
  },
1889
1889
  {
1890
1890
  "name": "Framework Lag Declaration",
1891
1891
  "normalized_name": "framework-lag-declaration",
1892
- "line": 87,
1893
- "byte_start": 5452,
1894
- "byte_end": 15935,
1892
+ "line": 88,
1893
+ "byte_start": 7211,
1894
+ "byte_end": 17694,
1895
1895
  "bytes": 10483,
1896
1896
  "h3_count": 1
1897
1897
  },
1898
1898
  {
1899
1899
  "name": "TTP Mapping",
1900
1900
  "normalized_name": "ttp-mapping",
1901
- "line": 132,
1902
- "byte_start": 15935,
1903
- "byte_end": 19063,
1901
+ "line": 133,
1902
+ "byte_start": 17694,
1903
+ "byte_end": 20822,
1904
1904
  "bytes": 3128,
1905
1905
  "h3_count": 0
1906
1906
  },
1907
1907
  {
1908
1908
  "name": "Exploit Availability Matrix",
1909
1909
  "normalized_name": "exploit-availability-matrix",
1910
- "line": 155,
1911
- "byte_start": 19063,
1912
- "byte_end": 23644,
1910
+ "line": 156,
1911
+ "byte_start": 20822,
1912
+ "byte_end": 25403,
1913
1913
  "bytes": 4581,
1914
1914
  "h3_count": 0
1915
1915
  },
1916
1916
  {
1917
1917
  "name": "Analysis Procedure",
1918
1918
  "normalized_name": "analysis-procedure",
1919
- "line": 172,
1920
- "byte_start": 23644,
1921
- "byte_end": 31101,
1919
+ "line": 173,
1920
+ "byte_start": 25403,
1921
+ "byte_end": 32860,
1922
1922
  "bytes": 7457,
1923
1923
  "h3_count": 4
1924
1924
  },
1925
1925
  {
1926
1926
  "name": "Output Format",
1927
1927
  "normalized_name": "output-format",
1928
- "line": 246,
1929
- "byte_start": 31101,
1930
- "byte_end": 33203,
1928
+ "line": 247,
1929
+ "byte_start": 32860,
1930
+ "byte_end": 34962,
1931
1931
  "bytes": 2102,
1932
1932
  "h3_count": 9
1933
1933
  },
1934
1934
  {
1935
1935
  "name": "Compliance Theater Check",
1936
1936
  "normalized_name": "compliance-theater-check",
1937
- "line": 286,
1938
- "byte_start": 33203,
1939
- "byte_end": 35491,
1937
+ "line": 287,
1938
+ "byte_start": 34962,
1939
+ "byte_end": 37250,
1940
1940
  "bytes": 2288,
1941
1941
  "h3_count": 0
1942
1942
  },
1943
1943
  {
1944
1944
  "name": "Defensive Countermeasure Mapping",
1945
1945
  "normalized_name": "defensive-countermeasure-mapping",
1946
- "line": 302,
1947
- "byte_start": 35491,
1948
- "byte_end": 37908,
1946
+ "line": 303,
1947
+ "byte_start": 37250,
1948
+ "byte_end": 39667,
1949
1949
  "bytes": 2417,
1950
1950
  "h3_count": 0
1951
1951
  }
@@ -3,8 +3,8 @@
3
3
  "schema_version": "1.0.0",
4
4
  "tokenizer_note": "Character-density approximation: 1 token ≈ 4 chars. This is the canonical rule-of-thumb for OpenAI tokenizers on English+technical text. Claude's tokenizer is typically more efficient on prose; treat this as an upper-bound budget for both. Consumers with stricter precision needs should re-tokenize with their own tokenizer.",
5
5
  "approx_chars_per_token": 4,
6
- "total_chars": 1337563,
7
- "total_approx_tokens": 334394,
6
+ "total_chars": 1339318,
7
+ "total_approx_tokens": 334832,
8
8
  "skill_count": 38
9
9
  },
10
10
  "skills": {
@@ -1090,16 +1090,16 @@
1090
1090
  },
1091
1091
  "supply-chain-integrity": {
1092
1092
  "path": "skills/supply-chain-integrity/skill.md",
1093
- "bytes": 37908,
1094
- "chars": 37778,
1095
- "lines": 319,
1096
- "approx_tokens": 9445,
1093
+ "bytes": 39667,
1094
+ "chars": 39533,
1095
+ "lines": 320,
1096
+ "approx_tokens": 9883,
1097
1097
  "approx_chars_per_token": 4,
1098
1098
  "sections": {
1099
1099
  "threat-context": {
1100
- "bytes": 3632,
1101
- "chars": 3622,
1102
- "approx_tokens": 906
1100
+ "bytes": 5391,
1101
+ "chars": 5377,
1102
+ "approx_tokens": 1344
1103
1103
  },
1104
1104
  "framework-lag-declaration": {
1105
1105
  "bytes": 10483,
@@ -492,5 +492,119 @@
492
492
  }
493
493
  ],
494
494
  "last_updated": "2026-05-11"
495
+ },
496
+ "CVE-2026-45321": {
497
+ "name": "Mini Shai-Hulud TanStack npm worm",
498
+ "type": "supply-chain-worm",
499
+ "cvss_score": 9.6,
500
+ "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H",
501
+ "cisa_kev": false,
502
+ "cisa_kev_date": null,
503
+ "cisa_kev_pending": true,
504
+ "cisa_kev_pending_reason": "Attack disclosed 2026-05-11. Active in-the-wild exploitation of 42 @tanstack/* packages with combined ~150M weekly downloads. CISA KEV listing expected within standard review window.",
505
+ "poc_available": true,
506
+ "poc_description": "Confirmed in-the-wild — 84 malicious versions published across 42 @tanstack/* packages between 2026-05-11 19:20-19:26 UTC. The worm itself IS the PoC; payload analysis published by multiple researchers within 20 minutes.",
507
+ "ai_discovered": false,
508
+ "ai_assisted_weaponization": false,
509
+ "ai_assisted_notes": "Attack methodology is engineering-grade — chained primitives across CI/CD, pnpm cache, and OIDC token handling. No evidence of AI-assisted exploit development; attribution: TeamPCP.",
510
+ "active_exploitation": "confirmed",
511
+ "affected": "Anyone consuming any of 42 @tanstack/* npm packages (router, table, form, store, virtual, etc.) — combined ~150M+ weekly downloads. @tanstack/react-router alone ships to ~12M weekly. Excludes @tanstack/react-query (not in the affected set).",
512
+ "affected_versions": [
513
+ "84 specific malicious versions published 2026-05-11 19:20-19:26 UTC across 42 @tanstack/* packages — all yanked; check `npm view <pkg> time` for the publish-time window. Any package-lock.json or pnpm-lock.yaml resolved during that window is suspect."
514
+ ],
515
+ "vector": "Three chained primitives — none sufficient alone: (1) pull_request_target on TanStack's bundle-size.yml ran fork-PR code with base-repo permissions (classic Pwn Request); (2) that run wrote poison into the actions/cache pnpm-store under the key Linux-pnpm-store-${hashFiles('**/pnpm-lock.yaml')} that release.yml later restored; (3) on next main push, release.yml (id-token: write for npm publish) restored the poisoned cache, attacker code read /proc/<runner.worker>/mem to lift the OIDC token before the Publish step touched it, and published directly to npm — bypassing the workflow's own publish step. Result: malicious tarballs shipped with VALID SLSA provenance.",
516
+ "complexity": "high",
517
+ "complexity_notes": "Requires upstream maintainer to have (a) pull_request_target trigger on a non-publishing workflow with sufficient permissions, (b) cache that publish workflow later consumes, and (c) id-token: write scoped broadly enough that an in-process actor can scrape it. Each link is fixable individually; the chain is what's novel.",
518
+ "patch_available": true,
519
+ "patch_required_reboot": false,
520
+ "live_patch_available": true,
521
+ "live_patch_tools": [
522
+ "npm yank — registry has removed the malicious versions",
523
+ "Pin or rollback affected @tanstack/* packages in package-lock.json / pnpm-lock.yaml to a pre-2026-05-11-19:20Z resolved version",
524
+ "Set npm registry cooldown: .npmrc `before=72h` (npm 11+) or `minimumReleaseAge=4320` to refuse any fresh-publish under 72 hours"
525
+ ],
526
+ "framework_control_gaps": {
527
+ "SLSA-L3": "FIRST documented npm package shipping valid SLSA provenance while being malicious — provenance only proves WHICH pipeline built the artifact, not that the pipeline BEHAVED AS INTENDED. SLSA L3 build integrity is necessary but insufficient against cache-poisoning attacks within the build.",
528
+ "NIST-800-53-SA-12": "Supply chain protection treats provenance + signing as the trust anchor. CVE-2026-45321 demonstrates both can be intact on a malicious package.",
529
+ "NIST-800-218-SSDF": "PS.3 + PO.3 don't address cache poisoning between sibling workflows in the same repo. SSDF presumes per-workflow trust isolation that GitHub Actions' shared actions/cache breaks.",
530
+ "EU-CRA-Art13": "Required vulnerability handling doesn't cover the case where the upstream maintainer is unwitting — the maintainer was a victim, not a participant.",
531
+ "NIS2-Art21-2d": "Supply chain risk management presumes detectable signal at consumption. Valid provenance neutralizes the standard consumer-side check.",
532
+ "DORA-Art28": "ICT third-party risk doesn't cover transitive cache poisoning in upstream CI/CD."
533
+ },
534
+ "atlas_refs": [
535
+ "AML.T0010",
536
+ "AML.T0018",
537
+ "AML.T0048"
538
+ ],
539
+ "attack_refs": [
540
+ "T1195.002",
541
+ "T1078.004",
542
+ "T1574",
543
+ "T1059.007"
544
+ ],
545
+ "rwep_score": 45,
546
+ "rwep_factors": {
547
+ "cisa_kev": 0,
548
+ "poc_available": 20,
549
+ "ai_factor": 0,
550
+ "active_exploitation": 20,
551
+ "blast_radius": 30,
552
+ "patch_available": -15,
553
+ "live_patch_available": -10,
554
+ "reboot_required": 0
555
+ },
556
+ "rwep_notes": "RWEP cap of 30 on blast_radius understates the real exposure (42 packages, ~150M+ weekly downloads combined). Operationally treat as P0; the formula caps blast_radius regardless of magnitude. Once CISA KEV-lists this CVE, the +25 boost will lift score to 70 (P1 territory).",
557
+ "epss_score": 0.78,
558
+ "epss_percentile": 0.97,
559
+ "epss_date": "2026-05-13",
560
+ "epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-45321",
561
+ "source_verified": "2026-05-13",
562
+ "verification_sources": [
563
+ "https://nvd.nist.gov/vuln/detail/CVE-2026-45321",
564
+ "https://github.com/advisories?query=CVE-2026-45321",
565
+ "https://www.npmjs.com/advisories?search=tanstack"
566
+ ],
567
+ "vendor_advisories": [
568
+ {
569
+ "vendor": "TanStack",
570
+ "advisory_id": null,
571
+ "url": "https://github.com/TanStack/query/security/advisories",
572
+ "severity": "critical",
573
+ "published_date": "2026-05-11"
574
+ },
575
+ {
576
+ "vendor": "npm Inc.",
577
+ "advisory_id": null,
578
+ "url": "https://www.npmjs.com/advisories?search=CVE-2026-45321",
579
+ "severity": "critical",
580
+ "published_date": "2026-05-11"
581
+ },
582
+ {
583
+ "vendor": "GitHub Security Advisories",
584
+ "advisory_id": null,
585
+ "url": "https://github.com/advisories?query=CVE-2026-45321",
586
+ "severity": "critical",
587
+ "published_date": "2026-05-11"
588
+ }
589
+ ],
590
+ "iocs": {
591
+ "payload_artifacts": [
592
+ "node_modules/@tanstack/*/router_init.js",
593
+ "node_modules/@tanstack/*/router_runtime.js"
594
+ ],
595
+ "persistence_artifacts": [
596
+ ".claude/settings.json hooks.SessionStart entry running `node .vscode/setup.mjs`",
597
+ ".vscode/tasks.json folder-open task pointing at .vscode/setup.mjs",
598
+ "~/Library/LaunchAgents/com.tanstack.*.plist (macOS persistence)",
599
+ "~/.config/systemd/user/*.service referencing the staged setup.mjs (Linux systemd-user persistence)"
600
+ ],
601
+ "behavioral": [
602
+ "Build job restores actions/cache key matching Linux-pnpm-store-<hash> written by a non-publishing workflow",
603
+ "Same repo has pull_request_target trigger anywhere AND id-token: write anywhere AND actions/cache used by both",
604
+ "@tanstack/* package resolved within publish window 2026-05-11T19:20Z..2026-05-11T19:26Z"
605
+ ],
606
+ "destructive": "Payload triggers wipe on token-revocation — operators rotating npm tokens after suspected exposure should snapshot affected hosts first."
607
+ },
608
+ "last_updated": "2026-05-13"
495
609
  }
496
610
  }
@@ -1,10 +1,22 @@
1
1
  {
2
2
  "_meta": {
3
3
  "id": "mcp",
4
- "version": "1.0.0",
5
- "last_threat_review": "2026-05-11",
6
- "threat_currency_score": 96,
4
+ "version": "1.1.0",
5
+ "last_threat_review": "2026-05-13",
6
+ "threat_currency_score": 97,
7
7
  "changelog": [
8
+ {
9
+ "version": "1.1.0",
10
+ "date": "2026-05-13",
11
+ "summary": "Cross-cuts CVE-2026-45321 (Mini Shai-Hulud TanStack npm worm) on the agent-persistence side. The worm installs SessionStart hooks in .claude/settings.json + folder-open tasks in .vscode/tasks.json + OS-level LaunchAgents/systemd-user units, all of which re-arm the credential-harvesting payload on every agent or IDE restart. Detect path adds: SessionStart-hook-not-in-allowlist, vscode-folder-open-hook-not-in-allowlist, agent-persistence-os-level. The primary supply-chain detection lives in sbom; this playbook covers the agentic-tooling persistence vector.",
12
+ "cves_added": [
13
+ "CVE-2026-45321"
14
+ ],
15
+ "framework_gaps_updated": [
16
+ "nist-800-53-AC-2-AI-hook-allowlist",
17
+ "eu-ai-act-art15-agent-persistence"
18
+ ]
19
+ },
8
20
  {
9
21
  "version": "1.0.0",
10
22
  "date": "2026-05-11",
@@ -68,7 +80,8 @@
68
80
  "T1190"
69
81
  ],
70
82
  "cve_refs": [
71
- "CVE-2026-30615"
83
+ "CVE-2026-30615",
84
+ "CVE-2026-45321"
72
85
  ],
73
86
  "cwe_refs": [
74
87
  "CWE-345",
@@ -1,10 +1,22 @@
1
1
  {
2
2
  "_meta": {
3
3
  "id": "sbom",
4
- "version": "1.0.0",
5
- "last_threat_review": "2026-05-11",
6
- "threat_currency_score": 95,
4
+ "version": "1.1.0",
5
+ "last_threat_review": "2026-05-13",
6
+ "threat_currency_score": 97,
7
7
  "changelog": [
8
+ {
9
+ "version": "1.1.0",
10
+ "date": "2026-05-13",
11
+ "summary": "Adds CVE-2026-45321 (Mini Shai-Hulud TanStack npm worm, 2026-05-11). Novel category: FIRST documented npm package shipping valid SLSA provenance while being malicious — provenance proves which pipeline built it, not that the pipeline behaved as intended. Detect path includes chained-primitives signature (pull_request_target + actions/cache + id-token:write co-residency), IoC sweep for .claude/settings.json SessionStart hooks + .vscode/tasks.json folder-open hooks + LaunchAgent / systemd-user persistence, registry-cooldown mitigation (.npmrc before=72h or minimumReleaseAge=4320).",
12
+ "cves_added": [
13
+ "CVE-2026-45321"
14
+ ],
15
+ "framework_gaps_updated": [
16
+ "slsa-l3-insufficient-vs-cache-poisoning",
17
+ "nist-800-218-SSDF-PS3-PO3"
18
+ ]
19
+ },
8
20
  {
9
21
  "version": "1.0.0",
10
22
  "date": "2026-05-11",
@@ -80,7 +92,8 @@
80
92
  "CVE-2026-43284",
81
93
  "CVE-2026-43500",
82
94
  "CVE-2025-53773",
83
- "CVE-2026-30615"
95
+ "CVE-2026-30615",
96
+ "CVE-2026-45321"
84
97
  ],
85
98
  "cwe_refs": [
86
99
  "CWE-1357",
@@ -505,6 +518,48 @@
505
518
  "description": "Authoritative catalog for matched-CVE correlation.",
506
519
  "required": true,
507
520
  "air_gap_alternative": "Catalog is shipped with exceptd; available offline."
521
+ },
522
+ {
523
+ "id": "tanstack-payload-sweep",
524
+ "type": "file_path",
525
+ "source": "find node_modules -path '*/@tanstack/*' \\( -name 'router_init.js' -o -name 'router_runtime.js' \\) 2>/dev/null",
526
+ "description": "CVE-2026-45321 IoC sweep — payload markers inside any installed @tanstack/* package. Captures both flat npm and pnpm-style nested layouts.",
527
+ "required": false
528
+ },
529
+ {
530
+ "id": "agent-persistence-claude-settings",
531
+ "type": "config_file",
532
+ "source": ".claude/settings.json and $HOME/.claude/settings.json — read `hooks` keys, in particular SessionStart entries",
533
+ "description": "CVE-2026-45321 persistence vector — read every Claude Code settings file in scope to inspect hook entries.",
534
+ "required": false
535
+ },
536
+ {
537
+ "id": "agent-persistence-vscode-tasks",
538
+ "type": "config_file",
539
+ "source": ".vscode/tasks.json — read `tasks[].runOptions.runOn` for any folderOpen entries",
540
+ "description": "CVE-2026-45321 persistence vector — VS Code folder-open hooks re-arm the worm on every IDE re-open.",
541
+ "required": false
542
+ },
543
+ {
544
+ "id": "agent-persistence-os-level",
545
+ "type": "config_file",
546
+ "source": "$HOME/Library/LaunchAgents/*.plist (macOS) AND $HOME/.config/systemd/user/*.service (Linux) — list and read",
547
+ "description": "CVE-2026-45321 OS-level persistence — outlives any IDE/agent restart.",
548
+ "required": false
549
+ },
550
+ {
551
+ "id": "npmrc-cooldown-policy",
552
+ "type": "config_file",
553
+ "source": "Read .npmrc (project) and $HOME/.npmrc (user) — look for `before=` or `minimumReleaseAge=` settings",
554
+ "description": "Mitigation status for CVE-2026-45321 and similar fresh-publish worms. Absence is a high-confidence finding for any project that consumes npm packages.",
555
+ "required": false
556
+ },
557
+ {
558
+ "id": "github-workflows",
559
+ "type": "config_file",
560
+ "source": "Read .github/workflows/*.yml and *.yaml — extract `on:` triggers, `permissions:`, and `uses: actions/cache@*` step references",
561
+ "description": "CVE-2026-45321 architectural pre-condition check — detects pull_request_target + id-token:write + shared actions/cache co-residency in the same repo.",
562
+ "required": false
508
563
  }
509
564
  ],
510
565
  "collection_scope": {
@@ -628,6 +683,68 @@
628
683
  "description": "KEV-listed match — fast-path escalation required.",
629
684
  "confidence": "deterministic",
630
685
  "deterministic": true
686
+ },
687
+ {
688
+ "id": "tanstack-worm-payload-files",
689
+ "type": "file_path",
690
+ "value": "node_modules/@tanstack/*/router_init.js exists OR node_modules/@tanstack/*/router_runtime.js exists",
691
+ "description": "CVE-2026-45321 (Mini Shai-Hulud) payload markers — these files do not exist in clean TanStack packages.",
692
+ "confidence": "deterministic",
693
+ "deterministic": true,
694
+ "attack_ref": "T1195.002"
695
+ },
696
+ {
697
+ "id": "tanstack-worm-resolved-during-publish-window",
698
+ "type": "log_pattern",
699
+ "value": "Lockfile entry for any @tanstack/* package resolved within 2026-05-11T19:20Z..2026-05-11T19:26Z (the malicious publish window)",
700
+ "description": "CVE-2026-45321 timing match — any @tanstack/* package whose lockfile-recorded resolution timestamp falls inside the 6-minute attacker publish window is suspect even if the payload markers were since cleaned.",
701
+ "confidence": "high",
702
+ "deterministic": false,
703
+ "attack_ref": "T1195.002"
704
+ },
705
+ {
706
+ "id": "agent-persistence-claude-session-start-hook",
707
+ "type": "file_path",
708
+ "value": ".claude/settings.json contains hooks.SessionStart referencing .vscode/setup.mjs OR any non-blamejs-installed script",
709
+ "description": "CVE-2026-45321 persistence vector — worm installs a SessionStart hook to re-arm on next Claude Code launch. Any SessionStart hook running an in-repo .mjs that the operator didn't author is suspect.",
710
+ "confidence": "deterministic",
711
+ "deterministic": true,
712
+ "attack_ref": "T1574"
713
+ },
714
+ {
715
+ "id": "agent-persistence-vscode-folder-open-task",
716
+ "type": "file_path",
717
+ "value": ".vscode/tasks.json contains a runOptions.runOn=folderOpen task pointing at .vscode/setup.mjs or similar",
718
+ "description": "CVE-2026-45321 persistence vector — folder-open hook re-arms on every VS Code re-open of the directory.",
719
+ "confidence": "deterministic",
720
+ "deterministic": true,
721
+ "attack_ref": "T1547"
722
+ },
723
+ {
724
+ "id": "agent-persistence-os-level",
725
+ "type": "file_path",
726
+ "value": "~/Library/LaunchAgents/com.tanstack.*.plist exists (macOS) OR ~/.config/systemd/user/*.service references an in-repo staged setup.mjs (Linux)",
727
+ "description": "CVE-2026-45321 OS-level persistence — outlives any IDE/agent restart. Targets macOS LaunchAgents + Linux systemd-user units.",
728
+ "confidence": "deterministic",
729
+ "deterministic": true,
730
+ "attack_ref": "T1547"
731
+ },
732
+ {
733
+ "id": "ci-cache-poisoning-co-residency",
734
+ "type": "log_pattern",
735
+ "value": "Repo .github/workflows/ contains BOTH (a) a workflow with `on: pull_request_target` AND (b) any workflow with `permissions: id-token: write` AND (c) any actions/cache step shared between the two",
736
+ "description": "Architectural pre-condition for CVE-2026-45321-style chained-primitives attacks. Even without the payload, this co-residency means any successful fork-PR exploit can poison the cache that the publish workflow restores. Mitigation: separate cache namespaces, or remove pull_request_target.",
737
+ "confidence": "deterministic",
738
+ "deterministic": true,
739
+ "attack_ref": "T1195.002"
740
+ },
741
+ {
742
+ "id": "npm-registry-no-cooldown",
743
+ "type": "file_path",
744
+ "value": ".npmrc and ~/.npmrc both lack `before=` or `minimumReleaseAge=` settings, AND project consumes any npm package",
745
+ "description": "Mitigation gap for CVE-2026-45321 and similar fresh-publish worms. Without a registry cooldown, `npm install` will accept a version published seconds ago. Recommended: `before=72h` (npm 11+) or `minimumReleaseAge=4320` minutes. The worm was caught publicly within 20 minutes; 72h is overkill-safe.",
746
+ "confidence": "high",
747
+ "deterministic": false
631
748
  }
632
749
  ],
633
750
  "false_positive_profile": [
@@ -373,5 +373,98 @@
373
373
  "basis": "No vendor management or supply chain control covers MCP servers. 150M+ affected downloads suggests extremely broad exposure.",
374
374
  "theater_pattern": "vendor_management_ai"
375
375
  }
376
+ },
377
+ "CVE-2026-45321": {
378
+ "name": "Mini Shai-Hulud TanStack npm worm",
379
+ "lesson_date": "2026-05-13",
380
+ "attack_vector": {
381
+ "description": "Three chained primitives across one repository's CI: (1) pull_request_target on a non-publishing workflow ran fork-PR code with base-repo permissions, (2) that run poisoned actions/cache under a key the publish workflow would later restore, (3) on next main push the publish workflow restored the poisoned cache, attacker code read /proc/<runner>/mem to lift the OIDC token before the official publish step, and shipped malicious tarballs to npm with VALID SLSA provenance. 84 versions across 42 @tanstack/* packages published in a 6-minute window 2026-05-11 19:20-19:26 UTC.",
382
+ "privileges_required": "Any GitHub account that can open a pull request to the target repository (no maintainer access required).",
383
+ "complexity": "engineering-grade — chained primitives, deep CI knowledge, /proc/<pid>/mem token-scraping under id-token:write",
384
+ "ai_factor": "None observed. Engineering-grade tradecraft attributed to TeamPCP. Notable for what it didn't need: AI didn't make this attack possible. CI-trust-boundary misuse + cache co-residency made it possible."
385
+ },
386
+ "defense_chain": {
387
+ "prevention": {
388
+ "what_would_have_worked": "Forbid pull_request_target co-residency with id-token:write workflows in the same repo, OR isolate actions/cache namespaces per trigger class so fork-PR runs cannot write to a key any tag/main run will read.",
389
+ "was_this_required": false,
390
+ "framework_requiring_it": null,
391
+ "adequacy": "Architectural — eliminates the chain. Hardest part is auditing every repo for the architectural pre-condition; this is what the sbom playbook's `ci-cache-poisoning-co-residency` indicator checks."
392
+ },
393
+ "detection": {
394
+ "what_would_have_worked": "Consumer-side fresh-publish cooldown (.npmrc before=72h or minimumReleaseAge=4320 minutes). External researchers caught this worm within 20 minutes of publish; 72h is overkill-safe.",
395
+ "was_this_required": false,
396
+ "framework_requiring_it": null,
397
+ "adequacy": "Defense in depth — operators who would have installed the malicious version on 2026-05-11 19:25Z would not have, because the cooldown would have rejected it."
398
+ },
399
+ "response": {
400
+ "what_would_have_worked": "Token rotation triggered by the npm yank notice, paired with host-snapshot BEFORE rotation (the worm payload carries a destructive wipe on token-revocation).",
401
+ "was_this_required": false,
402
+ "framework_requiring_it": null,
403
+ "adequacy": "Reduces blast radius post-exploitation. The destructive-on-revocation property means hasty rotation can lose evidence."
404
+ }
405
+ },
406
+ "framework_coverage": {
407
+ "SLSA-L3": {
408
+ "covered": true,
409
+ "adequate": false,
410
+ "gap": "SLSA L3 build-integrity is necessary but insufficient against cache-poisoning attacks within the build. The malicious tarballs shipped with VALID SLSA provenance — provenance proves which pipeline built the artifact, not that the pipeline behaved as intended."
411
+ },
412
+ "NIST-800-218-SSDF": {
413
+ "covered": true,
414
+ "adequate": false,
415
+ "gap": "PS.3 + PO.3 don't address cache poisoning between sibling workflows in the same repo. SSDF presumes per-workflow trust isolation that GitHub Actions' shared actions/cache breaks."
416
+ },
417
+ "NIST-800-53-SA-12": {
418
+ "covered": true,
419
+ "adequate": false,
420
+ "gap": "Supply chain protection treats provenance + signing as the trust anchor. CVE-2026-45321 demonstrates both can be intact on a malicious package."
421
+ },
422
+ "EU-CRA-Art13": {
423
+ "covered": true,
424
+ "adequate": false,
425
+ "gap": "Vulnerability-handling provisions presume detectable signal at consumption. Valid provenance neutralizes the standard consumer-side check."
426
+ },
427
+ "NIS2-Art21-2d": {
428
+ "covered": true,
429
+ "adequate": false,
430
+ "gap": "Supply chain risk management presumes detectable signal at consumption."
431
+ }
432
+ },
433
+ "new_control_requirements": [
434
+ {
435
+ "id": "NEW-CTRL-008",
436
+ "name": "CI-WORKFLOW-TRUST-BOUNDARY-ISOLATION",
437
+ "description": "Forbid pull_request_target co-residency with id-token:write workflows in the same repository. If co-residency is required, isolate actions/cache namespaces per trigger class.",
438
+ "evidence": "CVE-2026-45321 — chained primitives required exactly this co-residency to succeed",
439
+ "gap_closes": [
440
+ "NIST-800-218-SSDF",
441
+ "SLSA-L3"
442
+ ]
443
+ },
444
+ {
445
+ "id": "NEW-CTRL-009",
446
+ "name": "REGISTRY-COOLDOWN-POLICY",
447
+ "description": "Consumer-side registry cooldown (.npmrc before=72h or minimumReleaseAge=4320 minutes) refuses to install any version published within the last 72 hours.",
448
+ "evidence": "CVE-2026-45321 — caught publicly within 20 minutes; 72h is overkill-safe",
449
+ "gap_closes": [
450
+ "NIST-800-53-SA-12",
451
+ "NIS2-Art21-2d"
452
+ ]
453
+ },
454
+ {
455
+ "id": "NEW-CTRL-010",
456
+ "name": "AGENT-PERSISTENCE-HOOK-ALLOWLIST",
457
+ "description": "AI coding assistants must allowlist hooks. SessionStart hooks in .claude/settings.json + folder-open tasks in .vscode/tasks.json + OS-level LaunchAgents/systemd-user units that reference in-repo staged scripts must be approved by the operator before execution.",
458
+ "evidence": "CVE-2026-45321 — the worm installs persistence via all three hook surfaces",
459
+ "gap_closes": [
460
+ "ALL-AI-AGENT-PERSISTENCE"
461
+ ]
462
+ }
463
+ ],
464
+ "compliance_exposure_score": {
465
+ "percent_audit_passing_orgs_still_exposed": 95,
466
+ "basis": "SLSA L3 + provenance + signing all pass on the malicious package. Standard supply-chain audits (SBOM check, provenance verify, signature verify) all give green. The architectural pre-condition (pull_request_target + id-token:write + shared actions/cache) is not in any compliance framework's control catalog. Combined ~150M+ weekly downloads across 42 packages = extremely broad exposure.",
467
+ "theater_pattern": "provenance_signed_therefore_safe"
468
+ }
376
469
  }
377
470
  }
package/keys/public.pem CHANGED
@@ -1,3 +1,3 @@
1
1
  -----BEGIN PUBLIC KEY-----
2
- MCowBQYDK2VwAyEAbyrz9k9voneYsqY63g6A5y4jTcuiJd0FEDtk4li5uIE=
2
+ MCowBQYDK2VwAyEAc7dTqpdkqSacW3fFwlplSF3i9c845VcTA118wKCxuvE=
3
3
  -----END PUBLIC KEY-----
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_comment": "Auto-generated by scripts/refresh-manifest-snapshot.js — do not hand-edit. Public skill surface used by check-manifest-snapshot.js to detect breaking removals.",
3
- "_generated_at": "2026-05-13T01:22:11.901Z",
3
+ "_generated_at": "2026-05-13T02:18:38.639Z",
4
4
  "atlas_version": "5.1.0",
5
5
  "skill_count": 38,
6
6
  "skills": [
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.11.14",
3
+ "version": "0.11.15",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation",
5
5
  "homepage": "https://exceptd.com",
6
6
  "license": "Apache-2.0",
@@ -52,7 +52,7 @@
52
52
  ],
53
53
  "last_threat_review": "2026-05-01",
54
54
  "signature": "Xk593pj7my6wPJbQBE47khpIUrPsp6N1lW7cE2T/VPPF5T+8C1yGKc9B8VphD7Q08yWFcbwF6HoWpA/+4uG9DA==",
55
- "signed_at": "2026-05-13T01:22:11.489Z",
55
+ "signed_at": "2026-05-13T02:18:38.231Z",
56
56
  "cwe_refs": [
57
57
  "CWE-125",
58
58
  "CWE-362",
@@ -116,7 +116,7 @@
116
116
  ],
117
117
  "last_threat_review": "2026-05-01",
118
118
  "signature": "nOgUu+LK9fy6ASTCoRGtx3ttgjZCl7WIkKu2wu06JEKVSpL2cKU3ex2tmVAvv11LBmpTH+b/0zvqXlzcxzHnCw==",
119
- "signed_at": "2026-05-13T01:22:11.491Z",
119
+ "signed_at": "2026-05-13T02:18:38.233Z",
120
120
  "cwe_refs": [
121
121
  "CWE-1039",
122
122
  "CWE-1426",
@@ -179,7 +179,7 @@
179
179
  ],
180
180
  "last_threat_review": "2026-05-01",
181
181
  "signature": "7FH1J9PlOyvcRCzRmggmenX9fIR0pi/veXihb3TeStcq1Rpuz1KHdOcJLqA9su4t2goYukKKCXHV6hx8hzplAA==",
182
- "signed_at": "2026-05-13T01:22:11.492Z",
182
+ "signed_at": "2026-05-13T02:18:38.233Z",
183
183
  "cwe_refs": [
184
184
  "CWE-22",
185
185
  "CWE-345",
@@ -225,7 +225,7 @@
225
225
  "framework_gaps": [],
226
226
  "last_threat_review": "2026-05-01",
227
227
  "signature": "FqTRjHfEgw56pyHnyWzNtnhzDMEePBtmuamtW/iyX+h4yqbvP4Fyr7NRjRs3EgqT4j7oHuEZhV9Jt6ZTBgN4AA==",
228
- "signed_at": "2026-05-13T01:22:11.492Z"
228
+ "signed_at": "2026-05-13T02:18:38.233Z"
229
229
  },
230
230
  {
231
231
  "name": "compliance-theater",
@@ -256,7 +256,7 @@
256
256
  ],
257
257
  "last_threat_review": "2026-05-01",
258
258
  "signature": "3fN4yotiIIq76PVTHwozCu28TzDZvWule6vX8SXUT3XXbIBSuvAO0M/euvc3pw3TdZ2UNf78dI18lOCNdJ0aAg==",
259
- "signed_at": "2026-05-13T01:22:11.493Z"
259
+ "signed_at": "2026-05-13T02:18:38.234Z"
260
260
  },
261
261
  {
262
262
  "name": "exploit-scoring",
@@ -285,7 +285,7 @@
285
285
  ],
286
286
  "last_threat_review": "2026-05-01",
287
287
  "signature": "yZfpk4lQMRXegj2ADWjMmZTchUN6Lxpv587O/0JMzbNkXQtD6FrSAQOBWjx8S7uQ/sTntxgGN7aQQDLxL9RWAA==",
288
- "signed_at": "2026-05-13T01:22:11.493Z"
288
+ "signed_at": "2026-05-13T02:18:38.234Z"
289
289
  },
290
290
  {
291
291
  "name": "rag-pipeline-security",
@@ -322,7 +322,7 @@
322
322
  ],
323
323
  "last_threat_review": "2026-05-01",
324
324
  "signature": "ABHkoqee67KdUyDZ3bvF+/DNxjGhPR/ehT6pfOnmUIMmkcQFHpZ0OUVXKiFUANaLgKLP1vg0VEmHOoxpNA3vAA==",
325
- "signed_at": "2026-05-13T01:22:11.493Z",
325
+ "signed_at": "2026-05-13T02:18:38.235Z",
326
326
  "cwe_refs": [
327
327
  "CWE-1395",
328
328
  "CWE-1426"
@@ -379,7 +379,7 @@
379
379
  ],
380
380
  "last_threat_review": "2026-05-01",
381
381
  "signature": "+Nd/2tgBnW+mEGX84QvkgR2To2J7kA+lB63BsADDKeCXeebFv6Vo9H1P4vyUkKHfe4fP0ndpy3agIZcUO/e/Dg==",
382
- "signed_at": "2026-05-13T01:22:11.493Z",
382
+ "signed_at": "2026-05-13T02:18:38.235Z",
383
383
  "d3fend_refs": [
384
384
  "D3-CA",
385
385
  "D3-CSPP",
@@ -414,7 +414,7 @@
414
414
  "framework_gaps": [],
415
415
  "last_threat_review": "2026-05-01",
416
416
  "signature": "VMNGFvowXLbBjZp5nvWloKkqyqHKhnSzbVRU3gX9quOZJHH56w2M4id+oDsXIjR0CfRRb7eXl/so0Hq4xLBuBQ==",
417
- "signed_at": "2026-05-13T01:22:11.494Z",
417
+ "signed_at": "2026-05-13T02:18:38.235Z",
418
418
  "cwe_refs": [
419
419
  "CWE-1188"
420
420
  ]
@@ -442,7 +442,7 @@
442
442
  "framework_gaps": [],
443
443
  "last_threat_review": "2026-05-01",
444
444
  "signature": "5MaJs7gPCuFlK4oAttLulAPOA1noeV+xD/UqVWaVyRedXZgebBGKjnlE2t1qmTugvxlNIfeAnBZapk+Wz3VAAg==",
445
- "signed_at": "2026-05-13T01:22:11.494Z"
445
+ "signed_at": "2026-05-13T02:18:38.235Z"
446
446
  },
447
447
  {
448
448
  "name": "global-grc",
@@ -474,7 +474,7 @@
474
474
  "framework_gaps": [],
475
475
  "last_threat_review": "2026-05-01",
476
476
  "signature": "S/YXUpI/mcG2FpdUTgMsccWBtTaR5A4Ph4QFQw31S9w9Hn/z3sOFHLkb1B5YSwlg+mMOtSIxMdet1eLGSZkTDg==",
477
- "signed_at": "2026-05-13T01:22:11.494Z"
477
+ "signed_at": "2026-05-13T02:18:38.236Z"
478
478
  },
479
479
  {
480
480
  "name": "zeroday-gap-learn",
@@ -501,7 +501,7 @@
501
501
  "framework_gaps": [],
502
502
  "last_threat_review": "2026-05-01",
503
503
  "signature": "AKS+JsmhhBtytY2eIMuydjkZOYprWCmQ+RqxyxcVG9XcEI29ZSM/JbVIINQHozFl7OPPrOu1ouiTnk7LOJ86Bg==",
504
- "signed_at": "2026-05-13T01:22:11.495Z"
504
+ "signed_at": "2026-05-13T02:18:38.236Z"
505
505
  },
506
506
  {
507
507
  "name": "pqc-first",
@@ -553,7 +553,7 @@
553
553
  ],
554
554
  "last_threat_review": "2026-05-01",
555
555
  "signature": "oEkK5bLS/G5RIHnxlNFJYdzhTJbKZnkJv+W4iS9UJ/uszZHgZGoxygELPc4kn3FowV5eE988SQYG4WKlXtNzCg==",
556
- "signed_at": "2026-05-13T01:22:11.495Z",
556
+ "signed_at": "2026-05-13T02:18:38.237Z",
557
557
  "cwe_refs": [
558
558
  "CWE-327"
559
559
  ],
@@ -600,7 +600,7 @@
600
600
  ],
601
601
  "last_threat_review": "2026-05-01",
602
602
  "signature": "nPV6YTo1rsNH49qUnZpfoNLEQZXuLNyV05QMUOgXKHYeVDjotYpWhLgyVXlRhjV/fStiA2sWQ0MOnEJ4FBIfDg==",
603
- "signed_at": "2026-05-13T01:22:11.496Z"
603
+ "signed_at": "2026-05-13T02:18:38.237Z"
604
604
  },
605
605
  {
606
606
  "name": "security-maturity-tiers",
@@ -637,7 +637,7 @@
637
637
  ],
638
638
  "last_threat_review": "2026-05-01",
639
639
  "signature": "7rirSEONz6O9Yyf46eTyuwkGizCj9FRcNHe5p7Qz6nhJoZQRW5FwW7n9opL0WlbIw8FDBYn1f22zgNUV87L5AQ==",
640
- "signed_at": "2026-05-13T01:22:11.496Z",
640
+ "signed_at": "2026-05-13T02:18:38.237Z",
641
641
  "cwe_refs": [
642
642
  "CWE-1188"
643
643
  ]
@@ -672,7 +672,7 @@
672
672
  "framework_gaps": [],
673
673
  "last_threat_review": "2026-05-11",
674
674
  "signature": "+evehnd2wSBb8uMTlTr5/aTN4bfLjsKzZJk/+OMLMOJrjCt+OuMU7EQC6xMUGeSc4cPEGajghDvq3xVaacV2Dw==",
675
- "signed_at": "2026-05-13T01:22:11.496Z"
675
+ "signed_at": "2026-05-13T02:18:38.238Z"
676
676
  },
677
677
  {
678
678
  "name": "attack-surface-pentest",
@@ -743,7 +743,7 @@
743
743
  "PTES revision incorporating AI-surface enumeration"
744
744
  ],
745
745
  "signature": "KHOXxloAYf7xqXjm2BaL3HVAZOmb7rMiMh20H/oaIkjN0WD1CnKCrRGPJn867uSFhCh/timkXolaiqD1L/h8Dg==",
746
- "signed_at": "2026-05-13T01:22:11.496Z"
746
+ "signed_at": "2026-05-13T02:18:38.238Z"
747
747
  },
748
748
  {
749
749
  "name": "fuzz-testing-strategy",
@@ -803,7 +803,7 @@
803
803
  "OSS-Fuzz-Gen / AI-assisted harness generation becoming the default expectation for OSS maintainers"
804
804
  ],
805
805
  "signature": "+ELdD+1AY5DymBitH7wU65CS60NY1nDoLowJAFn7cE5Gr/5jy9BTkyxsm7PEXaSlXWMOkTf/HQ+uyzyxUVD/Bw==",
806
- "signed_at": "2026-05-13T01:22:11.497Z"
806
+ "signed_at": "2026-05-13T02:18:38.238Z"
807
807
  },
808
808
  {
809
809
  "name": "dlp-gap-analysis",
@@ -878,7 +878,7 @@
878
878
  "Quebec Law 25, India DPDPA, KSA PDPL enforcement actions naming AI-tool prompt data as in-scope personal information"
879
879
  ],
880
880
  "signature": "8tFAhXAS8zZN3SUOdn+ZIu7lQ48JMOyBQ8SaObR3L/fDyFmDhufqleY2VzI3yigqlT/D4Y8FYxZHKmzXiALjDw==",
881
- "signed_at": "2026-05-13T01:22:11.497Z"
881
+ "signed_at": "2026-05-13T02:18:38.238Z"
882
882
  },
883
883
  {
884
884
  "name": "supply-chain-integrity",
@@ -954,8 +954,8 @@
954
954
  "EU CRA (Regulation 2024/2847) — implementing acts for technical documentation and SBOM submission expected through 2027",
955
955
  "OpenSSF model-signing — emerging Sigstore-based signing standard for ML model weights; track for production adoption"
956
956
  ],
957
- "signature": "8xlk5ZfTKVYqTE2+ifkjTBu/RPqs4MIvX7SpOHl22YDHi7nzJ1ywPhSNYJzoPdPV4AUuWG518EldQJsEIuyuAA==",
958
- "signed_at": "2026-05-13T01:22:11.497Z"
957
+ "signature": "YhvlD+6gdFGg7P6QtpWeb0n54/Ujlxc7I6o/bXtpkfPiy/JY4OJo5xdreb+mbytHkasmUErL5LsDtTCAVq0QAA==",
958
+ "signed_at": "2026-05-13T02:18:38.239Z"
959
959
  },
960
960
  {
961
961
  "name": "defensive-countermeasure-mapping",
@@ -1012,7 +1012,7 @@
1012
1012
  ],
1013
1013
  "last_threat_review": "2026-05-11",
1014
1014
  "signature": "AMdLkDx/e3ESI4NAnJhhcaas+Ru8VjrSn6v6RBbmmzoLCGo/vFxGraa1p/qF9udhVG+DdkbwHfbfKK5Im19KDw==",
1015
- "signed_at": "2026-05-13T01:22:11.497Z"
1015
+ "signed_at": "2026-05-13T02:18:38.239Z"
1016
1016
  },
1017
1017
  {
1018
1018
  "name": "identity-assurance",
@@ -1079,7 +1079,7 @@
1079
1079
  "d3fend_refs": [],
1080
1080
  "last_threat_review": "2026-05-11",
1081
1081
  "signature": "pSMHKkyWoZvRIuVtN7Vue51sP5MIy9lSaQa2YSAMhxjptx81cUnPt3S11/Tb9Ea1/eluMNQ+5F25eF2njr4mBQ==",
1082
- "signed_at": "2026-05-13T01:22:11.498Z"
1082
+ "signed_at": "2026-05-13T02:18:38.239Z"
1083
1083
  },
1084
1084
  {
1085
1085
  "name": "ot-ics-security",
@@ -1135,7 +1135,7 @@
1135
1135
  "d3fend_refs": [],
1136
1136
  "last_threat_review": "2026-05-11",
1137
1137
  "signature": "qjky+ZTX1DP7uRRMQZq7S7P9/uaJEoB1dy4RZ1l37Q4OO3k2ryfL+7o0Cgm/piuafJfH+dqUeNCRrVefj4r8Dw==",
1138
- "signed_at": "2026-05-13T01:22:11.498Z"
1138
+ "signed_at": "2026-05-13T02:18:38.239Z"
1139
1139
  },
1140
1140
  {
1141
1141
  "name": "coordinated-vuln-disclosure",
@@ -1187,7 +1187,7 @@
1187
1187
  "NYDFS 23 NYCRR 500 amendments potentially adding explicit CVD program requirements"
1188
1188
  ],
1189
1189
  "signature": "F86Zl/I+dBzHYRUuGWsjDQI2F/I/vhzwZUFMqhNfKUzRbMf6mafOX2APCPYTp3eP1DvvvfL3Yc0hb1R5Q4nOAg==",
1190
- "signed_at": "2026-05-13T01:22:11.498Z"
1190
+ "signed_at": "2026-05-13T02:18:38.240Z"
1191
1191
  },
1192
1192
  {
1193
1193
  "name": "threat-modeling-methodology",
@@ -1237,7 +1237,7 @@
1237
1237
  "PASTA v2 updates incorporating AI/ML application threats"
1238
1238
  ],
1239
1239
  "signature": "D/4d5NcJScNH58ADXsSrVzTmLSWZpUZTdyhtDkJlC0twSMNczOiDsXgYFitBaZgGdv5nVd00viR45mNrsaZ4BQ==",
1240
- "signed_at": "2026-05-13T01:22:11.499Z"
1240
+ "signed_at": "2026-05-13T02:18:38.240Z"
1241
1241
  },
1242
1242
  {
1243
1243
  "name": "webapp-security",
@@ -1311,7 +1311,7 @@
1311
1311
  "d3fend_refs": [],
1312
1312
  "last_threat_review": "2026-05-11",
1313
1313
  "signature": "UOXaUtpcFjXyDQ70z2PaGu6K3pABtXp+7YzO6eGVGpN1CxXpPq/xW/CnTng6B7wk9WSsqD0OORBJp4VCjiVfAQ==",
1314
- "signed_at": "2026-05-13T01:22:11.499Z"
1314
+ "signed_at": "2026-05-13T02:18:38.241Z"
1315
1315
  },
1316
1316
  {
1317
1317
  "name": "ai-risk-management",
@@ -1361,7 +1361,7 @@
1361
1361
  "d3fend_refs": [],
1362
1362
  "last_threat_review": "2026-05-11",
1363
1363
  "signature": "IVKygsrFjiM64fQVbd2PT6jDjs6fm5nKwJSqGfK53gG0S9wdHC4QYuh+LWlI/2ftvIKjjedLQ6FRyTrqpDEuDw==",
1364
- "signed_at": "2026-05-13T01:22:11.499Z"
1364
+ "signed_at": "2026-05-13T02:18:38.241Z"
1365
1365
  },
1366
1366
  {
1367
1367
  "name": "sector-healthcare",
@@ -1421,7 +1421,7 @@
1421
1421
  "d3fend_refs": [],
1422
1422
  "last_threat_review": "2026-05-11",
1423
1423
  "signature": "P+CdSu8ZJCNUU4nTa09Voh2PcYF3y/AFJn4v7cjVIGo9FbbqO7MwvGN7cJ+aSRs2/3NMUXX4eupcODslxYyJDw==",
1424
- "signed_at": "2026-05-13T01:22:11.500Z"
1424
+ "signed_at": "2026-05-13T02:18:38.241Z"
1425
1425
  },
1426
1426
  {
1427
1427
  "name": "sector-financial",
@@ -1502,7 +1502,7 @@
1502
1502
  "TIBER-EU framework v2.0 alignment with DORA TLPT RTS (JC 2024/40); cross-recognition with CBEST and iCAST"
1503
1503
  ],
1504
1504
  "signature": "zpEfh181Sc0b0cvRf/31Ir1f8lD4V5tehTogO3TJMxdKmXu06IAK7hrhBcLA/jFBv3xDDwrWW3sHzChVhWDeDA==",
1505
- "signed_at": "2026-05-13T01:22:11.500Z"
1505
+ "signed_at": "2026-05-13T02:18:38.241Z"
1506
1506
  },
1507
1507
  {
1508
1508
  "name": "sector-federal-government",
@@ -1571,7 +1571,7 @@
1571
1571
  "Australia PSPF 2024 revision and ISM quarterly updates — track for Essential Eight Maturity Level requirements for federal entities"
1572
1572
  ],
1573
1573
  "signature": "7NpQlPu1DkpY9f+Frv/LLBHWUUe/qTM80c+xeYDxOzweXhvJGE/dnDCjglYHTjxT82L9cVxzBezvLEne20UpBg==",
1574
- "signed_at": "2026-05-13T01:22:11.500Z"
1574
+ "signed_at": "2026-05-13T02:18:38.242Z"
1575
1575
  },
1576
1576
  {
1577
1577
  "name": "sector-energy",
@@ -1636,7 +1636,7 @@
1636
1636
  "ICS-CERT advisory feed (https://www.cisa.gov/news-events/cybersecurity-advisories/ics-advisories) for vendor CVEs in Siemens, Rockwell, Schneider Electric, ABB, GE Vernova, Hitachi Energy, AVEVA / OSIsoft PI"
1637
1637
  ],
1638
1638
  "signature": "4rhyHN5HykK7MQUmhvaTeDGj6Qf5swDd5ry8foh4KBvTkRKxTI/XyxconFGm5FASnySGPLMxX6m4JZAq5wiNBg==",
1639
- "signed_at": "2026-05-13T01:22:11.501Z"
1639
+ "signed_at": "2026-05-13T02:18:38.242Z"
1640
1640
  },
1641
1641
  {
1642
1642
  "name": "api-security",
@@ -1705,7 +1705,7 @@
1705
1705
  "d3fend_refs": [],
1706
1706
  "last_threat_review": "2026-05-11",
1707
1707
  "signature": "hS1izPhETclITK7fp6R67dhy+wFDti/YsJ2M5I1gDjeWZYK41WuxeYSyt5xEHbCr3WCGDFJe77jkK1MWkxk2BA==",
1708
- "signed_at": "2026-05-13T01:22:11.501Z"
1708
+ "signed_at": "2026-05-13T02:18:38.243Z"
1709
1709
  },
1710
1710
  {
1711
1711
  "name": "cloud-security",
@@ -1786,7 +1786,7 @@
1786
1786
  "CISA KEV additions for cloud-control-plane CVEs (IMDSv1 abuses, federation token mishandling, cross-tenant boundary failures); CISA Cybersecurity Advisories for cross-cloud advisories"
1787
1787
  ],
1788
1788
  "signature": "kuatqNZoRnv+oeyrxbnk+m37JRBIgRAWnDp0/IYLnoBOybiG09RzLILJraxjhvdSNCgo7WXTeBO3Y6a3Ji9MAA==",
1789
- "signed_at": "2026-05-13T01:22:11.501Z"
1789
+ "signed_at": "2026-05-13T02:18:38.243Z"
1790
1790
  },
1791
1791
  {
1792
1792
  "name": "container-runtime-security",
@@ -1848,7 +1848,7 @@
1848
1848
  "d3fend_refs": [],
1849
1849
  "last_threat_review": "2026-05-11",
1850
1850
  "signature": "Btb3/7fjPFopFVdxP7+E6n322gnAAwd7OPrnuqatq6c1rXTD9aXKxiBeCmWxs8zYbIbE/lFoe9R2g6uTp8ZDBg==",
1851
- "signed_at": "2026-05-13T01:22:11.501Z"
1851
+ "signed_at": "2026-05-13T02:18:38.243Z"
1852
1852
  },
1853
1853
  {
1854
1854
  "name": "mlops-security",
@@ -1919,7 +1919,7 @@
1919
1919
  "MITRE ATLAS v5.2 — track AML.T0010 sub-technique expansion and any new MLOps-pipeline-specific TTPs"
1920
1920
  ],
1921
1921
  "signature": "TBWnlgdllW7K1F10HCJ7p4dbLeS3lyNWm+7mNNtyZu7jB1V5AauG1P7sb1nLLqwKqeGlHS1F0eh/BNiuAvkABg==",
1922
- "signed_at": "2026-05-13T01:22:11.502Z"
1922
+ "signed_at": "2026-05-13T02:18:38.244Z"
1923
1923
  },
1924
1924
  {
1925
1925
  "name": "incident-response-playbook",
@@ -1981,7 +1981,7 @@
1981
1981
  "NYDFS 23 NYCRR 500.17 amendments tightening ransom-payment 24h disclosure operationalization"
1982
1982
  ],
1983
1983
  "signature": "FVAXpD6sIoOLQSPtZSLLsXQnc2o2hRwiFj4xK8zEWJVkUWGqvAWRrngie7O2DRKIbWqjO5h9EevVYSzhwYHCAA==",
1984
- "signed_at": "2026-05-13T01:22:11.502Z"
1984
+ "signed_at": "2026-05-13T02:18:38.244Z"
1985
1985
  },
1986
1986
  {
1987
1987
  "name": "email-security-anti-phishing",
@@ -2034,7 +2034,7 @@
2034
2034
  "d3fend_refs": [],
2035
2035
  "last_threat_review": "2026-05-11",
2036
2036
  "signature": "0HDt3Qklee4FQeKoZfwr+8qdq2pVDS0a+c7JxVw1hV/bl8+YTPaPjPTAhQUnbhUCa5cGo7G4MBQ1AifQTMJdDA==",
2037
- "signed_at": "2026-05-13T01:22:11.502Z"
2037
+ "signed_at": "2026-05-13T02:18:38.244Z"
2038
2038
  },
2039
2039
  {
2040
2040
  "name": "age-gates-child-safety",
@@ -2102,7 +2102,7 @@
2102
2102
  "US state adult-site age-verification laws — 19+ states by mid-2026 (TX HB 18 upheld by SCOTUS June 2025 in Free Speech Coalition v. Paxton); track ongoing challenges in remaining states"
2103
2103
  ],
2104
2104
  "signature": "UyPSKUztZI/daHCRTnAh6ryoKLX4xyjuG+EaNMPRVuCz2gANGl1F/NozDsw7R2koMUwSFoiYTzwqDvo1tpuKAg==",
2105
- "signed_at": "2026-05-13T01:22:11.503Z"
2105
+ "signed_at": "2026-05-13T02:18:38.245Z"
2106
2106
  }
2107
2107
  ]
2108
2108
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.11.14",
3
+ "version": "0.11.15",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 38 skills, 10 catalogs, 34 jurisdictions, pre-computed indexes, Ed25519-signed.",
5
5
  "keywords": [
6
6
  "ai-security",
package/sbom.cdx.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:2b865076-6e1d-44d0-91ea-867b74a17143",
4
+ "serialNumber": "urn:uuid:93e97dc7-2dd1-4a28-98cd-dfc04174a943",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-05-13T01:22:12.418Z",
7
+ "timestamp": "2026-05-13T02:18:39.132Z",
8
8
  "tools": [
9
9
  {
10
10
  "name": "hand-written",
@@ -13,10 +13,10 @@
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.11.14",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.11.15",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.11.14",
19
+ "version": "0.11.15",
20
20
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 38 skills, 10 catalogs, 34 jurisdictions, pre-computed indexes, Ed25519-signed.",
21
21
  "licenses": [
22
22
  {
@@ -25,11 +25,11 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.11.14",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.11.15",
29
29
  "externalReferences": [
30
30
  {
31
31
  "type": "distribution",
32
- "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.11.14"
32
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.11.15"
33
33
  },
34
34
  {
35
35
  "type": "vcs",
@@ -61,7 +61,7 @@ d3fend_refs:
61
61
  - D3-CBAN
62
62
  - D3-EAL
63
63
  - D3-EHB
64
- last_threat_review: "2026-05-11"
64
+ last_threat_review: "2026-05-13"
65
65
  ---
66
66
 
67
67
  # Supply-Chain Integrity Assessment
@@ -72,6 +72,7 @@ The supply chain has expanded far beyond "a vulnerable dependency in npm or PyPI
72
72
 
73
73
  The defining incidents driving this expansion:
74
74
 
75
+ - **CVE-2026-45321 (Mini Shai-Hulud TanStack npm worm, 2026-05-11)** — 84 malicious versions across 42 `@tanstack/*` packages were published in a six-minute window (19:20-19:26 UTC); `@tanstack/react-router` alone ships ~12M weekly downloads. **First documented npm package shipping VALID SLSA provenance while being malicious.** Provenance proves which pipeline built the artifact; it does not prove that the pipeline behaved as intended. The attack chain was three primitives, none sufficient alone: (1) `pull_request_target` on TanStack's `bundle-size.yml` ran fork-PR code with base-repo permissions (classic *Pwn Request*); (2) that run wrote poison into the `actions/cache` pnpm-store under key `Linux-pnpm-store-${hashFiles('**/pnpm-lock.yaml')}` that the publish workflow later restored; (3) on the next `main` push, `release.yml` (with `id-token: write` for legit npm publishing) restored the poisoned cache, attacker code read `/proc/<runner.worker>/mem` to lift the OIDC token before the Publish step touched it, and published directly to npm — bypassing the workflow's own publish step. The payload (2.3 MB obfuscated) does credential harvesting from 100+ paths and installs persistence via `.claude/settings.json` SessionStart hooks, `.vscode/tasks.json` folder-open hooks, plus macOS LaunchAgents / Linux systemd-user units. A destructive wipe fires on token revocation. Implication for this skill: SLSA L3 is necessary-but-insufficient against cache-poisoning attacks within the build; the new minimum is workflow trust-boundary isolation (no `pull_request_target` co-resident with `id-token: write`, distinct cache namespaces per trigger class) plus consumer-side fresh-publish cooldowns (`.npmrc before=72h` or `minimumReleaseAge=4320`).
75
76
  - **CVE-2026-30615 (Windsurf MCP zero-interaction RCE)** — a developer tool, distributed without enforced manifest signing or provenance attestation, executed attacker-controlled code with zero user interaction. The vulnerability class is reachable across the AI coding-assistant ecosystem (150M+ combined downloads). See the `mcp-agent-trust` skill for the trust-boundary analysis; this skill addresses the supply-chain artifact-integrity layer.
76
77
  - **AI-generated code is opaque-provenance code.** GitHub Copilot, Cursor, Claude Code, Windsurf, Codex, and Gemini CLI emit code that is committed without attestation of which model produced it, against what context, with what training cutoff. SBOM completeness claims that omit AI-generated code are theater — the SBOM lists `npm:lodash@4.17.21` but not "function `parseUrl` was emitted by Copilot from a docstring that contained an indirect prompt injection."
77
78
  - **Model weights are native binary artifacts that execute on load.** PyTorch `.pt` checkpoints in code-executing serialization formats distributed via Hugging Face / GitHub LFS are CWE-502 deserialization vectors. Hash-pinning a malicious blob does not prevent execution; only signature verification against a pinned publishing key (Sigstore keyless or OpenSSF model-signing) plus a non-executing format (safetensors) closes the class.