@blamejs/exceptd-skills 0.12.9 → 0.12.11

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,80 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.11 — 2026-05-13
4
+
5
+ **Patch: OSV source hardening, indicator regex widening, CWE/framework-gap reconciliation. v0.12.10 audit closeout.**
6
+
7
+ ### OSV source hardening
8
+
9
+ `lib/source-osv.js` matures from greenfield to GHSA-parity:
10
+
11
+ - **Structured fixture-I/O error envelope.** Missing or malformed `EXCEPTD_OSV_FIXTURE` paths no longer crash with a Node stack trace; the source returns `{ok:false, error, source:"offline"}` matching the GHSA convention. Operators piping the CLI through `jq` or scripting around exit codes get a structured failure they can branch on.
12
+ - **Case-fold ids before lookup.** `fetchAdvisoryById("mal-2026-3083")` (lowercase) now resolves correctly. OSV.dev's `/v1/vulns/{id}` is case-sensitive — the source uppercases the id at entry before any branch on fixture lookup or network call.
13
+ - **Highest-CVSS-version wins + compute from vector.** `extractCvss` previously overwrote the chosen vector on every loop iteration ("last wins" not "highest-version wins") and returned `null` `score` when the OSV record carried only a vector string with no embedded numeric tail. Both fixed: explicit version-comparison via the `CVSS:N.M` prefix, and a new `cvss3BaseScore(vector)` helper that computes the CVSS 3.1 base score per FIRST §7.1 (handles Scope:U + Scope:C). MAL-* records that previously normalized to `cvss_score: null` / `active_exploitation: "unknown"` now carry computed scores.
14
+ - **GHSA-404 → OSV fallback for CVE-*.** `seedSingleAdvisory` previously routed `CVE-*` unconditionally through `source-ghsa`. When GHSA returned 404 for a CVE that had only PYSEC / RUSTSEC / SNYK / MAL coverage, the operator saw `GHSA returned HTTP 404` even though OSV had the record. Now: on GHSA-404 for a CVE-* id, retry via `source-osv.fetchAdvisoryById(id)`; surface the combined error when both 404.
15
+ - **`epss_note` on non-CVE drafts.** Non-CVE catalog keys (MAL-*, SNYK-*, RUSTSEC-*, etc.) now carry a populated `epss_note` documenting the FIRST EPSS API limitation — drafts no longer look incomplete to downstream consumers grepping for the field.
16
+ - **`verification_sources` deduped.** The canonical `osv.dev/vulnerability/<id>` URL was previously both prepended unconditionally AND pulled from `rec.references[]`. Deduped via `new Set` before return.
17
+ - **`buildDiff` error categorization.** Returns `unreachable_count` + `normalize_error_count` separately so an operator can distinguish "OSV unreachable" from "10 ids returned but none normalized cleanly."
18
+ - **`GHSA-` dropped from `OSV_ID_PREFIXES`.** The export previously listed GHSA-* even though the dispatcher unconditionally routes GHSA-* through `source-ghsa`. `isOsvId("GHSA-...")` now returns false. A top-of-file comment documents the routing decision (GHSA has richer field coverage for that namespace).
19
+ - **`OSV_HOST_OVERRIDE` env var for offline HTTP testing.** New stubbing surface — lets `tests/source-osv.test.js` spin up a local HTTP server to exercise HTTP 500 / 429 / timeout / parse-error paths previously uncovered. 429 surfaces as `rate-limited`; timeout error message clarified.
20
+ - **`seedSingleAdvisory` exported** for in-process testing.
21
+
22
+ ### Indicator regex widening
23
+
24
+ `gha-workflow-script-injection-sink` (added v0.12.10) previously anchored on `run:\s*\|` (block-scalar pipe only). Single-line `run: echo "${{ github.event.comment.body }}"` bypassed the regex despite being the same vulnerability class. Widened to `run:[\s\S]*?...` which admits both block-scalar AND single-line forms. The indicator's `confidence` drops from `deterministic` → `high` and `deterministic` flag flips to `false` to reflect the reasoning step still required for the false-positive demotion (sandboxed `pull_request` + `contents: read` permissions). `tests/gha-workflow-script-injection-sink.test.js` lands as a new end-to-end regex test with 8 fixture YAML cases covering both the catch and the FP-demotion classes. All 5 of this repo's own `.github/workflows/*.yml` files remain clean against the widened regex.
25
+
26
+ ### CWE reverse-references
27
+
28
+ The v0.12.10 catalog additions cited existing CWEs (CWE-89, CWE-77, CWE-94) without updating their reverse-reference `evidence_cves` arrays. Bidirectional linkage restored: CWE-89 now lists CVE-2026-42208 (LiteLLM SQLi), CWE-77 lists MAL-2026-3083 (elementary-data secondary classification), CWE-94 adds MAL-2026-3083 alongside the existing CVE-2025-53773 and CVE-2026-30615.
29
+
30
+ ### Framework-control-gaps key reconciliation
31
+
32
+ Eight `framework_control_gaps` keys used by the v0.12.10 catalog additions did not resolve in `data/framework-control-gaps.json`. Six reconciled to canonical existing forms: `SLSA-L3` → `SLSA-v1.0-Build-L3`; `OWASP-LLM01` → `OWASP-LLM-Top-10-2025-LLM01`; `NIST-800-218-PO.4` → `NIST-800-218-SSDF`; `NIS2-Art21-2d` / `-2g` → `NIS2-Art21-patch-management`; `NIS2-Art21-2e` → `NIS2-Art21-incident-handling`. Two genuinely-distinct citations gained new entries in the framework-gaps catalog: `EU-CRA-Art13` (essential cybersecurity requirements + technical documentation; the elementary-data class of supply-chain compromise where the maintainer is a victim) and `NIST-800-53-SI-10` (information input validation; the trust-boundary-vs-inside-boundary distinction that argument-injection / SQL-injection / prompt-injection exploit). All `framework_control_gaps` references in the catalog now resolve to a real entry.
33
+
34
+ ### Repository
35
+
36
+ - `lib/source-ghsa.js` "unrecognized id format" error message widened to enumerate the OSV-native prefixes operators can pass via `--advisory` (was previously CVE/GHSA only).
37
+ - `README.md` documents the OSV source: install command, `--advisory MAL-...` form, `EXCEPTD_OSV_FIXTURE` env var, the fresh-disclosure workflow expanded to mention OSV's coverage breadth.
38
+
39
+ Test count: 462 → 492 (+30: 18 OSV source-hardening tests + 10 indicator regex tests + 2 catalog drift assertions). Predeploy gates: 15/15. Skills: 38/38 signed and verified.
40
+
41
+ ## 0.12.10 — 2026-05-13
42
+
43
+ **Patch: OSV.dev wired as an upstream source, three new catalog entries, one new library-author indicator.**
44
+
45
+ ### OSV.dev as a new upstream source
46
+
47
+ `lib/source-osv.js` + `OSV_SOURCE` in `lib/refresh-external.js` add OSV.dev (https://api.osv.dev/) as a recognised upstream pull. Operators run `exceptd refresh --source osv` to import advisories from the OSV-aggregated dataset, which covers the OSSF Malicious Packages namespace (`MAL-*`), Snyk advisories (`SNYK-*`), GitHub Advisory Database (`GHSA-*`), RustSec (`RUSTSEC-*`), Mageia (`MGASA-*`), Go Vuln DB (`GO-*`), Ubuntu USN (`USN-*`), PYSEC, and UVI — one unauthenticated API in place of N per-vendor feeds.
48
+
49
+ The `--advisory <id>` flag now routes non-CVE / non-GHSA identifiers (`MAL-*`, `SNYK-*`, `RUSTSEC-*`, `USN-*`, `UVI-*`, `GO-*`, `MGASA-*`, `PYSEC-*`) through `source-osv`. CVE-* and GHSA-* continue routing through `source-ghsa` because the GitHub Advisory Database carries richer field coverage for those namespaces. Imported entries land as `_auto_imported: true` / `_draft: true` drafts, the same shape GHSA imports use — editorial fields (framework_control_gaps, full iocs, atlas_refs, attack_refs, rwep_factors) remain null until a human or AI assistant runs the cve-curation skill.
50
+
51
+ When an OSV record carries a `CVE-*` value in its `aliases`, the catalog key is the CVE form and the OSV identifier moves to an `aliases` array on the entry. When no CVE is assigned (e.g. MAL-* malicious-package compromises), the OSV identifier IS the catalog key. The previous identifier convention (CVE-only keys) is preserved as the default; the new identifier shapes are an extension.
52
+
53
+ Fixture support: `EXCEPTD_OSV_FIXTURE` env var (path to a JSON file with one or many OSV records) enables offline testing — same convention as the existing `EXCEPTD_GHSA_FIXTURE`.
54
+
55
+ ### Three new catalog entries
56
+
57
+ - **`MAL-2026-3083`** (OSV-native key for the **elementary-data PyPI worm**, April 2026). 1.1M-monthly-downloads package compromised via a GitHub Actions script-injection sink in the project's own workflow (`update_pylon_issue.yml` interpolated `${{ github.event.comment.body }}` directly into a `run:` shell, escalated via the workflow's `GITHUB_TOKEN` to forge an orphan-commit release). Payload was a single `elementary.pth` file in the wheel (Python auto-exec at install time, not import time); infostealer sweeping dbt warehouse creds, AWS/GCP/Azure credentials, SSH keys, Kubernetes configs, cryptocurrency wallets to `igotnofriendsonlineorirl-imgonnakmslmao.skyhanni.cloud` with second-stage at `litter.catbox.moe/iqesmbhukgd2c7hq.sh`. Cataloged from OSV's OSSF Malicious Packages dataset (which published 2026-04-24, 4 days before the Snyk advisory). Aliases retained: `SNYK-PYTHON-ELEMENTARYDATA-16316110`, `pypi/2026-04-compr-elementary-data/elementary-data`. Full Hard Rule #14 IoC block; precedent-setting first MAL-* entry in the catalog.
58
+
59
+ - **`CVE-2026-42208`** (BerriAI LiteLLM Proxy Auth SQL Injection). CVSS 9.3, **on CISA KEV** (dateAdded 2026-05-08). Crafted Authorization header to any LLM API route reaches a SQL query through the error-logging pathway with the attacker value concatenated rather than parameterised — read/modify the LiteLLM-managed-credentials database without prior auth. Affected: `litellm >= 1.81.16, < 1.83.7`. Patched: 1.83.7+ (parameterised query). Temporary workaround: `general_settings: disable_error_logs: true`. RWEP 65 (P1 / 72h timeline). Operator IoCs: Authorization header > 100 chars or carrying SQL metacharacters; mass key-mint events in LiteLLM logs without admin-UI sessions.
60
+
61
+ - **`CVE-2026-39884`** (Flux159 mcp-server-kubernetes Argument Injection). CVSS 8.3. The `port_forward` MCP tool builds a kubectl command string and `.split(' ')`s it instead of using an argv array, so an AI assistant feeding `resourceName: "pod-name --address=0.0.0.0"` (typically via prompt injection upstream) lands attacker flags in kubectl's argv — binds port-forward to all interfaces or redirects to attacker namespace. Affected: `mcp-server-kubernetes <= 3.4.0`. Patched: 3.5.0+ (argv-array refactor). Operator IoCs: MCP audit logs showing port_forward calls with spaces or `--`/`-n` in resourceName; kubectl port-forward processes with `--address=0.0.0.0` on hosts that don't manually port-forward.
62
+
63
+ Three matching `data/zeroday-lessons.json` entries follow the CVE-2026-45321 lesson shape. Five new control requirements derived from the lessons: NEW-CTRL-011 (GHA script-injection-sink ban), NEW-CTRL-012 (orphan-commit release detection), NEW-CTRL-013 (AI-gateway credential-store isolation), NEW-CTRL-014 (MCP-server argv not shellstring), NEW-CTRL-015 (MCP tool allowlist enforcement).
64
+
65
+ ### One new library-author indicator
66
+
67
+ `gha-workflow-script-injection-sink` flags any `.github/workflows/*.yml` workflow that interpolates an attacker-controllable `${{ github.event.* }}` field directly into a `run:` shell script — the exact sink the elementary-data attack exploited. Detection grep covers `github.event.comment.body`, `github.event.issue.body`, `github.event.issue.title`, `github.event.pull_request.body`, `github.event.pull_request.title`, `github.event.review.body`, `github.event.head_commit.message`, `github.head_ref`, `github.event.discussion.body`, `github.event.discussion.title`. False-positive demotion path: if the workflow captures the value into an `env:` variable first OR runs only on `pull_request` (sandboxed, not `pull_request_target`) with default-read permissions, the sink isn't exploitable. Cross-referenced to MAL-2026-3083.
68
+
69
+ ### Catalog extensions
70
+
71
+ - `data/cwe-catalog.json` gains CWE-506 (Embedded Malicious Code) and CWE-88 (Improper Neutralization of Argument Delimiters). Both backed by the new catalog entries.
72
+ - `data/cve-catalog.json` `_meta.id_conventions` documents the MAL-*/SNYK-*/GHSA-*/RUSTSEC-* identifier shapes the catalog now accepts, the alias-retention convention when MITRE issues a CVE later, and the EPSS limitation (FIRST only indexes CVE identifiers).
73
+
74
+ ### Repository
75
+
76
+ Test count: 441 → 459 (+18: OSV source tests + matching test references for Hard Rule #15 coverage). Predeploy gates: 15/15. Skills: 38/38 signed and verified. No skill bodies changed in this patch.
77
+
3
78
  ## 0.12.9 — 2026-05-13
4
79
 
5
80
  **Patch: post-v0.12.8 audit pass — Hard Rule #15 gate flips blocking, sbom evidence-correlation fix, CVE catalog freshness corrections, and recovery of two v0.12.8 stash-restore casualties.**
package/README.md CHANGED
@@ -135,6 +135,7 @@ You want to refresh CVE/RFC data, run currency checks, or generate reports. Inst
135
135
  npx @blamejs/exceptd-skills doctor # health check
136
136
  npx @blamejs/exceptd-skills refresh --apply --swarm # pull KEV/NVD/EPSS/RFC/GHSA + apply
137
137
  npx @blamejs/exceptd-skills refresh --advisory CVE-2026-45321 # seed one CVE draft from GHSA
138
+ npx @blamejs/exceptd-skills refresh --advisory MAL-2026-3083 # seed via OSV (MAL-/SNYK-/RUSTSEC-/USN-/PYSEC-/GO-/MGASA-/UVI-)
138
139
  npx @blamejs/exceptd-skills refresh --curate CVE-2026-45321 # surface editorial questions for a draft
139
140
  npx @blamejs/exceptd-skills refresh --network # swap data/ from latest signed npm tarball
140
141
  ```
@@ -148,7 +149,7 @@ exceptd help
148
149
 
149
150
  Air-gapped operation: run `exceptd refresh --prefetch` on a connected host, copy the resulting `.cache/upstream/` to the airgap, run `exceptd refresh --from-cache <path> --apply` over there. The vendored upstream snapshots replace every network call.
150
151
 
151
- Fresh-disclosure workflow (v0.12.0): the nightly auto-PR job pulls KEV / NVD / EPSS / IETF / **GHSA** (added in v0.12.0). KEV typically takes days; NVD ~10 days; GHSA fires within hours of disclosure and covers npm + PyPI + Maven + Go + NuGet + …. New CVE IDs land as drafts (`_auto_imported: true`, `_draft: true`) that the catalog validator treats as warnings, not errors — operators get the fresh entry immediately, editorial review (framework gaps, IoCs, ATLAS/ATT&CK refs) follows via `exceptd refresh --curate <CVE-ID>`. For "I want this CVE today, not tomorrow": `exceptd refresh --advisory <CVE-or-GHSA-ID> --apply`.
152
+ Fresh-disclosure workflow (v0.12.0): the nightly auto-PR job pulls KEV / NVD / EPSS / IETF / **GHSA** (added in v0.12.0) / **OSV** (added in v0.12.10). KEV typically takes days; NVD ~10 days; GHSA fires within hours of disclosure and covers npm + PyPI + Maven + Go + NuGet + …; OSV aggregates the OSSF Malicious Packages dataset (`MAL-*` keys) + Snyk + RustSec + Mageia + Ubuntu USN + Go Vuln DB + PYSEC + UVI on top of GHSA — useful for malicious-package compromises that don't have CVEs yet (`exceptd refresh --advisory MAL-2026-3083`). New IDs land as drafts (`_auto_imported: true`, `_draft: true`) that the catalog validator treats as warnings, not errors — operators get the fresh entry immediately, editorial review (framework gaps, IoCs, ATLAS/ATT&CK refs) follows via `exceptd refresh --curate <ID>`. For "I want this advisory today, not tomorrow": `exceptd refresh --advisory <CVE-or-GHSA-or-MAL-or-SNYK-or-RUSTSEC-ID> --apply`.
152
153
 
153
154
  Optional env vars for higher rate budgets:
154
155
 
@@ -157,6 +158,7 @@ Optional env vars for higher rate budgets:
157
158
  | `NVD_API_KEY` | Lifts NVD 2.0 from 5 → 50 requests per 30s window. Free key at <https://nvd.nist.gov/developers/request-an-api-key>. |
158
159
  | `GITHUB_TOKEN` | Lifts GitHub Releases + GHSA from 60 → 5000 requests per hour. |
159
160
  | `EXCEPTD_GHSA_FIXTURE` | Path to a JSON fixture matching the api.github.com/advisories shape. For offline tests + air-gap workflows. |
161
+ | `EXCEPTD_OSV_FIXTURE` | Path to a JSON fixture matching the OSV schema (https://ossf.github.io/osv-schema/). For offline tests + air-gap workflows against the OSV source (added v0.12.10). |
160
162
  | `EXCEPTD_REGISTRY_FIXTURE` | Path to a JSON fixture matching the npm registry response. Used by `doctor --registry-check` + `run --upstream-check` + `refresh --network` for offline testing. |
161
163
 
162
164
  ### 3. Maintainer (extend / sign / publish)
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-13T15:42:51.077Z",
3
+ "generated_at": "2026-05-13T21:19:48.889Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 49,
6
6
  "source_hashes": {
7
- "manifest.json": "9f566f47a27005f91dc31480151ff3c97d62f122569fc4e3b3a298c3d4e29f53",
7
+ "manifest.json": "b7e77cd5de579732b6dd352720557c3ba2ac93f472de50f4e1f861a665a2760b",
8
8
  "data/atlas-ttps.json": "f3f75ff2778a0a2c7d953a21386bc4f265cb2685ce41242eee45f9e9f2a6add6",
9
- "data/cve-catalog.json": "ad92ef439d877b7b201f6ca4f3384d575886c389e2c845c985d17798b45a4ec6",
10
- "data/cwe-catalog.json": "68e22967d39a9e22b82d7ac676125f829b551b2c2f3a9c564d3d942bf4ee6ecb",
9
+ "data/cve-catalog.json": "197f5313d93f0a7225d5ff275e21cbd067b3970a6f2fdc6da35f81c847e8bdee",
10
+ "data/cwe-catalog.json": "19ce1fad3ed0b0687ec9a328b2d6cd1b544eea7f19140234ec1a8467de1f908d",
11
11
  "data/d3fend-catalog.json": "d219520c8d3eb61a270b25ea60f64721035e98a8d5d51d1a4e1f1140d9a586f9",
12
12
  "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
13
13
  "data/exploit-availability.json": "7dad52f459c324c40aa4df7cd9157f6a19f670fdfb9d8f687d777c9d99798668",
14
- "data/framework-control-gaps.json": "8804a10bf77e987453ea76ae717153118dc5cc625f42e98f78213b08fa144f73",
14
+ "data/framework-control-gaps.json": "9240ea4a825090fe2716947f2f6f9171c065a133ef003e04d2fbc4f01fc55bdf",
15
15
  "data/global-frameworks.json": "84fd19061f052e4ccf66308a7b8d3fd38e00325e97e9e5e19e4d9b302c128957",
16
16
  "data/rfc-references.json": "583360bae01e324d752bd28a7d344b4276478381426428d683fc82b0ac19d64a",
17
- "data/zeroday-lessons.json": "0840eacd580d4ee5bd7dc44ccea6d52bfa95096576af0ccf67132eea05bedd55",
17
+ "data/zeroday-lessons.json": "d670e73dfd5237ceb71a56326676d90c05387b9547f8ed6f3a60a153854b444b",
18
18
  "skills/kernel-lpe-triage/skill.md": "e8b8601cd3b66d25150bf17f2edd2ef18f10ca6d81ee62aaf874432ee5bdc4b3",
19
19
  "skills/ai-attack-surface/skill.md": "2775fe50d58d6437fb629b2f796714ef76ff7b86d271ee5bbd4064b9ca0b0ef6",
20
20
  "skills/mcp-agent-trust/skill.md": "de17a4eee67096c737f2eb5972828445021e674fe6c28434cca34d290825739c",
@@ -67,8 +67,8 @@
67
67
  "dlp_refs": 0
68
68
  },
69
69
  "trigger_table_entries": 453,
70
- "chains_cve_entries": 6,
71
- "chains_cwe_entries": 51,
70
+ "chains_cve_entries": 8,
71
+ "chains_cwe_entries": 53,
72
72
  "jurisdictions_indexed": 29,
73
73
  "handoff_dag_nodes": 38,
74
74
  "summary_cards": 38,
@@ -19,7 +19,7 @@
19
19
  "artifact": "data/cve-catalog.json",
20
20
  "path": "data/cve-catalog.json",
21
21
  "schema_version": "1.0.0",
22
- "entry_count": 6
22
+ "entry_count": 9
23
23
  },
24
24
  {
25
25
  "date": "2026-05-13",
@@ -27,7 +27,7 @@
27
27
  "artifact": "data/cwe-catalog.json",
28
28
  "path": "data/cwe-catalog.json",
29
29
  "schema_version": "1.0.0",
30
- "entry_count": 51
30
+ "entry_count": 53
31
31
  },
32
32
  {
33
33
  "date": "2026-05-13",
@@ -37,6 +37,14 @@
37
37
  "schema_version": "1.0.0",
38
38
  "entry_count": 28
39
39
  },
40
+ {
41
+ "date": "2026-05-13",
42
+ "type": "catalog_update",
43
+ "artifact": "data/zeroday-lessons.json",
44
+ "path": "data/zeroday-lessons.json",
45
+ "schema_version": "1.0.0",
46
+ "entry_count": 9
47
+ },
40
48
  {
41
49
  "date": "2026-05-11",
42
50
  "type": "skill_review",
@@ -341,15 +349,7 @@
341
349
  "artifact": "data/framework-control-gaps.json",
342
350
  "path": "data/framework-control-gaps.json",
343
351
  "schema_version": "1.0.0",
344
- "entry_count": 59
345
- },
346
- {
347
- "date": "2026-05-01",
348
- "type": "catalog_update",
349
- "artifact": "data/zeroday-lessons.json",
350
- "path": "data/zeroday-lessons.json",
351
- "schema_version": "1.0.0",
352
- "entry_count": 6
352
+ "entry_count": 61
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": 6,
43
+ "entry_count": 9,
44
44
  "sample_keys": [
45
45
  "CVE-2026-31431",
46
46
  "CVE-2026-43284",
@@ -62,7 +62,7 @@
62
62
  "rebuild_after_days": 365,
63
63
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
64
64
  },
65
- "entry_count": 51,
65
+ "entry_count": 53,
66
66
  "sample_keys": [
67
67
  "CWE-787",
68
68
  "CWE-79",
@@ -150,7 +150,7 @@
150
150
  "rebuild_after_days": 365,
151
151
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
152
152
  },
153
- "entry_count": 59,
153
+ "entry_count": 61,
154
154
  "sample_keys": [
155
155
  "NIST-800-53-SI-2",
156
156
  "NIST-800-53-SC-8",
@@ -207,7 +207,7 @@
207
207
  "path": "data/zeroday-lessons.json",
208
208
  "purpose": "Distilled lessons from notable zero-days and campaigns (SesameOp, Copy Fail, Dirty Frag, Copilot RCE, Windsurf MCP). Each entry: technique, distinguishing characteristic, what it means for the framework lag.",
209
209
  "schema_version": "1.0.0",
210
- "last_updated": "2026-05-01",
210
+ "last_updated": "2026-05-13",
211
211
  "tlp": "CLEAR",
212
212
  "source_confidence_default": "B2",
213
213
  "freshness_policy": {
@@ -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": 6,
219
+ "entry_count": 9,
220
220
  "sample_keys": [
221
221
  "CVE-2026-31431",
222
222
  "CVE-2025-53773",
@@ -1768,6 +1768,57 @@
1768
1768
  "rfc_refs": []
1769
1769
  }
1770
1770
  },
1771
+ "MAL-2026-3083": {
1772
+ "name": "Elementary-Data PyPI Worm (Forged Release via GitHub Actions Script Injection)",
1773
+ "rwep": 45,
1774
+ "cvss": 9.3,
1775
+ "cisa_kev": false,
1776
+ "epss_score": null,
1777
+ "epss_percentile": null,
1778
+ "referencing_skills": [],
1779
+ "chain": {
1780
+ "cwes": [],
1781
+ "atlas": [],
1782
+ "d3fend": [],
1783
+ "framework_gaps": [],
1784
+ "attack_refs": [],
1785
+ "rfc_refs": []
1786
+ }
1787
+ },
1788
+ "CVE-2026-42208": {
1789
+ "name": "BerriAI LiteLLM Proxy Auth SQL Injection",
1790
+ "rwep": 65,
1791
+ "cvss": 9.8,
1792
+ "cisa_kev": true,
1793
+ "epss_score": 0.37368,
1794
+ "epss_percentile": 0.9722,
1795
+ "referencing_skills": [],
1796
+ "chain": {
1797
+ "cwes": [],
1798
+ "atlas": [],
1799
+ "d3fend": [],
1800
+ "framework_gaps": [],
1801
+ "attack_refs": [],
1802
+ "rfc_refs": []
1803
+ }
1804
+ },
1805
+ "CVE-2026-39884": {
1806
+ "name": "Flux159 mcp-server-kubernetes Argument Injection via port_forward",
1807
+ "rwep": 20,
1808
+ "cvss": 8.3,
1809
+ "cisa_kev": false,
1810
+ "epss_score": 0.00039,
1811
+ "epss_percentile": 0.11727,
1812
+ "referencing_skills": [],
1813
+ "chain": {
1814
+ "cwes": [],
1815
+ "atlas": [],
1816
+ "d3fend": [],
1817
+ "framework_gaps": [],
1818
+ "attack_refs": [],
1819
+ "rfc_refs": []
1820
+ }
1821
+ },
1771
1822
  "CWE-787": {
1772
1823
  "name": "Out-of-bounds Write",
1773
1824
  "category": "Memory Safety",
@@ -7386,5 +7437,33 @@
7386
7437
  "rfc_refs": []
7387
7438
  },
7388
7439
  "related_cves": []
7440
+ },
7441
+ "CWE-506": {
7442
+ "name": "Embedded Malicious Code",
7443
+ "category": "Supply Chain",
7444
+ "referencing_skills": [],
7445
+ "skill_count": 0,
7446
+ "chain": {
7447
+ "atlas": [],
7448
+ "attack_refs": [],
7449
+ "framework_gaps": [],
7450
+ "d3fend": [],
7451
+ "rfc_refs": []
7452
+ },
7453
+ "related_cves": []
7454
+ },
7455
+ "CWE-88": {
7456
+ "name": "Improper Neutralization of Argument Delimiters in a Command",
7457
+ "category": "Injection",
7458
+ "referencing_skills": [],
7459
+ "skill_count": 0,
7460
+ "chain": {
7461
+ "atlas": [],
7462
+ "attack_refs": [],
7463
+ "framework_gaps": [],
7464
+ "d3fend": [],
7465
+ "rfc_refs": []
7466
+ },
7467
+ "related_cves": []
7389
7468
  }
7390
7469
  }
@@ -2053,9 +2053,11 @@
2053
2053
  "CWE-338",
2054
2054
  "CWE-353",
2055
2055
  "CWE-426",
2056
+ "CWE-506",
2056
2057
  "CWE-522",
2057
2058
  "CWE-759",
2058
2059
  "CWE-760",
2060
+ "CWE-88",
2059
2061
  "CWE-916"
2060
2062
  ],
2061
2063
  "atlas_refs": [
@@ -2082,7 +2084,9 @@
2082
2084
  "AU-Essential-8-MFA",
2083
2085
  "AU-Essential-8-Patch",
2084
2086
  "EU-AI-Act-Art-15",
2087
+ "EU-CRA-Art13",
2085
2088
  "NIS2-Art21-incident-handling",
2089
+ "NIST-800-53-SI-10",
2086
2090
  "UK-CAF-A1",
2087
2091
  "UK-CAF-B2",
2088
2092
  "UK-CAF-C1",