@blamejs/exceptd-skills 0.15.50 → 0.15.52
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 +10 -0
- package/NOTICE +1 -1
- package/bin/exceptd.js +1 -1
- package/data/_indexes/_meta.json +10 -10
- package/data/_indexes/activity-feed.json +2 -2
- package/data/_indexes/catalog-summaries.json +6 -6
- package/data/_indexes/chains.json +775 -0
- package/data/_indexes/section-offsets.json +25 -25
- package/data/_indexes/token-budget.json +9 -9
- package/data/attack-techniques.json +30 -9
- package/data/cve-catalog.json +455 -7
- package/data/cwe-catalog.json +15 -5
- package/data/framework-control-gaps.json +29 -10
- package/data/playbooks/sbom.json +150 -1
- package/data/zeroday-lessons.json +251 -1
- package/lib/prefetch.js +2 -2
- package/manifest.json +45 -45
- package/package.json +1 -1
- package/sbom.cdx.json +59 -44
- package/scripts/check-changelog-extract.js +158 -0
- package/scripts/check-test-coverage.README.md +1 -1
- package/scripts/check-test-coverage.js +3 -3
- package/scripts/check-version-tags.js +31 -2
- package/scripts/predeploy.js +13 -0
- package/scripts/release.js +5 -0
- package/scripts/verify-shipped-tarball.js +1 -1
- package/skills/supply-chain-integrity/skill.md +2 -0
package/data/cve-catalog.json
CHANGED
|
@@ -55,12 +55,13 @@
|
|
|
55
55
|
"ai_discovery_methodology": {
|
|
56
56
|
"field_added": "2026-05-15",
|
|
57
57
|
"agents_md_target": "Hard Rule #7 — '41% of 2025 zero-days were AI-discovered'. Catalog target rate floor: 0.40.",
|
|
58
|
-
"current_rate": 0.
|
|
59
|
-
"current_floor_enforced_by_test": 0.
|
|
58
|
+
"current_rate": 0.0279,
|
|
59
|
+
"current_floor_enforced_by_test": 0.027,
|
|
60
60
|
"ladder_to_target": [
|
|
61
|
+
0.027,
|
|
61
62
|
0.028,
|
|
62
63
|
0.029,
|
|
63
|
-
|
|
64
|
+
0.03,
|
|
64
65
|
0.05,
|
|
65
66
|
0.1,
|
|
66
67
|
0.15,
|
|
@@ -68,7 +69,7 @@
|
|
|
68
69
|
0.3,
|
|
69
70
|
0.4
|
|
70
71
|
],
|
|
71
|
-
"floor_correction_note": "v0.13.4: floor dropped from 0.15 → 0.13 after the v0.13.4 cleanup removed two stuck-draft CVEs (MAL-2026-ANTHROPIC-MCP-STDIO duplicate of CVE-2026-30623 + CVE-2026-GTIG-AI-2FA embargoed placeholder). The GTIG entry was the only ai_discovered=true of the two; catalog observed rate fell from 6/40 (0.15) to 5/38 (0.132). Floor is reset below the new observed rate to keep the test honest, and a new 0.13 rung is prepended to the ladder so monotonic non-decreasing is preserved without rewriting prior rungs. Prior correction note: v0.12.31 floor dropped 0.20 → 0.15 after the cycle-11 intake added six ai_discovered=false entries. v0.13.17: catalog grew 68 -> 72 with 4 non-AI Nightmare-Eclipse entries; observed rate falls from 12/68 (0.176) to 12/72 (0.208). Floor unchanged at 0.13 — still under observed. v0.13.17: catalog grew 72 -> 232 via CISA KEV bulk import; observed rate drops from 0.208 (15/72) to 0.065 (15/232) because KEV records lack AI-attribution metadata. Floor reset to 0.05 with new prepended ladder rung; existing rungs preserved. v0.13.17 round-2: catalog grew further to 312 via additional KEV bulk import; observed rate 0.038 (12/312). Floor lowered to 0.03 with a new prepended ladder rung to keep the test honest under bulk-import dilution. Prior rungs preserved; the 0.40 target ladder is unchanged. AI-attribution backfill for the 240 bulk-imported entries is operator-curation work in future cycles. v0.13.113: catalog grew to 402; observed rate 12/402 (0.0299) fell just under the 0.03 floor, so the floor was lowered to 0.029 with a prepended 0.029 ladder rung (prior rungs and the 0.40 target preserved). v0.13.122: AI-ecosystem CVE tranches grew the catalog to 414; observed rate 12/414 (0.0290) fell just under the 0.029 floor, so the floor was lowered to 0.028 with a prepended 0.028 ladder rung (prior rungs and the 0.40 target preserved). v0.14.27: three non-AI CI/CD supply-chain entries grew the catalog to 423; observed rate 12/423 (0.0284), current_rate updated 0.029 -> 0.028; floor unchanged at 0.028 (still under observed).",
|
|
72
|
+
"floor_correction_note": "v0.13.4: floor dropped from 0.15 → 0.13 after the v0.13.4 cleanup removed two stuck-draft CVEs (MAL-2026-ANTHROPIC-MCP-STDIO duplicate of CVE-2026-30623 + CVE-2026-GTIG-AI-2FA embargoed placeholder). The GTIG entry was the only ai_discovered=true of the two; catalog observed rate fell from 6/40 (0.15) to 5/38 (0.132). Floor is reset below the new observed rate to keep the test honest, and a new 0.13 rung is prepended to the ladder so monotonic non-decreasing is preserved without rewriting prior rungs. Prior correction note: v0.12.31 floor dropped 0.20 → 0.15 after the cycle-11 intake added six ai_discovered=false entries. v0.13.17: catalog grew 68 -> 72 with 4 non-AI Nightmare-Eclipse entries; observed rate falls from 12/68 (0.176) to 12/72 (0.208). Floor unchanged at 0.13 — still under observed. v0.13.17: catalog grew 72 -> 232 via CISA KEV bulk import; observed rate drops from 0.208 (15/72) to 0.065 (15/232) because KEV records lack AI-attribution metadata. Floor reset to 0.05 with new prepended ladder rung; existing rungs preserved. v0.13.17 round-2: catalog grew further to 312 via additional KEV bulk import; observed rate 0.038 (12/312). Floor lowered to 0.03 with a new prepended ladder rung to keep the test honest under bulk-import dilution. Prior rungs preserved; the 0.40 target ladder is unchanged. AI-attribution backfill for the 240 bulk-imported entries is operator-curation work in future cycles. v0.13.113: catalog grew to 402; observed rate 12/402 (0.0299) fell just under the 0.03 floor, so the floor was lowered to 0.029 with a prepended 0.029 ladder rung (prior rungs and the 0.40 target preserved). v0.13.122: AI-ecosystem CVE tranches grew the catalog to 414; observed rate 12/414 (0.0290) fell just under the 0.029 floor, so the floor was lowered to 0.028 with a prepended 0.028 ladder rung (prior rungs and the 0.40 target preserved). v0.14.27: three non-AI CI/CD supply-chain entries grew the catalog to 423; observed rate 12/423 (0.0284), current_rate updated 0.029 -> 0.028; floor unchanged at 0.028 (still under observed). v0.15.51: three non-AI supply-chain entries (CVE-2022-23812 node-ipc protestware + MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM + MAL-2026-MOIKA-DEPCONFUSION) grew the catalog to 430; observed rate 12/430 (0.0279) fell just under the 0.028 floor, so the floor was lowered to 0.027 with a prepended 0.027 ladder rung (prior rungs and the 0.40 target preserved).",
|
|
72
73
|
"ladder_note": "Test floor advances when each rung is exceeded with a margin (>= floor + 0.05). Surfaces incremental tightening without coincidence-passing failures.",
|
|
73
74
|
"gap_explanation": "Catalog skews toward 2024 vendor-disclosed CVEs (xz-utils, runc, CRI-O, MLflow, containerd, SolarWinds, Citrix, ConnectWise) and Pwn2Own Ireland 2025 entries (Synacktiv, DEVCORE, Summoning Team, CyCraft) where AI-tooling involvement was either not used or not credited in the public disclosure. The 41% figure in AGENTS.md Hard Rule #7 reflects the broader 2025 zero-day population reported by Google Threat Intelligence Group; catalog membership is curated against a different sampling frame (operational impact + framework-coverage need) and so will lag the population-level rate.",
|
|
74
75
|
"discovery_source_enum": [
|
|
@@ -92,6 +93,453 @@
|
|
|
92
93
|
},
|
|
93
94
|
"last_threat_review": "2026-05-30"
|
|
94
95
|
},
|
|
96
|
+
"CVE-2022-23812": {
|
|
97
|
+
"name": "node-ipc geo-targeted file-wiper protestware (RU/BY heart-emoji overwrite; peacenotwar dropper in 11.0.0+)",
|
|
98
|
+
"type": "supply-chain-protestware-wiper",
|
|
99
|
+
"cvss_score": 9.8,
|
|
100
|
+
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
|
101
|
+
"cvss_correction_note": "NVD-assigned 9.8 CRITICAL (published 2022-03-16). Vector verbatim from NVD / GHSA-97m3-w2cp-4xx6. RWEP (below) captures the geo-gating that the worst-case CVSS base score does not. NVD scopes the bundled peacenotwar protestware (11.0.0+) under this same CVE id.",
|
|
102
|
+
"cisa_kev": false,
|
|
103
|
+
"cisa_kev_date": null,
|
|
104
|
+
"kev_scope_note": "Local grep of .cache/upstream/kev/known_exploited_vulnerabilities.json (catalogVersion 2026.05.13, 1590 entries) for CVE-2022-23812 returned 0 matches (cross-checked against 130 CVE-2022 entries present, so the 0 is a true absence). CISA KEV historically excludes npm-ecosystem malicious-package events lacking a federally-deployable product; cisa_kev:false is correct.",
|
|
105
|
+
"poc_available": true,
|
|
106
|
+
"poc_description": "Live malicious payload — node-ipc 10.1.1 and 10.1.2 (published 2022-03-07/08 by maintainer RIAEvangelist) shipped the file-overwrite logic to the public npm registry and were installable before npm removal. The malicious build IS the PoC; source preserved in archival mirrors and analyzed by Snyk (SNYK-JS-NODEIPC-2426370) and Orca (2022).",
|
|
107
|
+
"ai_discovered": false,
|
|
108
|
+
"ai_discovery_source": "human_researcher",
|
|
109
|
+
"ai_discovery_notes": "Community / vendor analysis of the published versions within hours (Snyk, GitHub Security Lab, Vue CLI consumers). No AI tool credited; with ai_discovered:false the schema prescribes human_researcher.",
|
|
110
|
+
"ai_assisted_weaponization": false,
|
|
111
|
+
"ai_assisted_notes": "Hand-authored JavaScript by the package maintainer (geo-IP check + recursive file overwrite). No AI-generated-code fingerprint reported.",
|
|
112
|
+
"active_exploitation": "suspected",
|
|
113
|
+
"active_exploitation_notes": "Sources (Snyk, Orca, NVD) document the PRESENCE of the destructive payload in published versions and broad exposure (node-ipc was a transitive dependency of Vue CLI), but none cite confirmed real-world victim file-wiping in RU/BY — Orca explicitly notes no documented cases of actual file deletion. Scored \"suspected\" rather than \"confirmed\": exposure via dependency resolution is not the same as observed exploitation (the MAL-2026-NODE-IPC-STEALER sibling earns \"confirmed\" only because Datadog/Socket observed live consumer installs).",
|
|
114
|
+
"affected": "node-ipc package on npm. Destructive RU/BY file-overwrite payload in 10.1.1 / 10.1.2 (published 2022-03-07/08 by maintainer RIAEvangelist / Brandon Nozaki Miller); removed in 10.1.3. NVD additionally scopes the bundled peacenotwar protestware (WITH-LOVE-FROM-AMERICA.txt desktop drop) into 11.0.0+. node-ipc carried ~1M+ weekly downloads and was a transitive dependency of Vue CLI, broadening exposure across the JS ecosystem.",
|
|
115
|
+
"affected_versions": [
|
|
116
|
+
"node-ipc == 10.1.1 (destructive RU/BY file-wiper, published 2022-03-07)",
|
|
117
|
+
"node-ipc == 10.1.2 (destructive RU/BY file-wiper, published 2022-03-08)",
|
|
118
|
+
"node-ipc >= 11.0.0 (NVD-scoped peacenotwar protestware dropper)"
|
|
119
|
+
],
|
|
120
|
+
"vector": "Maintainer-authored sabotage (insider supply-chain). The legitimate node-ipc maintainer added code to the published package that, on require('node-ipc'), resolved the host's public-IP geolocation and, if in Russia or Belarus, recursively overwrote writable files with a heart character. A follow-on change bundled the peacenotwar module dropping a WITH-LOVE-FROM-AMERICA.txt protest file. The payload fires on module load (NOT a postinstall hook) — consumer-side --ignore-scripts does NOT mitigate. Class: trusted-maintainer protestware/sabotage, distinct from account-takeover (MAL-2026-NODE-IPC-STEALER) and typosquat (MAL-2025-PYPI-COLORAMA-SOLANA-STEALER).",
|
|
121
|
+
"complexity": "low",
|
|
122
|
+
"complexity_notes": "Payload fires automatically on module load in any consumer (direct or transitive via Vue CLI). --ignore-scripts does not mitigate (main-module, not postinstall). Maintainer-side: trivially reproducible by any package owner with publish rights.",
|
|
123
|
+
"patch_available": true,
|
|
124
|
+
"patch_required_reboot": false,
|
|
125
|
+
"live_patch_available": false,
|
|
126
|
+
"live_patch_tools": [],
|
|
127
|
+
"vendor_update_paths": [
|
|
128
|
+
"Upgrade node-ipc to 10.1.3+ (destructive payload removed) and pin; for the 11.0.0+ peacenotwar range, pin to a pre-11.0.0 line or a maintained fork if the protest-file drop is unacceptable",
|
|
129
|
+
"Use npm ci with a lockfile predating 2022-03-07 to refuse the malicious versions",
|
|
130
|
+
"Audit for the heart-character overwrite IoC on any RU/BY-geolocated host that installed 10.1.1 / 10.1.2"
|
|
131
|
+
],
|
|
132
|
+
"framework_control_gaps": {
|
|
133
|
+
"NIST-800-218-SSDF": "Reused-OSS-component controls assume maintainer good-faith; they do not address trusted-maintainer protestware/sabotage as a supply-chain risk class.",
|
|
134
|
+
"EU-CRA-Art13": "SBOM / component-inventory records what resolved, not whether a trusted maintainer shipped a destructive payload — a pinned malicious version is SBOM-compliant.",
|
|
135
|
+
"NIS2-Art21-supply-chain": "Generic supply-chain controls without npm-ecosystem specifics (main-module-vs-postinstall payload distinction, maintainer-intent / geopolitical-sabotage risk).",
|
|
136
|
+
"UK-CAF-B4": "Outcome-based supply-chain principle does not prescribe defense against insider-maintainer sabotage of a public dependency.",
|
|
137
|
+
"ISO-27001-2022-A.5.21": "ICT-supply-chain control manages supplier risk but does not frame a trusted upstream maintainer shipping a destructive payload (insider sabotage) as a supply-chain risk."
|
|
138
|
+
},
|
|
139
|
+
"atlas_refs": [],
|
|
140
|
+
"attack_refs": [
|
|
141
|
+
"T1195.001",
|
|
142
|
+
"T1485"
|
|
143
|
+
],
|
|
144
|
+
"attack_refs_note": "T1195.001 (Compromise Software Dependencies and Development Tools) = the supply-chain delivery; T1485 (Data Destruction) = the geo-targeted recursive file overwrite. No ATLAS ref: this is not an AI/ML attack.",
|
|
145
|
+
"rwep_score": 27,
|
|
146
|
+
"rwep_factors": {
|
|
147
|
+
"cisa_kev": 0,
|
|
148
|
+
"poc_available": 20,
|
|
149
|
+
"ai_factor": 0,
|
|
150
|
+
"active_exploitation": 10,
|
|
151
|
+
"blast_radius": 12,
|
|
152
|
+
"patch_available": -15,
|
|
153
|
+
"live_patch_available": 0,
|
|
154
|
+
"reboot_required": 0
|
|
155
|
+
},
|
|
156
|
+
"rwep_rationale": "Sum = 0+20+0+10+12-15+0+0 = 27 (Shape-B, verified vs lib/scoring.js). poc_available=20 (live payload). active_exploitation=10 ('suspected' ladder x0.5x20 — presence documented, victim impact not confirmed). blast_radius=12 — broad download EXPOSURE (~1M weekly, transitive via Vue CLI) but the DESTRUCTIVE payload is geo-gated to RU/BY, narrowing real blast vs the global MAL-2026-NODE-IPC-STEALER's 28. patch_available=-15 (10.1.3 removed it). live_patch_available=0 (no registry-side live-patch tooling for a 2022 incident). Below the 2026 stealer's 43, reflecting geo-gated impact and no confirmed exploitation.",
|
|
157
|
+
"epss_score": null,
|
|
158
|
+
"epss_date": "2026-05-30",
|
|
159
|
+
"epss_note": "EPSS coverage is not carried for this 2022 npm malicious-package CVE; null.",
|
|
160
|
+
"cwe_refs": [
|
|
161
|
+
"CWE-506"
|
|
162
|
+
],
|
|
163
|
+
"source_verified": "2026-05-30",
|
|
164
|
+
"verification_sources": [
|
|
165
|
+
"https://nvd.nist.gov/vuln/detail/CVE-2022-23812",
|
|
166
|
+
"https://github.com/advisories/GHSA-97m3-w2cp-4xx6",
|
|
167
|
+
"https://security.snyk.io/vuln/SNYK-JS-NODEIPC-2426370",
|
|
168
|
+
"https://orca.security/resources/blog/cve-2022-23812-protestware-malicious-code-node-ipc-npm-package/",
|
|
169
|
+
"https://tag-security.cncf.io/community/catalog/compromises/2022/node-ipc-peacenotwar/"
|
|
170
|
+
],
|
|
171
|
+
"vendor_advisories": [
|
|
172
|
+
{
|
|
173
|
+
"vendor": "GitHub Advisory Database (npm)",
|
|
174
|
+
"advisory_id": "GHSA-97m3-w2cp-4xx6",
|
|
175
|
+
"url": "https://github.com/advisories/GHSA-97m3-w2cp-4xx6",
|
|
176
|
+
"severity": "critical",
|
|
177
|
+
"published_date": "2022-03-16"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"vendor": "Snyk",
|
|
181
|
+
"advisory_id": "SNYK-JS-NODEIPC-2426370",
|
|
182
|
+
"url": "https://security.snyk.io/vuln/SNYK-JS-NODEIPC-2426370",
|
|
183
|
+
"severity": "critical",
|
|
184
|
+
"published_date": "2022-03-15"
|
|
185
|
+
}
|
|
186
|
+
],
|
|
187
|
+
"iocs": {
|
|
188
|
+
"payload_artifacts": [
|
|
189
|
+
"Recursive overwrite of writable files with the heart/emoji character on hosts geolocated to Russia/Belarus (node-ipc 10.1.1 / 10.1.2)",
|
|
190
|
+
"WITH-LOVE-FROM-AMERICA.txt dropped on the desktop by the bundled peacenotwar module (node-ipc 11.0.0+ / peacenotwar dependency)"
|
|
191
|
+
],
|
|
192
|
+
"behavioral": [
|
|
193
|
+
"On require('node-ipc'), an outbound public-IP geolocation lookup followed by recursive filesystem writes when the host resolves to RU/BY",
|
|
194
|
+
"Presence of node-ipc 10.1.1 or 10.1.2 in a lockfile resolved from the public registry"
|
|
195
|
+
],
|
|
196
|
+
"forensic_note": "Main-module payload (not postinstall) — --ignore-scripts does not prevent it. The heart-character file overwrite is the destructive IoC; the WITH-LOVE-FROM-AMERICA.txt desktop file is the non-destructive protestware IoC."
|
|
197
|
+
},
|
|
198
|
+
"last_updated": "2026-05-30",
|
|
199
|
+
"discovery_attribution_note": "Disclosed by community / vendor analysis (Snyk, GitHub Security Lab) within hours of the 2022-03-07/08 publish. NVD scopes the destructive RU/BY payload (10.1.1 / 10.1.2) and the peacenotwar protest dropper (11.0.0+) together under CVE-2022-23812. Not AI-discovered.",
|
|
200
|
+
"remediation_status": "patched_upstream",
|
|
201
|
+
"remediation_note": "node-ipc 10.1.3 removed the destructive payload (2022-03-08). The 11.0.0+ peacenotwar protestware remained per NVD scoping. Novel defended class for this catalog: trusted-maintainer protestware / sabotage of a high-reach dependency (the catalog previously had account-takeover and typosquat supply-chain classes, not insider-maintainer sabotage).",
|
|
202
|
+
"remediation_status_verified_at": "2026-05-30",
|
|
203
|
+
"_editorial_note": "CVE-2022-23812 intake: first trusted-maintainer-protestware/sabotage entry in the catalog. Distinct from MAL-2026-NODE-IPC-STEALER (account-recovery takeover, credential-stealer): this is the original maintainer authoring a geo-targeted destructive payload. Paired zeroday-lesson generates NEW-CTRL-114 (main-module-payload detection — the --ignore-scripts blind spot)."
|
|
204
|
+
},
|
|
205
|
+
"MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM": {
|
|
206
|
+
"name": "TrapDoor cross-ecosystem crypto-stealer + AI-assistant poisoning campaign (npm/PyPI/crates.io)",
|
|
207
|
+
"type": "supply-chain-credential-stealer",
|
|
208
|
+
"primary_id": "MAL-2026-4207",
|
|
209
|
+
"additional_osv_ids": [
|
|
210
|
+
"MAL-2026-4207 (npm eth-wallet-sentinel; alias GHSA-7r6r-hqg7-f6mq)",
|
|
211
|
+
"MAL-2026-4218 (npm solidity-deploy-guard; alias GHSA-3r5j-pgc5-q23x)",
|
|
212
|
+
"MAL-2026-4220 (npm web3-secrets-detector; alias GHSA-qc99-w9r4-jrg5)",
|
|
213
|
+
"MAL-2026-4282 (npm prompt-engineering-toolkit; alias GHSA-5frg-fmcq-p9cg)",
|
|
214
|
+
"MAL-2026-4259 (PyPI cryptowallet-safety)",
|
|
215
|
+
"MAL-2026-4260 (PyPI defi-risk-scanner)",
|
|
216
|
+
"MAL-2026-4261 (PyPI eth-security-auditor)"
|
|
217
|
+
],
|
|
218
|
+
"cvss_score": 9.3,
|
|
219
|
+
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L",
|
|
220
|
+
"cvss_correction_note": "No NVD CVE assigned as of 2026-05-30; CVSS synthesized per OSSF Malicious-Packages convention. AV:N (payload reaches victim via npm/PyPI/crates.io registry channel); UI:R (developer/CI runs install, import, or `cargo build`); S:C (exfiltrated AWS/GitHub/SSH/wallet material + AI-assistant prompt-injection extends blast radius beyond the consuming process). A:L rather than A:H — this is a stealer, not a wiper/ransom payload. Synthesized, marked UNVERIFIED-as-formal-CVSS.",
|
|
221
|
+
"cisa_kev": false,
|
|
222
|
+
"cisa_kev_date": null,
|
|
223
|
+
"kev_scope_note": "CISA KEV scope excludes ecosystem malicious-package campaigns without an assigned NVD CVE. Local grep of known_exploited_vulnerabilities.json (catalogVersion 2026.05.13) for MAL-2026-4207, GHSA-7r6r-hqg7-f6mq, and 'trapdoor' returned 0. cisa_kev:false is correct; active_exploitation:confirmed reflects live registry payloads. Consume OpenSSF MAL feed + Socket/Amazon Inspector advisories for this class.",
|
|
224
|
+
"poc_available": true,
|
|
225
|
+
"poc_description": "Live payload. trap-core.js (48,485 bytes / 1,149 lines) shipped across the campaign (19 npm packages per The Hacker News; the GHSA-7r6r-hqg7-f6mq anchor cluster covers 10 npm packages by maintainer ddjidd5640, published 2026-05-19..21); PyPI variants auto-execute on import via `node -e` pulling JS from ddjidd564.github.io; crates.io variants run via build.rs at compile time, XOR-encrypting keystores with hardcoded key 'cargo-build-helper-2026' and exfiltrating to GitHub Gists. The malicious build IS the PoC. [Socket, 2026-05; OSV MAL-2026-4207, 2026-05-26]",
|
|
226
|
+
"ai_discovered": false,
|
|
227
|
+
"ai_discovery_source": "vendor_research",
|
|
228
|
+
"ai_discovery_notes": "Discovered by Socket behavioral/cross-registry detection (median 5m27s, fastest 58s after publication). No AI tool credited for discovery. ai_discovery_source=vendor_research (enum lacks 'ecosystem_detection'). [Socket, 2026-05]",
|
|
229
|
+
"ai_assisted_weaponization": true,
|
|
230
|
+
"ai_assisted_notes": "Novel AI-attack vector: the payload plants .cursorrules and CLAUDE.md files containing instructions hidden with zero-width Unicode characters, designed to trick AI coding assistants (Cursor, Claude Code) into running a fake 'security scan' that discovers and exfiltrates local secrets. This is AI-assistant prompt-injection as a weaponization channel, distinct from AI-generated payload code. [Socket, 2026-05; The Hacker News, 2026-05] — maps ATLAS AML.T0051 (LLM prompt injection).",
|
|
231
|
+
"active_exploitation": "confirmed",
|
|
232
|
+
"active_exploitation_notes": "Socket observed live installable packages across 384+ versions during the campaign window; some removed, others still live at time of Socket reporting. Amazon Inspector independently catalogued per-version malicious tarballs (IN-MAL-2026-003711..004092). [Socket 2026-05; OSV/Amazon Inspector 2026-05-26]",
|
|
233
|
+
"affected": "34+ packages / 384+ versions across three registries. npm (19 campaign-wide / 10 in the GHSA-7r6r anchor cluster, publisher cluster incl. 'asdxzxc' per Socket and 'ddjidd5640'/1623682356@qq.com per OSV — see actor-account note): async-pipeline-builder, build-scripts-utils, chain-key-validator, crypto-credential-scanner, defi-env-auditor, defi-threat-scanner, deployment-key-auditor, dev-env-bootstrapper, eth-wallet-sentinel, llm-context-compressor, mnemonic-safety-check, model-switch-router, node-setup-helpers, project-init-tools, prompt-engineering-toolkit, solidity-deploy-guard, token-usage-tracker, wallet-backup-verifier, wallet-security-checker, web3-secrets-detector, workspace-config-loader. PyPI (7, accounts asdmini67/dae5411): cryptowallet-safety, data-pipeline-check, defi-risk-scanner, env-loader-cli, eth-security-auditor, git-config-sync, solidity-build-guard. crates.io (6): move-analyzer-build, move-compiler-tools, move-project-builder, sui-framework-helpers, sui-move-build-helper, sui-sdk-build-utils. Targets crypto/DeFi/Solana/Sui/Aptos and AI-tooling developers.",
|
|
234
|
+
"actor_account_note": "UNVERIFIED reconciliation: Socket names npm user 'asdxzxc'; OSV/GHSA names npm maintainer 'ddjidd5640' (1623682356@qq.com). Both tie to C2 ddjidd564.github.io — co-actor accounts in one cluster. Exact account↔package mapping not fully reconcilable across the two primary sources.",
|
|
235
|
+
"vector": "Cross-ecosystem coordinated publish. npm: postinstall executes trap-core.js. PyPI: auto-execute on import — downloads JS from attacker GitHub Pages and runs via `node -e` (lets attacker mutate behavior without republishing). crates.io: build.rs runs at compile time, locates keystores, XOR-encrypts (key 'cargo-build-helper-2026'), exfiltrates to GitHub Gists. All variants: scan for SSH/AWS/GitHub/cloud creds + crypto-wallet extension data (Coinbase, Binance, MetaMask, Brave) + browser data + env vars; validate stolen AWS/GitHub tokens via API; attempt SSH lateral movement; plant persistence (git hooks, shell hooks, systemd, cron, SSH) AND AI-assistant poisoning files (.cursorrules, CLAUDE.md). C2 webhook fetched from ddjidd564.github.io/defi-security-best-practices/config.json (fallback webhook.site).",
|
|
236
|
+
"complexity": "low",
|
|
237
|
+
"complexity_notes": "Consumer-side execution automatic on install (npm postinstall), import (PyPI), or compile (crates build.rs). `--ignore-scripts` mitigates npm postinstall but NOT the PyPI import-time or crates build-time triggers. Lure-package naming (security-tool / MCP-server themes) lowers social-engineering cost.",
|
|
238
|
+
"patch_available": true,
|
|
239
|
+
"patch_required_reboot": false,
|
|
240
|
+
"live_patch_available": true,
|
|
241
|
+
"live_patch_tools": [
|
|
242
|
+
"Socket (registry-side install-time blocking)",
|
|
243
|
+
"npm audit / pip-audit / cargo-audit (advisory-driven, post OSV ingest)",
|
|
244
|
+
"Amazon Inspector (IN-MAL-2026-* per-version detection)",
|
|
245
|
+
"StepSecurity Harden-Runner (CI egress + install-time blocking)"
|
|
246
|
+
],
|
|
247
|
+
"vendor_update_paths": [
|
|
248
|
+
"Remove any of the 34 named packages; rotate ALL credentials reachable from a host that installed/imported/compiled them during the 2026-05-19..post-removal window",
|
|
249
|
+
"Audit .cursorrules and CLAUDE.md in any repo touched by these packages for zero-width-Unicode-hidden instructions",
|
|
250
|
+
"Lockfile/Cargo.lock/requirements audit against the named version set"
|
|
251
|
+
],
|
|
252
|
+
"framework_control_gaps": {
|
|
253
|
+
"EU-AI-Act-Art15": "Robustness/accuracy controls for AI systems do not address adversarial prompt-injection planted in repo config files (.cursorrules/CLAUDE.md) that subvert a developer's AI coding assistant into exfiltrating secrets.",
|
|
254
|
+
"NIS2-Art21-supply-chain": "Generic supply-chain controls; no guidance on cross-ecosystem coordinated campaigns or on AI-assistant config-file poisoning as a supply-chain vector.",
|
|
255
|
+
"DORA-Art28": "ICT third-party risk controls assume vendor relationships, not transitive OSS lure-packages auto-executing on import/build.",
|
|
256
|
+
"UK-CAF-B4": "Supply-chain principle does not cover build-time (build.rs) or import-time auto-execution distinct from install-time hooks.",
|
|
257
|
+
"ISO-27001-2022-A.5.21": "ICT-supply-chain control does not address the developer-workstation AI-assistant trust boundary or cross-ecosystem lure packages auto-executing on import/compile.",
|
|
258
|
+
"NIST-800-218-SSDF-PW.4": "Reused-component controls assume install-time review; no coverage of AI-assistant config poisoning or compile-time crates triggers."
|
|
259
|
+
},
|
|
260
|
+
"atlas_refs": [
|
|
261
|
+
"AML.T0051",
|
|
262
|
+
"AML.T0010",
|
|
263
|
+
"AML.T0020"
|
|
264
|
+
],
|
|
265
|
+
"attack_refs": [
|
|
266
|
+
"T1195.001",
|
|
267
|
+
"T1195.002",
|
|
268
|
+
"T1552.001",
|
|
269
|
+
"T1552.004",
|
|
270
|
+
"T1078.004",
|
|
271
|
+
"T1059.007",
|
|
272
|
+
"T1567.001"
|
|
273
|
+
],
|
|
274
|
+
"rwep_score": 55,
|
|
275
|
+
"rwep_factors": {
|
|
276
|
+
"cisa_kev": 0,
|
|
277
|
+
"poc_available": 20,
|
|
278
|
+
"ai_factor": 15,
|
|
279
|
+
"active_exploitation": 20,
|
|
280
|
+
"blast_radius": 25,
|
|
281
|
+
"patch_available": -15,
|
|
282
|
+
"live_patch_available": -10,
|
|
283
|
+
"reboot_required": 0
|
|
284
|
+
},
|
|
285
|
+
"rwep_rationale": "Shape-B stored sum = 0+20+15+20+25-15-10+0 = 55 (verified against lib/scoring.js RWEP_WEIGHTS). poc_available=20 (live payload). ai_factor=15 (AI-assistant prompt-injection weaponization via .cursorrules/CLAUDE.md — ai_assisted_weaponization=true). active_exploitation=20 ('confirmed' ladder; live installable packages observed). blast_radius=25 (34+ packages / 384+ versions / 3 ecosystems — broad campaign, but lure packages carry low individual download counts, so below node-ipc's 28 which sat on a single 3.35M-download core dependency). patch_available=-15 + live_patch_available=-10 (registry removals + Socket/Inspector blocking). Higher than node-ipc's 43 — the AI-assistant poisoning vector (+15 ai_factor that node-ipc lacked) is the delta and the entry's differentiator.",
|
|
286
|
+
"epss_score": null,
|
|
287
|
+
"epss_date": "2026-05-30",
|
|
288
|
+
"epss_note": "EPSS coverage does not extend to non-CVE OSSF-MAL identifiers as of 2026-05-30.",
|
|
289
|
+
"cwe_refs": [
|
|
290
|
+
"CWE-506",
|
|
291
|
+
"CWE-829",
|
|
292
|
+
"CWE-94",
|
|
293
|
+
"CWE-1357"
|
|
294
|
+
],
|
|
295
|
+
"source_verified": "2026-05-30",
|
|
296
|
+
"verification_sources": [
|
|
297
|
+
"https://socket.dev/blog/trapdoor-crypto-stealer-npm-pypi-crates",
|
|
298
|
+
"https://thehackernews.com/2026/05/trapdoor-supply-chain-attack-spreads.html",
|
|
299
|
+
"https://api.osv.dev/v1/vulns/MAL-2026-4207",
|
|
300
|
+
"https://github.com/advisories/GHSA-7r6r-hqg7-f6mq",
|
|
301
|
+
"https://socradar.io/blog/trapdoor-npm-pypi-cratesio-secrets-ai-tooling/",
|
|
302
|
+
"https://www.csoonline.com/article/4177019/trapdoor-malware-campaign-puts-developer-workstations-in-ciso-spotlight.html"
|
|
303
|
+
],
|
|
304
|
+
"vendor_advisories": [
|
|
305
|
+
{
|
|
306
|
+
"vendor": "GitHub Advisory Database (npm)",
|
|
307
|
+
"advisory_id": "GHSA-7r6r-hqg7-f6mq",
|
|
308
|
+
"url": "https://github.com/advisories/GHSA-7r6r-hqg7-f6mq",
|
|
309
|
+
"severity": "critical",
|
|
310
|
+
"published_date": "2026-05-21"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"vendor": "OpenSSF Malicious-Packages (OSV)",
|
|
314
|
+
"advisory_id": "MAL-2026-4207",
|
|
315
|
+
"url": "https://osv.dev/vulnerability/MAL-2026-4207",
|
|
316
|
+
"severity": "critical",
|
|
317
|
+
"published_date": "2026-05-21"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"vendor": "Amazon Inspector",
|
|
321
|
+
"advisory_id": "IN-MAL-2026-003711",
|
|
322
|
+
"url": "https://osv.dev/vulnerability/MAL-2026-4207",
|
|
323
|
+
"severity": "critical",
|
|
324
|
+
"published_date": "2026-05-26"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"vendor": "Socket",
|
|
328
|
+
"advisory_id": null,
|
|
329
|
+
"url": "https://socket.dev/blog/trapdoor-crypto-stealer-npm-pypi-crates",
|
|
330
|
+
"severity": "critical",
|
|
331
|
+
"published_date": "2026-05-25"
|
|
332
|
+
}
|
|
333
|
+
],
|
|
334
|
+
"iocs": {
|
|
335
|
+
"c2_infrastructure": [
|
|
336
|
+
"ddjidd564.github.io (GitHub Pages C2 / dynamic-config host)",
|
|
337
|
+
"ddjidd564.github.io/defi-security-best-practices/config.json (webhook URL config)",
|
|
338
|
+
"ddjidd564.github.io/defi-security-best-practices/ (PyPI remote-JS source)",
|
|
339
|
+
"webhook.site/8d334... (hardcoded fallback C2 — full token truncated in OSV details, marked UNVERIFIED-full-value)",
|
|
340
|
+
"GitHub account: ddjidd564 (Gist exfil destination for crates.io variant)"
|
|
341
|
+
],
|
|
342
|
+
"payload_artifacts": [
|
|
343
|
+
"trap-core.js — 48,485 bytes, 1,149 lines (shared npm payload)",
|
|
344
|
+
"Per-version SHA-256 tarball hashes catalogued by Amazon Inspector (e.g. eth-wallet-sentinel@2.1.2 = 17ddaa9a220790ae56841039efcd19f37774dd0c9e9047f7f1db0d0b6fd3f650; full set in OSV MAL-2026-4207 database_specific)",
|
|
345
|
+
"crates.io XOR key: cargo-build-helper-2026; build.rs compile-time trigger",
|
|
346
|
+
"Campaign marker string: P-2024-001"
|
|
347
|
+
],
|
|
348
|
+
"ai_assistant_poisoning": [
|
|
349
|
+
".cursorrules and CLAUDE.md files written into the project containing instructions hidden with zero-width Unicode characters (U+200B/U+200C/U+200D class) that instruct the AI assistant to run a fake 'security scan' triggering local-secret discovery + exfiltration"
|
|
350
|
+
],
|
|
351
|
+
"behavioral": [
|
|
352
|
+
"postinstall (npm) / import-time `node -e` (PyPI) / build.rs (crates) executing credential-scan over ~/.aws, ~/.ssh, GitHub tokens, browser crypto-wallet-extension stores (Coinbase/Binance/MetaMask/Brave), env vars",
|
|
353
|
+
"Outbound to ddjidd564.github.io for dynamic C2 config; Gist POST for crates exfil",
|
|
354
|
+
"AWS/GitHub token-validation API calls from a process that just resolved one of the named packages"
|
|
355
|
+
],
|
|
356
|
+
"forensic_note": "PyPI variant pulls live JS at import time so the on-disk package may not contain the final payload — capture network/DNS to ddjidd564.github.io and snapshot any written .cursorrules/CLAUDE.md before remediating. Zero-width Unicode in repo config is the AI-assistant-poisoning forensic artifact."
|
|
357
|
+
},
|
|
358
|
+
"last_updated": "2026-05-30",
|
|
359
|
+
"discovery_attribution_note": "Discovered and named by Socket (cross-registry behavioral detection, median 5m27s to detect). Corroborated by The Hacker News, CSO Online, SOCRadar, Phoenix Security. Primary machine-readable ids from OSV.dev (OpenSSF malicious-packages / GHSA-malware feed + Amazon Inspector). Discovery class: ecosystem-detection (telemetry-driven, no AI tool on defender side). crates.io packages NOT yet present in OSV as of 2026-05-30 query — their MAL-* ids are UNVERIFIED/pending; only npm + PyPI ids confirmed.",
|
|
360
|
+
"remediation_status": "partially_removed_from_registry",
|
|
361
|
+
"remediation_note": "Reported to npm/PyPI/crates.io; some versions removed, others live at Socket's reporting time. Novel defended class: AI-coding-assistant config-file prompt-injection (.cursorrules/CLAUDE.md zero-width Unicode) as a supply-chain exfiltration vector — candidate for a new zeroday-lessons control (AI-ASSISTANT-CONFIG-POISONING-DETECTION).",
|
|
362
|
+
"remediation_status_verified_at": "2026-05-30",
|
|
363
|
+
"affected_versions": [
|
|
364
|
+
"npm: 19 lure packages across the campaign (10 in the GHSA-7r6r-hqg7-f6mq anchor cluster, by maintainer ddjidd5640, published 2026-05-19..21) — all published versions of the named packages are malicious (e.g. eth-wallet-sentinel@2.1.2, SHA-256 in OSV MAL-2026-4207)",
|
|
365
|
+
"PyPI: cryptowallet-safety / defi-risk-scanner / eth-security-auditor (earliest eth-security-auditor@0.1.0, 2026-05-22) — all published versions malicious (OSV MAL-2026-4259/4260/4261)",
|
|
366
|
+
"crates.io: move-* / sui-* build-helper packages — all published versions malicious; no OSV MAL-* assigned as of 2026-05-30 (UNVERIFIED pending OSV coverage)"
|
|
367
|
+
]
|
|
368
|
+
},
|
|
369
|
+
"MAL-2026-MOIKA-DEPCONFUSION": {
|
|
370
|
+
"name": "oob.moika.tech dependency-confusion credential-exfiltration campaign (internal-scope namespace squat)",
|
|
371
|
+
"type": "supply-chain-dependency-confusion",
|
|
372
|
+
"cvss_score": 8.6,
|
|
373
|
+
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N",
|
|
374
|
+
"cvss_correction_note": "No NVD CVE assigned as of 2026-05-30; OSV tracks the campaign as per-package MAL-* records (e.g. MAL-2026-4952 / MAL-2026-4978 / MAL-2026-5032), each aliased to an unscored GHSA malicious-package advisory. CVSS synthesized per OSSF Malicious-Packages convention: unauthenticated code execution on `npm install` when a victim's private internal package name resolves to the attacker's inflated-version public scoped package. AV:N (payload reaches the victim over the npm registry channel); UI:R (a developer / CI must run `npm install` against a project referencing the squatted scope); S:C (full process.env exfil including AWS / NPM / GITHUB tokens extends blast radius beyond the install process); C:H/I:N/A:N — observed payload is reconnaissance/exfiltration only (Microsoft: server-side RECON_ONLY toggle), so no confirmed integrity/availability impact yet. The I:N/A:N is conservative and will move if the toggle is flipped to full exploitation.",
|
|
375
|
+
"cisa_kev": false,
|
|
376
|
+
"cisa_kev_date": null,
|
|
377
|
+
"kev_scope_note": "CISA KEV excludes ecosystem-package compromises (npm malicious-package events) with no assigned CVE — its scope is federally-deployable products with CVE identifiers. Local KEV snapshot (catalogVersion 2026.05.13) grepped for `moika` / `cloudplatform-single-spa` / `t-in-one` / `dependency confusion` returned 0 hits; the snapshot also predates the 2026-05-27 campaign. `cisa_kev: false` is correct. Consume KEV-equivalent guidance from the OSV MAL feed + GitHub Advisory Database + ecosystem reporting (SafeDep, Microsoft Security).",
|
|
378
|
+
"poc_available": true,
|
|
379
|
+
"poc_description": "Live payload — ~164 (escalated to ~179) malicious scoped packages were published to the public npm registry across two waves (2026-05-27 21:15–21:37 UTC; 2026-05-29 09:01–09:02 UTC) by attacker-controlled accounts mr.4nd3r50n / pik-libs / t-in-one (ce-rwb in the Microsoft cluster). The installable malicious build + obfuscated scripts/postinstall.js stager IS the PoC. Source: OSV MAL-2026-4978; SafeDep 2026-05-29; Microsoft Security 2026-05-29.",
|
|
380
|
+
"ai_discovered": false,
|
|
381
|
+
"ai_discovery_source": "vendor_research",
|
|
382
|
+
"ai_discovery_notes": "No AI-tool credited for discovery. Concurrent ecosystem detection by SafeDep (campaign analysis OSV cites) and Microsoft Security; OSV/GitHub Advisory Database assigned MAL-*/GHSA ids. ai_discovery_source set to `vendor_research` because the enum lacks an `ecosystem_detection` value; this note records the actual provenance.",
|
|
383
|
+
"ai_assisted_weaponization": false,
|
|
384
|
+
"ai_assisted_notes": "No AI-tooling credit on the payload-development side. The 7–13 KB obfuscated postinstall stager follows a conventional string-encoding/minifier pattern; no AI-generated-code fingerprint reported by the responding firms. UNVERIFIED whether any tooling was AI-assisted — no source asserts either way.",
|
|
385
|
+
"active_exploitation": "confirmed",
|
|
386
|
+
"active_exploitation_notes": "Packages were live and installable on the public npm registry during both exposure windows; the postinstall stager fires automatically on any `npm install` resolving a squatted internal name. Microsoft characterizes the deployed second stage as reconnaissance-only at time of reporting, with a server-side RECON_ONLY toggle that can escalate to full credential weaponization without republishing. Source: Microsoft Security 2026-05-29; SafeDep 2026-05-29.",
|
|
387
|
+
"affected": "Internal/private npm packages whose scope names were squatted on the PUBLIC registry: @cloudplatform-single-spa, @mlspace, @car-loans, @fb-deposit, @debit-ib, @t-in-one, @capibar.chat, @sber-ecom-core (SafeDep 8-scope set); Microsoft additionally lists @wb-track, @data-science, @ce-rwb, @payments-widget, @travel-autotests (nine-scope cluster, likely same operator). Any organization using these internal scope names is exposed if its install config lets the public registry win resolution. @sber-ecom-core impersonates Sberbank. ~164–179 packages total.",
|
|
388
|
+
"affected_versions": [
|
|
389
|
+
"Wave 1 (2026-05-27/28): scoped packages published at inflated version 99.99.99",
|
|
390
|
+
"Wave 2 (2026-05-29): inflated versions 5.7.1, 99.5.7, 99.5.8, and pre-staged 99.0.7",
|
|
391
|
+
"Any inflated-version public package under a squatted internal scope — exact-version match in a lockfile is the exposure signal"
|
|
392
|
+
],
|
|
393
|
+
"vector": "Dependency-confusion / namespace-squat. (1) Attacker publishes public npm packages under organizational scopes that mirror a target's INTERNAL package namespaces (e.g. @cloudplatform-single-spa/monitoring). (2) Packages carry inflated semver (99.99.99 etc.) so npm's default version resolution prefers the public package over the private-registry version when no scope→registry mapping pins the internal scope. (3) On `npm install`, the `postinstall` hook runs scripts/postinstall.js (7–13 KB obfuscated): 3s sandbox-evasion delay → OS detect → HTTPS GET https://oob.moika.tech/payload/{mac|win|linux}.js with header X-Secret: l95HdDaz3kQx1Zsg3WxH6HvKANf51RY1 → write to tmpdir → spawn detached subprocess. (4) Second stage POSTs full process.env (NPM_TOKEN, AWS_ACCESS_KEY_ID/SECRET, GITHUB_TOKEN, DB URLs) plus host/user/platform/arch/cwd/Node-version fingerprint to https://oob.moika.tech/report. Social-engineering cover: a fake telemetry disclosure (telemetry.cloudplatform-single-spa.io) + opt-out env var (CLOUDPLATFORM_SINGLE_SPA_NO_TELEMETRY=1 / T_IN_ONE_NO_TELEMETRY) makes the install-time egress read as legitimate corporate telemetry; real exfil goes to oob.moika.tech, not the disclosed domain. Class: dependency-confusion with postinstall second-stage staging — DISTINCT from account-recovery (node-ipc) and main-module payload classes. Source: SafeDep 2026-05-29; Microsoft 2026-05-29; OSV MAL-2026-4978/5032.",
|
|
394
|
+
"complexity": "low",
|
|
395
|
+
"complexity_notes": "Consumer-side exploitation is automatic on any `npm install` that resolves a squatted internal name to the public package; no race, no interaction beyond install. --ignore-scripts DOES mitigate (unlike the node-ipc main-module class) because the payload is gated behind the postinstall lifecycle hook. Attacker-side precondition (knowing a target's internal scope names) is low-complexity — scope names routinely leak via public source, CI logs, error traces, and job postings.",
|
|
396
|
+
"patch_available": true,
|
|
397
|
+
"patch_required_reboot": false,
|
|
398
|
+
"live_patch_available": true,
|
|
399
|
+
"live_patch_tools": [
|
|
400
|
+
"npm yank / GitHub-driven removal of the malicious versions (registry-side)",
|
|
401
|
+
"Scope-to-registry pinning in .npmrc (@scope:registry=) so internal scopes never resolve to the public registry — the structural fix for the whole class",
|
|
402
|
+
"npm install --ignore-scripts (blocks the postinstall stager specifically)",
|
|
403
|
+
"Socket / StepSecurity Harden-Runner (install-time + egress blocking)",
|
|
404
|
+
"Snyk / OSV-scanner / Semgrep Supply Chain (lockfile audit against MAL-*/GHSA set)"
|
|
405
|
+
],
|
|
406
|
+
"vendor_update_paths": [
|
|
407
|
+
"Pin every internal scope to the private registry in project + CI .npmrc (@cloudplatform-single-spa:registry=…, etc.); this prevents public-registry resolution regardless of version inflation",
|
|
408
|
+
"Lockfile audit: scan package-lock.json / yarn.lock / pnpm-lock.yaml for any of the squatted scopes resolved to a public-registry tarball at an inflated version",
|
|
409
|
+
"Rotate every credential exposed as an env var on any host (dev or CI) that ran an affected install during the exposure windows — NPM_TOKEN, AWS keys, GITHUB_TOKEN, DB URLs",
|
|
410
|
+
"Block egress to oob.moika.tech and the t-in-one.io lure domains at the network layer"
|
|
411
|
+
],
|
|
412
|
+
"framework_control_gaps": {
|
|
413
|
+
"NIST-800-218-SSDF": "PW/PS component-provenance controls assume the consumed package is the intended one; SSDF does not mandate scope→registry pinning, so a dependency-confusion resolution is SSDF-conformant.",
|
|
414
|
+
"EU-CRA-Art13": "SBOM/component-inventory requirement records WHAT resolved, not whether the resolution SHOULD have gone to a private registry — a confused public package is SBOM-listed and CRA-compliant.",
|
|
415
|
+
"NIS2-Art21-supply-chain": "Generic supply-chain risk-management without npm-ecosystem specifics: no requirement for scope-registry pinning, postinstall-hook policy, or internal-namespace-squat monitoring on public registries.",
|
|
416
|
+
"EU-AI-Act-Art15": "For the @mlspace / @data-science ML-tooling scopes, the robustness/accuracy controls do not address poisoning of the ML build/dev toolchain via dependency confusion.",
|
|
417
|
+
"UK-CAF-B4": "CAF B4 supply-chain principle is outcome-based and does not prescribe registry-resolution hardening; a confused dependency satisfies B4 on paper.",
|
|
418
|
+
"ISO-27001-2022-A.5.21": "ICT supply-chain control requires managing supplier risk but does not extend to public-registry namespace collisions with internal package scopes.",
|
|
419
|
+
"NIST-800-53-SR-11": "Supply-chain controls SR-3 (controls) / SR-11 (component authenticity) cover tampering/counterfeit but not legitimate-resolution-of-the-wrong-source via version inflation.",
|
|
420
|
+
"SLSA-v1.0-Build-L3": "Build provenance attests who built a given artifact; it cannot assert that the artifact the resolver SELECTED is the one the org intended — provenance is orthogonal to dependency-confusion."
|
|
421
|
+
},
|
|
422
|
+
"atlas_refs": [
|
|
423
|
+
"AML.T0010",
|
|
424
|
+
"AML.T0020"
|
|
425
|
+
],
|
|
426
|
+
"atlas_refs_note": "AML.T0010 (ML Supply Chain Compromise) and AML.T0020 (Poison Training Data — adjacent for the @mlspace/@data-science ML-tooling scopes). Pinned ATLAS v5.1.0. Mapped because the campaign explicitly targets ML-tooling internal scopes; if neither ATLAS technique survives review for a non-ML dependency-confusion case, fall back to ATT&CK-only (orphaned-control rule).",
|
|
427
|
+
"attack_refs": [
|
|
428
|
+
"T1195.001",
|
|
429
|
+
"T1195.002",
|
|
430
|
+
"T1059.007",
|
|
431
|
+
"T1552.001",
|
|
432
|
+
"T1041",
|
|
433
|
+
"T1071.001"
|
|
434
|
+
],
|
|
435
|
+
"attack_refs_note": "T1195.001 (Compromise SW Dependencies & Dev Tools) + .002 (Compromise SW Supply Chain) = the dependency-confusion core; T1059.007 (JavaScript postinstall execution); T1552.001 (Credentials in Files/env) — process.env harvest; T1041 (Exfil over C2 channel) / T1071.001 (Web protocols) — HTTPS POST to oob.moika.tech.",
|
|
436
|
+
"rwep_score": 43,
|
|
437
|
+
"rwep_factors": {
|
|
438
|
+
"cisa_kev": 0,
|
|
439
|
+
"poc_available": 20,
|
|
440
|
+
"ai_factor": 0,
|
|
441
|
+
"active_exploitation": 20,
|
|
442
|
+
"blast_radius": 28,
|
|
443
|
+
"patch_available": -15,
|
|
444
|
+
"live_patch_available": -10,
|
|
445
|
+
"reboot_required": 0
|
|
446
|
+
},
|
|
447
|
+
"rwep_rationale": "RWEP, not CVSS-alone. Sum = 0+20+0+20+28-15-10+0 = 43 (Shape-B, verified vs lib/scoring.js). poc_available=20 (live malicious packages, two waves). active_exploitation=20 (installable + auto-firing postinstall during the windows; Microsoft confirms a deployed-and-running stage). blast_radius=28 (full process.env on a CI runner = total deployment-secret compromise; ~164-179 packages across 8-9 scopes incl. a bank impersonation). patch_available=-15 + live_patch_available=-10 (registry removal + scope->registry pinning structural fix + scanner/Harden-Runner blocking). Matches the MAL-2026-NODE-IPC-STEALER exemplar shape (43).",
|
|
448
|
+
"epss_score": null,
|
|
449
|
+
"epss_date": "2026-05-30",
|
|
450
|
+
"epss_note": "EPSS does not cover non-CVE OSV-MAL identifiers as of 2026-05-30.",
|
|
451
|
+
"cwe_refs": [
|
|
452
|
+
"CWE-1357",
|
|
453
|
+
"CWE-829",
|
|
454
|
+
"CWE-506",
|
|
455
|
+
"CWE-427"
|
|
456
|
+
],
|
|
457
|
+
"cwe_refs_note": "CWE-1357 (reliance on insufficiently trustworthy component), CWE-829 (inclusion of functionality from untrusted control sphere — the dependency-confusion core), CWE-506 (embedded malicious code), CWE-427 (uncontrolled search path element — the resolution-precedence abuse analogue).",
|
|
458
|
+
"source_verified": "2026-05-30",
|
|
459
|
+
"verification_sources": [
|
|
460
|
+
"https://osv.dev/vulnerability/MAL-2026-4978",
|
|
461
|
+
"https://osv.dev/vulnerability/MAL-2026-5032",
|
|
462
|
+
"https://osv.dev/vulnerability/MAL-2026-4952",
|
|
463
|
+
"https://safedep.io/oob-moika-tech-dependency-confusion-campaign/",
|
|
464
|
+
"https://www.microsoft.com/en-us/security/blog/2026/05/29/33-malicious-npm-packages-abuse-dependency-confusion-profile-developer-environments/"
|
|
465
|
+
],
|
|
466
|
+
"vendor_advisories": [
|
|
467
|
+
{
|
|
468
|
+
"vendor": "OSV.dev (OpenSSF)",
|
|
469
|
+
"advisory_id": "MAL-2026-4978",
|
|
470
|
+
"url": "https://osv.dev/vulnerability/MAL-2026-4978",
|
|
471
|
+
"severity": "critical",
|
|
472
|
+
"published_date": "2026-05-28"
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"vendor": "OSV.dev (OpenSSF)",
|
|
476
|
+
"advisory_id": "MAL-2026-4952",
|
|
477
|
+
"url": "https://osv.dev/vulnerability/MAL-2026-4952",
|
|
478
|
+
"severity": "critical",
|
|
479
|
+
"published_date": "2026-05-28"
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"vendor": "OSV.dev (OpenSSF)",
|
|
483
|
+
"advisory_id": "MAL-2026-5032",
|
|
484
|
+
"url": "https://osv.dev/vulnerability/MAL-2026-5032",
|
|
485
|
+
"severity": "critical",
|
|
486
|
+
"published_date": "2026-05-29"
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
"vendor": "GitHub Advisory Database",
|
|
490
|
+
"advisory_id": "GHSA-pjmq-qghr-v939",
|
|
491
|
+
"url": "https://github.com/advisories/GHSA-pjmq-qghr-v939",
|
|
492
|
+
"severity": "critical",
|
|
493
|
+
"published_date": "2026-05-28"
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"vendor": "GitHub Advisory Database",
|
|
497
|
+
"advisory_id": "GHSA-jvj5-w453-mjrh",
|
|
498
|
+
"url": "https://github.com/advisories/GHSA-jvj5-w453-mjrh",
|
|
499
|
+
"severity": "critical",
|
|
500
|
+
"published_date": "2026-05-28"
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"vendor": "GitHub Advisory Database",
|
|
504
|
+
"advisory_id": "GHSA-6rfw-m3fj-7g8q",
|
|
505
|
+
"url": "https://github.com/advisories/GHSA-6rfw-m3fj-7g8q",
|
|
506
|
+
"severity": "critical",
|
|
507
|
+
"published_date": "2026-05-29"
|
|
508
|
+
}
|
|
509
|
+
],
|
|
510
|
+
"vendor_advisories_note": "OSV/GHSA assign per-package malicious-package records; the three MAL-*/GHSA pairs above are a representative sample (Wave 1 mr.4nd3r50n + Wave 2 t-in-one). GHSA malicious-package advisories are unscored by GitHub; severity=critical reflects the OSSF-MAL credential-exfil convention, not a published GHSA CVSS.",
|
|
511
|
+
"iocs": {
|
|
512
|
+
"network": [
|
|
513
|
+
"C2: oob.moika.tech — exfil endpoint https://oob.moika.tech/report (POST full process.env + host fingerprint)",
|
|
514
|
+
"Second-stage payload host: https://oob.moika.tech/payload/{mac|win|linux}.js (or /payload/{mac|win|linux})",
|
|
515
|
+
"Lure / social-engineering domains: npm.t-in-one.io, docs.t-in-one.io, jira.t-in-one.io; fake-telemetry disclosure domain telemetry.cloudplatform-single-spa.io",
|
|
516
|
+
"HTTP request header on ALL C2 calls: X-Secret: l95HdDaz3kQx1Zsg3WxH6HvKANf51RY1 (shared across all operator accounts — single-operator fingerprint)"
|
|
517
|
+
],
|
|
518
|
+
"payload_artifacts": [
|
|
519
|
+
"scripts/postinstall.js in the package tarball — 7–13 KB obfuscated stager; presence of a postinstall hook on a freshly-published scoped package at an inflated version is the primary tarball IoC",
|
|
520
|
+
"Dropped tmpdir payloads: ._cloudplatform-single-spa_init.js, ._wb-track_init.js, ._t-in-one_init.js",
|
|
521
|
+
"Dedup/marker cache dirs: ~/.cache/._cloudplatform-single-spa_init/, ~/.cache/._t-in-one_init/"
|
|
522
|
+
],
|
|
523
|
+
"behavioral": [
|
|
524
|
+
"An `npm install` resolving any of the squatted scopes spawns a detached child ~3s after install, then issues HTTPS GET to oob.moika.tech/payload and HTTPS POST to oob.moika.tech/report carrying high-volume env data",
|
|
525
|
+
"Process reads/serializes the full process.env (no key filtering) immediately before an outbound POST — the raw-env-dump-then-exfil sequence is the credential-harvest fingerprint",
|
|
526
|
+
"Kill-switch env vars present in the install environment: CLOUDPLATFORM_SINGLE_SPA_NO_TELEMETRY, T_IN_ONE_NO_TELEMETRY, or *_RECON_ONLY / *_PKG / *_VER / *_SECRET"
|
|
527
|
+
],
|
|
528
|
+
"version_exposure": [
|
|
529
|
+
"Lockfile contains any of the squatted scopes (@cloudplatform-single-spa, @mlspace, @car-loans, @fb-deposit, @debit-ib, @t-in-one, @capibar.chat, @sber-ecom-core, @wb-track, @data-science, @ce-rwb, @payments-widget, @travel-autotests) resolved to a PUBLIC-registry tarball at version 99.99.99 / 5.7.1 / 99.5.7 / 99.5.8 / 99.0.7"
|
|
530
|
+
],
|
|
531
|
+
"publisher_metadata": [
|
|
532
|
+
"npm publisher account mr.4nd3r50n (mr.4nd3r50n@yandex.ru), pik-libs, t-in-one (t-in-one@yandex.ru / nath.dr4k3@gmail.com), or ce-rwb (ogvanta@yandex.ru) on a scoped tarball"
|
|
533
|
+
],
|
|
534
|
+
"forensic_note": "The structural defense is scope→registry pinning, not yank — yanking individual packages does not prevent the NEXT inflated-version publish under the same scope. Audit every internal scope for a public-registry counterpart and pin it. Pull DNS + proxy logs for oob.moika.tech across both exposure windows; the POST to /report is the proof the payload fired AND exfil succeeded (postinstall execution alone does not prove successful exfil)."
|
|
535
|
+
},
|
|
536
|
+
"last_updated": "2026-05-30",
|
|
537
|
+
"discovery_attribution_note": "Concurrent ecosystem detection: SafeDep published the consolidated campaign analysis (https://safedep.io/oob-moika-tech-dependency-confusion-campaign/) OSV cites as the canonical reference; Microsoft Security published independent analysis 2026-05-29. OSV.dev / GitHub Advisory Database assigned per-package MAL-*/GHSA identifiers. No single human researcher credited; no AI-tool credit on the defender side. Discovery class: ecosystem-detection (telemetry/registry-monitoring driven). Source-count ambiguity: package count reported as 164 (SafeDep initial), 179 (SafeDep escalation by 2026-05-29), 45 (Microsoft article body: 26 mr.4nd3r50n + 7 ce-rwb + 12 t-in-one; the \"33\" in the URL slug is superseded by the body); the SafeDep figure is carried in `affected`, the Microsoft figure retained here for audit reconciliation. Scope sets differ between the two reports (8 vs 9 named scopes) — both retained.",
|
|
538
|
+
"_editorial_note": "MOIKA (oob.moika.tech) intake: NOVEL attack class for this catalog — first dependency-confusion / internal-scope-squat entry (catalog previously had zero). Distinct from MAL-2026-NODE-IPC-STEALER (account-recovery, main-module payload, DNS-TXT exfil): MOIKA is namespace-confusion, postinstall stager, HTTPS-POST exfil, --ignore-scripts-mitigable. Likely warrants a new zeroday-lessons control (PACKAGE-INTERNAL-SCOPE-REGISTRY-PINNING). RWEP 43 (exemplar convention: live_patch_available credited -10).js (would be 43 under the exemplar's -10 convention).",
|
|
539
|
+
"remediation_status": "partially_removed_from_registry",
|
|
540
|
+
"remediation_note": "Malicious packages were reported and are being removed from npm; OSV/GHSA records published 2026-05-28/29. Removal is per-package and reactive — the structural risk (any attacker can re-publish an inflated version under an unpinned internal scope) persists until consuming orgs pin internal scopes to their private registry. UNVERIFIED: whether all ~179 packages were removed and whether all four publisher accounts were deactivated as of 2026-05-30 (no source confirms complete takedown).",
|
|
541
|
+
"remediation_status_verified_at": "2026-05-30"
|
|
542
|
+
},
|
|
95
543
|
"CVE-2025-0282": {
|
|
96
544
|
"ai_assisted_weaponization": false,
|
|
97
545
|
"name": "Ivanti Connect Secure / Policy Secure / Neurons for ZTA stack-overflow preauth RCE",
|
|
@@ -17178,9 +17626,9 @@
|
|
|
17178
17626
|
"affected": "Weaviate OSS before the branch fixes 1.30.20, 1.31.19, 1.32.16, and 1.33.4 (the GHSA ships per-maintained-branch patches).",
|
|
17179
17627
|
"affected_versions": [
|
|
17180
17628
|
"Weaviate OSS < 1.30.20",
|
|
17181
|
-
|
|
17182
|
-
|
|
17183
|
-
|
|
17629
|
+
"Weaviate OSS >= 1.31.0-rc.0, < 1.31.19",
|
|
17630
|
+
"Weaviate OSS >= 1.32.0-rc.0, < 1.32.16",
|
|
17631
|
+
"Weaviate OSS >= 1.33.0-rc.0, < 1.33.4"
|
|
17184
17632
|
],
|
|
17185
17633
|
"vector": "Weaviate OSS does not constrain backup entry paths during restore, so an attacker with insert/write access crafts entries with absolute or ../ traversal paths that escape the restore root (CWE-22 ZipSlip), creating or overwriting files in arbitrary locations on the Weaviate host.",
|
|
17186
17634
|
"complexity": "low",
|
package/data/cwe-catalog.json
CHANGED
|
@@ -429,7 +429,8 @@
|
|
|
429
429
|
"CVE-2026-45829",
|
|
430
430
|
"CVE-2026-5760",
|
|
431
431
|
"CVE-2026-6973",
|
|
432
|
-
"MAL-2026-3083"
|
|
432
|
+
"MAL-2026-3083",
|
|
433
|
+
"MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM"
|
|
433
434
|
],
|
|
434
435
|
"framework_controls_partially_addressing": [
|
|
435
436
|
"NIST-800-53-SI-10",
|
|
@@ -1425,7 +1426,10 @@
|
|
|
1425
1426
|
"MAL-2026-3083",
|
|
1426
1427
|
"MAL-2026-NODE-IPC-STEALER",
|
|
1427
1428
|
"MAL-2026-SHAI-HULUD-OSS",
|
|
1428
|
-
"MAL-2026-TANSTACK-MINI"
|
|
1429
|
+
"MAL-2026-TANSTACK-MINI",
|
|
1430
|
+
"CVE-2022-23812",
|
|
1431
|
+
"MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM",
|
|
1432
|
+
"MAL-2026-MOIKA-DEPCONFUSION"
|
|
1429
1433
|
],
|
|
1430
1434
|
"framework_controls_partially_addressing": [
|
|
1431
1435
|
"NIST-800-53-SA-12",
|
|
@@ -1745,7 +1749,9 @@
|
|
|
1745
1749
|
"CVE-2025-54136",
|
|
1746
1750
|
"CVE-2025-64496",
|
|
1747
1751
|
"MAL-2026-NODE-IPC-STEALER",
|
|
1748
|
-
"MAL-2026-SHAI-HULUD-OSS"
|
|
1752
|
+
"MAL-2026-SHAI-HULUD-OSS",
|
|
1753
|
+
"MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM",
|
|
1754
|
+
"MAL-2026-MOIKA-DEPCONFUSION"
|
|
1749
1755
|
],
|
|
1750
1756
|
"framework_controls_partially_addressing": [
|
|
1751
1757
|
"NIST-800-53-SA-12",
|
|
@@ -2021,7 +2027,9 @@
|
|
|
2021
2027
|
"CVE-2024-3094",
|
|
2022
2028
|
"CVE-2026-30615",
|
|
2023
2029
|
"CVE-2026-45321",
|
|
2024
|
-
"MAL-2026-NODE-IPC-STEALER"
|
|
2030
|
+
"MAL-2026-NODE-IPC-STEALER",
|
|
2031
|
+
"MAL-2026-TRAPDOOR-CROSS-ECOSYSTEM",
|
|
2032
|
+
"MAL-2026-MOIKA-DEPCONFUSION"
|
|
2025
2033
|
],
|
|
2026
2034
|
"framework_controls_partially_addressing": [
|
|
2027
2035
|
"NIST-800-53-SA-12",
|
|
@@ -3177,7 +3185,9 @@
|
|
|
3177
3185
|
"CWE-2000"
|
|
3178
3186
|
],
|
|
3179
3187
|
"related_weaknesses": [],
|
|
3180
|
-
"evidence_cves": [
|
|
3188
|
+
"evidence_cves": [
|
|
3189
|
+
"MAL-2026-MOIKA-DEPCONFUSION"
|
|
3190
|
+
],
|
|
3181
3191
|
"last_verified": "2026-05-19",
|
|
3182
3192
|
"notes": "Bulk-imported v0.13.18 from the canonical MITRE Top 25 + commonly-referenced-class expansion.",
|
|
3183
3193
|
"_auto_imported": true,
|