@blamejs/exceptd-skills 0.12.8 → 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/AGENTS.md +2 -2
- package/ARCHITECTURE.md +21 -5
- package/CHANGELOG.md +120 -0
- package/README.md +1 -1
- package/bin/exceptd.js +227 -17
- package/data/_indexes/_meta.json +20 -20
- package/data/_indexes/activity-feed.json +17 -17
- package/data/_indexes/catalog-summaries.json +5 -5
- package/data/_indexes/chains.json +90 -11
- package/data/_indexes/frequency.json +2 -0
- package/data/_indexes/section-offsets.json +463 -355
- package/data/_indexes/token-budget.json +113 -53
- package/data/cve-catalog.json +385 -23
- package/data/cwe-catalog.json +34 -0
- package/data/playbooks/library-author.json +14 -0
- package/data/playbooks/mcp.json +1 -0
- package/data/zeroday-lessons.json +223 -1
- package/lib/playbook-runner.js +119 -35
- package/lib/prefetch.js +27 -6
- package/lib/refresh-external.js +81 -18
- package/lib/source-osv.js +493 -0
- package/manifest-snapshot.json +1 -1
- package/manifest.json +51 -51
- package/orchestrator/index.js +1 -1
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
- package/scripts/check-test-coverage.js +27 -6
- package/scripts/predeploy.js +7 -9
- package/skills/ai-attack-surface/skill.md +25 -0
- package/skills/ai-c2-detection/skill.md +24 -0
- package/skills/compliance-theater/skill.md +6 -0
- package/skills/exploit-scoring/skill.md +6 -0
- package/skills/mcp-agent-trust/skill.md +24 -0
- package/skills/policy-exception-gen/skill.md +6 -0
- package/skills/rag-pipeline-security/skill.md +28 -2
- package/skills/researcher/skill.md +6 -0
- package/skills/security-maturity-tiers/skill.md +6 -0
- package/skills/skill-update-loop/skill.md +6 -0
- package/skills/threat-model-currency/skill.md +4 -0
- package/skills/zeroday-gap-learn/skill.md +6 -0
package/data/cve-catalog.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_meta": {
|
|
3
3
|
"schema_version": "1.0.0",
|
|
4
|
-
"last_updated": "2026-05-
|
|
4
|
+
"last_updated": "2026-05-13",
|
|
5
5
|
"source": "NVD + CISA KEV + vendor advisories — see sources/index.json",
|
|
6
6
|
"required_fields": [
|
|
7
7
|
"type",
|
|
@@ -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",
|
|
@@ -43,8 +48,9 @@
|
|
|
43
48
|
"cvss_score": 7.8,
|
|
44
49
|
"cvss_vector": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
|
|
45
50
|
"cisa_kev": true,
|
|
46
|
-
"cisa_kev_date": "2026-
|
|
47
|
-
"cisa_kev_due_date": "2026-
|
|
51
|
+
"cisa_kev_date": "2026-05-01",
|
|
52
|
+
"cisa_kev_due_date": "2026-05-15",
|
|
53
|
+
"cisa_kev_date_correction_note": "v0.12.9 (2026-05-13): catalog previously stored 2026-03-15 / due 2026-04-05. CISA KEV JSON authoritative is dateAdded 2026-05-01 / dueDate 2026-05-15 (source: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json filtered for CVE-2026-31431). The catalog was running six weeks ahead of the real KEV listing; downstream framework-SLA computations were anchored on a date that hadn't yet been authoritative.",
|
|
48
54
|
"poc_available": true,
|
|
49
55
|
"poc_description": "Public exploit script — single-stage, 732 bytes, no race condition, deterministic root escalation from any unprivileged user or container",
|
|
50
56
|
"ai_discovered": true,
|
|
@@ -91,11 +97,13 @@
|
|
|
91
97
|
"live_patch_available": -10,
|
|
92
98
|
"reboot_required": 5
|
|
93
99
|
},
|
|
94
|
-
"epss_score": 0.
|
|
95
|
-
"epss_percentile": 0.
|
|
96
|
-
"epss_date": "2026-05-
|
|
100
|
+
"epss_score": 0.0257,
|
|
101
|
+
"epss_percentile": 0.8569,
|
|
102
|
+
"epss_date": "2026-05-13",
|
|
97
103
|
"epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-31431",
|
|
98
|
-
"
|
|
104
|
+
"epss_correction_note": "v0.12.9: refreshed from live FIRST API. Catalog previously stored 0.94 / 0.99 (estimate for newly-published CVE; EPSS model cold-start). Live values reflect post-disclosure exploitation telemetry through 2026-05-13.",
|
|
105
|
+
"cwe_refs": ["CWE-669"],
|
|
106
|
+
"source_verified": "2026-05-13",
|
|
99
107
|
"verification_sources": [
|
|
100
108
|
"https://nvd.nist.gov/vuln/detail/CVE-2026-31431",
|
|
101
109
|
"https://www.cisa.gov/known-exploited-vulnerabilities-catalog"
|
|
@@ -180,8 +188,11 @@
|
|
|
180
188
|
"CVE-2026-43284": {
|
|
181
189
|
"name": "Dirty Frag (ESP/IPsec component)",
|
|
182
190
|
"type": "LPE",
|
|
183
|
-
"cvss_score":
|
|
184
|
-
"cvss_vector": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:
|
|
191
|
+
"cvss_score": 8.8,
|
|
192
|
+
"cvss_vector": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
|
|
193
|
+
"cvss_correction_note": "v0.12.9 (2026-05-13): catalog previously stored 7.8 / Scope:U. NVD secondary CVSS block authoritative is 8.8 / Scope:C (Scope: Changed — kernel→user-namespace breakout is in-scope, which supports the container-escape framing). Source: https://nvd.nist.gov/vuln/detail/CVE-2026-43284. The lower-scored block remains valid for compatibility readers; the higher block is the operational risk floor.",
|
|
194
|
+
"cvss_score_alternate": 7.8,
|
|
195
|
+
"cvss_vector_alternate": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
|
|
185
196
|
"cisa_kev": false,
|
|
186
197
|
"cisa_kev_date": null,
|
|
187
198
|
"poc_available": true,
|
|
@@ -222,11 +233,13 @@
|
|
|
222
233
|
"live_patch_available": 0,
|
|
223
234
|
"reboot_required": 5
|
|
224
235
|
},
|
|
225
|
-
"epss_score": 0.
|
|
226
|
-
"epss_percentile": 0.
|
|
227
|
-
"epss_date": "2026-05-
|
|
236
|
+
"epss_score": 0.00007,
|
|
237
|
+
"epss_percentile": 0.0051,
|
|
238
|
+
"epss_date": "2026-05-13",
|
|
228
239
|
"epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-43284",
|
|
229
|
-
"
|
|
240
|
+
"epss_correction_note": "v0.12.9: refreshed from live FIRST API. Previous values (0.18 / 0.88) were estimates for the newly-published CVE; cold-start EPSS routinely overstates newly-cataloged kernel CVEs.",
|
|
241
|
+
"cwe_refs": ["CWE-123"],
|
|
242
|
+
"source_verified": "2026-05-13",
|
|
230
243
|
"verification_sources": [
|
|
231
244
|
"https://nvd.nist.gov/vuln/detail/CVE-2026-43284"
|
|
232
245
|
],
|
|
@@ -346,11 +359,13 @@
|
|
|
346
359
|
"live_patch_available": 0,
|
|
347
360
|
"reboot_required": 5
|
|
348
361
|
},
|
|
349
|
-
"epss_score": 0.
|
|
350
|
-
"epss_percentile": 0.
|
|
351
|
-
"epss_date": "2026-05-
|
|
362
|
+
"epss_score": 0.0001,
|
|
363
|
+
"epss_percentile": 0.0115,
|
|
364
|
+
"epss_date": "2026-05-13",
|
|
352
365
|
"epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-43500",
|
|
353
|
-
"
|
|
366
|
+
"epss_correction_note": "v0.12.9: refreshed from live FIRST API (cold-start cleanup).",
|
|
367
|
+
"cwe_refs": ["CWE-787"],
|
|
368
|
+
"source_verified": "2026-05-13",
|
|
354
369
|
"verification_sources": [
|
|
355
370
|
"https://nvd.nist.gov/vuln/detail/CVE-2026-43500"
|
|
356
371
|
],
|
|
@@ -553,10 +568,11 @@
|
|
|
553
568
|
"last_updated": "2026-05-13"
|
|
554
569
|
},
|
|
555
570
|
"CVE-2026-30615": {
|
|
556
|
-
"name": "Windsurf MCP
|
|
571
|
+
"name": "Windsurf MCP Local-Vector RCE via Adversarial Tool Response",
|
|
557
572
|
"type": "RCE-supply-chain",
|
|
558
|
-
"cvss_score":
|
|
559
|
-
"cvss_vector": "CVSS:3.1/AV:
|
|
573
|
+
"cvss_score": 8.0,
|
|
574
|
+
"cvss_vector": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H",
|
|
575
|
+
"cvss_correction_note": "v0.12.9 (2026-05-13): catalog previously stored CVSS 9.8 / AV:N. NVD authoritative is 8.0 / AV:L (local attack vector; attacker must control HTML content the Windsurf MCP client processes — not a network-vector zero-interaction RCE as initially cataloged). Source: https://nvd.nist.gov/vuln/detail/CVE-2026-30615 (published 2026-04-15, last_modified 2026-04-27, vulnStatus: Deferred). Recompute RWEP with blast_radius reduced from 30→20 to reflect local-vector + Scope:U.",
|
|
560
576
|
"cisa_kev": false,
|
|
561
577
|
"cisa_kev_date": null,
|
|
562
578
|
"poc_available": true,
|
|
@@ -722,10 +738,11 @@
|
|
|
722
738
|
"reboot_required": 0
|
|
723
739
|
},
|
|
724
740
|
"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).",
|
|
725
|
-
"epss_score": 0.
|
|
726
|
-
"epss_percentile": 0.
|
|
741
|
+
"epss_score": 0.00039,
|
|
742
|
+
"epss_percentile": 0.1179,
|
|
727
743
|
"epss_date": "2026-05-13",
|
|
728
744
|
"epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-45321",
|
|
745
|
+
"epss_correction_note": "v0.12.9: refreshed from live FIRST API. Previous values (0.78 / 0.97) were cold-start estimates inconsistent with confirmed in-wild exploitation; the qualitative narrative (rwep_notes above) remains the authoritative risk signal — raw EPSS underreports newly-disclosed worm payload classes.",
|
|
729
746
|
"source_verified": "2026-05-13",
|
|
730
747
|
"verification_sources": [
|
|
731
748
|
"https://nvd.nist.gov/vuln/detail/CVE-2026-45321",
|
|
@@ -823,5 +840,350 @@
|
|
|
823
840
|
]
|
|
824
841
|
},
|
|
825
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"
|
|
826
1188
|
}
|
|
827
1189
|
}
|
package/data/cwe-catalog.json
CHANGED
|
@@ -1302,5 +1302,39 @@
|
|
|
1302
1302
|
"real_requirement": "Argon2id (memory-hard, RFC 9106) with tuned m/t/p; scrypt as fallback; bcrypt with work factor ≥ 12 acceptable for legacy. PBKDF2 only with iteration count ≥ 600,000 (NIST SP 800-63B 2022 update).",
|
|
1303
1303
|
"lag_notes": "SP 800-63B updated iteration guidance in 2022; many compliance attestations still cite the 2017 numbers. Argon2id is RFC-9106 (2021) but absent from FIPS-approved lists, creating policy friction in federal contexts.",
|
|
1304
1304
|
"last_verified": "2026-05-13"
|
|
1305
|
+
},
|
|
1306
|
+
"CWE-506": {
|
|
1307
|
+
"id": "CWE-506",
|
|
1308
|
+
"name": "Embedded Malicious Code",
|
|
1309
|
+
"abstraction": "Class",
|
|
1310
|
+
"category": "Supply Chain",
|
|
1311
|
+
"description": "The application contains code that appears to perform a legitimate function but actually contains a payload that performs an additional, attacker-controlled action — typically credential theft, persistence, or remote loader logic. The class covers package-registry malware (PyPI / npm / RubyGems / Cargo / Maven typosquats, compromised maintainer accounts, forged-release-via-CI vectors).",
|
|
1312
|
+
"top_25_rank_2024": null,
|
|
1313
|
+
"top_25_rank_2025": null,
|
|
1314
|
+
"view_memberships": ["CWE-1000"],
|
|
1315
|
+
"related_attack_patterns_capec": ["CAPEC-442", "CAPEC-446", "CAPEC-538"],
|
|
1316
|
+
"skills_referencing": ["library-author", "supply-chain-integrity"],
|
|
1317
|
+
"evidence_cves": ["CVE-2026-45321", "MAL-2026-3083"],
|
|
1318
|
+
"framework_controls_partially_addressing": ["NIST-800-53-SA-12", "NIST-800-218-PS.1", "ISO-27001-2022-A.8.30", "SLSA-Level-3"],
|
|
1319
|
+
"real_requirement": "Provenance attestation at install time (Sigstore, in-toto, SLSA L3+); registry-side malware scanning on every uploaded artifact; install-time .pth / postinstall / preinstall hook auditing; differential analysis between consecutive releases of the same package (added files, new network egress, new file reads); cooldown periods on new releases of high-download packages so registry scanners and community detection have time to fire before mass install.",
|
|
1320
|
+
"lag_notes": "SA-12 contemplates the traditional supply chain but does not require differential-analysis between adjacent releases. The elementary-data 0.23.3 attack (April 2026) added exactly one file (a `.pth` install-time payload) versus 0.23.2 — a difference any naive diff would catch but no registry-side scanner currently runs at upload time by default.",
|
|
1321
|
+
"last_verified": "2026-05-13"
|
|
1322
|
+
},
|
|
1323
|
+
"CWE-88": {
|
|
1324
|
+
"id": "CWE-88",
|
|
1325
|
+
"name": "Improper Neutralization of Argument Delimiters in a Command",
|
|
1326
|
+
"abstraction": "Base",
|
|
1327
|
+
"category": "Injection",
|
|
1328
|
+
"description": "The product constructs a string for a downstream command (typically by concatenating user input into a shell command line, then splitting on whitespace to argv) without escaping argument-delimiter characters. Distinguished from CWE-77 (Command Injection) by the narrower attack surface: the attacker cannot run arbitrary commands but CAN inject additional flags / arguments to a command the application already invokes, which is often sufficient to break the security model (redirect kubectl to attacker-control, change kubectl namespace, etc.).",
|
|
1329
|
+
"top_25_rank_2024": null,
|
|
1330
|
+
"top_25_rank_2025": null,
|
|
1331
|
+
"view_memberships": ["CWE-1000", "CWE-1003"],
|
|
1332
|
+
"related_attack_patterns_capec": ["CAPEC-460"],
|
|
1333
|
+
"skills_referencing": ["mcp-agent-trust", "container-runtime-security"],
|
|
1334
|
+
"evidence_cves": ["CVE-2026-39884"],
|
|
1335
|
+
"framework_controls_partially_addressing": ["NIST-800-53-SI-10"],
|
|
1336
|
+
"real_requirement": "Pass arguments to spawned processes as an array, not a string. When a string-form command is unavoidable, use the runtime's argument-list API (Node `child_process.spawn(cmd, argsArray)`, Python `subprocess.run([cmd, ...args])`) or a vetted escape function. Linter rule that flags any `.split(' ')` followed by `spawn`/`exec` on user-tainted input.",
|
|
1337
|
+
"lag_notes": "SI-10 addresses input validation categorically but does not specify the argv-vs-string boundary that argument injection exploits. Many MCP servers and CI runners string-concatenate user input into shell commands without registering this as a code-review failure mode.",
|
|
1338
|
+
"last_verified": "2026-05-13"
|
|
1305
1339
|
}
|
|
1306
1340
|
}
|
|
@@ -757,6 +757,20 @@
|
|
|
757
757
|
"deterministic": true,
|
|
758
758
|
"attack_ref": "T1195.002"
|
|
759
759
|
},
|
|
760
|
+
{
|
|
761
|
+
"id": "gha-workflow-script-injection-sink",
|
|
762
|
+
"type": "file_path",
|
|
763
|
+
"value": "Within the release-workflows artifact (any file under .github/workflows/*.yml): a `run:` shell script body directly interpolates an attacker-controllable github.event field — ${{ 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 }} — without first capturing the value into an env: variable. Grep regex (multi-line YAML aware): `run:\\s*\\|[\\s\\S]*?\\$\\{\\{\\s*github\\.(event\\.(comment|issue|pull_request|review|head_commit|discussion)\\.|head_ref)`. Corroborate via the branch-tag-protection artifact: if any workflow with this sink also triggers on `pull_request_target` / `issue_comment` / `pull_request_review_comment` AND its job has `permissions: contents: write` (or unrestricted GITHUB_TOKEN), the sink is exploitable by any GitHub user who can comment on the repo.",
|
|
764
|
+
"description": "GitHub Actions script-injection sink. Elementary-data 0.23.3 (April 2026) was forged via this exact pattern — `${{ github.event.comment.body }}` interpolated into a `run:` block in update_pylon_issue.yml, escalated via the workflow's GITHUB_TOKEN to publish a malicious release. Without this indicator, a publisher account compromise via attacker-controlled comments looks identical to a clean release at the consumer side.",
|
|
765
|
+
"confidence": "deterministic",
|
|
766
|
+
"deterministic": true,
|
|
767
|
+
"false_positive_checks_required": [
|
|
768
|
+
"If the run: block reads the github.event field via an `env:` variable first (env: COMMENT_BODY: ${{ github.event.comment.body }}) and then references $COMMENT_BODY in the shell — that is the documented-safe pattern; demote to miss.",
|
|
769
|
+
"If the workflow only runs in a sandboxed `pull_request` event (not `pull_request_target`) AND has default `permissions: contents: read` AND does not use secrets.* — the sink is not exploitable; demote to miss."
|
|
770
|
+
],
|
|
771
|
+
"attack_ref": "T1195.001",
|
|
772
|
+
"cve_ref": "MAL-2026-3083"
|
|
773
|
+
},
|
|
760
774
|
{
|
|
761
775
|
"id": "publish-workflow-no-id-token-write",
|
|
762
776
|
"type": "file_path",
|