@blamejs/exceptd-skills 0.12.9 → 0.12.10

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,42 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.10 — 2026-05-13
4
+
5
+ **Patch: OSV.dev wired as an upstream source, three new catalog entries, one new library-author indicator.**
6
+
7
+ ### OSV.dev as a new upstream source
8
+
9
+ `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.
10
+
11
+ 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.
12
+
13
+ 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.
14
+
15
+ 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`.
16
+
17
+ ### Three new catalog entries
18
+
19
+ - **`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.
20
+
21
+ - **`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.
22
+
23
+ - **`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.
24
+
25
+ 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).
26
+
27
+ ### One new library-author indicator
28
+
29
+ `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.
30
+
31
+ ### Catalog extensions
32
+
33
+ - `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.
34
+ - `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).
35
+
36
+ ### Repository
37
+
38
+ 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.
39
+
3
40
  ## 0.12.9 — 2026-05-13
4
41
 
5
42
  **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.**
@@ -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-13T17:30:56.669Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 49,
6
6
  "source_hashes": {
7
- "manifest.json": "9f566f47a27005f91dc31480151ff3c97d62f122569fc4e3b3a298c3d4e29f53",
7
+ "manifest.json": "b7501793892cdfd22ede52a21ec60629d000a5a562373948dd33c1b840776189",
8
8
  "data/atlas-ttps.json": "f3f75ff2778a0a2c7d953a21386bc4f265cb2685ce41242eee45f9e9f2a6add6",
9
- "data/cve-catalog.json": "ad92ef439d877b7b201f6ca4f3384d575886c389e2c845c985d17798b45a4ec6",
10
- "data/cwe-catalog.json": "68e22967d39a9e22b82d7ac676125f829b551b2c2f3a9c564d3d942bf4ee6ecb",
9
+ "data/cve-catalog.json": "e4ee5a94bfab0109c2dbd9531a1cd3ad96ce37ad4ec36523d699beace5b6d5d4",
10
+ "data/cwe-catalog.json": "9d71498894a74a235d2c9dae97d062499529cb031184a4011172bf6dce9f3c3d",
11
11
  "data/d3fend-catalog.json": "d219520c8d3eb61a270b25ea60f64721035e98a8d5d51d1a4e1f1140d9a586f9",
12
12
  "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
13
13
  "data/exploit-availability.json": "7dad52f459c324c40aa4df7cd9157f6a19f670fdfb9d8f687d777c9d99798668",
14
14
  "data/framework-control-gaps.json": "8804a10bf77e987453ea76ae717153118dc5cc625f42e98f78213b08fa144f73",
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",
@@ -343,14 +351,6 @@
343
351
  "schema_version": "1.0.0",
344
352
  "entry_count": 59
345
353
  },
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
353
- },
354
354
  {
355
355
  "date": "2026-05-01",
356
356
  "type": "manifest_review",
@@ -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",
@@ -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": [
@@ -35,7 +35,12 @@
35
35
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
36
36
  },
37
37
  "vendor_advisory_field_added": "2026-05-11",
38
- "vendor_advisory_note": "Each CVE carries a structured vendor_advisories array (vendor, advisory_id, url, severity, published_date) for downstream consumers that route by vendor advisory. Unknown advisory IDs are null with the canonical vendor CVE-resolver URL — never fabricated. Existing free-form references are preserved in verification_sources; vendor_advisories is additive."
38
+ "vendor_advisory_note": "Each CVE carries a structured vendor_advisories array (vendor, advisory_id, url, severity, published_date) for downstream consumers that route by vendor advisory. Unknown advisory IDs are null with the canonical vendor CVE-resolver URL — never fabricated. Existing free-form references are preserved in verification_sources; vendor_advisories is additive.",
39
+ "id_conventions": {
40
+ "default": "CVE-YYYY-NNNNN",
41
+ "non_cve_keys_accepted": ["SNYK-*", "GHSA-*"],
42
+ "note": "Catalog keys are CVE-* by default. For pre-CVE-assignment advisories under active operational impact, the project accepts OSV-native identifier shapes as the canonical key, with cross-references retained in `aliases`: MAL-* (OSSF Malicious Packages dataset — published into OSV.dev; primary key for malicious-package compromises), GHSA-* (GitHub Advisory Database; primary key when the package is on GitHub and no CVE has issued yet), and SNYK-* (Snyk advisory dataset; primary key for advisories Snyk catalogued before OSV/GHSA ingested them). When MITRE issues a CVE, the entry is renamed in lockstep with the matching zeroday-lessons key; the previous identifier is retained in `aliases` so historical references continue to resolve. Precedent: MAL-2026-3083 added 2026-05-13 (the elementary-data PyPI worm, 1.1M monthly downloads, OSV/OSSF-cataloged before any CVE issued). EPSS coverage does not extend to non-CVE identifiers; epss_score is null with a documenting epss_note on such entries. Upstream pull from OSV.dev: `exceptd refresh --source osv` (added v0.12.10)."
43
+ }
39
44
  },
40
45
  "CVE-2026-31431": {
41
46
  "name": "Copy Fail",
@@ -835,5 +840,350 @@
835
840
  ]
836
841
  },
837
842
  "last_updated": "2026-05-13"
843
+ },
844
+ "MAL-2026-3083": {
845
+ "name": "Elementary-Data PyPI Worm (Forged Release via GitHub Actions Script Injection)",
846
+ "type": "RCE-supply-chain",
847
+ "aliases": [
848
+ "SNYK-PYTHON-ELEMENTARYDATA-16316110",
849
+ "pypi/2026-04-compr-elementary-data/elementary-data"
850
+ ],
851
+ "aliases_note": "Primary key is OSV-native MAL-2026-3083 (OSSF Malicious Packages dataset; first publisher 2026-04-24T22:54Z). Snyk SNYK-PYTHON-ELEMENTARYDATA-16316110 and kam193 campaign id pypi/2026-04-compr-elementary-data are cross-references for operator lookup. MITRE has not assigned a CVE id as of 2026-05-13; if one is issued later the catalog key is renamed and aliases retained.",
852
+ "cvss_score": 9.3,
853
+ "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
854
+ "cisa_kev": false,
855
+ "cisa_kev_date": null,
856
+ "poc_available": true,
857
+ "poc_description": "Public forensic writeups + the malicious orphan commit b1e4b1f3aad0d489ab0e9208031c67402bbb8480 still readable on GitHub. The .pth-file install-time payload mechanism is well-understood; the exfiltration domain (skyhanni.cloud subdomain) was active in the wild during the window 2026-04-24 22:20Z through 2026-04-25 ~06:30Z.",
858
+ "ai_discovered": false,
859
+ "ai_assisted_weaponization": false,
860
+ "active_exploitation": "confirmed",
861
+ "active_exploitation_notes": "1.1M monthly downloads — anyone who pip-installed elementary-data==0.23.3 during the 8-hour exposure window was hit. Window: 2026-04-24 22:20Z → 2026-04-25 ~06:30Z.",
862
+ "affected": "elementary-data (PyPI) — data observability tool inside dbt analytics pipelines. ~1.1M monthly downloads.",
863
+ "affected_versions": [
864
+ "elementary-data == 0.23.3"
865
+ ],
866
+ "vector": "GitHub Actions script-injection sink in `.github/workflows/update_pylon_issue.yml`. Workflow interpolated `${{ github.event.comment.body }}` directly into a `run:` shell script — commenting on any open PR was sufficient to execute attacker-controlled shell with the elevated GITHUB_TOKEN. Attacker forged orphan commit b1e4b1f3aad0d489ab0e9208031c67402bbb8480, tagged v0.23.3, and dispatched the legitimate publishing pipeline — producing a properly-signed release pointing at code the maintainers never saw.",
867
+ "complexity": "low",
868
+ "complexity_notes": "Anyone with a GitHub account can comment on a public PR. Self-replicating in pattern: any project running a similar workflow shape (`${{ github.event.* }}` directly in `run:`) is exploitable by the same primitive.",
869
+ "patch_available": true,
870
+ "patch_required_reboot": false,
871
+ "live_patch_available": true,
872
+ "live_patch_tools": [
873
+ "pip uninstall elementary-data && pip install elementary-data==0.23.4 (clean replacement, same-day)",
874
+ "Yank 0.23.3 from any private mirror; PyPI has already yanked the public copy",
875
+ "GHCR :latest re-points to clean image; rebuild any image FROM elementary-data:0.23.3"
876
+ ],
877
+ "framework_control_gaps": {
878
+ "SLSA-L3": "Same shape as CVE-2026-45321 — provenance valid, payload malicious. The publishing pipeline ran on a malicious orphan commit and emitted a legitimate signed release. SLSA-L3 attests WHICH pipeline built the artifact, not that the pipeline was driven by trusted inputs.",
879
+ "NIST-800-53-SA-12": "Supply chain protection treats signed release as the trust anchor. The signature was valid; the input to the signing pipeline was attacker-controlled.",
880
+ "NIST-800-218-PO.4": "Define and use secure development security checks. Direct interpolation of github.event.* into run: scripts is a documented secure-development anti-pattern (GitHub Actions docs explicitly warn against it) but is not framework-enforced.",
881
+ "EU-CRA-Art13": "Required vulnerability handling doesn't address the case where the maintainer was an unwitting publisher.",
882
+ "NIS2-Art21-2d": "Supply chain risk management presumes detectable signal at consumption. Valid signature neutralizes consumer-side checks."
883
+ },
884
+ "atlas_refs": [
885
+ "AML.T0010",
886
+ "AML.T0018",
887
+ "AML.T0055"
888
+ ],
889
+ "attack_refs": [
890
+ "T1195.001",
891
+ "T1195.002",
892
+ "T1078.004",
893
+ "T1552.001",
894
+ "T1059.006"
895
+ ],
896
+ "rwep_score": 45,
897
+ "rwep_factors": {
898
+ "cisa_kev": 0,
899
+ "poc_available": 20,
900
+ "ai_factor": 0,
901
+ "active_exploitation": 20,
902
+ "blast_radius": 30,
903
+ "patch_available": -15,
904
+ "live_patch_available": -10,
905
+ "reboot_required": 0
906
+ },
907
+ "rwep_notes": "Canonical RWEP = 45. Operationally treat as P1 — the 8h mass-exposure window (2026-04-24 22:20Z → 2026-04-25 ~06:30Z) means anyone who installed during that window is affected regardless of whether they later upgraded; credential rotation is required. The RWEP formula caps blast_radius at 30 and has no factor for time-bounded mass-exposure windows; the qualitative narrative here is the authoritative risk signal. CISA KEV listing (when it arrives) will add +25 → 70.",
908
+ "epss_score": null,
909
+ "epss_percentile": null,
910
+ "epss_date": "2026-05-13",
911
+ "epss_source": null,
912
+ "epss_note": "EPSS coverage does not extend to non-CVE advisories. FIRST EPSS API only indexes CVE identifiers; MAL-* / SNYK-* / GHSA-* keys return no data. Re-query and populate epss_score when MITRE assigns a CVE id and the entry is renamed.",
913
+ "cwe_refs": ["CWE-506", "CWE-77", "CWE-94"],
914
+ "source_verified": "2026-05-13",
915
+ "verification_sources": [
916
+ "https://api.osv.dev/v1/query (POST {package:{name:elementary-data,ecosystem:PyPI},version:0.23.3}) — returns MAL-2026-3083",
917
+ "https://security.snyk.io/vuln/SNYK-PYTHON-ELEMENTARYDATA-16316110",
918
+ "https://www.stepsecurity.io/blog/elementary-data-compromised-on-pypi-and-ghcr-forged-release-pushed-via-github-actions-script-injection",
919
+ "https://snyk.io/blog/malicious-release-of-elementary-data-pypi-package-steals-cloud-credentials-from-data-engineers/",
920
+ "https://www.bleepingcomputer.com/news/security/pypi-package-with-11m-monthly-downloads-hacked-to-push-infostealer/",
921
+ "https://www.chainguard.dev/unchained/chainguard-customers-safe-from-elementary-data-compromise",
922
+ "https://www.elementary-data.com/post/security-incident-report-malicious-release-of-elementary-oss-python-cli-v0-23-3",
923
+ "https://bad-packages.kam193.eu/pypi/campaign/2026-04-compr-elementary-data"
924
+ ],
925
+ "vendor_advisories": [
926
+ {
927
+ "vendor": "OSV.dev (OSSF Malicious Packages)",
928
+ "advisory_id": "MAL-2026-3083",
929
+ "url": "https://osv.dev/vulnerability/MAL-2026-3083",
930
+ "severity": "critical",
931
+ "published_date": "2026-04-24"
932
+ },
933
+ {
934
+ "vendor": "Snyk",
935
+ "advisory_id": "SNYK-PYTHON-ELEMENTARYDATA-16316110",
936
+ "url": "https://security.snyk.io/vuln/SNYK-PYTHON-ELEMENTARYDATA-16316110",
937
+ "severity": "critical",
938
+ "published_date": "2026-04-28"
939
+ },
940
+ {
941
+ "vendor": "StepSecurity",
942
+ "advisory_id": null,
943
+ "url": "https://www.stepsecurity.io/blog/elementary-data-compromised-on-pypi-and-ghcr-forged-release-pushed-via-github-actions-script-injection",
944
+ "severity": "critical",
945
+ "published_date": "2026-04-25"
946
+ },
947
+ {
948
+ "vendor": "Elementary Data",
949
+ "advisory_id": null,
950
+ "url": "https://github.com/elementary-data/elementary/issues/2205",
951
+ "severity": "critical",
952
+ "published_date": "2026-04-25"
953
+ }
954
+ ],
955
+ "iocs": {
956
+ "payload_artifacts": [
957
+ "site-packages/elementary.pth (any line starting with `import` — auto-execs on every python invocation; ~245 KB base64-encoded harvester)",
958
+ "PyPI package elementary-data==0.23.3 (yanked; the wheel+sdist differ from 0.23.2 by exactly one file: elementary.pth)",
959
+ "GHCR image elementarydata/elementary-data:latest pre-2026-04-25 — image digest sha256:31ecc5939de6d24cf60c50d4ca26cf7a8c322db82a8ce4bd122ebd89cf634255",
960
+ "Clean baseline: GHCR sha256:b3bbfafde1a0db3a4d47e70eb0eb2ca19daef4a19410154a71abee567b35d3d9"
961
+ ],
962
+ "persistence_artifacts": [
963
+ "$TMPDIR/.trinny-security-update (campaign persistence marker; presence on disk = install-time payload executed)",
964
+ "elementary.pth in any site-packages — Python auto-loads .pth files on interpreter startup"
965
+ ],
966
+ "credential_paths_scanned": [
967
+ "~/.dbt/profiles.yml (dbt warehouse credentials — primary target given elementary's dbt user base)",
968
+ "~/.aws/credentials, application_default_credentials.json (GCP), ~/.azure/",
969
+ "~/.ssh/id_rsa, ~/.ssh/id_ed25519, ~/.git-credentials",
970
+ "~/.docker/config.json, ~/.kube/config, /etc/kubernetes/*.conf",
971
+ "~/.npmrc, ~/.pypirc, ~/.cargo/credentials.toml",
972
+ ".env* files up to 6 directory levels deep",
973
+ "~/.vault-token, ~/.netrc, ~/.pgpass, ~/.my.cnf",
974
+ "/etc/passwd, /etc/shadow, shell history files, /var/log/auth.log",
975
+ "Cryptocurrency wallet files"
976
+ ],
977
+ "c2_indicators": [
978
+ "DNS / outbound HTTPS to igotnofriendsonlineorirl-imgonnakmslmao.skyhanni.cloud (sole exfiltration domain)",
979
+ "Outbound HTTP request carrying header `X-Rise-To-The-Trinny: agree` (campaign tag)",
980
+ "Any outbound from python child of pip / pip install on a host that just installed elementary-data"
981
+ ],
982
+ "supply_chain_entry_vectors": [
983
+ "GitHub repo with any `.github/workflows/*.yml` interpolating `${{ github.event.comment.body }}` / `github.event.issue.body` / `github.event.review.body` directly into a `run: |` block — exploitable by anyone who can comment on a PR/issue",
984
+ "Orphan-commit-driven release: any release tag whose target commit is NOT an ancestor of the default branch — forged via privileged token usage",
985
+ "GitHub repo with `permissions: contents: write` on a workflow that triggers on `issue_comment` / `pull_request_target` / similar untrusted-input triggers"
986
+ ],
987
+ "behavioral": [
988
+ "Brand-new GitHub account (created within 7 days) commenting on a high-download package's open PR with a payload-shaped string (shell metacharacters in a context that gets shell-interpolated)",
989
+ "Release tag pointing at an orphan commit (no path through git rev-list to the default branch)",
990
+ "Workflow run on a public repo where GITHUB_TOKEN.permissions includes contents:write AND the trigger event is issue_comment / pull_request_target",
991
+ "pip install of a major-version-pinned package returning a wheel whose contents differ from the previous patch version by added .pth file"
992
+ ]
993
+ },
994
+ "last_updated": "2026-05-13"
995
+ },
996
+ "CVE-2026-42208": {
997
+ "name": "BerriAI LiteLLM Proxy Auth SQL Injection",
998
+ "type": "RCE-via-sql-injection",
999
+ "cvss_score": 9.8,
1000
+ "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
1001
+ "cvss_v4_score": 9.3,
1002
+ "cvss_v4_vector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
1003
+ "cisa_kev": true,
1004
+ "cisa_kev_date": "2026-05-08",
1005
+ "cisa_kev_due_date": "2026-05-29",
1006
+ "poc_available": true,
1007
+ "poc_description": "GHSA-r75f-5x8p-qvmc documents the sink shape — crafted Authorization header to any LLM API route reaches the vulnerable query through error-handling paths. KEV-listed implies in-wild exploitation evidence.",
1008
+ "ai_discovered": false,
1009
+ "ai_assisted_weaponization": false,
1010
+ "active_exploitation": "confirmed",
1011
+ "active_exploitation_notes": "CISA KEV listing criterion is in-wild exploitation evidence.",
1012
+ "affected": "BerriAI LiteLLM Proxy — open-source LLM-API gateway managing credentials + routing across model providers. Used in front of AI agent stacks, MCP-server fronts, multi-model proxy deployments. Substantial production footprint.",
1013
+ "affected_versions": [
1014
+ "litellm >= 1.81.16",
1015
+ "litellm < 1.83.7"
1016
+ ],
1017
+ "vector": "Authorization header value passed directly into a SQL query in the proxy's auth path. Crafted bearer-token-shape strings reach the error-logging pathway which executes SQL with the attacker-controlled value as a string-concatenated parameter. Result: read/modify the managed-credentials DB without prior auth.",
1018
+ "complexity": "low",
1019
+ "complexity_notes": "Curl-able exploit — POST to /chat/completions with a SQL-injection payload in Authorization. Network-reachable, no auth, no UI.",
1020
+ "patch_available": true,
1021
+ "patch_required_reboot": false,
1022
+ "live_patch_available": true,
1023
+ "live_patch_tools": [
1024
+ "Upgrade to litellm 1.83.7+ (parameterised query — caller-supplied value is now a SQL parameter not a concatenated string)",
1025
+ "Temporary workaround: `general_settings: disable_error_logs: true` removes the error-handling pathway the injection abuses"
1026
+ ],
1027
+ "framework_control_gaps": {
1028
+ "NIST-800-53-SI-10": "Input validation control doesn't address argument-vs-statement distinction in SQL libraries. SI-10 is satisfied by 'we validate inputs' regardless of whether the validation runs before the SQL parameter binding.",
1029
+ "OWASP-LLM01": "Prompt injection control set doesn't address the AI-PROXY backend SQL surface — LiteLLM is the substrate that gates LLM API access, not the LLM itself.",
1030
+ "NIS2-Art21-2e": "Cryptographic measures control doesn't address application-layer SQL injection.",
1031
+ "EU-AI-Act-Art-15": "Robustness + cybersecurity requirement is undefined operationally for AI gateway infrastructure."
1032
+ },
1033
+ "atlas_refs": [
1034
+ "AML.T0055"
1035
+ ],
1036
+ "attack_refs": [
1037
+ "T1190",
1038
+ "T1078.001"
1039
+ ],
1040
+ "rwep_score": 65,
1041
+ "rwep_factors": {
1042
+ "cisa_kev": 25,
1043
+ "poc_available": 20,
1044
+ "ai_factor": 0,
1045
+ "active_exploitation": 20,
1046
+ "blast_radius": 25,
1047
+ "patch_available": -15,
1048
+ "live_patch_available": -10,
1049
+ "reboot_required": 0
1050
+ },
1051
+ "rwep_notes": "Operationally P1 — KEV-listed, network-vector, no auth, full credential DB compromise. AI-stack fleets running LiteLLM as the gateway should patch within the KEV 21-day window at minimum.",
1052
+ "epss_score": 0.37368,
1053
+ "epss_percentile": 0.9722,
1054
+ "epss_date": "2026-05-13",
1055
+ "epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-42208",
1056
+ "cwe_refs": ["CWE-89"],
1057
+ "source_verified": "2026-05-13",
1058
+ "verification_sources": [
1059
+ "https://nvd.nist.gov/vuln/detail/CVE-2026-42208",
1060
+ "https://github.com/BerriAI/litellm/security/advisories/GHSA-r75f-5x8p-qvmc",
1061
+ "https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-42208"
1062
+ ],
1063
+ "vendor_advisories": [
1064
+ {
1065
+ "vendor": "BerriAI",
1066
+ "advisory_id": "GHSA-r75f-5x8p-qvmc",
1067
+ "url": "https://github.com/BerriAI/litellm/security/advisories/GHSA-r75f-5x8p-qvmc",
1068
+ "severity": "critical",
1069
+ "published_date": "2026-05-08"
1070
+ },
1071
+ {
1072
+ "vendor": "CISA KEV",
1073
+ "advisory_id": null,
1074
+ "url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-42208",
1075
+ "severity": "critical",
1076
+ "published_date": "2026-05-08"
1077
+ }
1078
+ ],
1079
+ "iocs": {
1080
+ "payload_artifacts": [
1081
+ "POST /chat/completions with Authorization header value containing SQL-injection metacharacters (`'`, `--`, `OR 1=1`, UNION-based payloads)",
1082
+ "Any HTTP request to a LiteLLM proxy where the Authorization header value is unusually long (> 100 chars) or contains characters outside [A-Za-z0-9\\-_.~+/=]"
1083
+ ],
1084
+ "behavioral": [
1085
+ "LiteLLM proxy db (default sqlite or postgres) showing new rows in the LiteLLM_VerificationToken / LiteLLM_UserTable created without a corresponding admin-UI session",
1086
+ "LiteLLM error logs containing parameterised-SQL failure shapes that include the Authorization header string verbatim (pre-1.83.7 the value lands in error logs in cleartext)",
1087
+ "Outbound network from a LiteLLM proxy host to a model-provider endpoint using a freshly-issued virtual key that has no admin-event history",
1088
+ "Mass key-generation events in LiteLLM logs (the SQLi path includes a key-mint primitive)"
1089
+ ],
1090
+ "c2_indicators": [
1091
+ "Outbound from a LiteLLM proxy host to model-provider endpoints (openai, anthropic, etc.) using virtual keys not minted via the admin UI (compromised proxy uses its own stolen keys to mask attacker traffic as legitimate proxy traffic)"
1092
+ ],
1093
+ "credential_paths_scanned": [
1094
+ "LiteLLM proxy DATABASE_URL-pointed database (sqlite file or postgres connection) — once SQLi reaches the DB, the entire managed-credentials table is read/write",
1095
+ "Environment variables LITELLM_MASTER_KEY, DATABASE_URL on the proxy host"
1096
+ ]
1097
+ },
1098
+ "last_updated": "2026-05-13"
1099
+ },
1100
+ "CVE-2026-39884": {
1101
+ "name": "Flux159 mcp-server-kubernetes Argument Injection via port_forward",
1102
+ "type": "argument-injection",
1103
+ "cvss_score": 8.3,
1104
+ "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L",
1105
+ "cisa_kev": false,
1106
+ "cisa_kev_date": null,
1107
+ "poc_available": true,
1108
+ "poc_description": "GHSA-4xqg-gf5c-ghwq publishes the PoC: invoke port_forward tool with resourceName containing space-delimited kubectl flags. Attacker-controllable args reach kubectl via .split(' ') concatenation in startPortForward() / executeKubectlCommandAsync().",
1109
+ "ai_discovered": false,
1110
+ "ai_assisted_weaponization": false,
1111
+ "active_exploitation": "suspected",
1112
+ "active_exploitation_notes": "No public exploitation evidence as of 2026-05-13, but the MCP-server ecosystem has known opportunistic-scan history. Treated as suspected.",
1113
+ "affected": "Flux159 mcp-server-kubernetes — MCP server giving AI assistants kubectl control. Installed in AI agent stacks that talk to Kubernetes clusters.",
1114
+ "affected_versions": [
1115
+ "mcp-server-kubernetes <= 3.4.0"
1116
+ ],
1117
+ "vector": "AI assistant invokes the port_forward MCP tool with resourceName='pod-name --address=0.0.0.0' or similar. The MCP server builds a string-form kubectl command and uses .split(' ') instead of an args array — the attacker-controlled flag lands as a distinct argv entry to kubectl. --address=0.0.0.0 binds the port-forward to all interfaces; -n kube-system redirects to attacker-chosen namespace.",
1118
+ "complexity": "low",
1119
+ "complexity_notes": "Only requires the AI assistant to be tricked (prompt injection in retrieved docs / commit messages / MCP tool responses) into passing a tainted resourceName. PR-injection / RAG-poisoning surface upstream gates exploitation.",
1120
+ "patch_available": true,
1121
+ "patch_required_reboot": false,
1122
+ "live_patch_available": true,
1123
+ "live_patch_tools": [
1124
+ "Upgrade mcp-server-kubernetes to 3.5.0+ (argv-array refactor)",
1125
+ "Until patched: disable the port_forward tool in MCP allowlist (most operator deployments don't rely on it)"
1126
+ ],
1127
+ "framework_control_gaps": {
1128
+ "NIST-800-53-SI-10": "Input validation control doesn't address the argv-vs-string boundary that argument injection exploits — many MCP servers concatenate user input into shell commands without registering this as a code-review failure.",
1129
+ "OWASP-LLM01": "Prompt-injection-as-access-control gap — the attacker doesn't compromise the MCP server directly; they feed adversarial input that the AI passes through.",
1130
+ "NIS2-Art21-2g": "Patch management presumes traditional CVE timelines; MCP plugin ecosystem patch awareness lags."
1131
+ },
1132
+ "atlas_refs": [
1133
+ "AML.T0053",
1134
+ "AML.T0051"
1135
+ ],
1136
+ "attack_refs": [
1137
+ "T1059",
1138
+ "T1078"
1139
+ ],
1140
+ "rwep_score": 20,
1141
+ "rwep_factors": {
1142
+ "cisa_kev": 0,
1143
+ "poc_available": 20,
1144
+ "ai_factor": 0,
1145
+ "active_exploitation": 10,
1146
+ "blast_radius": 15,
1147
+ "patch_available": -15,
1148
+ "live_patch_available": -10,
1149
+ "reboot_required": 0
1150
+ },
1151
+ "rwep_notes": "P3 — patch available, mitigation via tool disable, but the class (AI-mediated argument injection into infrastructure tools) is operationally important to track.",
1152
+ "epss_score": 0.00039,
1153
+ "epss_percentile": 0.11727,
1154
+ "epss_date": "2026-05-13",
1155
+ "epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-39884",
1156
+ "cwe_refs": ["CWE-88"],
1157
+ "source_verified": "2026-05-13",
1158
+ "verification_sources": [
1159
+ "https://nvd.nist.gov/vuln/detail/CVE-2026-39884",
1160
+ "https://github.com/Flux159/mcp-server-kubernetes/security/advisories/GHSA-4xqg-gf5c-ghwq"
1161
+ ],
1162
+ "vendor_advisories": [
1163
+ {
1164
+ "vendor": "Flux159",
1165
+ "advisory_id": "GHSA-4xqg-gf5c-ghwq",
1166
+ "url": "https://github.com/Flux159/mcp-server-kubernetes/security/advisories/GHSA-4xqg-gf5c-ghwq",
1167
+ "severity": "high",
1168
+ "published_date": "2026-04-15"
1169
+ }
1170
+ ],
1171
+ "iocs": {
1172
+ "payload_artifacts": [
1173
+ "src/tools/port_forward.ts startPortForward() / executeKubectlCommandAsync() in any version <= 3.4.0 — calls `.split(' ')` on user-input-concatenated command string",
1174
+ "dist/tools/port_forward.js — compiled artifact in installed package"
1175
+ ],
1176
+ "behavioral": [
1177
+ "MCP audit log showing port_forward tool calls with resourceName containing spaces or kubectl flag prefixes (`--`, `-n`)",
1178
+ "kubectl port-forward processes with --address=0.0.0.0 on hosts that never invoke port-forward manually",
1179
+ "kubectl port-forward processes targeting kube-system / kube-public namespaces when the operator's intended namespace was a workload namespace",
1180
+ "Multiple -n flags in a single kubectl invocation (split-by-space duplicate-flag injection signature)"
1181
+ ],
1182
+ "runtime_syscall": [
1183
+ "execve of kubectl with argv containing /^--address=/ from a parent process in node_modules/mcp-server-kubernetes/dist/",
1184
+ "Network listener bound to 0.0.0.0:<port> by a kubectl process on a host that should only port-forward to localhost"
1185
+ ]
1186
+ },
1187
+ "last_updated": "2026-05-13"
838
1188
  }
839
1189
  }