muaddib-scanner 1.0.0

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.
Files changed (41) hide show
  1. package/.github/workflows/scan.yml +33 -0
  2. package/LICENSE +21 -0
  3. package/MUADDIBLOGO.png +0 -0
  4. package/README.md +218 -0
  5. package/action/action.yml +28 -0
  6. package/bin/muaddib.js +84 -0
  7. package/data/iocs.json +38 -0
  8. package/docs/threat-model.md +116 -0
  9. package/iocs/hashes.yaml +220 -0
  10. package/iocs/packages.yaml +265 -0
  11. package/package.json +43 -0
  12. package/results.sarif +379 -0
  13. package/src/index.js +142 -0
  14. package/src/ioc/feeds.js +42 -0
  15. package/src/ioc/updater.js +244 -0
  16. package/src/ioc/yaml-loader.js +96 -0
  17. package/src/report.js +152 -0
  18. package/src/response/playbooks.js +115 -0
  19. package/src/rules/index.js +197 -0
  20. package/src/sarif.js +74 -0
  21. package/src/scanner/ast.js +175 -0
  22. package/src/scanner/dataflow.js +167 -0
  23. package/src/scanner/dependencies.js +110 -0
  24. package/src/scanner/hash.js +68 -0
  25. package/src/scanner/obfuscation.js +99 -0
  26. package/src/scanner/package.js +60 -0
  27. package/src/scanner/shell.js +63 -0
  28. package/src/watch.js +37 -0
  29. package/test/samples/malicious.js +20 -0
  30. package/tests/run-tests.js +363 -0
  31. package/tests/samples/ast/malicious.js +20 -0
  32. package/tests/samples/clean/safe.js +14 -0
  33. package/tests/samples/dataflow/exfiltration.js +20 -0
  34. package/tests/samples/edge/empty/empty.js +0 -0
  35. package/tests/samples/edge/invalid-syntax/broken.js +5 -0
  36. package/tests/samples/edge/large-file/large.js +6 -0
  37. package/tests/samples/edge/non-js/readme.txt +3 -0
  38. package/tests/samples/markers/shai-hulud.js +10 -0
  39. package/tests/samples/obfuscation/obfuscated.js +1 -0
  40. package/tests/samples/package/package.json +9 -0
  41. package/tests/samples/shell/malicious.sh +13 -0
@@ -0,0 +1,220 @@
1
+ # MUAD'DIB IOCs - Hashes SHA256 malveillants
2
+ # Contribuez via PR: https://github.com/DNSZLSK/muad-dib
3
+
4
+ version: "1.0.0"
5
+ updated: "2026-01-01"
6
+
7
+ hashes:
8
+ # ============================================
9
+ # SHAI-HULUD v2 - bun_environment.js
10
+ # ============================================
11
+ - id: HASH-SHAI-V2-001
12
+ sha256: "62ee164b9b306250c1172583f138c9614139264f889fa99614903c12755468d0"
13
+ file: "bun_environment.js"
14
+ source: shai-hulud-v2
15
+ severity: critical
16
+ confidence: high
17
+ description: "Payload Shai-Hulud v2 - exfiltration credentials"
18
+ references:
19
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
20
+
21
+ - id: HASH-SHAI-V2-002
22
+ sha256: "cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd"
23
+ file: "bun_environment.js"
24
+ source: shai-hulud-v2
25
+ severity: critical
26
+ confidence: high
27
+ description: "Variante Shai-Hulud v2"
28
+ references:
29
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
30
+
31
+ - id: HASH-SHAI-V2-003
32
+ sha256: "f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068"
33
+ file: "bun_environment.js"
34
+ source: shai-hulud-v2
35
+ severity: critical
36
+ confidence: high
37
+ description: "Variante Shai-Hulud v2"
38
+ references:
39
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
40
+
41
+ # ============================================
42
+ # SHAI-HULUD v2 - setup_bun.js
43
+ # ============================================
44
+ - id: HASH-SHAI-V2-004
45
+ sha256: "a3894003ad1d293ba96d77881ccd2071446dc3f65f434669b49b3da92421901a"
46
+ file: "setup_bun.js"
47
+ source: shai-hulud-v2
48
+ severity: critical
49
+ confidence: high
50
+ description: "Loader Shai-Hulud v2"
51
+ references:
52
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
53
+
54
+ - id: HASH-SHAI-V2-005
55
+ sha256: "f1df4896244500671eb4aa63ebb48ea11cee196fafaa0e9874e17b24ac053c02"
56
+ file: "setup_bun.js"
57
+ source: shai-hulud-v2
58
+ severity: critical
59
+ confidence: high
60
+ description: "Variante Shai-Hulud v2"
61
+ references:
62
+ - https://blog.phylum.io/shai-hulud-npm-worm
63
+
64
+ - id: HASH-SHAI-V2-006
65
+ sha256: "9d59fd0bcc14b671079824c704575f201b74276238dc07a9c12a93a84195648a"
66
+ file: "setup_bun.js"
67
+ source: shai-hulud-v2
68
+ severity: critical
69
+ confidence: high
70
+ description: "Variante Shai-Hulud v2"
71
+ references:
72
+ - https://blog.phylum.io/shai-hulud-npm-worm
73
+
74
+ - id: HASH-SHAI-V2-007
75
+ sha256: "e0250076c1d2ac38777ea8f542431daf61fcbaab0ca9c196614b28065ef5b918"
76
+ file: "setup_bun.js"
77
+ source: shai-hulud-v2
78
+ severity: critical
79
+ confidence: high
80
+ description: "Variante Shai-Hulud v2"
81
+ references:
82
+ - https://blog.phylum.io/shai-hulud-npm-worm
83
+
84
+ # ============================================
85
+ # NODE-IPC PROTESTWARE
86
+ # ============================================
87
+ - id: HASH-PROTEST-001
88
+ sha256: "4b2399646573bb737c4969563303d8ee2e9ddbd1b271f1ca9e35ea78062538db"
89
+ file: "peacenotwar.js"
90
+ source: protestware
91
+ severity: critical
92
+ confidence: high
93
+ description: "Payload node-ipc peacenotwar"
94
+ references:
95
+ - https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/
96
+
97
+ - id: HASH-PROTEST-002
98
+ sha256: "46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09"
99
+ file: "peacenotwar.js"
100
+ source: protestware
101
+ severity: critical
102
+ confidence: high
103
+ description: "Variante node-ipc peacenotwar"
104
+ references:
105
+ - https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/
106
+
107
+ markers:
108
+ # ============================================
109
+ # SHAI-HULUD MARKERS
110
+ # ============================================
111
+ - id: MARKER-SHAI-001
112
+ pattern: "Sha1-Hulud"
113
+ source: shai-hulud-v1
114
+ severity: critical
115
+ confidence: high
116
+ description: "Signature Shai-Hulud v1"
117
+
118
+ - id: MARKER-SHAI-002
119
+ pattern: "Shai-Hulud"
120
+ source: shai-hulud-v1
121
+ severity: critical
122
+ confidence: high
123
+ description: "Signature Shai-Hulud"
124
+
125
+ - id: MARKER-SHAI-003
126
+ pattern: "The Second Coming"
127
+ source: shai-hulud-v2
128
+ severity: critical
129
+ confidence: high
130
+ description: "Signature Shai-Hulud v2"
131
+
132
+ - id: MARKER-SHAI-004
133
+ pattern: "Goldox-T3chs"
134
+ source: shai-hulud-v3
135
+ severity: critical
136
+ confidence: high
137
+ description: "Signature Shai-Hulud v3 Golden Path"
138
+
139
+ - id: MARKER-SHAI-005
140
+ pattern: "Only Happy Girl"
141
+ source: shai-hulud-v2
142
+ severity: critical
143
+ confidence: high
144
+ description: "Signature Shai-Hulud v2 variante"
145
+
146
+ # ============================================
147
+ # PROTESTWARE MARKERS
148
+ # ============================================
149
+ - id: MARKER-PROTEST-001
150
+ pattern: "peacenotwar"
151
+ source: protestware
152
+ severity: critical
153
+ confidence: high
154
+ description: "Signature node-ipc protestware"
155
+
156
+ # ============================================
157
+ # GENERIC MALWARE MARKERS
158
+ # ============================================
159
+ - id: MARKER-GENERIC-001
160
+ pattern: "/dev/tcp"
161
+ source: generic
162
+ severity: critical
163
+ confidence: high
164
+ description: "Reverse shell bash"
165
+
166
+ - id: MARKER-GENERIC-002
167
+ pattern: "discord.com/api/webhooks"
168
+ source: generic
169
+ severity: high
170
+ confidence: medium
171
+ description: "Exfiltration via Discord webhook"
172
+
173
+ files:
174
+ # ============================================
175
+ # FICHIERS SUSPECTS SHAI-HULUD
176
+ # ============================================
177
+ - id: FILE-SHAI-001
178
+ name: "setup_bun.js"
179
+ source: shai-hulud-v2
180
+ severity: critical
181
+ confidence: high
182
+ description: "Loader Shai-Hulud"
183
+
184
+ - id: FILE-SHAI-002
185
+ name: "bun_environment.js"
186
+ source: shai-hulud-v2
187
+ severity: critical
188
+ confidence: high
189
+ description: "Payload Shai-Hulud"
190
+
191
+ - id: FILE-SHAI-003
192
+ name: "bundle.js"
193
+ source: shai-hulud-v2
194
+ severity: high
195
+ confidence: medium
196
+ description: "Payload obfusque potentiel"
197
+
198
+ # ============================================
199
+ # FICHIERS SUSPECTS GENERIQUES
200
+ # ============================================
201
+ - id: FILE-GENERIC-001
202
+ name: "stealer.js"
203
+ source: generic
204
+ severity: critical
205
+ confidence: high
206
+ description: "Token stealer potentiel"
207
+
208
+ - id: FILE-GENERIC-002
209
+ name: "token-grabber.js"
210
+ source: generic
211
+ severity: critical
212
+ confidence: high
213
+ description: "Token stealer potentiel"
214
+
215
+ - id: FILE-GENERIC-003
216
+ name: "inject.js"
217
+ source: generic
218
+ severity: high
219
+ confidence: medium
220
+ description: "Code injection potentiel"
@@ -0,0 +1,265 @@
1
+ # MUAD'DIB IOCs - Packages malveillants
2
+ # Contribuez via PR: https://github.com/DNSZLSK/muad-dib
3
+
4
+ version: "1.0.0"
5
+ updated: "2026-01-01"
6
+
7
+ packages:
8
+ # ============================================
9
+ # SHAI-HULUD v1 (Septembre 2025)
10
+ # ============================================
11
+ - id: SHAI-HULUD-V1-001
12
+ name: "@ctrl/tinycolor"
13
+ version: "4.1.1"
14
+ severity: critical
15
+ confidence: high
16
+ source: shai-hulud-v1
17
+ introduced: "2025-09-01"
18
+ description: "Package compromis par Shai-Hulud v1 - vol de credentials npm/GitHub"
19
+ references:
20
+ - https://blog.phylum.io/shai-hulud-npm-worm
21
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
22
+ mitre: T1195.002
23
+
24
+ - id: SHAI-HULUD-V1-002
25
+ name: "ng2-file-upload"
26
+ version: "*"
27
+ severity: critical
28
+ confidence: high
29
+ source: shai-hulud-v1
30
+ introduced: "2025-09-01"
31
+ description: "Package compromis par Shai-Hulud v1"
32
+ references:
33
+ - https://blog.phylum.io/shai-hulud-npm-worm
34
+ mitre: T1195.002
35
+
36
+ - id: SHAI-HULUD-V1-003
37
+ name: "ngx-bootstrap"
38
+ version: "*"
39
+ severity: critical
40
+ confidence: high
41
+ source: shai-hulud-v1
42
+ introduced: "2025-09-01"
43
+ description: "Package compromis par Shai-Hulud v1"
44
+ references:
45
+ - https://blog.phylum.io/shai-hulud-npm-worm
46
+ mitre: T1195.002
47
+
48
+ # ============================================
49
+ # SHAI-HULUD v2 "The Second Coming" (Novembre 2025)
50
+ # ============================================
51
+ - id: SHAI-HULUD-V2-001
52
+ name: "@asyncapi/specs"
53
+ version: "*"
54
+ severity: critical
55
+ confidence: high
56
+ source: shai-hulud-v2
57
+ introduced: "2025-11-01"
58
+ description: "Package compromis par Shai-Hulud v2 - inclut dead man's switch"
59
+ references:
60
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
61
+ mitre: T1195.002
62
+
63
+ - id: SHAI-HULUD-V2-002
64
+ name: "get-them-args"
65
+ version: "*"
66
+ severity: critical
67
+ confidence: high
68
+ source: shai-hulud-v2
69
+ introduced: "2025-11-01"
70
+ description: "Package compromis par Shai-Hulud v2"
71
+ references:
72
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
73
+ mitre: T1195.002
74
+
75
+ - id: SHAI-HULUD-V2-003
76
+ name: "kill-port"
77
+ version: "*"
78
+ severity: critical
79
+ confidence: high
80
+ source: shai-hulud-v2
81
+ introduced: "2025-11-01"
82
+ description: "Package compromis par Shai-Hulud v2"
83
+ references:
84
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
85
+ mitre: T1195.002
86
+
87
+ - id: SHAI-HULUD-V2-004
88
+ name: "posthog-node"
89
+ version: "*"
90
+ severity: critical
91
+ confidence: high
92
+ source: shai-hulud-v2
93
+ introduced: "2025-11-01"
94
+ description: "Package compromis par Shai-Hulud v2"
95
+ references:
96
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
97
+ mitre: T1195.002
98
+
99
+ - id: SHAI-HULUD-V2-005
100
+ name: "posthog-js"
101
+ version: "*"
102
+ severity: critical
103
+ confidence: high
104
+ source: shai-hulud-v2
105
+ introduced: "2025-11-01"
106
+ description: "Package compromis par Shai-Hulud v2"
107
+ references:
108
+ - https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
109
+ mitre: T1195.002
110
+
111
+ # ============================================
112
+ # SHAI-HULUD v3 "Golden Path" (Decembre 2025)
113
+ # ============================================
114
+ - id: SHAI-HULUD-V3-001
115
+ name: "@vietmoney/react-big-calendar"
116
+ version: "0.26.2"
117
+ severity: critical
118
+ confidence: high
119
+ source: shai-hulud-v3
120
+ introduced: "2025-12-01"
121
+ description: "Package compromis par Shai-Hulud v3 Golden Path"
122
+ references:
123
+ - https://socket.dev/npm/package/@vietmoney/react-big-calendar
124
+ mitre: T1195.002
125
+
126
+ # ============================================
127
+ # ATTAQUES HISTORIQUES
128
+ # ============================================
129
+ - id: EVENT-STREAM-001
130
+ name: "flatmap-stream"
131
+ version: "0.1.1"
132
+ severity: critical
133
+ confidence: high
134
+ source: event-stream-2018
135
+ introduced: "2018-11-01"
136
+ description: "Payload malveillant de l'attaque event-stream - vol de Bitcoin wallets"
137
+ references:
138
+ - https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident
139
+ mitre: T1195.002
140
+
141
+ - id: EVENT-STREAM-002
142
+ name: "event-stream"
143
+ version: "3.3.6"
144
+ severity: critical
145
+ confidence: high
146
+ source: event-stream-2018
147
+ introduced: "2018-11-01"
148
+ description: "Version compromise de event-stream"
149
+ references:
150
+ - https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident
151
+ mitre: T1195.002
152
+
153
+ - id: ESLINT-SCOPE-001
154
+ name: "eslint-scope"
155
+ version: "3.7.2"
156
+ severity: critical
157
+ confidence: high
158
+ source: eslint-scope-2018
159
+ introduced: "2018-07-01"
160
+ description: "Version compromise de eslint-scope - vol de tokens npm"
161
+ references:
162
+ - https://eslint.org/blog/2018/07/postmortem-for-malicious-package-publishes
163
+ mitre: T1195.002
164
+
165
+ # ============================================
166
+ # PROTESTWARE
167
+ # ============================================
168
+ - id: PROTESTWARE-001
169
+ name: "node-ipc"
170
+ version: "10.1.1"
171
+ severity: critical
172
+ confidence: high
173
+ source: protestware
174
+ introduced: "2022-03-01"
175
+ description: "Protestware - supprime fichiers sur machines avec IP russe/bielorusse"
176
+ references:
177
+ - https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/
178
+ mitre: T1485
179
+
180
+ - id: PROTESTWARE-002
181
+ name: "node-ipc"
182
+ version: "10.1.2"
183
+ severity: critical
184
+ confidence: high
185
+ source: protestware
186
+ introduced: "2022-03-01"
187
+ description: "Protestware - version modifiee"
188
+ references:
189
+ - https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/
190
+ mitre: T1485
191
+
192
+ - id: PROTESTWARE-003
193
+ name: "colors"
194
+ version: "1.4.1"
195
+ severity: high
196
+ confidence: high
197
+ source: protestware
198
+ introduced: "2022-01-01"
199
+ description: "Protestware - boucle infinie intentionnelle"
200
+ references:
201
+ - https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/
202
+ mitre: T1499
203
+
204
+ - id: PROTESTWARE-004
205
+ name: "faker"
206
+ version: "6.6.6"
207
+ severity: high
208
+ confidence: high
209
+ source: protestware
210
+ introduced: "2022-01-01"
211
+ description: "Protestware - sabotage intentionnel"
212
+ references:
213
+ - https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/
214
+ mitre: T1499
215
+
216
+ # ============================================
217
+ # TYPOSQUATS
218
+ # ============================================
219
+ - id: TYPOSQUAT-001
220
+ name: "crossenv"
221
+ version: "*"
222
+ severity: high
223
+ confidence: high
224
+ source: typosquat
225
+ introduced: "2017-08-01"
226
+ description: "Typosquat de cross-env - vol de variables d'environnement"
227
+ references:
228
+ - https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry
229
+ mitre: T1195.002
230
+
231
+ - id: TYPOSQUAT-002
232
+ name: "mongose"
233
+ version: "*"
234
+ severity: high
235
+ confidence: high
236
+ source: typosquat
237
+ introduced: "2017-08-01"
238
+ description: "Typosquat de mongoose"
239
+ references:
240
+ - https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry
241
+ mitre: T1195.002
242
+
243
+ - id: TYPOSQUAT-003
244
+ name: "babelcli"
245
+ version: "*"
246
+ severity: high
247
+ confidence: high
248
+ source: typosquat
249
+ introduced: "2017-08-01"
250
+ description: "Typosquat de babel-cli"
251
+ references:
252
+ - https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry
253
+ mitre: T1195.002
254
+
255
+ - id: TYPOSQUAT-004
256
+ name: "lodahs"
257
+ version: "*"
258
+ severity: high
259
+ confidence: high
260
+ source: typosquat
261
+ introduced: "2019-01-01"
262
+ description: "Typosquat de lodash"
263
+ references:
264
+ - https://snyk.io/blog/malicious-code-found-in-npm-package-event-stream/
265
+ mitre: T1195.002
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "muaddib-scanner",
3
+ "version": "1.0.0",
4
+ "description": "Supply-chain threat detection & response for npm",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "muaddib": "./bin/muaddib.js"
8
+ },
9
+ "scripts": {
10
+ "test": "node tests/run-tests.js",
11
+ "scan": "node bin/muaddib.js scan .",
12
+ "update": "node bin/muaddib.js update"
13
+ },
14
+ "keywords": [
15
+ "security",
16
+ "npm",
17
+ "supply-chain",
18
+ "malware",
19
+ "scanner",
20
+ "shai-hulud",
21
+ "detection",
22
+ "ast",
23
+ "sarif"
24
+ ],
25
+ "author": "DNSZLSK",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/DNSZLSK/muad-dib.git"
30
+ },
31
+ "homepage": "https://github.com/DNSZLSK/muad-dib",
32
+ "bugs": {
33
+ "url": "https://github.com/DNSZLSK/muad-dib/issues"
34
+ },
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "dependencies": {
39
+ "acorn": "^8.14.0",
40
+ "acorn-walk": "^8.3.4",
41
+ "js-yaml": "^4.1.0"
42
+ }
43
+ }