code-auditor-mcp 4.0.3 → 4.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +124 -0
- package/README.md +5 -5
- package/configs/hhra-compat.json +2 -2
- package/dist/analyzers/applicability.d.ts +25 -2
- package/dist/analyzers/applicability.d.ts.map +1 -1
- package/dist/analyzers/applicability.js +44 -50
- package/dist/analyzers/applicability.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +18 -49
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +22 -240
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +2 -14
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +0 -104
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/orgFilterTiers.d.ts +89 -0
- package/dist/analyzers/orgFilterTiers.d.ts.map +1 -0
- package/dist/analyzers/orgFilterTiers.js +96 -0
- package/dist/analyzers/orgFilterTiers.js.map +1 -0
- package/dist/analyzers/ruleRegistry.d.ts +15 -0
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +139 -185
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +39 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +62 -41
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +2 -2
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +2 -2
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts +86 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js +606 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts +14 -0
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +35 -18
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/migrations.d.ts +14 -1
- package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/migrations.js +58 -14
- package/dist/analyzers/universal/schema/migrations.js.map +1 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +70 -13
- package/dist/auditRunner.js.map +1 -1
- package/dist/churn/churnExtractor.js +5 -5
- package/dist/churn/churnExtractor.js.map +1 -1
- package/dist/cli.js +40 -9
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDB.d.ts +6 -0
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +33 -1
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/config/configGeneratePath.d.ts +19 -0
- package/dist/config/configGeneratePath.d.ts.map +1 -0
- package/dist/config/configGeneratePath.js +29 -0
- package/dist/config/configGeneratePath.js.map +1 -0
- package/dist/config/configLoader.d.ts +36 -4
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +136 -15
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/lintConfigReader.d.ts +4 -0
- package/dist/config/lintConfigReader.d.ts.map +1 -1
- package/dist/config/lintConfigReader.js +35 -36
- package/dist/config/lintConfigReader.js.map +1 -1
- package/dist/config/staticObjectExtract.d.ts +35 -0
- package/dist/config/staticObjectExtract.d.ts.map +1 -0
- package/dist/config/staticObjectExtract.js +312 -0
- package/dist/config/staticObjectExtract.js.map +1 -0
- package/dist/constants.d.ts +1 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -2
- package/dist/constants.js.map +1 -1
- package/dist/daemon/core.js +1 -1
- package/dist/daemon/core.js.map +1 -1
- package/dist/daemon/main.js +1 -1
- package/dist/daemon/main.js.map +1 -1
- package/dist/dataPaths.d.ts +11 -0
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +24 -2
- package/dist/dataPaths.js.map +1 -1
- package/dist/generators/BaseConfigGenerator.d.ts +0 -4
- package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
- package/dist/generators/BaseConfigGenerator.js +1 -7
- package/dist/generators/BaseConfigGenerator.js.map +1 -1
- package/dist/installConfig.d.ts +3 -1
- package/dist/installConfig.d.ts.map +1 -1
- package/dist/installConfig.js +15 -2
- package/dist/installConfig.js.map +1 -1
- package/dist/installer.d.ts +10 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +14 -2
- package/dist/installer.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.js +6 -6
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/RuntimeManager.d.ts +4 -2
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +77 -44
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/go/{analyzer → analyzer-darwin-amd64} +0 -0
- package/dist/languages/go/analyzer-darwin-arm64 +0 -0
- package/dist/languages/go/analyzer-linux-amd64 +0 -0
- package/dist/languages/go/analyzer-linux-arm64 +0 -0
- package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
- package/dist/languages/goBinary.d.ts +8 -7
- package/dist/languages/goBinary.d.ts.map +1 -1
- package/dist/languages/goBinary.js +8 -7
- package/dist/languages/goBinary.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +7 -2
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts +5 -1
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +81 -29
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.js +19 -4
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +1 -0
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/nextFileIncremental.js +1 -1
- package/dist/nextFileIncremental.js.map +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +13 -2
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +15 -0
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +140 -6
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.js +2 -2
- package/dist/reporting/htmlReportGenerator.js.map +1 -1
- package/dist/ruleAliases.d.ts.map +1 -1
- package/dist/ruleAliases.js +45 -0
- package/dist/ruleAliases.js.map +1 -1
- package/dist/styles/tailwindConfigLoader.d.ts +4 -0
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
- package/dist/styles/tailwindConfigLoader.js +54 -36
- package/dist/styles/tailwindConfigLoader.js.map +1 -1
- package/dist/types.d.ts +55 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/examples/.auditrc.example.json +2 -2
- package/examples/.auditrc.json +3 -3
- package/examples/nextjs.auditrc.json +1 -1
- package/examples/node-api.auditrc.json +1 -1
- package/examples/react.auditrc.json +2 -2
- package/examples/tolerant-solid.auditrc.json +1 -1
- package/package.json +2 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/hook-common.sh +27 -27
- package/plugin/skills/code-auditor/SKILL.md +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Security Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Spec 61 R6 — the three single-file syntactic rules the tool should have had
|
|
5
|
+
* but did not, so twelve hand-found security defects passed a self-audit
|
|
6
|
+
* silently:
|
|
7
|
+
*
|
|
8
|
+
* - `command-injection-risk` — a shell/process invocation whose command
|
|
9
|
+
* is built by interpolation or string concatenation.
|
|
10
|
+
* - `dynamic-require-of-project-path` — `require()` / `createRequire(...)()` /
|
|
11
|
+
* `import()` of a path discovered from the project tree (a config candidate,
|
|
12
|
+
* a directory walk, a project-root join), which *executes* the file.
|
|
13
|
+
* - `unescaped-html-interpolation` — a data value interpolated into an HTML
|
|
14
|
+
* template without an escaping call (stored XSS).
|
|
15
|
+
*
|
|
16
|
+
* The three share the same shape as the other universal security analyzers: a
|
|
17
|
+
* single `analyzeAST` that walks the tree and emits violations, test/fixture
|
|
18
|
+
* files excluded up front (a fixture's `execSync(\`cp …\`)` is scaffolding, not
|
|
19
|
+
* a finding).
|
|
20
|
+
*/
|
|
21
|
+
import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
|
|
22
|
+
import { withRuleTiming } from '../ruleTiming.js';
|
|
23
|
+
import { walkAST, getNodeText, getFieldNode } from '../../languages/adapterBridge.js';
|
|
24
|
+
export const DEFAULT_SECURITY_CONFIG = {
|
|
25
|
+
checkCommandInjection: true,
|
|
26
|
+
checkDynamicRequire: true,
|
|
27
|
+
checkUnescapedHtml: true,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Child-process entry points whose *first argument* is the command string. When
|
|
31
|
+
* that string is interpolated or concatenated, a value the operator did not
|
|
32
|
+
* intend can become a shell command. `execAsync` is `util.promisify(exec)` — the
|
|
33
|
+
* same sink under a different name (RuntimeManager's pre-fix `execAsync(\`cd
|
|
34
|
+
* "${goDir}" && …\`)` is the proof site).
|
|
35
|
+
*/
|
|
36
|
+
const SHELL_PROCESS_FUNCTIONS = new Set([
|
|
37
|
+
'execSync', 'exec', 'execFile', 'execFileSync',
|
|
38
|
+
'spawn', 'spawnSync', 'fork', 'execAsync',
|
|
39
|
+
]);
|
|
40
|
+
/** Escaping-call names that neutralize an HTML interpolation. */
|
|
41
|
+
const ESCAPE_FNS = new Set([
|
|
42
|
+
'escapeHtml', 'htmlEscape', 'escape', 'escapeHTML',
|
|
43
|
+
'sanitize', 'sanitizeHtml', 'h', 'e',
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* Method names on a string/array whose result still carries the receiver's
|
|
47
|
+
* value (taint flows receiver → result). Covers string derivations (`join`,
|
|
48
|
+
* `slice`, `trim`, …) and array passthroughs (`filter`, `sort`, …) alike.
|
|
49
|
+
*/
|
|
50
|
+
const RECEIVER_PASSTHROUGH_METHODS = new Set([
|
|
51
|
+
'join', 'concat', 'toString', 'valueOf', 'slice', 'substring', 'substr',
|
|
52
|
+
'trim', 'trimStart', 'trimEnd', 'replace', 'replaceAll',
|
|
53
|
+
'toLowerCase', 'toUpperCase', 'padStart', 'padEnd', 'at', 'charAt',
|
|
54
|
+
'filter', 'sort', 'flat', 'reverse',
|
|
55
|
+
]);
|
|
56
|
+
/** Array methods whose result is built from the callback's returned value. */
|
|
57
|
+
const MAP_VALUE_METHODS = new Set(['map', 'flatMap']);
|
|
58
|
+
/** Object names treated as an HTTP response whose `.send`/`.write` emits HTML. */
|
|
59
|
+
const HTTP_RESPONSE_OBJECTS = new Set(['res', 'response', 'resp', 'reply']);
|
|
60
|
+
/** A string-valued constant: a `string` node or a substitution-free template. */
|
|
61
|
+
function isStringConstant(node) {
|
|
62
|
+
if (!node)
|
|
63
|
+
return false;
|
|
64
|
+
if (node.type === 'string')
|
|
65
|
+
return true;
|
|
66
|
+
if (node.type === 'template_string') {
|
|
67
|
+
const hasSub = (node.children ?? []).some((c) => c.type === 'template_substitution');
|
|
68
|
+
return !hasSub;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/** A substitution's expression is a compile-time literal, not a computed value. */
|
|
73
|
+
function isLiteralNode(node) {
|
|
74
|
+
if (!node)
|
|
75
|
+
return false;
|
|
76
|
+
if (['string', 'number', 'true', 'false', 'null', 'undefined'].includes(node.type))
|
|
77
|
+
return true;
|
|
78
|
+
if (node.type === 'template_string') {
|
|
79
|
+
const hasSub = (node.children ?? []).some((c) => c.type === 'template_substitution');
|
|
80
|
+
if (!hasSub)
|
|
81
|
+
return true; // substitution-free template is a constant
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
/** Is this path a test/fixture file? Excluded up front (see header). */
|
|
86
|
+
function isTestOrFixtureFile(filePath) {
|
|
87
|
+
const lower = filePath.toLowerCase();
|
|
88
|
+
return (lower.includes('.test.') || lower.includes('.spec.') ||
|
|
89
|
+
lower.includes('__tests__') ||
|
|
90
|
+
lower.includes('/test/') || lower.includes('/tests/') ||
|
|
91
|
+
lower.includes('/fixtures/') || lower.includes('.fixture.') ||
|
|
92
|
+
lower.endsWith('_test.go'));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The first argument (child of the `arguments` node) of a call, if any.
|
|
96
|
+
*/
|
|
97
|
+
function firstArgument(node) {
|
|
98
|
+
const args = node.children?.find((c) => c.type === 'arguments');
|
|
99
|
+
return args?.children?.[0];
|
|
100
|
+
}
|
|
101
|
+
/** `node` is a bare `require(x)` call — callee is the identifier `require`. */
|
|
102
|
+
function isBareRequire(node, sourceCode) {
|
|
103
|
+
const fn = node.children?.[0];
|
|
104
|
+
return fn?.type === 'identifier' && getNodeText(fn, sourceCode) === 'require';
|
|
105
|
+
}
|
|
106
|
+
/** `node` is a `createRequire(...)(x)` call — callee is itself a createRequire call. */
|
|
107
|
+
function isCreateRequireInvocation(node, sourceCode) {
|
|
108
|
+
const fn = node.children?.[0];
|
|
109
|
+
if (fn?.type !== 'call_expression')
|
|
110
|
+
return false;
|
|
111
|
+
const innerFn = fn.children?.[0];
|
|
112
|
+
return innerFn?.type === 'identifier' && getNodeText(innerFn, sourceCode) === 'createRequire';
|
|
113
|
+
}
|
|
114
|
+
/** The operator text of a `binary_expression`, if it is the given token. */
|
|
115
|
+
function binaryOperatorIs(node, token, sourceCode) {
|
|
116
|
+
const op = getFieldNode(node, 'operator');
|
|
117
|
+
if (op)
|
|
118
|
+
return getNodeText(op, sourceCode).trim() === token;
|
|
119
|
+
return (node.children ?? []).some((c) => getNodeText(c, sourceCode) === token);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The property name of a `member_expression` (`sessionData.path` → `path`),
|
|
123
|
+
* or null when there is no property identifier.
|
|
124
|
+
*/
|
|
125
|
+
function memberPropertyName(node, sourceCode) {
|
|
126
|
+
const prop = node.children?.find((c) => c.type === 'property_identifier');
|
|
127
|
+
return prop ? getNodeText(prop, sourceCode) : null;
|
|
128
|
+
}
|
|
129
|
+
/** Collect the expressions a function body can return (for taint-through-return). */
|
|
130
|
+
function collectReturnExpressions(bodyNode) {
|
|
131
|
+
const out = [];
|
|
132
|
+
walkAST(bodyNode, (n) => {
|
|
133
|
+
if (n.type === 'return_statement') {
|
|
134
|
+
const expr = (n.children ?? []).find((c) => c.type !== ';');
|
|
135
|
+
if (expr)
|
|
136
|
+
out.push(expr);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The sink arguments of an HTML-emitting call: `res.send(x)` / `res.write(x)` /
|
|
143
|
+
* `document.write(x)` (first argument), `el.insertAdjacentHTML(pos, x)` (second
|
|
144
|
+
* argument), `el.setHTMLUnsafe(x)` (first argument), and the jQuery/Hono
|
|
145
|
+
* `.html(x)` setter (first argument — the getter `.html()` has no argument and
|
|
146
|
+
* is a read, not a sink). Returns [] for any other call.
|
|
147
|
+
*/
|
|
148
|
+
function htmlSinkArguments(callNode, sourceCode) {
|
|
149
|
+
const fn = callNode.children?.[0];
|
|
150
|
+
if (fn?.type !== 'member_expression')
|
|
151
|
+
return [];
|
|
152
|
+
const prop = memberPropertyName(fn, sourceCode);
|
|
153
|
+
const obj = fn.children?.find((c) => c.type === 'identifier');
|
|
154
|
+
const objName = obj ? getNodeText(obj, sourceCode) : null;
|
|
155
|
+
if (prop === 'insertAdjacentHTML') {
|
|
156
|
+
// `el.insertAdjacentHTML(pos, html)` — the HTML is the *second* argument.
|
|
157
|
+
// The `arguments` children include the inter-argument `,` as a significant
|
|
158
|
+
// anonymous node, so filter it out rather than assuming `children[1]`.
|
|
159
|
+
const args = callNode.children?.find((c) => c.type === 'arguments');
|
|
160
|
+
const values = (args?.children ?? []).filter((c) => c.type !== ',');
|
|
161
|
+
const html = values[1];
|
|
162
|
+
return html ? [html] : [];
|
|
163
|
+
}
|
|
164
|
+
if (prop === 'send' || prop === 'write') {
|
|
165
|
+
if (!objName || (!HTTP_RESPONSE_OBJECTS.has(objName) && objName !== 'document'))
|
|
166
|
+
return [];
|
|
167
|
+
const first = firstArgument(callNode);
|
|
168
|
+
return first ? [first] : [];
|
|
169
|
+
}
|
|
170
|
+
if (prop === 'setHTMLUnsafe') {
|
|
171
|
+
// `Element.setHTMLUnsafe(x)` parses `x` as HTML on any receiver, so there is
|
|
172
|
+
// no object-name gate (unlike `res.send`/`document.write`).
|
|
173
|
+
const first = firstArgument(callNode);
|
|
174
|
+
return first ? [first] : [];
|
|
175
|
+
}
|
|
176
|
+
if (prop === 'html') {
|
|
177
|
+
// jQuery `.html(content)` setter and Hono `c.html(content)` response both
|
|
178
|
+
// treat the argument as HTML. The getter `.html()` (no argument) is a read.
|
|
179
|
+
const args = callNode.children?.find((c) => c.type === 'arguments');
|
|
180
|
+
const first = args?.children?.[0];
|
|
181
|
+
return first ? [first] : [];
|
|
182
|
+
}
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Security analyzer: three Spec-61 rules that should have caught the twelve
|
|
187
|
+
* hand-found defects.
|
|
188
|
+
*/
|
|
189
|
+
export class UniversalSecurityAnalyzer extends UniversalAnalyzer {
|
|
190
|
+
name = 'security';
|
|
191
|
+
description = 'Detects command injection, dynamic require of project paths, and unescaped HTML interpolation';
|
|
192
|
+
category = 'security';
|
|
193
|
+
async analyzeAST(ast, adapter, config, sourceCode) {
|
|
194
|
+
const violations = [];
|
|
195
|
+
const finalConfig = { ...DEFAULT_SECURITY_CONFIG, ...config };
|
|
196
|
+
if (isTestOrFixtureFile(ast.filePath))
|
|
197
|
+
return violations;
|
|
198
|
+
if (finalConfig.checkCommandInjection !== false) {
|
|
199
|
+
withRuleTiming('command-injection-risk', () => {
|
|
200
|
+
walkAST(ast.root, (node) => {
|
|
201
|
+
if (node.type === 'call_expression') {
|
|
202
|
+
violations.push(...this.checkCommandInjection(node, adapter, sourceCode, ast.filePath));
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
if (finalConfig.checkDynamicRequire !== false) {
|
|
208
|
+
withRuleTiming('dynamic-require-of-project-path', () => {
|
|
209
|
+
walkAST(ast.root, (node) => {
|
|
210
|
+
if (node.type === 'call_expression') {
|
|
211
|
+
violations.push(...this.checkDynamicRequire(node, adapter, sourceCode, ast.filePath));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (finalConfig.checkUnescapedHtml !== false) {
|
|
217
|
+
withRuleTiming('unescaped-html-interpolation', () => {
|
|
218
|
+
const sinkTemplates = this.computeHtmlSinkTemplates(ast, sourceCode);
|
|
219
|
+
walkAST(ast.root, (node) => {
|
|
220
|
+
if (node.type === 'template_string' && sinkTemplates.has(node)) {
|
|
221
|
+
violations.push(...this.checkUnescapedHtml(node, adapter, sourceCode, ast.filePath));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return violations;
|
|
227
|
+
}
|
|
228
|
+
// ── command-injection-risk ────────────────────────────────────────────────
|
|
229
|
+
checkCommandInjection(node, adapter, sourceCode, filePath) {
|
|
230
|
+
const fn = node.children?.[0];
|
|
231
|
+
// Only a bare identifier (`execSync(...)`), never a member access
|
|
232
|
+
// (`this.db.exec(...)` is SQLite, not a shell).
|
|
233
|
+
if (fn?.type !== 'identifier')
|
|
234
|
+
return [];
|
|
235
|
+
const fnName = getNodeText(fn, sourceCode);
|
|
236
|
+
if (!SHELL_PROCESS_FUNCTIONS.has(fnName))
|
|
237
|
+
return [];
|
|
238
|
+
const cmd = firstArgument(node);
|
|
239
|
+
if (!cmd)
|
|
240
|
+
return [];
|
|
241
|
+
let unsafe = false;
|
|
242
|
+
if (cmd.type === 'template_string') {
|
|
243
|
+
unsafe = (cmd.children ?? []).some((c) => c.type === 'template_substitution');
|
|
244
|
+
}
|
|
245
|
+
else if (cmd.type === 'binary_expression') {
|
|
246
|
+
if (binaryOperatorIs(cmd, '+', sourceCode)) {
|
|
247
|
+
const left = getFieldNode(cmd, 'left');
|
|
248
|
+
const right = getFieldNode(cmd, 'right');
|
|
249
|
+
unsafe = !isLiteralNode(left) || !isLiteralNode(right);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (!unsafe)
|
|
253
|
+
return [];
|
|
254
|
+
return [this.createViolation(filePath, node.location.start, `Unsafe process invocation: ${fnName}() is passed a command built by interpolation/concatenation, so a value can become a shell command. Pass the command as a string literal and arguments as an argv array (execFileSync/spawn), never a shell string.`, {
|
|
255
|
+
severity: 'critical',
|
|
256
|
+
rule: 'command-injection-risk',
|
|
257
|
+
symbol: fnName,
|
|
258
|
+
resolution: {
|
|
259
|
+
action: 'use-argv-array',
|
|
260
|
+
summary: `Replace ${fnName} with an argv-array form (execFileSync/spawn) whose command is a string literal and whose arguments are separate array elements, so no shell interprets them.`,
|
|
261
|
+
symbols: [fnName],
|
|
262
|
+
files: [filePath],
|
|
263
|
+
lines: [node.location.start.line],
|
|
264
|
+
},
|
|
265
|
+
})];
|
|
266
|
+
}
|
|
267
|
+
// ── dynamic-require-of-project-path ────────────────────────────────────────
|
|
268
|
+
checkDynamicRequire(node, adapter, sourceCode, filePath) {
|
|
269
|
+
const fn = node.children?.[0];
|
|
270
|
+
let isForm = false;
|
|
271
|
+
if (isBareRequire(node, sourceCode) || fn?.type === 'import') {
|
|
272
|
+
isForm = true; // require(x) or import(x)
|
|
273
|
+
}
|
|
274
|
+
else if (isCreateRequireInvocation(node, sourceCode)) {
|
|
275
|
+
isForm = true; // createRequire(...)(x)
|
|
276
|
+
}
|
|
277
|
+
if (!isForm)
|
|
278
|
+
return [];
|
|
279
|
+
const arg = firstArgument(node);
|
|
280
|
+
if (!arg)
|
|
281
|
+
return [];
|
|
282
|
+
// Computed: not a string literal, and not a substitution-free template.
|
|
283
|
+
if (isLiteralNode(arg))
|
|
284
|
+
return [];
|
|
285
|
+
const text = getNodeText(arg, sourceCode).toLowerCase();
|
|
286
|
+
// Project-config-path-derived: a config-named path (the config candidate /
|
|
287
|
+
// project-root join / directory-walk result this rule exists to catch).
|
|
288
|
+
const isConfigPath = /config/.test(text) && /path|file|dir|join\(|resolve\(|pathtofileurl|href/.test(text);
|
|
289
|
+
if (!isConfigPath)
|
|
290
|
+
return [];
|
|
291
|
+
return [this.createViolation(filePath, node.location.start, `Dynamic require/import of a project config path: ${getNodeText(arg, sourceCode)}. A path discovered from the project tree is executed when it is require()'d or import()'d. Read config files without executing them (static extraction).`, {
|
|
292
|
+
severity: 'critical',
|
|
293
|
+
rule: 'dynamic-require-of-project-path',
|
|
294
|
+
resolution: {
|
|
295
|
+
action: 'static-config-extraction',
|
|
296
|
+
summary: 'Replace the dynamic require/import with static extraction (read the source and extract the literal export) so a project-supplied config is never executed.',
|
|
297
|
+
symbols: [getNodeText(fn, sourceCode)],
|
|
298
|
+
files: [filePath],
|
|
299
|
+
lines: [node.location.start.line],
|
|
300
|
+
},
|
|
301
|
+
})];
|
|
302
|
+
}
|
|
303
|
+
// ── unescaped-html-interpolation ───────────────────────────────────────────
|
|
304
|
+
/**
|
|
305
|
+
* Backward-reachability: which template literals in this file have a value
|
|
306
|
+
* that reaches an HTML sink? A template whose value flows into such a sink is
|
|
307
|
+
* the only place an unescaped interpolation becomes stored XSS — the trigger
|
|
308
|
+
* is *where the string goes*, not what its text looks like.
|
|
309
|
+
*
|
|
310
|
+
* Split into three single-purpose phases — collect local value flow, collect
|
|
311
|
+
* sink roots, then propagate backward — rather than one fused visitor. The
|
|
312
|
+
* fused form is what pushed this method over the `method-complexity`
|
|
313
|
+
* threshold: a single walk that simultaneously dispatched per node type to
|
|
314
|
+
* build bindings/returns *and* sink roots, plus the backward-propagation
|
|
315
|
+
* switch. Each phase is now a small walk with one job; none individually
|
|
316
|
+
* crosses the threshold, and no exemption is needed.
|
|
317
|
+
*/
|
|
318
|
+
computeHtmlSinkTemplates(ast, sourceCode) {
|
|
319
|
+
const { bindings, returnsByName } = this.collectLocalFlow(ast, sourceCode);
|
|
320
|
+
const sinkRoots = this.collectSinkRoots(ast, sourceCode);
|
|
321
|
+
return this.propagateSinkFlow(sinkRoots, bindings, returnsByName, sourceCode);
|
|
322
|
+
}
|
|
323
|
+
/** The expressions a function body can return, used for taint-through-return. */
|
|
324
|
+
returnsOf(fnNode) {
|
|
325
|
+
if (fnNode.type === 'arrow_function') {
|
|
326
|
+
const block = fnNode.children?.find((c) => c.type === 'statement_block');
|
|
327
|
+
if (!block) {
|
|
328
|
+
// Expression body: the expression itself is the return value.
|
|
329
|
+
for (let i = (fnNode.children ?? []).length - 1; i >= 0; i--) {
|
|
330
|
+
const c = fnNode.children[i];
|
|
331
|
+
if (c.type === 'formal_parameters' || c.type === '=>')
|
|
332
|
+
continue;
|
|
333
|
+
return [c];
|
|
334
|
+
}
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
return collectReturnExpressions(block);
|
|
338
|
+
}
|
|
339
|
+
const block = fnNode.children?.find((c) => c.type === 'statement_block');
|
|
340
|
+
return block ? collectReturnExpressions(block) : [];
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Phase 1 — local value flow: bind every declared name to its initializer and
|
|
344
|
+
* record, per function name, the expressions its body can return. The
|
|
345
|
+
* taint-through-return producer (`call_expression` → a named function's return)
|
|
346
|
+
* reads this map.
|
|
347
|
+
*/
|
|
348
|
+
collectLocalFlow(ast, sourceCode) {
|
|
349
|
+
const bindings = new Map();
|
|
350
|
+
const returnsByName = new Map();
|
|
351
|
+
walkAST(ast.root, (node) => {
|
|
352
|
+
if (node.type === 'variable_declarator') {
|
|
353
|
+
const name = getFieldNode(node, 'name');
|
|
354
|
+
const value = getFieldNode(node, 'value');
|
|
355
|
+
if (name && value) {
|
|
356
|
+
const n = getNodeText(name, sourceCode);
|
|
357
|
+
const arr = bindings.get(n) ?? [];
|
|
358
|
+
arr.push(value);
|
|
359
|
+
bindings.set(n, arr);
|
|
360
|
+
if (value.type === 'arrow_function' || value.type === 'function_expression') {
|
|
361
|
+
const rets = this.returnsOf(value);
|
|
362
|
+
if (rets.length)
|
|
363
|
+
returnsByName.set(n, rets);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
else if (node.type === 'function_declaration') {
|
|
368
|
+
const name = getFieldNode(node, 'name');
|
|
369
|
+
if (name) {
|
|
370
|
+
const rets = this.returnsOf(node);
|
|
371
|
+
if (rets.length)
|
|
372
|
+
returnsByName.set(getNodeText(name, sourceCode), rets);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
return { bindings, returnsByName };
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Phase 2 — sink roots: every expression that is injected into an HTML sink.
|
|
380
|
+
* Sink roots are collected from three places: (1) HTML-emitting calls —
|
|
381
|
+
* `insertAdjacentHTML`, `res.send`/`res.write`, `document.write`,
|
|
382
|
+
* `setHTMLUnsafe`, jQuery/Hono `.html(x)` (`htmlSinkArguments`); (2) property
|
|
383
|
+
* writes/attributes — `innerHTML`/`outerHTML` assignment, React's
|
|
384
|
+
* `dangerouslySetInnerHTML` in both its forms (the JSX attribute and the
|
|
385
|
+
* `__html` object key); and (3) Vue's `v-html` directive, where the template
|
|
386
|
+
* string is itself the sink.
|
|
387
|
+
*/
|
|
388
|
+
collectSinkRoots(ast, sourceCode) {
|
|
389
|
+
const sinkRoots = [];
|
|
390
|
+
walkAST(ast.root, (node) => {
|
|
391
|
+
if (node.type === 'call_expression') {
|
|
392
|
+
for (const a of htmlSinkArguments(node, sourceCode))
|
|
393
|
+
sinkRoots.push(a);
|
|
394
|
+
}
|
|
395
|
+
else if (node.type === 'assignment_expression') {
|
|
396
|
+
const left = getFieldNode(node, 'left');
|
|
397
|
+
const right = getFieldNode(node, 'right');
|
|
398
|
+
if (left?.type === 'member_expression' && right) {
|
|
399
|
+
const prop = memberPropertyName(left, sourceCode);
|
|
400
|
+
if (prop === 'innerHTML' || prop === 'outerHTML')
|
|
401
|
+
sinkRoots.push(right);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
else if (node.type === 'pair') {
|
|
405
|
+
// React's `dangerouslySetInnerHTML={{ __html: x }}` — and its extracted
|
|
406
|
+
// `const markup = { __html: x }` form — put the raw-HTML value under the
|
|
407
|
+
// `__html` key. Any expression bound to `__html` is injected as HTML.
|
|
408
|
+
const key = getFieldNode(node, 'key');
|
|
409
|
+
const value = getFieldNode(node, 'value');
|
|
410
|
+
if (key && value) {
|
|
411
|
+
const keyText = getNodeText(key, sourceCode);
|
|
412
|
+
const isHtmlKey = key.type === 'property_identifier'
|
|
413
|
+
? keyText === '__html'
|
|
414
|
+
: keyText === '"__html"' || keyText === "'__html'";
|
|
415
|
+
if (isHtmlKey)
|
|
416
|
+
sinkRoots.push(value);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else if (node.type === 'jsx_attribute') {
|
|
420
|
+
// React's `dangerouslySetInnerHTML` as the JSX *attribute* (the other
|
|
421
|
+
// form alongside the `__html` key above). The attribute is itself a sink
|
|
422
|
+
// marker: whatever expression is bound to it is injected as raw HTML.
|
|
423
|
+
// Its value is normally `{{ __html: x }}` (whose `__html` pair is already
|
|
424
|
+
// a sink root via the branch above); this branch also covers a bare
|
|
425
|
+
// `dangerouslySetInnerHTML={expr}` whose expression is not an `__html`
|
|
426
|
+
// object, so the attribute name alone is enough to mark the value a sink.
|
|
427
|
+
const nameNode = node.children?.find((c) => c.type === 'property_identifier' || c.type === 'identifier');
|
|
428
|
+
if (nameNode && getNodeText(nameNode, sourceCode) === 'dangerouslySetInnerHTML') {
|
|
429
|
+
const valueNode = node.children?.find((c) => c.type === 'jsx_expression' || c.type === 'string');
|
|
430
|
+
if (valueNode) {
|
|
431
|
+
if (valueNode.type === 'jsx_expression') {
|
|
432
|
+
const inner = valueNode.children?.find((c) => c.type !== '{' && c.type !== '}');
|
|
433
|
+
if (inner)
|
|
434
|
+
sinkRoots.push(inner);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
sinkRoots.push(valueNode);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else if (node.type === 'template_string') {
|
|
443
|
+
// Vue's `v-html` directive: the template *is* the sink (the bound value
|
|
444
|
+
// is injected as raw HTML), so a template carrying `v-html=` is its own
|
|
445
|
+
// sink root even without an enclosing call/assignment.
|
|
446
|
+
const isVHtml = (node.children ?? []).some((c) => c.type === 'string_fragment' && /v-html\s*=/i.test(getNodeText(c, sourceCode)));
|
|
447
|
+
if (isVHtml)
|
|
448
|
+
sinkRoots.push(node);
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
return sinkRoots;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Phase 3 — backward propagation: a worklist from each sink root through
|
|
455
|
+
* value flow (`producers`) to find which template literals actually reach a
|
|
456
|
+
* sink. Only those templates are candidates for `checkUnescapedHtml`.
|
|
457
|
+
*/
|
|
458
|
+
propagateSinkFlow(sinkRoots, bindings, returnsByName, sourceCode) {
|
|
459
|
+
const producers = (e) => {
|
|
460
|
+
switch (e.type) {
|
|
461
|
+
case 'identifier':
|
|
462
|
+
return bindings.get(getNodeText(e, sourceCode)) ?? [];
|
|
463
|
+
case 'template_string':
|
|
464
|
+
return (e.children ?? [])
|
|
465
|
+
.filter((c) => c.type === 'template_substitution')
|
|
466
|
+
.map((s) => s.children?.[0])
|
|
467
|
+
.filter((x) => !!x);
|
|
468
|
+
case 'parenthesized_expression': {
|
|
469
|
+
const inner = e.children?.[0];
|
|
470
|
+
return inner ? [inner] : [];
|
|
471
|
+
}
|
|
472
|
+
case 'binary_expression': {
|
|
473
|
+
const left = getFieldNode(e, 'left');
|
|
474
|
+
const right = getFieldNode(e, 'right');
|
|
475
|
+
return [left, right].filter((x) => !!x);
|
|
476
|
+
}
|
|
477
|
+
case 'ternary_expression': {
|
|
478
|
+
const cons = getFieldNode(e, 'consequence');
|
|
479
|
+
const alt = getFieldNode(e, 'alternative');
|
|
480
|
+
return [cons, alt].filter((x) => !!x);
|
|
481
|
+
}
|
|
482
|
+
case 'call_expression': {
|
|
483
|
+
const fn = e.children?.[0];
|
|
484
|
+
if (fn?.type === 'identifier') {
|
|
485
|
+
return returnsByName.get(getNodeText(fn, sourceCode)) ?? [];
|
|
486
|
+
}
|
|
487
|
+
if (fn?.type === 'member_expression') {
|
|
488
|
+
const prop = memberPropertyName(fn, sourceCode);
|
|
489
|
+
if (prop && MAP_VALUE_METHODS.has(prop)) {
|
|
490
|
+
const cb = firstArgument(e);
|
|
491
|
+
if (cb && (cb.type === 'arrow_function' || cb.type === 'function_expression')) {
|
|
492
|
+
return this.returnsOf(cb);
|
|
493
|
+
}
|
|
494
|
+
return [];
|
|
495
|
+
}
|
|
496
|
+
if (prop && RECEIVER_PASSTHROUGH_METHODS.has(prop)) {
|
|
497
|
+
const obj = fn.children?.find((c) => c.type !== 'property_identifier' && c.type !== '.' && c.type !== '?.');
|
|
498
|
+
return obj ? [obj] : [];
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return [];
|
|
502
|
+
}
|
|
503
|
+
default:
|
|
504
|
+
return [];
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
const sinkTemplates = new Set();
|
|
508
|
+
const seen = new Set();
|
|
509
|
+
const queue = [...sinkRoots];
|
|
510
|
+
while (queue.length) {
|
|
511
|
+
const e = queue.shift();
|
|
512
|
+
if (seen.has(e))
|
|
513
|
+
continue;
|
|
514
|
+
seen.add(e);
|
|
515
|
+
if (e.type === 'template_string')
|
|
516
|
+
sinkTemplates.add(e);
|
|
517
|
+
for (const p of producers(e)) {
|
|
518
|
+
if (!seen.has(p))
|
|
519
|
+
queue.push(p);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return sinkTemplates;
|
|
523
|
+
}
|
|
524
|
+
checkUnescapedHtml(node, adapter, sourceCode, filePath) {
|
|
525
|
+
// Reached only for templates whose value flows to an HTML sink (see
|
|
526
|
+
// computeHtmlSinkTemplates), so no markup check is needed here. Walk the
|
|
527
|
+
// template's children in order, tracking script/style context so a
|
|
528
|
+
// substitution inside `<script>`/`<style>` (JSON serialization, CSS vars) is
|
|
529
|
+
// not misread as an HTML interpolation.
|
|
530
|
+
const violations = [];
|
|
531
|
+
let scriptDepth = 0;
|
|
532
|
+
let styleDepth = 0;
|
|
533
|
+
for (const child of node.children ?? []) {
|
|
534
|
+
if (child.type === 'string_fragment') {
|
|
535
|
+
const text = getNodeText(child, sourceCode);
|
|
536
|
+
const openScript = (text.match(/<script\b/gi) ?? []).length;
|
|
537
|
+
const closeScript = (text.match(/<\/script\s*>/gi) ?? []).length;
|
|
538
|
+
const openStyle = (text.match(/<style\b/gi) ?? []).length;
|
|
539
|
+
const closeStyle = (text.match(/<\/style\s*>/gi) ?? []).length;
|
|
540
|
+
scriptDepth = Math.max(0, scriptDepth + openScript - closeScript);
|
|
541
|
+
styleDepth = Math.max(0, styleDepth + openStyle - closeStyle);
|
|
542
|
+
}
|
|
543
|
+
else if (child.type === 'template_substitution') {
|
|
544
|
+
if (scriptDepth > 0 || styleDepth > 0)
|
|
545
|
+
continue;
|
|
546
|
+
const v = this.checkInterpolation(child, adapter, sourceCode, filePath);
|
|
547
|
+
if (v)
|
|
548
|
+
violations.push(v);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return violations;
|
|
552
|
+
}
|
|
553
|
+
checkInterpolation(sub, adapter, sourceCode, filePath) {
|
|
554
|
+
const expr = sub.children?.[0];
|
|
555
|
+
if (!expr)
|
|
556
|
+
return null;
|
|
557
|
+
// Escape-wrapped (`${escapeHtml(x)}`) is the fix, not the finding.
|
|
558
|
+
if (expr.type === 'call_expression') {
|
|
559
|
+
const fn = expr.children?.[0];
|
|
560
|
+
if (fn?.type === 'identifier' && ESCAPE_FNS.has(getNodeText(fn, sourceCode)))
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
// Resolve the interpolated value. `x || 'default'` / `x ?? d` interpolate the
|
|
564
|
+
// *value* operand `x` — the default is a fallback, not a second sink, so the
|
|
565
|
+
// rule looks at `x` (the left operand) and ignores the default.
|
|
566
|
+
let value = expr;
|
|
567
|
+
while (value.type === 'binary_expression') {
|
|
568
|
+
const opNode = getFieldNode(value, 'operator');
|
|
569
|
+
const op = opNode ? getNodeText(opNode, sourceCode).trim() : null;
|
|
570
|
+
if (op !== '||' && op !== '??')
|
|
571
|
+
return null; // arithmetic/`+` is not a plain value sink
|
|
572
|
+
const left = getFieldNode(value, 'left');
|
|
573
|
+
const right = getFieldNode(value, 'right');
|
|
574
|
+
if (!left || !right)
|
|
575
|
+
return null;
|
|
576
|
+
// A string fallback (`x || '…'`) marks a string-valued interpolation — the
|
|
577
|
+
// dangerous case. A numeric fallback (`x || 0`) marks a count and is safe,
|
|
578
|
+
// so `${totalSections || 0}` stays silent.
|
|
579
|
+
if (!isStringConstant(right))
|
|
580
|
+
return null;
|
|
581
|
+
value = left;
|
|
582
|
+
}
|
|
583
|
+
// Only a data member access (`violation.file`, `codeMap.quickPreview`) is a
|
|
584
|
+
// string sink; bare identifiers (loop vars, pre-built HTML fragments), calls
|
|
585
|
+
// (`.map()`, `JSON.stringify`, `new Date().toX()`), ternaries, and literals
|
|
586
|
+
// are not. See the authenticity ledger for the gap this leaves.
|
|
587
|
+
if (value.type !== 'member_expression')
|
|
588
|
+
return null;
|
|
589
|
+
const prop = memberPropertyName(value, sourceCode);
|
|
590
|
+
if (!prop)
|
|
591
|
+
return null;
|
|
592
|
+
return this.createViolation(filePath, sub.location.start, `Unescaped HTML interpolation: ${prop} is inserted into an HTML template without an escaping call. Analysis-controlled strings (file paths, messages, previews) can carry markup — wrap the interpolation in escapeHtml() to prevent stored XSS.`, {
|
|
593
|
+
severity: 'severe',
|
|
594
|
+
rule: 'unescaped-html-interpolation',
|
|
595
|
+
symbol: prop,
|
|
596
|
+
resolution: {
|
|
597
|
+
action: 'escape-html-interpolation',
|
|
598
|
+
summary: `Wrap the ${prop} interpolation in an escaping call (e.g. \${escapeHtml(${prop})}) before it reaches the HTML template.`,
|
|
599
|
+
symbols: [prop],
|
|
600
|
+
files: [filePath],
|
|
601
|
+
lines: [sub.location.start.line],
|
|
602
|
+
},
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=UniversalSecurityAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniversalSecurityAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalSecurityAnalyzer.ts"],"names":[],"mappings":"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"}
|