@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.
- package/LICENSE +661 -0
- package/README.md +281 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +703 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/batch.d.ts +12 -0
- package/dist/scanner/batch.d.ts.map +1 -0
- package/dist/scanner/batch.js +104 -0
- package/dist/scanner/batch.js.map +1 -0
- package/dist/scanner/bundler.d.ts +35 -0
- package/dist/scanner/bundler.d.ts.map +1 -0
- package/dist/scanner/bundler.js +120 -0
- package/dist/scanner/bundler.js.map +1 -0
- package/dist/scanner/cache.d.ts +45 -0
- package/dist/scanner/cache.d.ts.map +1 -0
- package/dist/scanner/cache.js +153 -0
- package/dist/scanner/cache.js.map +1 -0
- package/dist/scanner/cache.test.d.ts +2 -0
- package/dist/scanner/cache.test.d.ts.map +1 -0
- package/dist/scanner/cache.test.js +149 -0
- package/dist/scanner/cache.test.js.map +1 -0
- package/dist/scanner/capabilities.d.ts +29 -0
- package/dist/scanner/capabilities.d.ts.map +1 -0
- package/dist/scanner/capabilities.js +217 -0
- package/dist/scanner/capabilities.js.map +1 -0
- package/dist/scanner/checks/ast.d.ts +3 -0
- package/dist/scanner/checks/ast.d.ts.map +1 -0
- package/dist/scanner/checks/ast.js +469 -0
- package/dist/scanner/checks/ast.js.map +1 -0
- package/dist/scanner/checks/ast.test.d.ts +2 -0
- package/dist/scanner/checks/ast.test.d.ts.map +1 -0
- package/dist/scanner/checks/ast.test.js +389 -0
- package/dist/scanner/checks/ast.test.js.map +1 -0
- package/dist/scanner/checks/behavioral.d.ts +3 -0
- package/dist/scanner/checks/behavioral.d.ts.map +1 -0
- package/dist/scanner/checks/behavioral.js +367 -0
- package/dist/scanner/checks/behavioral.js.map +1 -0
- package/dist/scanner/checks/blocklist.d.ts +3 -0
- package/dist/scanner/checks/blocklist.d.ts.map +1 -0
- package/dist/scanner/checks/blocklist.js +32 -0
- package/dist/scanner/checks/blocklist.js.map +1 -0
- package/dist/scanner/checks/blocklist.test.d.ts +2 -0
- package/dist/scanner/checks/blocklist.test.d.ts.map +1 -0
- package/dist/scanner/checks/blocklist.test.js +74 -0
- package/dist/scanner/checks/blocklist.test.js.map +1 -0
- package/dist/scanner/checks/chains.d.ts +35 -0
- package/dist/scanner/checks/chains.d.ts.map +1 -0
- package/dist/scanner/checks/chains.js +505 -0
- package/dist/scanner/checks/chains.js.map +1 -0
- package/dist/scanner/checks/chains.test.d.ts +2 -0
- package/dist/scanner/checks/chains.test.d.ts.map +1 -0
- package/dist/scanner/checks/chains.test.js +250 -0
- package/dist/scanner/checks/chains.test.js.map +1 -0
- package/dist/scanner/checks/dataflow.d.ts +3 -0
- package/dist/scanner/checks/dataflow.d.ts.map +1 -0
- package/dist/scanner/checks/dataflow.js +316 -0
- package/dist/scanner/checks/dataflow.js.map +1 -0
- package/dist/scanner/checks/dependencies.d.ts +13 -0
- package/dist/scanner/checks/dependencies.d.ts.map +1 -0
- package/dist/scanner/checks/dependencies.js +225 -0
- package/dist/scanner/checks/dependencies.js.map +1 -0
- package/dist/scanner/checks/dependencies.test.d.ts +2 -0
- package/dist/scanner/checks/dependencies.test.d.ts.map +1 -0
- package/dist/scanner/checks/dependencies.test.js +248 -0
- package/dist/scanner/checks/dependencies.test.js.map +1 -0
- package/dist/scanner/checks/finding-quality.test.d.ts +8 -0
- package/dist/scanner/checks/finding-quality.test.d.ts.map +1 -0
- package/dist/scanner/checks/finding-quality.test.js +164 -0
- package/dist/scanner/checks/finding-quality.test.js.map +1 -0
- package/dist/scanner/checks/ioc.d.ts +20 -0
- package/dist/scanner/checks/ioc.d.ts.map +1 -0
- package/dist/scanner/checks/ioc.js +234 -0
- package/dist/scanner/checks/ioc.js.map +1 -0
- package/dist/scanner/checks/ioc.test.d.ts +2 -0
- package/dist/scanner/checks/ioc.test.d.ts.map +1 -0
- package/dist/scanner/checks/ioc.test.js +298 -0
- package/dist/scanner/checks/ioc.test.js.map +1 -0
- package/dist/scanner/checks/manifest.d.ts +6 -0
- package/dist/scanner/checks/manifest.d.ts.map +1 -0
- package/dist/scanner/checks/manifest.js +123 -0
- package/dist/scanner/checks/manifest.js.map +1 -0
- package/dist/scanner/checks/manifest.test.d.ts +2 -0
- package/dist/scanner/checks/manifest.test.d.ts.map +1 -0
- package/dist/scanner/checks/manifest.test.js +108 -0
- package/dist/scanner/checks/manifest.test.js.map +1 -0
- package/dist/scanner/checks/obfuscation.d.ts +3 -0
- package/dist/scanner/checks/obfuscation.d.ts.map +1 -0
- package/dist/scanner/checks/obfuscation.js +432 -0
- package/dist/scanner/checks/obfuscation.js.map +1 -0
- package/dist/scanner/checks/obfuscation.test.d.ts +2 -0
- package/dist/scanner/checks/obfuscation.test.d.ts.map +1 -0
- package/dist/scanner/checks/obfuscation.test.js +399 -0
- package/dist/scanner/checks/obfuscation.test.js.map +1 -0
- package/dist/scanner/checks/package.d.ts +17 -0
- package/dist/scanner/checks/package.d.ts.map +1 -0
- package/dist/scanner/checks/package.js +422 -0
- package/dist/scanner/checks/package.js.map +1 -0
- package/dist/scanner/checks/package.test.d.ts +2 -0
- package/dist/scanner/checks/package.test.d.ts.map +1 -0
- package/dist/scanner/checks/package.test.js +518 -0
- package/dist/scanner/checks/package.test.js.map +1 -0
- package/dist/scanner/checks/patterns.d.ts +5 -0
- package/dist/scanner/checks/patterns.d.ts.map +1 -0
- package/dist/scanner/checks/patterns.js +251 -0
- package/dist/scanner/checks/patterns.js.map +1 -0
- package/dist/scanner/checks/patterns.test.d.ts +2 -0
- package/dist/scanner/checks/patterns.test.d.ts.map +1 -0
- package/dist/scanner/checks/patterns.test.js +147 -0
- package/dist/scanner/checks/patterns.test.js.map +1 -0
- package/dist/scanner/checks/unicode.d.ts +3 -0
- package/dist/scanner/checks/unicode.d.ts.map +1 -0
- package/dist/scanner/checks/unicode.js +247 -0
- package/dist/scanner/checks/unicode.js.map +1 -0
- package/dist/scanner/checks/unicode.test.d.ts +2 -0
- package/dist/scanner/checks/unicode.test.d.ts.map +1 -0
- package/dist/scanner/checks/unicode.test.js +202 -0
- package/dist/scanner/checks/unicode.test.js.map +1 -0
- package/dist/scanner/checks/yara.d.ts +23 -0
- package/dist/scanner/checks/yara.d.ts.map +1 -0
- package/dist/scanner/checks/yara.js +349 -0
- package/dist/scanner/checks/yara.js.map +1 -0
- package/dist/scanner/checks/yara.test.d.ts +2 -0
- package/dist/scanner/checks/yara.test.d.ts.map +1 -0
- package/dist/scanner/checks/yara.test.js +126 -0
- package/dist/scanner/checks/yara.test.js.map +1 -0
- package/dist/scanner/constants.d.ts +18 -0
- package/dist/scanner/constants.d.ts.map +1 -0
- package/dist/scanner/constants.js +37 -0
- package/dist/scanner/constants.js.map +1 -0
- package/dist/scanner/detection-coverage.test.d.ts +2 -0
- package/dist/scanner/detection-coverage.test.d.ts.map +1 -0
- package/dist/scanner/detection-coverage.test.js +216 -0
- package/dist/scanner/detection-coverage.test.js.map +1 -0
- package/dist/scanner/download.d.ts +76 -0
- package/dist/scanner/download.d.ts.map +1 -0
- package/dist/scanner/download.js +339 -0
- package/dist/scanner/download.js.map +1 -0
- package/dist/scanner/download.test.d.ts +2 -0
- package/dist/scanner/download.test.d.ts.map +1 -0
- package/dist/scanner/download.test.js +149 -0
- package/dist/scanner/download.test.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +167 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/index.test.d.ts +2 -0
- package/dist/scanner/index.test.d.ts.map +1 -0
- package/dist/scanner/index.test.js +71 -0
- package/dist/scanner/index.test.js.map +1 -0
- package/dist/scanner/loaders/zoo.d.ts +3 -0
- package/dist/scanner/loaders/zoo.d.ts.map +1 -0
- package/dist/scanner/loaders/zoo.js +112 -0
- package/dist/scanner/loaders/zoo.js.map +1 -0
- package/dist/scanner/types.d.ts +118 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +2 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner/utils.d.ts +14 -0
- package/dist/scanner/utils.d.ts.map +1 -0
- package/dist/scanner/utils.js +25 -0
- package/dist/scanner/utils.js.map +1 -0
- package/dist/scanner/vsix.d.ts +6 -0
- package/dist/scanner/vsix.d.ts.map +1 -0
- package/dist/scanner/vsix.js +213 -0
- package/dist/scanner/vsix.js.map +1 -0
- package/dist/scanner/vsix.test.d.ts +2 -0
- package/dist/scanner/vsix.test.d.ts.map +1 -0
- package/dist/scanner/vsix.test.js +355 -0
- package/dist/scanner/vsix.test.js.map +1 -0
- package/package.json +60 -0
- package/zoo/blocklist/extensions.json +201 -0
- package/zoo/iocs/blockchain-extensions.txt +21 -0
- package/zoo/iocs/c2-domains.txt +50 -0
- package/zoo/iocs/c2-ips.txt +24 -0
- package/zoo/iocs/hashes.txt +47 -0
- package/zoo/iocs/malicious-npm.txt +85 -0
- package/zoo/iocs/wallets.txt +18 -0
- package/zoo/signatures/yara/README.md +46 -0
- package/zoo/signatures/yara/blockchain_c2.yar +48 -0
- package/zoo/signatures/yara/code_execution.yar +165 -0
- package/zoo/signatures/yara/credential_harvesting.yar +116 -0
- package/zoo/signatures/yara/crypto_wallet_targeting.yar +92 -0
- package/zoo/signatures/yara/data_exfiltration.yar +207 -0
- package/zoo/signatures/yara/google_calendar_c2.yar +187 -0
- package/zoo/signatures/yara/messaging_c2.yar +103 -0
- package/zoo/signatures/yara/multi_stage_attacks.yar +331 -0
- package/zoo/signatures/yara/obfuscation_patterns.yar +208 -0
- package/zoo/signatures/yara/powershell_attacks.yar +116 -0
- package/zoo/signatures/yara/rat_capabilities.yar +243 -0
- package/zoo/signatures/yara/self_propagation.yar +239 -0
- package/zoo/signatures/yara/unicode_stealth.yar +48 -0
- package/zoo/signatures/yara/websocket_c2.yar +83 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { checkAST } from "./ast.js";
|
|
3
|
+
function makeContents(files) {
|
|
4
|
+
const manifest = {
|
|
5
|
+
name: "test-extension",
|
|
6
|
+
publisher: "test",
|
|
7
|
+
version: "1.0.0",
|
|
8
|
+
};
|
|
9
|
+
const fileMap = new Map();
|
|
10
|
+
for (const [name, content] of Object.entries(files)) {
|
|
11
|
+
fileMap.set(name, Buffer.from(content, "utf8"));
|
|
12
|
+
}
|
|
13
|
+
return { manifest, files: fileMap, basePath: "/test" };
|
|
14
|
+
}
|
|
15
|
+
describe("checkAST", () => {
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// EVAL DETECTION
|
|
18
|
+
// ============================================================================
|
|
19
|
+
describe("eval() detection", () => {
|
|
20
|
+
it("detects eval with dynamic argument", () => {
|
|
21
|
+
const content = `
|
|
22
|
+
const code = getUserInput();
|
|
23
|
+
eval(code);
|
|
24
|
+
`;
|
|
25
|
+
const contents = makeContents({ "extension.js": content });
|
|
26
|
+
const findings = checkAST(contents);
|
|
27
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it("ignores eval with string literal", () => {
|
|
30
|
+
const content = `eval("console.log('hello')");`;
|
|
31
|
+
const contents = makeContents({ "extension.js": content });
|
|
32
|
+
const findings = checkAST(contents);
|
|
33
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it("detects globalThis.eval access", () => {
|
|
36
|
+
const content = `globalThis.eval(code);`;
|
|
37
|
+
const contents = makeContents({ "extension.js": content });
|
|
38
|
+
const findings = checkAST(contents);
|
|
39
|
+
expect(findings.some((f) => f.id === "AST_GLOBAL_THIS_EVAL")).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it("detects window.eval access", () => {
|
|
42
|
+
const content = `window["eval"](code);`;
|
|
43
|
+
const contents = makeContents({ "extension.js": content });
|
|
44
|
+
const findings = checkAST(contents);
|
|
45
|
+
expect(findings.some((f) => f.id === "AST_GLOBAL_THIS_EVAL")).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// FUNCTION CONSTRUCTOR DETECTION
|
|
50
|
+
// ============================================================================
|
|
51
|
+
describe("Function() constructor detection", () => {
|
|
52
|
+
it("detects new Function() with dynamic argument", () => {
|
|
53
|
+
const content = `
|
|
54
|
+
const body = getCode();
|
|
55
|
+
const fn = new Function('arg', body);
|
|
56
|
+
`;
|
|
57
|
+
const contents = makeContents({ "extension.js": content });
|
|
58
|
+
const findings = checkAST(contents);
|
|
59
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it("detects new Function() with literal argument", () => {
|
|
62
|
+
// Even literal arguments are flagged (unless bundled) because
|
|
63
|
+
// Function() is dangerous and rarely needed
|
|
64
|
+
const content = `const fn = new Function('return 1');`;
|
|
65
|
+
const contents = makeContents({ "extension.js": content });
|
|
66
|
+
const findings = checkAST(contents);
|
|
67
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// DYNAMIC REQUIRE/IMPORT DETECTION
|
|
72
|
+
// ============================================================================
|
|
73
|
+
describe("dynamic require() detection", () => {
|
|
74
|
+
it("detects require with variable argument", () => {
|
|
75
|
+
const content = `
|
|
76
|
+
const moduleName = getModuleName();
|
|
77
|
+
require(moduleName);
|
|
78
|
+
`;
|
|
79
|
+
const contents = makeContents({ "extension.js": content });
|
|
80
|
+
const findings = checkAST(contents);
|
|
81
|
+
expect(findings.some((f) => f.id === "AST_DYNAMIC_REQUIRE")).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it("ignores require with string literal", () => {
|
|
84
|
+
const content = `require("fs");`;
|
|
85
|
+
const contents = makeContents({ "extension.js": content });
|
|
86
|
+
const findings = checkAST(contents);
|
|
87
|
+
expect(findings.some((f) => f.id === "AST_DYNAMIC_REQUIRE")).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("dynamic import() detection", () => {
|
|
91
|
+
it("detects import() with variable argument", () => {
|
|
92
|
+
const content = `
|
|
93
|
+
const path = getPath();
|
|
94
|
+
import(path);
|
|
95
|
+
`;
|
|
96
|
+
const contents = makeContents({ "extension.js": content });
|
|
97
|
+
const findings = checkAST(contents);
|
|
98
|
+
expect(findings.some((f) => f.id === "AST_DYNAMIC_IMPORT")).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it("ignores import() with string literal", () => {
|
|
101
|
+
const content = `import("./module.js");`;
|
|
102
|
+
const contents = makeContents({ "extension.js": content });
|
|
103
|
+
const findings = checkAST(contents);
|
|
104
|
+
expect(findings.some((f) => f.id === "AST_DYNAMIC_IMPORT")).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// PROCESS.BINDING DETECTION
|
|
109
|
+
// ============================================================================
|
|
110
|
+
describe("process.binding detection", () => {
|
|
111
|
+
it("detects process.binding() call", () => {
|
|
112
|
+
const content = `process.binding('fs');`;
|
|
113
|
+
const contents = makeContents({ "extension.js": content });
|
|
114
|
+
const findings = checkAST(contents);
|
|
115
|
+
expect(findings.some((f) => f.id === "AST_PROCESS_BINDING")).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
it("detects process._linkedBinding() call", () => {
|
|
118
|
+
const content = `process._linkedBinding('config');`;
|
|
119
|
+
const contents = makeContents({ "extension.js": content });
|
|
120
|
+
const findings = checkAST(contents);
|
|
121
|
+
expect(findings.some((f) => f.id === "AST_PROCESS_BINDING")).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// NODE_MODULES EXCLUSIONS
|
|
126
|
+
// ============================================================================
|
|
127
|
+
describe("node_modules exclusions", () => {
|
|
128
|
+
it("skips eval detection in node_modules", () => {
|
|
129
|
+
const content = `
|
|
130
|
+
const code = getUserInput();
|
|
131
|
+
eval(code);
|
|
132
|
+
`;
|
|
133
|
+
const contents = makeContents({ "node_modules/protobufjs/src/parse.js": content });
|
|
134
|
+
const findings = checkAST(contents);
|
|
135
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(false);
|
|
136
|
+
});
|
|
137
|
+
it("skips Function constructor detection in node_modules", () => {
|
|
138
|
+
const content = `const fn = new Function('arg', body);`;
|
|
139
|
+
const contents = makeContents({ "node_modules/@babel/core/lib/transform.js": content });
|
|
140
|
+
const findings = checkAST(contents);
|
|
141
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
it("skips process.binding detection in node_modules", () => {
|
|
144
|
+
const content = `process.binding('fs');`;
|
|
145
|
+
const contents = makeContents({ "node_modules/graceful-fs/polyfills.js": content });
|
|
146
|
+
const findings = checkAST(contents);
|
|
147
|
+
expect(findings.some((f) => f.id === "AST_PROCESS_BINDING")).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
it("skips dynamic require in node_modules", () => {
|
|
150
|
+
const content = `require(modulePath);`;
|
|
151
|
+
const contents = makeContents({ "node_modules/pino/lib/logger.js": content });
|
|
152
|
+
const findings = checkAST(contents);
|
|
153
|
+
expect(findings.some((f) => f.id === "AST_DYNAMIC_REQUIRE")).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
it("skips vendor directory", () => {
|
|
156
|
+
const content = `eval(code);`;
|
|
157
|
+
const contents = makeContents({ "vendor/third-party/lib.js": content });
|
|
158
|
+
const findings = checkAST(contents);
|
|
159
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(false);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// BUNDLED CODE EXCLUSIONS
|
|
164
|
+
// ============================================================================
|
|
165
|
+
describe("bundled code exclusions", () => {
|
|
166
|
+
it("skips eval in webpack bundled code", () => {
|
|
167
|
+
// Webpack bundles have characteristic patterns
|
|
168
|
+
const content = `
|
|
169
|
+
/******/ (function(modules) { // webpackBootstrap
|
|
170
|
+
/******/ function __webpack_require__(moduleId) {
|
|
171
|
+
/******/ }
|
|
172
|
+
/******/ })
|
|
173
|
+
eval(__webpack_require__.m[moduleId]);
|
|
174
|
+
`;
|
|
175
|
+
const contents = makeContents({ "dist/bundle.js": content });
|
|
176
|
+
const findings = checkAST(contents);
|
|
177
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(false);
|
|
178
|
+
});
|
|
179
|
+
it("skips Function constructor in rollup bundled code", () => {
|
|
180
|
+
// Rollup detection requires (function (exports AND Object.defineProperty(exports,
|
|
181
|
+
const content = `
|
|
182
|
+
(function (exports) {
|
|
183
|
+
'use strict';
|
|
184
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
185
|
+
const fn = new Function('return this')();
|
|
186
|
+
exports.default = fn;
|
|
187
|
+
})();
|
|
188
|
+
`;
|
|
189
|
+
const contents = makeContents({ "dist/bundle.js": content });
|
|
190
|
+
const findings = checkAST(contents);
|
|
191
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(false);
|
|
192
|
+
});
|
|
193
|
+
it("still detects eval in bundled code WITH obfuscation", () => {
|
|
194
|
+
// If bundled code also has obfuscation indicators, flag it
|
|
195
|
+
const content = `
|
|
196
|
+
/******/ (function(modules) { // webpackBootstrap
|
|
197
|
+
/******/ })
|
|
198
|
+
var _0x4a2b = ['ZXZhbA=='];
|
|
199
|
+
eval(atob(_0x4a2b[0]));
|
|
200
|
+
`;
|
|
201
|
+
const contents = makeContents({ "dist/bundle.js": content });
|
|
202
|
+
const findings = checkAST(contents);
|
|
203
|
+
// Should be flagged because of obfuscation indicators
|
|
204
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
it("still detects Function constructor in bundled code WITH obfuscation", () => {
|
|
207
|
+
const content = `
|
|
208
|
+
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
209
|
+
var _0x1234 = ['return this'];
|
|
210
|
+
const fn = new Function(atob(_0x1234[0]))();
|
|
211
|
+
`;
|
|
212
|
+
const contents = makeContents({ "dist/bundle.js": content });
|
|
213
|
+
const findings = checkAST(contents);
|
|
214
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(true);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
// ============================================================================
|
|
218
|
+
// AUTHOR CODE DETECTION (STILL WORKS)
|
|
219
|
+
// ============================================================================
|
|
220
|
+
describe("author code detection", () => {
|
|
221
|
+
it("detects eval in extension source code", () => {
|
|
222
|
+
const content = `
|
|
223
|
+
function runUserCode(code) {
|
|
224
|
+
return eval(code);
|
|
225
|
+
}
|
|
226
|
+
`;
|
|
227
|
+
const contents = makeContents({ "src/extension.js": content });
|
|
228
|
+
const findings = checkAST(contents);
|
|
229
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it("detects eval in out directory (compiled but not bundled)", () => {
|
|
232
|
+
const content = `
|
|
233
|
+
function dangerous(input) {
|
|
234
|
+
eval(input);
|
|
235
|
+
}
|
|
236
|
+
`;
|
|
237
|
+
const contents = makeContents({ "out/extension.js": content });
|
|
238
|
+
const findings = checkAST(contents);
|
|
239
|
+
expect(findings.some((f) => f.id === "AST_EVAL_DYNAMIC")).toBe(true);
|
|
240
|
+
});
|
|
241
|
+
it("detects Function constructor in author code", () => {
|
|
242
|
+
const content = `const fn = new Function('arg', body);`;
|
|
243
|
+
const contents = makeContents({ "lib/compiler.js": content });
|
|
244
|
+
const findings = checkAST(contents);
|
|
245
|
+
expect(findings.some((f) => f.id === "AST_FUNCTION_CONSTRUCTOR")).toBe(true);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
// ============================================================================
|
|
249
|
+
// FILE TYPE FILTERING
|
|
250
|
+
// ============================================================================
|
|
251
|
+
describe("file type filtering", () => {
|
|
252
|
+
it("scans .js files", () => {
|
|
253
|
+
const content = `eval(code);`;
|
|
254
|
+
const contents = makeContents({ "extension.js": content });
|
|
255
|
+
const findings = checkAST(contents);
|
|
256
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
257
|
+
});
|
|
258
|
+
it("scans .ts files", () => {
|
|
259
|
+
const content = `eval(code as string);`;
|
|
260
|
+
const contents = makeContents({ "extension.ts": content });
|
|
261
|
+
const findings = checkAST(contents);
|
|
262
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
263
|
+
});
|
|
264
|
+
it("scans .mjs files", () => {
|
|
265
|
+
const content = `eval(code);`;
|
|
266
|
+
const contents = makeContents({ "extension.mjs": content });
|
|
267
|
+
const findings = checkAST(contents);
|
|
268
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
269
|
+
});
|
|
270
|
+
it("scans .cjs files", () => {
|
|
271
|
+
const content = `eval(code);`;
|
|
272
|
+
const contents = makeContents({ "extension.cjs": content });
|
|
273
|
+
const findings = checkAST(contents);
|
|
274
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
275
|
+
});
|
|
276
|
+
it("scans .jsx files", () => {
|
|
277
|
+
const content = `eval(code);`;
|
|
278
|
+
const contents = makeContents({ "component.jsx": content });
|
|
279
|
+
const findings = checkAST(contents);
|
|
280
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
281
|
+
});
|
|
282
|
+
it("scans .tsx files", () => {
|
|
283
|
+
const content = `eval(code);`;
|
|
284
|
+
const contents = makeContents({ "component.tsx": content });
|
|
285
|
+
const findings = checkAST(contents);
|
|
286
|
+
expect(findings.length).toBeGreaterThan(0);
|
|
287
|
+
});
|
|
288
|
+
it("ignores .json files", () => {
|
|
289
|
+
const content = `{"eval": "code"}`;
|
|
290
|
+
const contents = makeContents({ "config.json": content });
|
|
291
|
+
const findings = checkAST(contents);
|
|
292
|
+
expect(findings).toHaveLength(0);
|
|
293
|
+
});
|
|
294
|
+
it("ignores .md files", () => {
|
|
295
|
+
const content = `eval(code) is dangerous`;
|
|
296
|
+
const contents = makeContents({ "README.md": content });
|
|
297
|
+
const findings = checkAST(contents);
|
|
298
|
+
expect(findings).toHaveLength(0);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
// ============================================================================
|
|
302
|
+
// METADATA AND LOCATION
|
|
303
|
+
// ============================================================================
|
|
304
|
+
describe("metadata", () => {
|
|
305
|
+
it("includes code snippet in metadata", () => {
|
|
306
|
+
const content = `eval(maliciousCode);`;
|
|
307
|
+
const contents = makeContents({ "extension.js": content });
|
|
308
|
+
const findings = checkAST(contents);
|
|
309
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
310
|
+
expect(finding?.metadata?.["codeSnippet"]).toContain("eval");
|
|
311
|
+
});
|
|
312
|
+
it("includes legitimate uses in metadata", () => {
|
|
313
|
+
const content = `eval(code);`;
|
|
314
|
+
const contents = makeContents({ "extension.js": content });
|
|
315
|
+
const findings = checkAST(contents);
|
|
316
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
317
|
+
expect(finding?.metadata?.["legitimateUses"]).toBeDefined();
|
|
318
|
+
});
|
|
319
|
+
it("includes red flags in metadata", () => {
|
|
320
|
+
const content = `eval(code);`;
|
|
321
|
+
const contents = makeContents({ "extension.js": content });
|
|
322
|
+
const findings = checkAST(contents);
|
|
323
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
324
|
+
expect(finding?.metadata?.["redFlags"]).toBeDefined();
|
|
325
|
+
});
|
|
326
|
+
it("includes line number in location", () => {
|
|
327
|
+
const content = `// line 1\n// line 2\neval(code);`;
|
|
328
|
+
const contents = makeContents({ "extension.js": content });
|
|
329
|
+
const findings = checkAST(contents);
|
|
330
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
331
|
+
expect(finding?.location?.line).toBe(3);
|
|
332
|
+
});
|
|
333
|
+
it("includes file path in location", () => {
|
|
334
|
+
const content = `eval(code);`;
|
|
335
|
+
const contents = makeContents({ "src/dangerous.js": content });
|
|
336
|
+
const findings = checkAST(contents);
|
|
337
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
338
|
+
expect(finding?.location?.file).toBe("src/dangerous.js");
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
// ============================================================================
|
|
342
|
+
// CATEGORY ASSIGNMENT
|
|
343
|
+
// ============================================================================
|
|
344
|
+
describe("category assignment", () => {
|
|
345
|
+
it("assigns ast category to all findings", () => {
|
|
346
|
+
const content = `
|
|
347
|
+
eval(code);
|
|
348
|
+
new Function(body);
|
|
349
|
+
process.binding('fs');
|
|
350
|
+
`;
|
|
351
|
+
const contents = makeContents({ "extension.js": content });
|
|
352
|
+
const findings = checkAST(contents);
|
|
353
|
+
expect(findings.every((f) => f.category === "ast")).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
// ============================================================================
|
|
357
|
+
// PARSE ERROR HANDLING
|
|
358
|
+
// ============================================================================
|
|
359
|
+
describe("parse error handling", () => {
|
|
360
|
+
it("handles files with syntax errors gracefully", () => {
|
|
361
|
+
const content = `function broken( { eval(code) }`;
|
|
362
|
+
const contents = makeContents({ "broken.js": content });
|
|
363
|
+
// Should not throw, just return empty findings
|
|
364
|
+
const findings = checkAST(contents);
|
|
365
|
+
expect(Array.isArray(findings)).toBe(true);
|
|
366
|
+
});
|
|
367
|
+
it("handles empty files", () => {
|
|
368
|
+
const contents = makeContents({ "empty.js": "" });
|
|
369
|
+
const findings = checkAST(contents);
|
|
370
|
+
expect(findings).toHaveLength(0);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
// ============================================================================
|
|
374
|
+
// OBFUSCATION INDICATORS
|
|
375
|
+
// ============================================================================
|
|
376
|
+
describe("obfuscation indicators", () => {
|
|
377
|
+
it("includes additional info when obfuscation is detected", () => {
|
|
378
|
+
const content = `
|
|
379
|
+
var _0x4a2b = function() { return 'test'; };
|
|
380
|
+
eval(_0x4a2b());
|
|
381
|
+
`;
|
|
382
|
+
const contents = makeContents({ "obfuscated.js": content });
|
|
383
|
+
const findings = checkAST(contents);
|
|
384
|
+
const finding = findings.find((f) => f.id === "AST_EVAL_DYNAMIC");
|
|
385
|
+
expect(finding?.metadata?.["additionalInfo"]).toContain("obfuscation");
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
//# sourceMappingURL=ast.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.test.js","sourceRoot":"","sources":["../../../src/scanner/checks/ast.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"behavioral.d.ts","sourceRoot":"","sources":["../../../src/scanner/checks/behavioral.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAY,YAAY,EAAE,MAAM,aAAa,CAAC;AA6XnE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,EAAE,CAkDjE"}
|