supply-chain-attack 0.1.2 → 0.1.8
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 +1 -1
- package/README.md +96 -7
- package/RESEARCH.md +35 -0
- package/bin/supply-chain-attack.js +1 -4
- package/lib/advisories.js +450 -0
- package/lib/cli.js +663 -0
- package/lib/live-osv.js +151 -0
- package/lib/parsers.js +348 -0
- package/lib/scanner.js +808 -0
- package/package.json +15 -13
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026
|
|
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,23 +1,112 @@
|
|
|
1
1
|
# supply-chain-attack
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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, checks the latest 4 embedded supply-chain attacks against packages found on the machine, shows either the affected libraries present locally or “Nice” for each attack, and exits non-zero when it finds a risky package or suspicious IOC.
|
|
20
|
+
|
|
21
|
+
Interactive terminals also get a small one-line menu:
|
|
12
22
|
|
|
13
23
|
```txt
|
|
14
24
|
options l learn a actions q quit ›
|
|
15
25
|
```
|
|
16
26
|
|
|
17
|
-
|
|
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
|
|
18
96
|
|
|
19
97
|
```sh
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
98
|
+
npm test
|
|
99
|
+
npm run check
|
|
100
|
+
npm pack --dry-run
|
|
101
|
+
npm publish
|
|
23
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
|
-
|
|
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
|
+
};
|