@kernlang/review 3.1.6 → 3.1.8
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/dist/cache.d.ts +1 -1
- package/dist/cache.js +5 -3
- package/dist/cache.js.map +1 -1
- package/dist/call-graph.d.ts +63 -0
- package/dist/call-graph.js +380 -0
- package/dist/call-graph.js.map +1 -0
- package/dist/concept-rules/boundary-mutation.d.ts +1 -1
- package/dist/concept-rules/boundary-mutation.js.map +1 -1
- package/dist/concept-rules/ignored-error.d.ts +1 -1
- package/dist/concept-rules/ignored-error.js.map +1 -1
- package/dist/concept-rules/illegal-dependency.d.ts +1 -1
- package/dist/concept-rules/illegal-dependency.js.map +1 -1
- package/dist/concept-rules/index.js +1 -6
- package/dist/concept-rules/index.js.map +1 -1
- package/dist/concept-rules/unguarded-effect.d.ts +1 -1
- package/dist/concept-rules/unguarded-effect.js.map +1 -1
- package/dist/concept-rules/unrecovered-effect.d.ts +1 -1
- package/dist/concept-rules/unrecovered-effect.js +2 -1
- package/dist/concept-rules/unrecovered-effect.js.map +1 -1
- package/dist/confidence.js +12 -8
- package/dist/confidence.js.map +1 -1
- package/dist/differ.js +3 -7
- package/dist/differ.js.map +1 -1
- package/dist/external-tools.js +5 -6
- package/dist/external-tools.js.map +1 -1
- package/dist/file-context.d.ts +21 -0
- package/dist/file-context.js +234 -0
- package/dist/file-context.js.map +1 -0
- package/dist/file-role.js +14 -7
- package/dist/file-role.js.map +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +24 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +44 -35
- package/dist/index.js +210 -121
- package/dist/index.js.map +1 -1
- package/dist/inferrer.d.ts +8 -2
- package/dist/inferrer.js +80 -47
- package/dist/inferrer.js.map +1 -1
- package/dist/kern-lint.d.ts +3 -4
- package/dist/kern-lint.js +7 -5
- package/dist/kern-lint.js.map +1 -1
- package/dist/llm-bridge.d.ts +23 -7
- package/dist/llm-bridge.js +267 -31
- package/dist/llm-bridge.js.map +1 -1
- package/dist/llm-review.d.ts +16 -2
- package/dist/llm-review.js +240 -35
- package/dist/llm-review.js.map +1 -1
- package/dist/mappers/ts-concepts.d.ts +1 -1
- package/dist/mappers/ts-concepts.js +303 -32
- package/dist/mappers/ts-concepts.js.map +1 -1
- package/dist/norm-miner.d.ts +31 -0
- package/dist/norm-miner.js +119 -0
- package/dist/norm-miner.js.map +1 -0
- package/dist/obligations.d.ts +63 -0
- package/dist/obligations.js +158 -0
- package/dist/obligations.js.map +1 -0
- package/dist/quality-rules.d.ts +3 -3
- package/dist/quality-rules.js +4 -2
- package/dist/quality-rules.js.map +1 -1
- package/dist/reporter.d.ts +7 -2
- package/dist/reporter.js +82 -51
- package/dist/reporter.js.map +1 -1
- package/dist/rule-eval.d.ts +1 -2
- package/dist/rule-eval.js +5 -9
- package/dist/rule-eval.js.map +1 -1
- package/dist/rule-loader.js +16 -14
- package/dist/rule-loader.js.map +1 -1
- package/dist/rules/base.js +153 -69
- package/dist/rules/base.js.map +1 -1
- package/dist/rules/cli.js +23 -19
- package/dist/rules/cli.js.map +1 -1
- package/dist/rules/confidence.d.ts +1 -1
- package/dist/rules/confidence.js +5 -5
- package/dist/rules/confidence.js.map +1 -1
- package/dist/rules/dead-code.d.ts +10 -0
- package/dist/rules/dead-code.js +75 -0
- package/dist/rules/dead-code.js.map +1 -0
- package/dist/rules/dead-logic.js +35 -31
- package/dist/rules/dead-logic.js.map +1 -1
- package/dist/rules/express.d.ts +2 -1
- package/dist/rules/express.js +380 -126
- package/dist/rules/express.js.map +1 -1
- package/dist/rules/fastapi.js +53 -19
- package/dist/rules/fastapi.js.map +1 -1
- package/dist/rules/ground-layer.js +3 -3
- package/dist/rules/ground-layer.js.map +1 -1
- package/dist/rules/index.js +574 -105
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ink.js +9 -8
- package/dist/rules/ink.js.map +1 -1
- package/dist/rules/kern-source.js +202 -63
- package/dist/rules/kern-source.js.map +1 -1
- package/dist/rules/nextjs.js +88 -33
- package/dist/rules/nextjs.js.map +1 -1
- package/dist/rules/null-safety.js +52 -26
- package/dist/rules/null-safety.js.map +1 -1
- package/dist/rules/nuxt.js +24 -29
- package/dist/rules/nuxt.js.map +1 -1
- package/dist/rules/react.js +355 -69
- package/dist/rules/react.js.map +1 -1
- package/dist/rules/security-v2.js +71 -57
- package/dist/rules/security-v2.js.map +1 -1
- package/dist/rules/security-v3.js.map +1 -1
- package/dist/rules/security-v4.js +54 -27
- package/dist/rules/security-v4.js.map +1 -1
- package/dist/rules/security.js +35 -5
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/terminal.js +17 -5
- package/dist/rules/terminal.js.map +1 -1
- package/dist/rules/vue.js +162 -107
- package/dist/rules/vue.js.map +1 -1
- package/dist/semantic-diff.d.ts +52 -0
- package/dist/semantic-diff.js +342 -0
- package/dist/semantic-diff.js.map +1 -0
- package/dist/spec-checker.js +11 -10
- package/dist/spec-checker.js.map +1 -1
- package/dist/suppression/apply-suppression.d.ts +2 -3
- package/dist/suppression/apply-suppression.js +3 -3
- package/dist/suppression/apply-suppression.js.map +1 -1
- package/dist/suppression/index.d.ts +2 -2
- package/dist/suppression/index.js +1 -1
- package/dist/suppression/index.js.map +1 -1
- package/dist/suppression/parse-directives.d.ts +1 -1
- package/dist/suppression/parse-directives.js +9 -4
- package/dist/suppression/parse-directives.js.map +1 -1
- package/dist/taint-ast.d.ts +20 -0
- package/dist/taint-ast.js +427 -0
- package/dist/taint-ast.js.map +1 -0
- package/dist/taint-crossfile.d.ts +28 -0
- package/dist/taint-crossfile.js +174 -0
- package/dist/taint-crossfile.js.map +1 -0
- package/dist/taint-findings.d.ts +17 -0
- package/dist/taint-findings.js +131 -0
- package/dist/taint-findings.js.map +1 -0
- package/dist/taint-regex.d.ts +61 -0
- package/dist/taint-regex.js +379 -0
- package/dist/taint-regex.js.map +1 -0
- package/dist/taint-types.d.ts +128 -0
- package/dist/taint-types.js +174 -0
- package/dist/taint-types.js.map +1 -0
- package/dist/taint.d.ts +13 -107
- package/dist/taint.js +16 -1067
- package/dist/taint.js.map +1 -1
- package/dist/template-detector.d.ts +2 -2
- package/dist/template-detector.js +11 -16
- package/dist/template-detector.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taint Tracking — shared types, classification tables, and sanitizer sufficiency.
|
|
3
|
+
*/
|
|
4
|
+
// ── Source Classification ────────────────────────────────────────────────
|
|
5
|
+
/** Param names/types that indicate HTTP handler context */
|
|
6
|
+
export const HTTP_PARAM_NAMES = /^(req|request)$/i;
|
|
7
|
+
export const HTTP_PARAM_TYPES = /Request|IncomingMessage|FastifyRequest|KoaContext|Context/;
|
|
8
|
+
/** User input access patterns — what flows from HTTP params */
|
|
9
|
+
export const USER_INPUT_ACCESS = [
|
|
10
|
+
{ pattern: /\breq\.body\b/, origin: 'req.body' },
|
|
11
|
+
{ pattern: /\breq\.query\b/, origin: 'req.query' },
|
|
12
|
+
{ pattern: /\breq\.params\b/, origin: 'req.params' },
|
|
13
|
+
{ pattern: /\breq\.headers\b/, origin: 'req.headers' },
|
|
14
|
+
{ pattern: /\brequest\.body\b/, origin: 'request.body' },
|
|
15
|
+
{ pattern: /\brequest\.query\b/, origin: 'request.query' },
|
|
16
|
+
{ pattern: /\brequest\.params\b/, origin: 'request.params' },
|
|
17
|
+
{ pattern: /\bprocess\.argv\b/, origin: 'process.argv' },
|
|
18
|
+
{ pattern: /\bprocess\.env\b/, origin: 'process.env' },
|
|
19
|
+
// DB read results (indirect injection sources)
|
|
20
|
+
{ pattern: /\bdb\.query\b/, origin: 'db.query' },
|
|
21
|
+
{ pattern: /\bfindOne\b/, origin: 'findOne' },
|
|
22
|
+
{ pattern: /\bfindById\b/, origin: 'findById' },
|
|
23
|
+
{ pattern: /\bgetItem\b/, origin: 'getItem' },
|
|
24
|
+
{ pattern: /\bcollection\.find\b/, origin: 'collection.find' },
|
|
25
|
+
// RAG/retrieval results
|
|
26
|
+
{ pattern: /\bvectorStore\.search\b/, origin: 'vectorStore.search' },
|
|
27
|
+
{ pattern: /\bsimilaritySearch\b/, origin: 'similaritySearch' },
|
|
28
|
+
{ pattern: /\bindex\.query\b/, origin: 'index.query' },
|
|
29
|
+
];
|
|
30
|
+
export const SINK_PATTERNS = [
|
|
31
|
+
// Command execution
|
|
32
|
+
{ pattern: /\bexec\s*\(/, name: 'exec', category: 'command' },
|
|
33
|
+
{ pattern: /\bexecSync\s*\(/, name: 'execSync', category: 'command' },
|
|
34
|
+
{ pattern: /\bspawn\s*\(/, name: 'spawn', category: 'command' },
|
|
35
|
+
{ pattern: /\bspawnSync\s*\(/, name: 'spawnSync', category: 'command' },
|
|
36
|
+
{ pattern: /\bexecFile\s*\(/, name: 'execFile', category: 'command' },
|
|
37
|
+
// Filesystem
|
|
38
|
+
{ pattern: /\bwriteFile\s*\(/, name: 'writeFile', category: 'fs' },
|
|
39
|
+
{ pattern: /\bwriteFileSync\s*\(/, name: 'writeFileSync', category: 'fs' },
|
|
40
|
+
{ pattern: /\bcreateWriteStream\s*\(/, name: 'createWriteStream', category: 'fs' },
|
|
41
|
+
{ pattern: /\bunlink\s*\(/, name: 'unlink', category: 'fs' },
|
|
42
|
+
{ pattern: /\bunlinkSync\s*\(/, name: 'unlinkSync', category: 'fs' },
|
|
43
|
+
// SQL (template literal with query-like calls)
|
|
44
|
+
{ pattern: /\bquery\s*\(/, name: 'query', category: 'sql' },
|
|
45
|
+
{ pattern: /\b\$execute\s*\(/, name: '$execute', category: 'sql' },
|
|
46
|
+
{ pattern: /\braw\s*\(/, name: 'raw', category: 'sql' },
|
|
47
|
+
// Redirect
|
|
48
|
+
{ pattern: /\bredirect\s*\(/, name: 'redirect', category: 'redirect' },
|
|
49
|
+
// Eval
|
|
50
|
+
{ pattern: /\beval\s*\(/, name: 'eval', category: 'eval' },
|
|
51
|
+
{ pattern: /\bnew\s+Function\s*\(/, name: 'new Function', category: 'eval' },
|
|
52
|
+
// LLM API calls (prompt injection sinks)
|
|
53
|
+
{ pattern: /\bgenerateContent\s*\(/, name: 'generateContent', category: 'template' },
|
|
54
|
+
{ pattern: /\bsendMessage\s*\(/, name: 'sendMessage', category: 'template' },
|
|
55
|
+
{ pattern: /\bchat\.completions\.create\s*\(/, name: 'chat.completions.create', category: 'template' },
|
|
56
|
+
// VM execution sinks (LLM output execution)
|
|
57
|
+
{ pattern: /\bvm\.runInContext\s*\(/, name: 'vm.runInContext', category: 'eval' },
|
|
58
|
+
{ pattern: /\bvm\.runInNewContext\s*\(/, name: 'vm.runInNewContext', category: 'eval' },
|
|
59
|
+
// Code generation sinks — external values interpolated into generated source code
|
|
60
|
+
{ pattern: /\blines\.push\s*\(`/, name: 'lines.push(template)', category: 'codegen' },
|
|
61
|
+
{ pattern: /\bhelperBlock\.push\s*\(`/, name: 'helperBlock.push(template)', category: 'codegen' },
|
|
62
|
+
{ pattern: /\bcode\s*\+=\s*`/, name: 'code += template', category: 'codegen' },
|
|
63
|
+
];
|
|
64
|
+
// ── Sanitizer Detection ─────────────────────────────────────────────────
|
|
65
|
+
export const SANITIZER_PATTERNS = [
|
|
66
|
+
// Type coercion (sanitizes to safe type)
|
|
67
|
+
{ pattern: /\bparseInt\s*\(/, name: 'parseInt' },
|
|
68
|
+
{ pattern: /\bparseFloat\s*\(/, name: 'parseFloat' },
|
|
69
|
+
{ pattern: /\bNumber\s*\(/, name: 'Number()' },
|
|
70
|
+
{ pattern: /\bBoolean\s*\(/, name: 'Boolean()' },
|
|
71
|
+
// Schema validation
|
|
72
|
+
{ pattern: /\.parse\s*\(/, name: 'schema.parse' },
|
|
73
|
+
{ pattern: /\.safeParse\s*\(/, name: 'schema.safeParse' },
|
|
74
|
+
{ pattern: /\.validate\s*\(/, name: 'schema.validate' },
|
|
75
|
+
{ pattern: /\.validateSync\s*\(/, name: 'schema.validateSync' },
|
|
76
|
+
// String sanitization
|
|
77
|
+
{ pattern: /\bsanitize\w*\s?\(/, name: 'sanitize()' },
|
|
78
|
+
{ pattern: /\bescape\w*\s?\(/, name: 'escape()' },
|
|
79
|
+
{ pattern: /\bDOMPurify\b/, name: 'DOMPurify' },
|
|
80
|
+
{ pattern: /\bencodeURI(Component)?\s*\(/, name: 'encodeURIComponent' },
|
|
81
|
+
// Path sanitization
|
|
82
|
+
{ pattern: /path\.(resolve|normalize|basename)\s*\(/, name: 'path.normalize' },
|
|
83
|
+
{ pattern: /\.replace\s*\(\s*\/.*\.\.\//, name: 'replace(../)' },
|
|
84
|
+
// SQL parameterization
|
|
85
|
+
{ pattern: /\$\d+/, name: 'parameterized query ($N)' },
|
|
86
|
+
{ pattern: /\?\s*,/, name: 'parameterized query (?)' },
|
|
87
|
+
// Prompt sanitization
|
|
88
|
+
{ pattern: /\bsanitizeForPrompt\s*\(/, name: 'sanitizeForPrompt' },
|
|
89
|
+
{ pattern: /\bescapePrompt\s*\(/, name: 'escapePrompt' },
|
|
90
|
+
// LLM-specific sanitizers
|
|
91
|
+
{ pattern: /\bstripDelimiters\s*\(/, name: 'stripDelimiters' },
|
|
92
|
+
{ pattern: /\bcleanForPrompt\s*\(/, name: 'cleanForPrompt' },
|
|
93
|
+
];
|
|
94
|
+
const SANITIZER_SUFFICIENCY = {
|
|
95
|
+
parseInt: new Set(['sql']),
|
|
96
|
+
parseFloat: new Set(['sql']),
|
|
97
|
+
'Number()': new Set(['sql']),
|
|
98
|
+
'Boolean()': new Set([]), // too weak for anything
|
|
99
|
+
'schema.parse': new Set(['command', 'fs', 'sql', 'redirect', 'eval', 'template']),
|
|
100
|
+
'schema.safeParse': new Set(['command', 'fs', 'sql', 'redirect', 'eval', 'template']),
|
|
101
|
+
'schema.validate': new Set(['command', 'fs', 'sql', 'redirect', 'eval', 'template']),
|
|
102
|
+
'schema.validateSync': new Set(['command', 'fs', 'sql', 'redirect', 'eval', 'template']),
|
|
103
|
+
'sanitize()': new Set(['template']),
|
|
104
|
+
'escape()': new Set(['sql', 'template']),
|
|
105
|
+
DOMPurify: new Set(['template']),
|
|
106
|
+
encodeURIComponent: new Set(['redirect']),
|
|
107
|
+
'path.normalize': new Set(['fs']),
|
|
108
|
+
'replace(../)': new Set(['fs']),
|
|
109
|
+
'parameterized query ($N)': new Set(['sql']),
|
|
110
|
+
'parameterized query (?)': new Set(['sql']),
|
|
111
|
+
sanitizeForPrompt: new Set(['template']),
|
|
112
|
+
escapePrompt: new Set(['template']),
|
|
113
|
+
stripDelimiters: new Set(['template']),
|
|
114
|
+
cleanForPrompt: new Set(['template']),
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Check if a sanitizer is actually sufficient for a given sink category.
|
|
118
|
+
* Returns true if the sanitizer protects against the sink, false if it's
|
|
119
|
+
* a mismatch (e.g., parseInt used to "sanitize" command injection).
|
|
120
|
+
*/
|
|
121
|
+
export function isSanitizerSufficient(sanitizerName, sinkCategory) {
|
|
122
|
+
const allowed = SANITIZER_SUFFICIENCY[sanitizerName];
|
|
123
|
+
if (!allowed)
|
|
124
|
+
return false; // Unknown sanitizer — default deny, verify manually
|
|
125
|
+
return allowed.has(sinkCategory);
|
|
126
|
+
}
|
|
127
|
+
// ── Derived Lookup Tables ───────────────────────────────────────────────
|
|
128
|
+
// Sink name → category lookup (flat map from SINK_PATTERNS)
|
|
129
|
+
export const SINK_NAMES = new Map([
|
|
130
|
+
['exec', 'command'],
|
|
131
|
+
['execSync', 'command'],
|
|
132
|
+
['spawn', 'command'],
|
|
133
|
+
['spawnSync', 'command'],
|
|
134
|
+
['execFile', 'command'],
|
|
135
|
+
['execFileSync', 'command'],
|
|
136
|
+
['readFile', 'fs'],
|
|
137
|
+
['readFileSync', 'fs'],
|
|
138
|
+
['writeFile', 'fs'],
|
|
139
|
+
['writeFileSync', 'fs'],
|
|
140
|
+
['createWriteStream', 'fs'],
|
|
141
|
+
['createReadStream', 'fs'],
|
|
142
|
+
['unlink', 'fs'],
|
|
143
|
+
['unlinkSync', 'fs'],
|
|
144
|
+
['query', 'sql'],
|
|
145
|
+
['$execute', 'sql'],
|
|
146
|
+
['raw', 'sql'],
|
|
147
|
+
['$queryRaw', 'sql'],
|
|
148
|
+
['$queryRawUnsafe', 'sql'],
|
|
149
|
+
['redirect', 'redirect'],
|
|
150
|
+
['eval', 'eval'],
|
|
151
|
+
['Function', 'eval'],
|
|
152
|
+
]);
|
|
153
|
+
// Sanitizer names to detect (from SANITIZER_PATTERNS)
|
|
154
|
+
export const SANITIZER_PATTERN_NAMES = [
|
|
155
|
+
'parseInt',
|
|
156
|
+
'parseFloat',
|
|
157
|
+
'Number',
|
|
158
|
+
'Boolean',
|
|
159
|
+
'String',
|
|
160
|
+
'encodeURI',
|
|
161
|
+
'encodeURIComponent',
|
|
162
|
+
'escape',
|
|
163
|
+
'sanitize',
|
|
164
|
+
'DOMPurify',
|
|
165
|
+
'purify',
|
|
166
|
+
'xss',
|
|
167
|
+
'escapeHtml',
|
|
168
|
+
'sqlstring',
|
|
169
|
+
'parameterized',
|
|
170
|
+
'parse',
|
|
171
|
+
'safeParse',
|
|
172
|
+
'validate',
|
|
173
|
+
];
|
|
174
|
+
//# sourceMappingURL=taint-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taint-types.js","sourceRoot":"","sources":["../src/taint-types.ts"],"names":[],"mappings":"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"}
|
package/dist/taint.d.ts
CHANGED
|
@@ -1,115 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Taint Tracking —
|
|
2
|
+
* Taint Tracking — barrel re-export module.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export interface TaintSource {
|
|
17
|
-
name: string;
|
|
18
|
-
origin: string;
|
|
19
|
-
line?: number;
|
|
20
|
-
}
|
|
21
|
-
export interface TaintSink {
|
|
22
|
-
name: string;
|
|
23
|
-
category: 'command' | 'fs' | 'sql' | 'redirect' | 'eval' | 'template';
|
|
24
|
-
taintedArg: string;
|
|
25
|
-
line?: number;
|
|
26
|
-
}
|
|
27
|
-
export interface TaintPath {
|
|
28
|
-
source: TaintSource;
|
|
29
|
-
sink: TaintSink;
|
|
30
|
-
sanitized: boolean;
|
|
31
|
-
sanitizer?: string;
|
|
32
|
-
insufficientSanitizer?: string;
|
|
33
|
-
}
|
|
34
|
-
export interface TaintResult {
|
|
35
|
-
fnName: string;
|
|
36
|
-
filePath: string;
|
|
37
|
-
startLine: number;
|
|
38
|
-
paths: TaintPath[];
|
|
39
|
-
}
|
|
40
|
-
type SinkCategory = TaintSink['category'];
|
|
41
|
-
/**
|
|
42
|
-
* Check if a sanitizer is actually sufficient for a given sink category.
|
|
43
|
-
* Returns true if the sanitizer protects against the sink, false if it's
|
|
44
|
-
* a mismatch (e.g., parseInt used to "sanitize" command injection).
|
|
45
|
-
*/
|
|
46
|
-
export declare function isSanitizerSufficient(sanitizerName: string, sinkCategory: SinkCategory): boolean;
|
|
47
|
-
export interface CrossFileTaintResult {
|
|
48
|
-
callerFile: string;
|
|
49
|
-
callerFn: string;
|
|
50
|
-
callerLine: number;
|
|
51
|
-
calleeFile: string;
|
|
52
|
-
calleeFn: string;
|
|
53
|
-
taintedArgs: string[];
|
|
54
|
-
sinkInCallee: TaintSink;
|
|
55
|
-
source: TaintSource;
|
|
56
|
-
}
|
|
57
|
-
/** Map of exported function names → file path + param info */
|
|
58
|
-
export interface ExportedFunction {
|
|
59
|
-
filePath: string;
|
|
60
|
-
fnName: string;
|
|
61
|
-
params: string;
|
|
62
|
-
hasSink: boolean;
|
|
63
|
-
sinks: TaintSink[];
|
|
64
|
-
}
|
|
4
|
+
* Re-exports everything from the 5 taint sub-modules so existing
|
|
5
|
+
* imports from './taint.js' continue to work unchanged.
|
|
6
|
+
*/
|
|
7
|
+
import type { SourceFile } from 'ts-morph';
|
|
8
|
+
import type { TaintResult } from './taint-types.js';
|
|
9
|
+
import type { InferResult } from './types.js';
|
|
10
|
+
export type { CrossFileTaintResult, ExportedFunction, InternalSinkFunction, SinkCategory, SinkPattern, TaintPath, TaintResult, TaintSink, TaintSource, } from './taint-types.js';
|
|
11
|
+
export { HTTP_PARAM_NAMES, HTTP_PARAM_TYPES, isSanitizerSufficient, SANITIZER_PATTERN_NAMES, SANITIZER_PATTERNS, SINK_NAMES, SINK_PATTERNS, USER_INPUT_ACCESS, } from './taint-types.js';
|
|
12
|
+
export { analyzeTaintAST, buildInternalSinkMap } from './taint-ast.js';
|
|
13
|
+
export { analyzeTaintRegex, buildPaths, classifyParams, detectSanitizers, extractAllAssignments, extractDependencies, findClosingParen, findTaintedSinks, isCircularAssignment, parseLineAssignments, propagateTaint, propagateTaintMultiHop, } from './taint-regex.js';
|
|
14
|
+
export { crossFileTaintToFindings, taintToFindings } from './taint-findings.js';
|
|
15
|
+
export { analyzeTaintCrossFile, buildExportMap, buildImportMap } from './taint-crossfile.js';
|
|
65
16
|
/**
|
|
66
17
|
* Run taint analysis on all fn nodes in inferred results.
|
|
67
18
|
* When sourceFile is provided, uses AST-based analysis (more accurate).
|
|
68
19
|
* Falls back to regex-based analysis when no SourceFile available.
|
|
69
20
|
*/
|
|
70
21
|
export declare function analyzeTaint(inferred: InferResult[], filePath: string, sourceFile?: SourceFile): TaintResult[];
|
|
71
|
-
/**
|
|
72
|
-
* Multi-hop taint propagation using worklist algorithm.
|
|
73
|
-
* Propagates until fixed point or configurable depth limit.
|
|
74
|
-
*
|
|
75
|
-
* Handles all assignment patterns:
|
|
76
|
-
* - const b = a
|
|
77
|
-
* - const b = a.trim()
|
|
78
|
-
* - const {x} = obj
|
|
79
|
-
* - let b; b = a
|
|
80
|
-
*
|
|
81
|
-
* @param code - Handler code string
|
|
82
|
-
* @param initialTainted - Set of initially tainted variable names
|
|
83
|
-
* @param maxDepth - Maximum propagation depth (default: 3)
|
|
84
|
-
* @returns Set of all tainted variable names after fixed point or depth limit
|
|
85
|
-
*/
|
|
86
|
-
export declare function propagateTaintMultiHop(code: string, initialTainted: Set<string>, maxDepth?: number): Set<string>;
|
|
87
|
-
/**
|
|
88
|
-
* Convert taint results into ReviewFinding[] for the unified pipeline.
|
|
89
|
-
*/
|
|
90
|
-
export declare function taintToFindings(results: TaintResult[]): ReviewFinding[];
|
|
91
|
-
/**
|
|
92
|
-
* Build a map of exported functions across all files.
|
|
93
|
-
* Maps "filePath::fnName" → ExportedFunction with sink info.
|
|
94
|
-
*/
|
|
95
|
-
export declare function buildExportMap(inferredPerFile: Map<string, InferResult[]>): Map<string, ExportedFunction>;
|
|
96
|
-
/**
|
|
97
|
-
* Build import→function resolution map.
|
|
98
|
-
* Maps "importingFile::importedName" → absolute file path of the definition.
|
|
99
|
-
*/
|
|
100
|
-
export declare function buildImportMap(inferredPerFile: Map<string, InferResult[]>, graphImports: Map<string, string[]>): Map<string, string>;
|
|
101
|
-
/**
|
|
102
|
-
* Cross-file taint analysis.
|
|
103
|
-
*
|
|
104
|
-
* For each handler function with tainted params:
|
|
105
|
-
* 1. Find calls to imported functions in the handler body
|
|
106
|
-
* 2. Check if tainted data is passed as an argument
|
|
107
|
-
* 3. Look up the target function — does it have a dangerous sink?
|
|
108
|
-
* 4. If yes and no sanitizer in between → cross-file taint path
|
|
109
|
-
*/
|
|
110
|
-
export declare function analyzeTaintCrossFile(inferredPerFile: Map<string, InferResult[]>, graphImports: Map<string, string[]>): CrossFileTaintResult[];
|
|
111
|
-
/**
|
|
112
|
-
* Convert cross-file taint results into ReviewFinding[].
|
|
113
|
-
*/
|
|
114
|
-
export declare function crossFileTaintToFindings(results: CrossFileTaintResult[]): ReviewFinding[];
|
|
115
|
-
export {};
|