supply-chain-attack 0.1.1 → 0.1.7

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 amifcked contributors
3
+ Copyright (c) 2026 supply-chain-attack contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,17 +1,112 @@
1
1
  # supply-chain-attack
2
2
 
3
- Professional CLI wrapper around `amifcked` for scanning local package-manager state for known supply-chain attack indicators.
3
+ Scan this machine for packages and binaries tied to known supply-chain attacks, malware campaigns, and AI security incidents.
4
4
 
5
5
  ```sh
6
6
  npx supply-chain-attack
7
7
  ```
8
8
 
9
- This package uses the same scanner and advisory snapshot as `amifcked`, but prints professional output suitable for teams, CI logs, and security reports.
9
+ `supply-chain-attack` scans local package-manager state wherever you run it: global installs, temporary `npx` installs, npm/pnpm/Yarn/Bun caches or stores, and Python user/pipx environments when present. Scoped packages are included.
10
10
 
11
- ## Options
11
+ A cache/store hit means the package was fetched or stored on this machine. A global or `npx` hit is stronger evidence that package code may have been installed or executed.
12
+
13
+ ## Usage
14
+
15
+ ```sh
16
+ npx supply-chain-attack
17
+ ```
18
+
19
+ The CLI prints a compact verdict and exits non-zero when it finds a risky package or suspicious IOC.
20
+
21
+ Interactive terminals also get a small one-line menu:
22
+
23
+ ```txt
24
+ options l learn a actions q quit ›
25
+ ```
26
+
27
+ The loader and menu are disabled for JSON output, non-interactive terminals, and CI.
28
+
29
+ ## Example
30
+
31
+ ```txt
32
+ Verdict: Potential supply-chain exposure detected — 1 package hit
33
+
34
+ Matched packages
35
+ - npm @rspack/cli@1.1.7 (npm cache _npx)
36
+
37
+ scan 6 store(s), 1842 package/version pair(s), snapshot 2026-05-12
38
+ ```
39
+
40
+ ## What It Checks
41
+
42
+ The embedded offline snapshot is dated `2026-05-12` and covers `438` package/version artifacts.
43
+
44
+ Local sources include:
45
+
46
+ - npm global packages, cache records, and `_npx` installs
47
+ - pnpm global packages and content-addressed store manifests
48
+ - Yarn and Bun global/cache entries
49
+ - Python user site-packages and pipx virtual environments
50
+
51
+ Advisory coverage includes Mini Shai-Hulud/TanStack, Mistral, UiPath, Squawk, OpenSearch, Lightning, Guardrails AI, SAP CAP, Intercom, Namastex.ai, CanisterWorm, CanisterSprawl, Axios, `plain-crypto-js`, Rspack, and Nx `s1ngularity`.
52
+
53
+ It also checks common home-directory locations for suspicious files such as `router_runtime.js` and `setup.mjs` when contents match known credential-exfiltration or persistence markers.
54
+
55
+ ## Exit Codes
56
+
57
+ - `0`: no findings
58
+ - `1`: findings detected
59
+ - `2`: usage or runtime error
60
+
61
+ ## Privacy
62
+
63
+ `supply-chain-attack` uses its embedded advisory snapshot and does not send discovered package names or versions to a remote service. Set `NO_COLOR=1` for plain text output.
64
+
65
+ ## If You Get a Hit
66
+
67
+ Treat the machine as potentially exposed:
68
+
69
+ 1. Remove affected global or `npx` installs.
70
+ 2. Clear relevant package-manager cache/store entries.
71
+ 3. Inspect projects that may have installed the package.
72
+ 4. Rotate exposed tokens and credentials.
73
+ 5. Check for unexpected persistence files or workflow changes.
74
+
75
+ Use menu option `l` for attack-chain context and option `a` for a cleanup prompt you can paste into a coding/security agent.
76
+
77
+ ## Limitations
78
+
79
+ This is a detection tool, not a full incident-response platform.
80
+
81
+ - Cache/store hits show package presence, not project usage.
82
+ - The advisory snapshot is curated and dated.
83
+ - A clean result does not prove the machine is free of malicious packages.
84
+ - Some package-manager stores may not expose package names and versions.
85
+
86
+ ## Development
87
+
88
+ ```sh
89
+ npm test
90
+ npm run check
91
+ node bin/supply-chain-attack.js
92
+ npm exec --package=. -- supply-chain-attack
93
+ ```
94
+
95
+ ## Publishing
12
96
 
13
97
  ```sh
14
- supply-chain-attack --json
15
- supply-chain-attack --list-advisories
16
- supply-chain-attack --no-interactive
98
+ npm test
99
+ npm run check
100
+ npm pack --dry-run
101
+ npm publish
17
102
  ```
103
+
104
+ The package has no runtime npm dependencies and requires Node.js `18` or newer.
105
+
106
+ ## Research
107
+
108
+ The research trail and source URLs are in [`RESEARCH.md`](./RESEARCH.md).
109
+
110
+ ## License
111
+
112
+ MIT
package/RESEARCH.md ADDED
@@ -0,0 +1,35 @@
1
+ # Research Notes
2
+
3
+ Snapshot date: 2026-05-12.
4
+
5
+ The scanner data is intentionally split into:
6
+
7
+ - An embedded offline snapshot in `lib/advisories.js`.
8
+
9
+ ## Sources Used
10
+
11
+ - Socket Mini Shai-Hulud campaign page: https://socket.dev/supply-chain-attacks/mini-shai-hulud
12
+ - GitHub TanStack advisory `GHSA-g7cv-rxg3-hmpx`: https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx
13
+ - TanStack postmortem: https://tanstack.com/blog/npm-supply-chain-compromise-postmortem
14
+ - Snyk TanStack compromise tracker: https://security.snyk.io/TanStack-npm-Supply-Chain-Compromise-May-2026
15
+ - Aikido Mini Shai-Hulud/TanStack mirror: https://www.aikido.dev/blog/mini-shai-hulud-is-back-tanstack-compromised
16
+ - Socket CanisterWorm campaign page: https://socket.dev/supply-chain-attacks/canisterworm
17
+ - Socket CanisterSprawl campaign page: https://socket.dev/supply-chain-attacks/canistersprawl
18
+ - Socket Axios compromise report: https://socket.dev/blog/axios-npm-package-compromised
19
+ - Socket Rspack compromise report: https://socket.dev/blog/rspack-npm-packages-compromised
20
+ - Socket Nx compromise report: https://socket.dev/blog/nx-packages-compromised
21
+ - OSV live API: https://api.osv.dev
22
+
23
+ The requested X URL, `https://x.com/SocketSecurity/status/2053950165665386546`, was attempted directly but was not retrievable through the available web tooling. The TanStack/Mini Shai-Hulud package data from that discussion was cross-checked against the official Socket campaign page, the GitHub advisory, and public incident trackers above.
24
+
25
+ ## Current Embedded Coverage
26
+
27
+ The embedded snapshot currently covers 438 package/version artifacts across npm, PyPI, and Packagist. It includes the May 2026 TanStack/Mini Shai-Hulud wave and related AI/developer-tool package incidents such as Mistral, UiPath, Squawk, OpenSearch, Lightning, Guardrails AI, Namastex/CanisterWorm, CanisterSprawl AI brand-squats, Axios/plain-crypto-js, Rspack, and Nx.
28
+
29
+ Use:
30
+
31
+ ```sh
32
+ node bin/supply-chain-attack.js --list-advisories
33
+ ```
34
+
35
+ to see the exact artifact count and source URLs embedded in the package.
@@ -1,10 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- process.env.AMIFCKED_OUTPUT_STYLE = 'professional';
5
- process.env.AMIFCKED_COMMAND_NAME = 'supply-chain-attack';
6
-
7
- const { main } = require('amifcked/lib/cli');
4
+ const { main } = require('../lib/cli');
8
5
 
9
6
  main(process.argv.slice(2)).catch((error) => {
10
7
  console.error(`supply-chain-attack: ${error && error.message ? error.message : error}`);
@@ -0,0 +1,450 @@
1
+ 'use strict';
2
+
3
+ const SNAPSHOT_DATE = '2026-05-12';
4
+
5
+ function pkg(name, versions, extra = {}) {
6
+ return {
7
+ name,
8
+ versions: Array.isArray(versions) ? versions : [versions],
9
+ ...extra,
10
+ };
11
+ }
12
+
13
+ const tanstackPackages = [
14
+ pkg('@tanstack/angular-form', ['1.20.0', '1.21.0']),
15
+ pkg('@tanstack/angular-query-experimental', ['5.90.13', '5.91.0']),
16
+ pkg('@tanstack/angular-router-plugin', ['1.166.8', '1.167.1']),
17
+ pkg('@tanstack/angular-router', ['1.166.6', '1.167.1']),
18
+ pkg('@tanstack/form-core', ['1.20.0', '1.21.0']),
19
+ pkg('@tanstack/history', ['1.166.4', '1.167.0']),
20
+ pkg('@tanstack/query-async-storage-persister', ['5.90.12', '5.90.14']),
21
+ pkg('@tanstack/query-broadcast-client-experimental', ['5.90.12', '5.90.14']),
22
+ pkg('@tanstack/query-core', ['5.90.12', '5.90.14']),
23
+ pkg('@tanstack/query-db-collection', ['0.3.6', '0.3.7']),
24
+ pkg('@tanstack/query-devtools', ['5.91.1', '5.91.3']),
25
+ pkg('@tanstack/query-persist-client-core', ['5.90.12', '5.90.14']),
26
+ pkg('@tanstack/query-sync-storage-persister', ['5.90.12', '5.90.14']),
27
+ pkg('@tanstack/react-db', ['0.3.6', '0.3.7']),
28
+ pkg('@tanstack/react-devtools', ['0.7.3', '0.7.5']),
29
+ pkg('@tanstack/react-devtools-event-bus', ['0.3.1', '0.3.3']),
30
+ pkg('@tanstack/react-form', ['1.20.0', '1.21.0']),
31
+ pkg('@tanstack/react-query-devtools', ['5.90.2', '5.91.0']),
32
+ pkg('@tanstack/react-query-next-experimental', ['5.90.12', '5.90.14']),
33
+ pkg('@tanstack/react-query', ['5.90.12', '5.90.14']),
34
+ pkg('@tanstack/react-router-devtools', ['1.166.6', '1.167.1']),
35
+ pkg('@tanstack/react-router-ssr-query', ['1.166.6', '1.167.1']),
36
+ pkg('@tanstack/react-router-with-query', ['1.166.6', '1.167.1']),
37
+ pkg('@tanstack/react-router', ['1.166.6', '1.167.1']),
38
+ pkg('@tanstack/react-start-client', ['1.166.6', '1.167.1']),
39
+ pkg('@tanstack/react-start-config', ['1.166.6', '1.167.1']),
40
+ pkg('@tanstack/react-start-plugin', ['1.166.6', '1.167.1']),
41
+ pkg('@tanstack/react-start-router-manifest', ['1.166.6', '1.167.1']),
42
+ pkg('@tanstack/react-start-server', ['1.166.6', '1.167.1']),
43
+ pkg('@tanstack/react-start', ['1.166.6', '1.167.1']),
44
+ pkg('@tanstack/router-core', ['1.166.4', '1.167.0']),
45
+ pkg('@tanstack/router-devtools-core', ['1.166.4', '1.167.0']),
46
+ pkg('@tanstack/router-generator', ['1.166.4', '1.167.0']),
47
+ pkg('@tanstack/router-plugin', ['1.166.6', '1.167.1']),
48
+ pkg('@tanstack/router-ssr-query-core', ['1.166.4', '1.167.0']),
49
+ pkg('@tanstack/router-utils', ['1.166.4', '1.167.0']),
50
+ pkg('@tanstack/server-functions-plugin', ['1.166.4', '1.167.0']),
51
+ pkg('@tanstack/solid-form', ['1.20.0', '1.21.0']),
52
+ pkg('@tanstack/solid-query-devtools', ['5.91.2', '5.91.4']),
53
+ pkg('@tanstack/solid-query', ['5.90.13', '5.91.0']),
54
+ pkg('@tanstack/store', ['0.8.0', '0.8.2']),
55
+ pkg('@tanstack/vue-query-devtools', ['5.90.2', '5.91.0']),
56
+ ];
57
+
58
+ const uipathPackages = [
59
+ pkg('@uipath/orchestrator', '4.20.34'),
60
+ pkg('@uipath/studio-sdk', '1.0.16'),
61
+ pkg('@uipath/apollo-core', '5.9.2'),
62
+ pkg('@uipath/uipathclicore', ['2.24.4', '2.25.4']),
63
+ pkg('@uipath/uipathcli', ['2.24.4', '2.25.4'], { binaries: ['uipath'] }),
64
+ pkg('@uipath/pipelines-cli', ['21.10.6', '21.11.5', '22.4.4', '22.10.4', '23.4.6', '23.10.6', '24.4.6', '24.10.6', '25.4.5', '25.10.1']),
65
+ pkg('@uipath/node-executor', '2.0.1'),
66
+ pkg('@uipath/node-logging', '2.0.1'),
67
+ pkg('@uipath/vertex-sdk-js', '0.2.2'),
68
+ pkg('@uipath/dotnet-extension', ['3.1.1', '3.2.1', '3.3.1', '3.4.2', '3.5.1']),
69
+ pkg('@uipath/agent-utils', '1.0.1'),
70
+ pkg('@uipath/agent-tool', '1.0.1'),
71
+ pkg('@uipath/maestro-mcp', '0.1.1'),
72
+ pkg('@uipath/autopilot-sdk', '0.1.1'),
73
+ pkg('@uipath/uipath-typescript-helpers', '0.7.1'),
74
+ pkg('@uipath/script-context', '0.1.1'),
75
+ pkg('@uipath/marketplace-sdk-client', '1.0.1'),
76
+ pkg('@uipath/integrationservice-tool', '1.0.2'),
77
+ pkg('@uipath/uipath-pack', ['0.0.7', '0.0.8', '0.0.9', '0.0.10']),
78
+ pkg('@uipath/uipath-string', ['1.0.5', '1.0.6', '1.0.7', '1.0.8', '1.0.9']),
79
+ pkg('@uipath/flow-tool', '1.0.2'),
80
+ pkg('@uipath/pipelines', ['24.12.3', '25.4.1', '25.10.1']),
81
+ pkg('@uipath/teams', '0.0.9'),
82
+ pkg('@uipath/log-message', '1.0.8'),
83
+ pkg('@uipath/system', '2.1.1'),
84
+ pkg('@uipath/webservices', '2.0.1'),
85
+ pkg('@uipath/calls', '1.0.2'),
86
+ pkg('@uipath/maestro-tool', '1.0.1'),
87
+ pkg('@uipath/excel', '1.1.7'),
88
+ pkg('@uipath/docsai-tool', '1.0.1'),
89
+ pkg('@uipath/context-grounding-tool', '0.1.1'),
90
+ pkg('@uipath/packager-tool-functions', '0.1.1'),
91
+ pkg('@uipath/http-request', '1.0.5'),
92
+ pkg('@uipath/ui-automation', '1.0.1'),
93
+ pkg('@uipath/mail', '1.0.6'),
94
+ pkg('@uipath/file', '1.2.1'),
95
+ pkg('@uipath/microsoft', '2.1.9'),
96
+ pkg('@uipath/word', '2.0.9'),
97
+ pkg('@uipath/word-data-models', '2.0.10'),
98
+ pkg('@uipath/odata', '0.0.1'),
99
+ pkg('@uipath/outlook', '2.1.12'),
100
+ pkg('@uipath/cloud-drive', '1.0.12'),
101
+ pkg('@uipath/agent', '1.5.15'),
102
+ pkg('@uipath/agent-intermediate-schema', '1.5.10'),
103
+ pkg('@uipath/agent-builder-types', '1.0.15'),
104
+ pkg('@uipath/apps-editor-components', '1.2.102'),
105
+ ];
106
+
107
+ const squawkPackages = [
108
+ pkg('@squawk/fix-data', ['0.6.7', '0.6.8']),
109
+ pkg('@squawk/weather', ['0.5.9', '0.5.10']),
110
+ pkg('@squawk/icao-registry-data', ['0.8.7', '0.8.8']),
111
+ pkg('@squawk/airport-data', ['0.7.7', '0.7.8']),
112
+ pkg('@squawk/flightplan', ['0.5.5', '0.5.6']),
113
+ pkg('@squawk/units', ['0.4.6', '0.4.7']),
114
+ pkg('@squawk/flight-math', ['0.5.7', '0.5.8']),
115
+ pkg('@squawk/mcp', ['0.9.4', '0.9.5'], { binaries: ['squawk-mcp'] }),
116
+ pkg('@squawk/fixes', ['0.3.5', '0.3.6']),
117
+ pkg('@squawk/airspace-data', ['0.5.6', '0.5.7']),
118
+ pkg('@squawk/procedure-data', ['0.7.6', '0.7.7']),
119
+ pkg('@squawk/navaids', ['0.4.5', '0.4.6']),
120
+ pkg('@squawk/procedures', ['0.5.5', '0.5.6']),
121
+ pkg('@squawk/notams', ['0.3.9', '0.3.10']),
122
+ pkg('@squawk/airways', ['0.4.5', '0.4.6']),
123
+ pkg('@squawk/airports', ['0.6.5', '0.6.6']),
124
+ pkg('@squawk/types', ['0.8.4', '0.8.5']),
125
+ pkg('@squawk/icao-registry', ['0.5.5', '0.5.6']),
126
+ pkg('@squawk/airspace', ['0.8.4', '0.8.5']),
127
+ pkg('@squawk/geo', ['0.4.7', '0.4.8']),
128
+ pkg('@squawk/navaid-data', ['0.6.7', '0.6.8']),
129
+ pkg('@squawk/airway-data', ['0.5.7', '0.5.8']),
130
+ ];
131
+
132
+ const miniExpansionPackages = [
133
+ pkg('@dqbd/tiktoken', '1.0.23'),
134
+ pkg('mixme', '0.5.13'),
135
+ pkg('handlebars', '4.7.9'),
136
+ pkg('@gongallin/vue-i18n-bundler', '1.0.3'),
137
+ pkg('@grafana/demodata-datasource', ['2.2.0', '2.2.1']),
138
+ pkg('react-devtools-core', ['7.0.0', '7.0.1']),
139
+ pkg('@vscode/test-electron', ['2.6.0', '2.6.1']),
140
+ pkg('storybook', ['10.1.0-alpha.2', '10.1.0-alpha.3'], { binaries: ['storybook'] }),
141
+ pkg('@k-nut/link-header-parser', '1.1.5'),
142
+ pkg('auth0', '6.9.0'),
143
+ pkg('zod-to-json-schema', ['3.25.1', '3.25.2', '3.25.3', '3.25.4', '3.25.5']),
144
+ pkg('mini-html-webpack-plugin', '3.3.1'),
145
+ pkg('lightningcss-darwin-arm64', '1.30.2'),
146
+ pkg('@unrs/resolver-binding-android-arm-eabi', '1.11.2'),
147
+ pkg('@unrs/resolver-binding-android-arm64', '1.11.2'),
148
+ pkg('@unrs/resolver-binding-darwin-arm64', '1.11.2'),
149
+ pkg('@unrs/resolver-binding-darwin-x64', '1.11.2'),
150
+ pkg('@unrs/resolver-binding-freebsd-x64', '1.11.2'),
151
+ pkg('@unrs/resolver-binding-linux-arm-gnueabihf', '1.11.2'),
152
+ pkg('@unrs/resolver-binding-linux-arm-musleabihf', '1.11.2'),
153
+ pkg('@unrs/resolver-binding-linux-arm64-gnu', '1.11.2'),
154
+ pkg('@unrs/resolver-binding-linux-arm64-musl', '1.11.2'),
155
+ pkg('@unrs/resolver-binding-linux-ppc64-gnu', '1.11.2'),
156
+ pkg('@unrs/resolver-binding-linux-riscv64-gnu', '1.11.2'),
157
+ pkg('@unrs/resolver-binding-linux-riscv64-musl', '1.11.2'),
158
+ pkg('@unrs/resolver-binding-linux-s390x-gnu', '1.11.2'),
159
+ pkg('@unrs/resolver-binding-linux-x64-gnu', '1.11.2'),
160
+ pkg('@unrs/resolver-binding-linux-x64-musl', '1.11.2'),
161
+ pkg('@unrs/resolver-binding-wasm32-wasi', '1.11.2'),
162
+ pkg('@unrs/resolver-binding-win32-arm64-msvc', '1.11.2'),
163
+ pkg('@unrs/resolver-binding-win32-ia32-msvc', '1.11.2'),
164
+ pkg('@unrs/resolver-binding-win32-x64-msvc', '1.11.2'),
165
+ ];
166
+
167
+ const operatoPackages = [
168
+ 'input',
169
+ 'graphql',
170
+ 'utils',
171
+ 'graphql-ws',
172
+ 'shell',
173
+ 'layout',
174
+ 'popup',
175
+ 'styles',
176
+ 'resize',
177
+ 'help',
178
+ 'icon',
179
+ 'i18n',
180
+ 'pull-to-refresh',
181
+ 'stomp',
182
+ 'markdown',
183
+ 'chart',
184
+ 'form',
185
+ 'calendar',
186
+ 'sortable',
187
+ 'user-device',
188
+ 'snack-bar',
189
+ 'blockquote',
190
+ 'carousel',
191
+ 'timeline',
192
+ 'context',
193
+ 'command',
194
+ 'numeric-stepper',
195
+ 'color-picker',
196
+ 'element',
197
+ 'search',
198
+ 'progress',
199
+ 'headroom',
200
+ 'selection',
201
+ 'graphql-observable',
202
+ 'graphql-client',
203
+ 'graphql-subscription',
204
+ 'data-grist',
205
+ 'data-table',
206
+ 'context-menu',
207
+ 'date-picker',
208
+ 'dropdown',
209
+ 'checkbox',
210
+ 'radio',
211
+ 'button',
212
+ 'input-mask',
213
+ 'rich-text',
214
+ 'datetime',
215
+ 'tooltip',
216
+ 'switch',
217
+ 'select',
218
+ 'tabs',
219
+ 'accordion',
220
+ 'breadcrumb',
221
+ 'chip',
222
+ 'dialog',
223
+ 'menu',
224
+ 'pagination',
225
+ 'splitter',
226
+ 'tree',
227
+ 'avatar',
228
+ 'notify',
229
+ 'scrollbar',
230
+ 'field',
231
+ 'hierarchy',
232
+ 'list',
233
+ 'overlay',
234
+ 'overlay-stack',
235
+ 'popover',
236
+ 'ripple',
237
+ 'scroller',
238
+ 'table',
239
+ 'virtual-list',
240
+ 'input-base',
241
+ 'field-base',
242
+ 'base',
243
+ 'layout-base',
244
+ 'style-base',
245
+ ].map((name) => pkg(`@operato/${name}`, '9.0.36')).concat([
246
+ pkg('@operato/scene', '3.1.18'),
247
+ ]);
248
+
249
+ const wonderlicPackages = [
250
+ pkg('@wonderlic/auth', '6.6.7'),
251
+ pkg('@wonderlic/surveys', '7.2.7'),
252
+ pkg('@wonderlic/validation', '2.0.15'),
253
+ pkg('@wonderlic/core', '3.3.3'),
254
+ pkg('@wonderlic/test-taker-api', '1.5.7'),
255
+ pkg('@wonderlic/preset-auth', '4.2.7'),
256
+ pkg('@wonderlic/tds', '3.3.7'),
257
+ pkg('@wonderlic/wonscore', '7.1.7'),
258
+ pkg('@wonderlic/reporting', '2.14.7'),
259
+ pkg('@wonderlic/select', '4.1.8'),
260
+ pkg('@wonderlic/validation-fns', '1.0.42'),
261
+ ];
262
+
263
+ const advisories = [
264
+ {
265
+ id: 'GHSA-g7cv-rxg3-hmpx',
266
+ title: 'TanStack npm packages compromised in Mini Shai-Hulud',
267
+ severity: 'critical',
268
+ ecosystem: 'npm',
269
+ type: 'supply-chain',
270
+ published: '2026-05-11',
271
+ source: 'https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx',
272
+ summary: 'A compromised npm token published malicious versions of 42 TanStack packages containing credential exfiltration behavior.',
273
+ packages: tanstackPackages,
274
+ },
275
+ {
276
+ id: 'SOCKET-mini-shai-hulud-2026-04',
277
+ title: 'Mini Shai-Hulud campaign affecting SAP CAP, Intercom, Lightning, Mistral and related packages',
278
+ severity: 'critical',
279
+ ecosystem: 'mixed',
280
+ type: 'supply-chain',
281
+ published: '2026-04-29',
282
+ source: 'https://socket.dev/supply-chain-attacks/mini-shai-hulud',
283
+ summary: 'Socket tracked Mini Shai-Hulud packages that exfiltrate secrets and attempt persistence through developer tooling files.',
284
+ packages: [
285
+ pkg('@cap-js/cds-types', '0.15.0'),
286
+ pkg('@cap-js/cds-typer', '0.35.0', { binaries: ['cds-typer'] }),
287
+ pkg('@cap-js/db-service', '2.4.1'),
288
+ pkg('@cap-js/cds-odata-v2-adapter-proxy', '1.14.1'),
289
+ pkg('mbt', '1.2.34', { binaries: ['mbt'] }),
290
+ pkg('intercom-client', '7.0.4'),
291
+ pkg('lightning', ['2.6.2', '2.6.3'], { ecosystem: 'pypi', binaries: ['lightning'] }),
292
+ pkg('mistralai', '2.4.6', { ecosystem: 'pypi' }),
293
+ pkg('guardrails-ai', '0.10.1', { ecosystem: 'pypi', binaries: ['guardrails'] }),
294
+ pkg('yidas/codeception-pageobjects', '2.0.5', { ecosystem: 'packagist' }),
295
+ ],
296
+ },
297
+ {
298
+ id: 'SOCKET-mini-shai-hulud-expansion-2026-05',
299
+ title: 'Mini Shai-Hulud expansion into AI/devtool ecosystem packages',
300
+ severity: 'critical',
301
+ ecosystem: 'npm',
302
+ type: 'supply-chain',
303
+ published: '2026-05-12',
304
+ source: 'https://socket.dev/supply-chain-attacks/mini-shai-hulud',
305
+ summary: 'Socket and Snyk reporting showed the Mini Shai-Hulud wave expanding into Mistral, UiPath, Squawk, OpenSearch and related packages.',
306
+ packages: [
307
+ pkg('@mistralai/mistralai', ['2.2.2', '2.2.3', '2.2.4']),
308
+ pkg('@mistralai/mistralai-azure', ['1.7.1', '1.7.2', '1.7.3']),
309
+ pkg('@mistralai/mistralai-gcp', ['1.7.1', '1.7.2', '1.7.3']),
310
+ pkg('@opensearch-project/opensearch', ['3.5.3', '3.6.2', '3.7.0', '3.8.0']),
311
+ pkg('cross-stitch', ['1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.1.7']),
312
+ pkg('ts-dna', ['3.0.4', '3.0.5']),
313
+ ...miniExpansionPackages,
314
+ ...operatoPackages,
315
+ ...wonderlicPackages,
316
+ ...uipathPackages,
317
+ ...squawkPackages,
318
+ ],
319
+ },
320
+ {
321
+ id: 'GHSA-fw8c-xr5c-95f9',
322
+ title: 'Axios maintainer account compromise pulled malicious plain-crypto-js dependency',
323
+ severity: 'critical',
324
+ ecosystem: 'npm',
325
+ type: 'supply-chain',
326
+ published: '2026-03-31',
327
+ source: 'https://socket.dev/blog/axios-npm-package-compromised',
328
+ summary: 'Two malicious axios versions injected a trojanized plain-crypto-js dependency that ran during postinstall.',
329
+ packages: [
330
+ pkg('axios', ['0.30.4', '1.14.1']),
331
+ pkg('plain-crypto-js', ['4.2.0', '4.2.1']),
332
+ pkg('@shadanai/openclaw', ['2026.3.28-2', '2026.3.28-3', '2026.3.31-1', '2026.3.31-2']),
333
+ pkg('@qqbrowser/openclaw-qbot', '0.0.130'),
334
+ ],
335
+ },
336
+ {
337
+ id: 'SOCKET-namastex-canisterworm-2026-04',
338
+ title: 'Namastex.ai packages compromised by CanisterWorm',
339
+ severity: 'critical',
340
+ ecosystem: 'npm',
341
+ type: 'ai-supply-chain',
342
+ published: '2026-04-21',
343
+ source: 'https://socket.dev/supply-chain-attacks/canisterworm',
344
+ summary: 'AI and developer tooling packages were compromised with credential theft and worm behavior.',
345
+ packages: [
346
+ pkg('@automagik/genie', ['4.260421.33', '4.260421.34', '4.260421.35', '4.260421.36', '4.260421.37', '4.260421.38', '4.260421.39'], { binaries: ['genie', 'automagik'] }),
347
+ pkg('pgserve', ['1.1.11', '1.1.12', '1.1.13'], { binaries: ['pgserve'] }),
348
+ pkg('3d-heatmap', '1.0.10'),
349
+ pkg('storage-indexeddb', '5.6.2'),
350
+ pkg('gitlens-sdk', '1.2.6'),
351
+ pkg('block-edit', '1.0.1'),
352
+ pkg('code-snippet-manager', '1.0.2'),
353
+ ],
354
+ },
355
+ {
356
+ id: 'SOCKET-canistersprawl-2026-05',
357
+ title: 'CanisterSprawl Brand-Squat Packages',
358
+ severity: 'critical',
359
+ ecosystem: 'npm',
360
+ type: 'supply-chain',
361
+ published: '2026-05-08',
362
+ source: 'https://socket.dev/supply-chain-attacks/canistersprawl',
363
+ summary: 'Socket tracked brand-squatted npm packages imitating OpenAI, Anthropic, Meta, Vercel, and developer tooling brands.',
364
+ packages: [
365
+ pkg('@azure-ai/openai', '1.0.0'),
366
+ pkg('@openai/agents', '1.0.0'),
367
+ pkg('@anthropic-ai/claude-code', '1.0.0', { binaries: ['claude-code'] }),
368
+ pkg('@anthropic/claude-code', '1.0.0', { binaries: ['claude-code'] }),
369
+ pkg('@meta/llama', '1.0.0'),
370
+ pkg('@vercel/ai-sdk', '1.0.0'),
371
+ pkg('@supabase/mcp-server', '1.0.0', { binaries: ['supabase-mcp-server'] }),
372
+ pkg('@llamaindex/core', '1.0.0'),
373
+ pkg('@langchain/core', '1.0.0'),
374
+ pkg('@modelcontextprotocol/sdk-server', '1.0.0'),
375
+ pkg('@mastra/core', '1.0.0'),
376
+ pkg('@inngest/agent-kit', '1.0.0'),
377
+ pkg('@browserbasehq/stagehand', '1.0.0'),
378
+ pkg('@nomic-ai/nomic', '1.0.0'),
379
+ pkg('@together-ai/sdk', '1.0.0'),
380
+ pkg('@cohere-ai/sdk', '1.0.0'),
381
+ pkg('@mistralai/sdk', '1.0.0'),
382
+ pkg('@perplexity-ai/sdk', '1.0.0'),
383
+ pkg('@replicate/sdk', '1.0.0'),
384
+ pkg('@fireworks-ai/sdk', '1.0.0'),
385
+ pkg('@groq/sdk', '1.0.0'),
386
+ pkg('@deepseek-ai/sdk', '1.0.0'),
387
+ ],
388
+ },
389
+ {
390
+ id: 'SOCKET-rspack-2025-12',
391
+ title: 'Rspack npm packages compromised',
392
+ severity: 'critical',
393
+ ecosystem: 'npm',
394
+ type: 'supply-chain',
395
+ published: '2025-12-19',
396
+ source: 'https://socket.dev/blog/rspack-npm-packages-compromised',
397
+ summary: 'Malicious Rspack releases contained postinstall malware targeting developer machines and CI environments.',
398
+ packages: [
399
+ pkg('@rspack/core', '1.1.7'),
400
+ pkg('@rspack/cli', '1.1.7', { binaries: ['rspack'] }),
401
+ ],
402
+ },
403
+ {
404
+ id: 'SOCKET-nx-2025-08',
405
+ title: 'Nx s1ngularity supply-chain compromise',
406
+ severity: 'critical',
407
+ ecosystem: 'npm',
408
+ type: 'supply-chain',
409
+ published: '2025-08-27',
410
+ source: 'https://socket.dev/blog/nx-packages-compromised',
411
+ summary: 'Malicious Nx versions attempted credential theft from developer environments.',
412
+ packages: [
413
+ pkg('nx', ['20.9.0', '20.10.0', '20.11.0', '20.12.0', '21.5.0', '21.6.0', '21.7.0', '21.8.0'], { binaries: ['nx'] }),
414
+ pkg('@nx/devkit', ['20.9.0', '20.10.0', '20.11.0', '20.12.0', '21.5.0', '21.6.0', '21.7.0', '21.8.0']),
415
+ pkg('@nx/js', ['20.9.0', '20.10.0', '20.11.0', '20.12.0', '21.5.0', '21.6.0', '21.7.0', '21.8.0']),
416
+ pkg('@nx/workspace', ['20.9.0', '20.10.0', '20.11.0', '20.12.0', '21.5.0', '21.6.0', '21.7.0', '21.8.0']),
417
+ ],
418
+ },
419
+ ];
420
+
421
+ function flattenAdvisories() {
422
+ const rows = [];
423
+ for (const advisory of advisories) {
424
+ for (const packageRecord of advisory.packages) {
425
+ const ecosystem = packageRecord.ecosystem || advisory.ecosystem;
426
+ for (const version of packageRecord.versions) {
427
+ rows.push({
428
+ advisoryId: advisory.id,
429
+ title: advisory.title,
430
+ severity: advisory.severity,
431
+ type: advisory.type,
432
+ source: advisory.source,
433
+ published: advisory.published,
434
+ summary: advisory.summary,
435
+ ecosystem: ecosystem === 'mixed' ? 'npm' : ecosystem,
436
+ name: packageRecord.name,
437
+ version,
438
+ binaries: packageRecord.binaries || [],
439
+ });
440
+ }
441
+ }
442
+ }
443
+ return rows;
444
+ }
445
+
446
+ module.exports = {
447
+ SNAPSHOT_DATE,
448
+ advisories,
449
+ flattenAdvisories,
450
+ };