@trailofbits/vsix-audit 0.1.0 → 0.1.3

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 (82) hide show
  1. package/README.md +23 -30
  2. package/dist/index.js +0 -0
  3. package/dist/scanner/checks/ioc.test.js +1 -0
  4. package/dist/scanner/checks/ioc.test.js.map +1 -1
  5. package/dist/scanner/checks/package.test.js +1 -0
  6. package/dist/scanner/checks/package.test.js.map +1 -1
  7. package/dist/scanner/checks/telemetry.d.ts +6 -0
  8. package/dist/scanner/checks/telemetry.d.ts.map +1 -0
  9. package/dist/scanner/checks/telemetry.js +487 -0
  10. package/dist/scanner/checks/telemetry.js.map +1 -0
  11. package/dist/scanner/checks/telemetry.test.d.ts +2 -0
  12. package/dist/scanner/checks/telemetry.test.d.ts.map +1 -0
  13. package/dist/scanner/checks/telemetry.test.js +583 -0
  14. package/dist/scanner/checks/telemetry.test.js.map +1 -0
  15. package/dist/scanner/index.d.ts +1 -1
  16. package/dist/scanner/index.d.ts.map +1 -1
  17. package/dist/scanner/index.js +14 -1
  18. package/dist/scanner/index.js.map +1 -1
  19. package/dist/scanner/loaders/zoo.d.ts.map +1 -1
  20. package/dist/scanner/loaders/zoo.js +35 -1
  21. package/dist/scanner/loaders/zoo.js.map +1 -1
  22. package/dist/scanner/types.d.ts +8 -0
  23. package/dist/scanner/types.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. package/zoo/signatures/yara/README.md +7 -4
  26. package/zoo/telemetry/known-services.txt +27 -0
  27. package/dist/scanner/checks/behavioral.d.ts +0 -3
  28. package/dist/scanner/checks/behavioral.d.ts.map +0 -1
  29. package/dist/scanner/checks/behavioral.js +0 -367
  30. package/dist/scanner/checks/behavioral.js.map +0 -1
  31. package/dist/scanner/checks/blocklist.d.ts +0 -3
  32. package/dist/scanner/checks/blocklist.d.ts.map +0 -1
  33. package/dist/scanner/checks/blocklist.js +0 -32
  34. package/dist/scanner/checks/blocklist.js.map +0 -1
  35. package/dist/scanner/checks/blocklist.test.d.ts +0 -2
  36. package/dist/scanner/checks/blocklist.test.d.ts.map +0 -1
  37. package/dist/scanner/checks/blocklist.test.js +0 -74
  38. package/dist/scanner/checks/blocklist.test.js.map +0 -1
  39. package/dist/scanner/checks/chains.d.ts +0 -35
  40. package/dist/scanner/checks/chains.d.ts.map +0 -1
  41. package/dist/scanner/checks/chains.js +0 -505
  42. package/dist/scanner/checks/chains.js.map +0 -1
  43. package/dist/scanner/checks/chains.test.d.ts +0 -2
  44. package/dist/scanner/checks/chains.test.d.ts.map +0 -1
  45. package/dist/scanner/checks/chains.test.js +0 -250
  46. package/dist/scanner/checks/chains.test.js.map +0 -1
  47. package/dist/scanner/checks/dataflow.d.ts +0 -3
  48. package/dist/scanner/checks/dataflow.d.ts.map +0 -1
  49. package/dist/scanner/checks/dataflow.js +0 -316
  50. package/dist/scanner/checks/dataflow.js.map +0 -1
  51. package/dist/scanner/checks/dependencies.d.ts +0 -13
  52. package/dist/scanner/checks/dependencies.d.ts.map +0 -1
  53. package/dist/scanner/checks/dependencies.js +0 -225
  54. package/dist/scanner/checks/dependencies.js.map +0 -1
  55. package/dist/scanner/checks/dependencies.test.d.ts +0 -2
  56. package/dist/scanner/checks/dependencies.test.d.ts.map +0 -1
  57. package/dist/scanner/checks/dependencies.test.js +0 -248
  58. package/dist/scanner/checks/dependencies.test.js.map +0 -1
  59. package/dist/scanner/checks/manifest.d.ts +0 -6
  60. package/dist/scanner/checks/manifest.d.ts.map +0 -1
  61. package/dist/scanner/checks/manifest.js +0 -123
  62. package/dist/scanner/checks/manifest.js.map +0 -1
  63. package/dist/scanner/checks/manifest.test.d.ts +0 -2
  64. package/dist/scanner/checks/manifest.test.d.ts.map +0 -1
  65. package/dist/scanner/checks/manifest.test.js +0 -108
  66. package/dist/scanner/checks/manifest.test.js.map +0 -1
  67. package/dist/scanner/checks/patterns.d.ts +0 -5
  68. package/dist/scanner/checks/patterns.d.ts.map +0 -1
  69. package/dist/scanner/checks/patterns.js +0 -251
  70. package/dist/scanner/checks/patterns.js.map +0 -1
  71. package/dist/scanner/checks/patterns.test.d.ts +0 -2
  72. package/dist/scanner/checks/patterns.test.d.ts.map +0 -1
  73. package/dist/scanner/checks/patterns.test.js +0 -147
  74. package/dist/scanner/checks/patterns.test.js.map +0 -1
  75. package/dist/scanner/checks/unicode.d.ts +0 -3
  76. package/dist/scanner/checks/unicode.d.ts.map +0 -1
  77. package/dist/scanner/checks/unicode.js +0 -247
  78. package/dist/scanner/checks/unicode.js.map +0 -1
  79. package/dist/scanner/checks/unicode.test.d.ts +0 -2
  80. package/dist/scanner/checks/unicode.test.d.ts.map +0 -1
  81. package/dist/scanner/checks/unicode.test.js +0 -202
  82. package/dist/scanner/checks/unicode.test.js.map +0 -1
@@ -0,0 +1,583 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { checkTelemetry } from "./telemetry.js";
3
+ function makeContents(files, manifestOverrides) {
4
+ const manifest = {
5
+ name: "test-extension",
6
+ publisher: "test",
7
+ version: "1.0.0",
8
+ ...manifestOverrides,
9
+ };
10
+ const fileMap = new Map();
11
+ for (const [name, content] of Object.entries(files)) {
12
+ fileMap.set(name, Buffer.from(content, "utf8"));
13
+ }
14
+ return { manifest, files: fileMap, basePath: "/test" };
15
+ }
16
+ function makeZooData(telemetryServices) {
17
+ return {
18
+ blocklist: [],
19
+ hashes: new Set(),
20
+ domains: new Set(),
21
+ ips: new Set(),
22
+ maliciousNpmPackages: new Set(),
23
+ wallets: new Set(),
24
+ blockchainAllowlist: new Set(),
25
+ telemetryServices: telemetryServices ??
26
+ new Map([
27
+ ["sentry.io", { name: "Sentry", category: "crash-reporting", domains: ["sentry.io"] }],
28
+ [
29
+ "ingest.sentry.io",
30
+ { name: "Sentry", category: "crash-reporting", domains: ["ingest.sentry.io"] },
31
+ ],
32
+ [
33
+ "api.mixpanel.com",
34
+ { name: "Mixpanel", category: "analytics", domains: ["api.mixpanel.com"] },
35
+ ],
36
+ [
37
+ "api.amplitude.com",
38
+ { name: "Amplitude", category: "analytics", domains: ["api.amplitude.com"] },
39
+ ],
40
+ ["api.segment.io", { name: "Segment", category: "analytics", domains: ["api.segment.io"] }],
41
+ [
42
+ "app.posthog.com",
43
+ { name: "PostHog", category: "analytics", domains: ["app.posthog.com"] },
44
+ ],
45
+ [
46
+ "applicationinsights.azure.com",
47
+ {
48
+ name: "Azure Application Insights",
49
+ category: "apm",
50
+ domains: ["applicationinsights.azure.com"],
51
+ },
52
+ ],
53
+ ["datadoghq.com", { name: "Datadog", category: "apm", domains: ["datadoghq.com"] }],
54
+ ]),
55
+ };
56
+ }
57
+ describe("checkTelemetry", () => {
58
+ // ============================================================================
59
+ // SDK IMPORT DETECTION
60
+ // ============================================================================
61
+ describe("SDK import detection", () => {
62
+ it("detects ESM Sentry import", () => {
63
+ const content = `
64
+ import * as Sentry from "@sentry/node";
65
+ Sentry.init({ dsn: "https://example.ingest.sentry.io/123" });
66
+ `;
67
+ const contents = makeContents({ "extension.js": content });
68
+ const zooData = makeZooData();
69
+ const findings = checkTelemetry(contents, zooData);
70
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
71
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
72
+ expect(finding?.metadata?.["serviceName"]).toBe("Sentry");
73
+ expect(finding?.metadata?.["sdkPackage"]).toBe("@sentry/node");
74
+ expect(finding?.metadata?.["serviceCategory"]).toBe("crash-reporting");
75
+ });
76
+ it("detects CommonJS Sentry require", () => {
77
+ const content = `
78
+ const Sentry = require("@sentry/node");
79
+ Sentry.init({ dsn: "https://example.ingest.sentry.io/123" });
80
+ `;
81
+ const contents = makeContents({ "extension.js": content });
82
+ const zooData = makeZooData();
83
+ const findings = checkTelemetry(contents, zooData);
84
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
85
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
86
+ expect(finding?.metadata?.["serviceName"]).toBe("Sentry");
87
+ expect(finding?.metadata?.["sdkPackage"]).toBe("@sentry/node");
88
+ });
89
+ it("detects Mixpanel SDK import", () => {
90
+ const content = `
91
+ import Mixpanel from "mixpanel";
92
+ const mixpanel = Mixpanel.init("token");
93
+ `;
94
+ const contents = makeContents({ "extension.js": content });
95
+ const zooData = makeZooData();
96
+ const findings = checkTelemetry(contents, zooData);
97
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
98
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
99
+ expect(finding?.metadata?.["serviceName"]).toBe("Mixpanel");
100
+ expect(finding?.metadata?.["serviceCategory"]).toBe("analytics");
101
+ });
102
+ it("detects VS Code Telemetry SDK", () => {
103
+ const content = `
104
+ import TelemetryReporter from "@vscode/extension-telemetry";
105
+ const reporter = new TelemetryReporter(key);
106
+ `;
107
+ const contents = makeContents({ "extension.ts": content });
108
+ const zooData = makeZooData();
109
+ const findings = checkTelemetry(contents, zooData);
110
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
111
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
112
+ expect(finding?.metadata?.["serviceName"]).toBe("VS Code Telemetry");
113
+ expect(finding?.metadata?.["sdkPackage"]).toBe("@vscode/extension-telemetry");
114
+ });
115
+ it("detects ApplicationInsights SDK", () => {
116
+ const content = `
117
+ const appInsights = require("applicationinsights");
118
+ appInsights.setup("key").start();
119
+ `;
120
+ const contents = makeContents({ "extension.js": content });
121
+ const zooData = makeZooData();
122
+ const findings = checkTelemetry(contents, zooData);
123
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
124
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
125
+ expect(finding?.metadata?.["serviceName"]).toBe("Azure Application Insights");
126
+ expect(finding?.metadata?.["serviceCategory"]).toBe("apm");
127
+ });
128
+ it("detects PostHog SDK", () => {
129
+ const content = `
130
+ import { PostHog } from "posthog-node";
131
+ const client = new PostHog("key");
132
+ `;
133
+ const contents = makeContents({ "extension.ts": content });
134
+ const zooData = makeZooData();
135
+ const findings = checkTelemetry(contents, zooData);
136
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
137
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
138
+ expect(finding?.metadata?.["serviceName"]).toBe("PostHog");
139
+ });
140
+ });
141
+ // ============================================================================
142
+ // ENDPOINT URL DETECTION
143
+ // ============================================================================
144
+ describe("endpoint URL detection", () => {
145
+ it("detects known Sentry endpoint URL", () => {
146
+ const content = `
147
+ const dsn = "https://ingest.sentry.io/api/123/envelope/";
148
+ fetch(dsn, { method: "POST", body: data });
149
+ `;
150
+ const contents = makeContents({ "extension.js": content });
151
+ const zooData = makeZooData();
152
+ const findings = checkTelemetry(contents, zooData);
153
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
154
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
155
+ expect(finding?.metadata?.["serviceName"]).toBe("Sentry");
156
+ expect(finding?.metadata?.["endpoint"]).toContain("sentry.io");
157
+ expect(finding?.metadata?.["isKnownService"]).toBe(true);
158
+ });
159
+ it("detects known Mixpanel endpoint URL", () => {
160
+ const content = `
161
+ const url = "https://api.mixpanel.com/track";
162
+ await fetch(url, { body: JSON.stringify(event) });
163
+ `;
164
+ const contents = makeContents({ "extension.js": content });
165
+ const zooData = makeZooData();
166
+ const findings = checkTelemetry(contents, zooData);
167
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
168
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
169
+ expect(finding?.metadata?.["serviceName"]).toBe("Mixpanel");
170
+ expect(finding?.metadata?.["endpoint"]).toContain("mixpanel.com");
171
+ });
172
+ it("detects unknown telemetry URL by path pattern", () => {
173
+ const content = `
174
+ const url = "https://telemetry.example.com/v2/track";
175
+ fetch(url, { body: data });
176
+ `;
177
+ const contents = makeContents({ "extension.js": content });
178
+ const zooData = makeZooData();
179
+ const findings = checkTelemetry(contents, zooData);
180
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
181
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
182
+ expect(finding?.metadata?.["serviceName"]).toBe("telemetry.example.com");
183
+ expect(finding?.metadata?.["isKnownService"]).toBe(false);
184
+ });
185
+ it("detects telemetry URL with /api/telemetry path", () => {
186
+ const content = `
187
+ const endpoint = "https://custom.service.io/api/telemetry";
188
+ sendData(endpoint, payload);
189
+ `;
190
+ const contents = makeContents({ "extension.js": content });
191
+ const zooData = makeZooData();
192
+ const findings = checkTelemetry(contents, zooData);
193
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
194
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
195
+ expect(finding?.metadata?.["isKnownService"]).toBe(false);
196
+ });
197
+ it("detects telemetry URL with /collect path", () => {
198
+ const content = `
199
+ navigator.sendBeacon("https://analytics.custom.io/collect", payload);
200
+ `;
201
+ const contents = makeContents({ "extension.js": content });
202
+ const zooData = makeZooData();
203
+ const findings = checkTelemetry(contents, zooData);
204
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
205
+ });
206
+ });
207
+ // ============================================================================
208
+ // OPT-OUT DETECTION
209
+ // ============================================================================
210
+ describe("opt-out detection", () => {
211
+ it("detects VS Code API opt-out (vscode.env.isTelemetryEnabled)", () => {
212
+ const content = `
213
+ import * as Sentry from "@sentry/node";
214
+ import * as vscode from "vscode";
215
+
216
+ if (vscode.env.isTelemetryEnabled) {
217
+ Sentry.init({ dsn: "..." });
218
+ }
219
+ `;
220
+ const contents = makeContents({ "extension.ts": content });
221
+ const zooData = makeZooData();
222
+ const findings = checkTelemetry(contents, zooData);
223
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
224
+ expect(finding?.metadata?.["optOut"]).toEqual({
225
+ available: true,
226
+ method: "vscode-api",
227
+ settingName: "vscode.env.isTelemetryEnabled",
228
+ });
229
+ expect(finding?.severity).toBe("medium");
230
+ });
231
+ it("detects manifest configuration opt-out", () => {
232
+ const content = `
233
+ import * as Sentry from "@sentry/node";
234
+ Sentry.init({ dsn: "..." });
235
+ `;
236
+ const contents = makeContents({ "extension.ts": content }, {
237
+ contributes: {
238
+ configuration: {
239
+ properties: {
240
+ "myext.enableTelemetry": {
241
+ type: "boolean",
242
+ default: true,
243
+ description: "Enable telemetry",
244
+ },
245
+ },
246
+ },
247
+ },
248
+ });
249
+ const zooData = makeZooData();
250
+ const findings = checkTelemetry(contents, zooData);
251
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
252
+ expect(finding?.metadata?.["optOut"]).toEqual({
253
+ available: true,
254
+ method: "manifest-config",
255
+ settingName: "myext.enableTelemetry",
256
+ });
257
+ expect(finding?.severity).toBe("medium");
258
+ });
259
+ it("detects code conditional opt-out via getConfiguration", () => {
260
+ const content = `
261
+ import * as Sentry from "@sentry/node";
262
+ const config = vscode.workspace.getConfiguration("myext");
263
+ if (config.get("enableTelemetry")) {
264
+ Sentry.init({ dsn: "..." });
265
+ }
266
+ `;
267
+ const contents = makeContents({ "extension.ts": content });
268
+ const zooData = makeZooData();
269
+ const findings = checkTelemetry(contents, zooData);
270
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
271
+ expect(finding?.metadata?.["optOut"]).toMatchObject({
272
+ available: true,
273
+ method: "code-conditional",
274
+ });
275
+ expect(finding?.severity).toBe("medium");
276
+ });
277
+ it("sets high severity when no opt-out is detected", () => {
278
+ const content = `
279
+ import * as Sentry from "@sentry/node";
280
+ Sentry.init({ dsn: "..." });
281
+ `;
282
+ const contents = makeContents({ "extension.ts": content });
283
+ const zooData = makeZooData();
284
+ const findings = checkTelemetry(contents, zooData);
285
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
286
+ expect(finding?.metadata?.["optOut"]).toEqual({
287
+ available: false,
288
+ method: "none",
289
+ settingName: null,
290
+ });
291
+ expect(finding?.severity).toBe("high");
292
+ });
293
+ it("detects opt-out in a different file (cross-file detection)", () => {
294
+ const telemetryFile = `
295
+ import * as Sentry from "@sentry/node";
296
+ export function init() {
297
+ Sentry.init({ dsn: "..." });
298
+ }
299
+ `;
300
+ const mainFile = `
301
+ import * as vscode from "vscode";
302
+ import { init } from "./telemetry";
303
+
304
+ if (vscode.env.isTelemetryEnabled) {
305
+ init();
306
+ }
307
+ `;
308
+ const contents = makeContents({
309
+ "src/telemetry.ts": telemetryFile,
310
+ "src/extension.ts": mainFile,
311
+ });
312
+ const zooData = makeZooData();
313
+ const findings = checkTelemetry(contents, zooData);
314
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
315
+ expect(finding?.metadata?.["optOut"]).toEqual({
316
+ available: true,
317
+ method: "vscode-api",
318
+ settingName: "vscode.env.isTelemetryEnabled",
319
+ });
320
+ });
321
+ });
322
+ // ============================================================================
323
+ // DATA COLLECTION ANALYSIS
324
+ // ============================================================================
325
+ describe("data collection analysis", () => {
326
+ it("detects common telemetry data fields", () => {
327
+ const content = `
328
+ import * as Sentry from "@sentry/node";
329
+ Sentry.setTag("extension_version", extensionVersion);
330
+ Sentry.setTag("vscode_version", vscode.version);
331
+ Sentry.setTag("os_platform", process.platform);
332
+ `;
333
+ const contents = makeContents({ "extension.ts": content });
334
+ const zooData = makeZooData();
335
+ const findings = checkTelemetry(contents, zooData);
336
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
337
+ const dataCollected = finding?.metadata?.["dataCollected"];
338
+ expect(dataCollected).toContain("extension_version");
339
+ expect(dataCollected).toContain("vscode_version");
340
+ expect(dataCollected).toContain("os_platform");
341
+ });
342
+ it("detects machine_id and session_id collection", () => {
343
+ const content = `
344
+ import analytics from "@segment/analytics-node";
345
+ analytics.track({
346
+ userId: machine_id,
347
+ sessionId: session_id,
348
+ event: "Extension Activated"
349
+ });
350
+ `;
351
+ const contents = makeContents({ "extension.js": content });
352
+ const zooData = makeZooData();
353
+ const findings = checkTelemetry(contents, zooData);
354
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
355
+ const dataCollected = finding?.metadata?.["dataCollected"];
356
+ expect(dataCollected).toContain("machine_id");
357
+ expect(dataCollected).toContain("session_id");
358
+ });
359
+ it("returns empty array when no data fields detected", () => {
360
+ const content = `
361
+ import * as Sentry from "@sentry/node";
362
+ Sentry.init({ dsn: "..." });
363
+ `;
364
+ const contents = makeContents({ "extension.ts": content });
365
+ const zooData = makeZooData();
366
+ const findings = checkTelemetry(contents, zooData);
367
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
368
+ const dataCollected = finding?.metadata?.["dataCollected"];
369
+ expect(dataCollected).toEqual([]);
370
+ });
371
+ });
372
+ // ============================================================================
373
+ // NODE_MODULES EXCLUSIONS
374
+ // ============================================================================
375
+ describe("node_modules exclusions", () => {
376
+ it("skips files in node_modules", () => {
377
+ const content = `
378
+ import * as Sentry from "@sentry/node";
379
+ Sentry.init({ dsn: "..." });
380
+ `;
381
+ const contents = makeContents({ "node_modules/@sentry/node/index.js": content });
382
+ const zooData = makeZooData();
383
+ const findings = checkTelemetry(contents, zooData);
384
+ expect(findings).toHaveLength(0);
385
+ });
386
+ it("skips files in vendor directory", () => {
387
+ const content = `
388
+ import * as Sentry from "@sentry/node";
389
+ Sentry.init({ dsn: "..." });
390
+ `;
391
+ const contents = makeContents({ "vendor/telemetry.js": content });
392
+ const zooData = makeZooData();
393
+ const findings = checkTelemetry(contents, zooData);
394
+ expect(findings).toHaveLength(0);
395
+ });
396
+ });
397
+ // ============================================================================
398
+ // FILE TYPE FILTERING
399
+ // ============================================================================
400
+ describe("file type filtering", () => {
401
+ it("scans .js files", () => {
402
+ const content = `import * as Sentry from "@sentry/node";`;
403
+ const contents = makeContents({ "extension.js": content });
404
+ const zooData = makeZooData();
405
+ const findings = checkTelemetry(contents, zooData);
406
+ expect(findings.length).toBeGreaterThan(0);
407
+ });
408
+ it("scans .ts files", () => {
409
+ const content = `import * as Sentry from "@sentry/node";`;
410
+ const contents = makeContents({ "extension.ts": content });
411
+ const zooData = makeZooData();
412
+ const findings = checkTelemetry(contents, zooData);
413
+ expect(findings.length).toBeGreaterThan(0);
414
+ });
415
+ it("scans .mjs files", () => {
416
+ const content = `import * as Sentry from "@sentry/node";`;
417
+ const contents = makeContents({ "extension.mjs": content });
418
+ const zooData = makeZooData();
419
+ const findings = checkTelemetry(contents, zooData);
420
+ expect(findings.length).toBeGreaterThan(0);
421
+ });
422
+ it("ignores .json files", () => {
423
+ const content = `{ "import": "@sentry/node" }`;
424
+ const contents = makeContents({ "package.json": content });
425
+ const zooData = makeZooData();
426
+ const findings = checkTelemetry(contents, zooData);
427
+ expect(findings).toHaveLength(0);
428
+ });
429
+ it("ignores .md files", () => {
430
+ const content = `Use \`import * as Sentry from "@sentry/node"\``;
431
+ const contents = makeContents({ "README.md": content });
432
+ const zooData = makeZooData();
433
+ const findings = checkTelemetry(contents, zooData);
434
+ expect(findings).toHaveLength(0);
435
+ });
436
+ });
437
+ // ============================================================================
438
+ // EDGE CASES
439
+ // ============================================================================
440
+ describe("edge cases", () => {
441
+ it("handles empty files gracefully", () => {
442
+ const contents = makeContents({ "empty.js": "" });
443
+ const zooData = makeZooData();
444
+ const findings = checkTelemetry(contents, zooData);
445
+ expect(findings).toHaveLength(0);
446
+ });
447
+ it("handles files with no telemetry", () => {
448
+ const content = `
449
+ import * as vscode from "vscode";
450
+ export function activate(context) {
451
+ console.log("Hello");
452
+ }
453
+ `;
454
+ const contents = makeContents({ "extension.ts": content });
455
+ const zooData = makeZooData();
456
+ const findings = checkTelemetry(contents, zooData);
457
+ expect(findings).toHaveLength(0);
458
+ });
459
+ it("handles malformed URLs gracefully", () => {
460
+ const content = `
461
+ const url = "not-a-valid-url";
462
+ const url2 = "https://";
463
+ fetch(url);
464
+ `;
465
+ const contents = makeContents({ "extension.js": content });
466
+ const zooData = makeZooData();
467
+ // Should not throw
468
+ const findings = checkTelemetry(contents, zooData);
469
+ expect(Array.isArray(findings)).toBe(true);
470
+ });
471
+ it("deduplicates multiple SDK imports of the same service", () => {
472
+ const content = `
473
+ import { init } from "@sentry/node";
474
+ import * as Sentry from "@sentry/node";
475
+ `;
476
+ const contents = makeContents({ "extension.ts": content });
477
+ const zooData = makeZooData();
478
+ const findings = checkTelemetry(contents, zooData);
479
+ // Should only have one finding for Sentry
480
+ const sentryFindings = findings.filter((f) => f.metadata?.["serviceName"] === "Sentry");
481
+ expect(sentryFindings.length).toBe(1);
482
+ });
483
+ it("handles empty zoo data gracefully", () => {
484
+ const content = `
485
+ import * as Sentry from "@sentry/node";
486
+ Sentry.init({ dsn: "..." });
487
+ `;
488
+ const contents = makeContents({ "extension.ts": content });
489
+ const zooData = makeZooData(new Map());
490
+ // Should still detect SDK imports even without zoo data
491
+ const findings = checkTelemetry(contents, zooData);
492
+ expect(findings.some((f) => f.id === "TELEMETRY_DETECTED")).toBe(true);
493
+ });
494
+ });
495
+ // ============================================================================
496
+ // METADATA AND LOCATION
497
+ // ============================================================================
498
+ describe("metadata and location", () => {
499
+ it("includes line number in location", () => {
500
+ const content = `// line 1
501
+ // line 2
502
+ import * as Sentry from "@sentry/node";`;
503
+ const contents = makeContents({ "extension.ts": content });
504
+ const zooData = makeZooData();
505
+ const findings = checkTelemetry(contents, zooData);
506
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
507
+ expect(finding?.location?.line).toBe(3);
508
+ });
509
+ it("includes file path in location", () => {
510
+ const content = `import * as Sentry from "@sentry/node";`;
511
+ const contents = makeContents({ "src/telemetry.ts": content });
512
+ const zooData = makeZooData();
513
+ const findings = checkTelemetry(contents, zooData);
514
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
515
+ expect(finding?.location?.file).toBe("src/telemetry.ts");
516
+ });
517
+ it("assigns telemetry category to all findings", () => {
518
+ const content = `
519
+ import * as Sentry from "@sentry/node";
520
+ import Mixpanel from "mixpanel";
521
+ `;
522
+ const contents = makeContents({ "extension.ts": content });
523
+ const zooData = makeZooData();
524
+ const findings = checkTelemetry(contents, zooData);
525
+ expect(findings.every((f) => f.category === "telemetry")).toBe(true);
526
+ });
527
+ });
528
+ // ============================================================================
529
+ // SEVERITY DETERMINATION
530
+ // ============================================================================
531
+ describe("severity determination", () => {
532
+ it("returns medium severity with VS Code API opt-out", () => {
533
+ const content = `
534
+ import * as Sentry from "@sentry/node";
535
+ if (vscode.env.isTelemetryEnabled) {
536
+ Sentry.init({ dsn: "..." });
537
+ }
538
+ `;
539
+ const contents = makeContents({ "extension.ts": content });
540
+ const zooData = makeZooData();
541
+ const findings = checkTelemetry(contents, zooData);
542
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
543
+ expect(finding?.severity).toBe("medium");
544
+ });
545
+ it("returns high severity without opt-out", () => {
546
+ const content = `
547
+ import * as Sentry from "@sentry/node";
548
+ Sentry.init({ dsn: "..." });
549
+ `;
550
+ const contents = makeContents({ "extension.ts": content });
551
+ const zooData = makeZooData();
552
+ const findings = checkTelemetry(contents, zooData);
553
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
554
+ expect(finding?.severity).toBe("high");
555
+ });
556
+ });
557
+ // ============================================================================
558
+ // FINDING STRUCTURE
559
+ // ============================================================================
560
+ describe("finding structure", () => {
561
+ it("includes all required metadata fields", () => {
562
+ const content = `import * as Sentry from "@sentry/node";`;
563
+ const contents = makeContents({ "extension.ts": content });
564
+ const zooData = makeZooData();
565
+ const findings = checkTelemetry(contents, zooData);
566
+ const finding = findings.find((f) => f.id === "TELEMETRY_DETECTED");
567
+ expect(finding).toBeDefined();
568
+ expect(finding?.id).toBe("TELEMETRY_DETECTED");
569
+ expect(finding?.title).toContain("Telemetry detected");
570
+ expect(finding?.description).toBeDefined();
571
+ expect(finding?.severity).toBeDefined();
572
+ expect(finding?.category).toBe("telemetry");
573
+ expect(finding?.location).toBeDefined();
574
+ expect(finding?.metadata).toBeDefined();
575
+ expect(finding?.metadata?.["serviceName"]).toBe("Sentry");
576
+ expect(finding?.metadata?.["serviceCategory"]).toBe("crash-reporting");
577
+ expect(finding?.metadata?.["isKnownService"]).toBe(true);
578
+ expect(finding?.metadata?.["optOut"]).toBeDefined();
579
+ expect(finding?.metadata?.["dataCollected"]).toBeDefined();
580
+ });
581
+ });
582
+ });
583
+ //# sourceMappingURL=telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/scanner/checks/telemetry.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { BatchScanResult, CheckSummary, Finding, ModuleTimings, ScanOptions, ScanResult, Severity } from "./types.js";
2
- export declare const MODULE_NAMES: readonly ["package", "obfuscation", "ast", "ioc", "yara"];
2
+ export declare const MODULE_NAMES: readonly ["package", "obfuscation", "ast", "ioc", "yara", "telemetry"];
3
3
  export type ModuleName = (typeof MODULE_NAMES)[number];
4
4
  export type { BatchScanResult, CheckSummary, Finding, ModuleTimings, ScanOptions, ScanResult, Severity, };
5
5
  export type { BatchScanCallbacks, BatchScanOptions } from "./batch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,QAAQ,EAET,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,YAAY,2DAA4D,CAAC;AACtF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,YAAY,EACV,eAAe,EACf,YAAY,EACZ,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,QAAQ,GACT,CAAC;AACF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoD1D,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA2H7F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,QAAQ,EAET,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,YAAY,wEAAyE,CAAC;AACnG,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,YAAY,EACV,eAAe,EACf,YAAY,EACZ,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,QAAQ,GACT,CAAC;AACF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoD1D,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwI7F"}