@kernlang/review 3.1.5 → 3.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE +17 -0
  2. package/dist/cache.d.ts +1 -1
  3. package/dist/cache.js +5 -3
  4. package/dist/cache.js.map +1 -1
  5. package/dist/call-graph.d.ts +63 -0
  6. package/dist/call-graph.js +380 -0
  7. package/dist/call-graph.js.map +1 -0
  8. package/dist/concept-rules/boundary-mutation.d.ts +1 -1
  9. package/dist/concept-rules/boundary-mutation.js.map +1 -1
  10. package/dist/concept-rules/ignored-error.d.ts +1 -1
  11. package/dist/concept-rules/ignored-error.js.map +1 -1
  12. package/dist/concept-rules/illegal-dependency.d.ts +1 -1
  13. package/dist/concept-rules/illegal-dependency.js.map +1 -1
  14. package/dist/concept-rules/index.js +1 -6
  15. package/dist/concept-rules/index.js.map +1 -1
  16. package/dist/concept-rules/unguarded-effect.d.ts +1 -1
  17. package/dist/concept-rules/unguarded-effect.js.map +1 -1
  18. package/dist/concept-rules/unrecovered-effect.d.ts +1 -1
  19. package/dist/concept-rules/unrecovered-effect.js +2 -1
  20. package/dist/concept-rules/unrecovered-effect.js.map +1 -1
  21. package/dist/confidence.js +12 -8
  22. package/dist/confidence.js.map +1 -1
  23. package/dist/differ.js +3 -7
  24. package/dist/differ.js.map +1 -1
  25. package/dist/external-tools.js +5 -6
  26. package/dist/external-tools.js.map +1 -1
  27. package/dist/file-context.d.ts +21 -0
  28. package/dist/file-context.js +234 -0
  29. package/dist/file-context.js.map +1 -0
  30. package/dist/file-role.js +14 -7
  31. package/dist/file-role.js.map +1 -1
  32. package/dist/graph.d.ts +1 -1
  33. package/dist/graph.js +24 -16
  34. package/dist/graph.js.map +1 -1
  35. package/dist/index.d.ts +44 -35
  36. package/dist/index.js +221 -68
  37. package/dist/index.js.map +1 -1
  38. package/dist/inferrer.d.ts +8 -2
  39. package/dist/inferrer.js +80 -47
  40. package/dist/inferrer.js.map +1 -1
  41. package/dist/kern-lint.d.ts +3 -4
  42. package/dist/kern-lint.js +7 -5
  43. package/dist/kern-lint.js.map +1 -1
  44. package/dist/llm-bridge.d.ts +23 -7
  45. package/dist/llm-bridge.js +267 -31
  46. package/dist/llm-bridge.js.map +1 -1
  47. package/dist/llm-review.d.ts +16 -2
  48. package/dist/llm-review.js +240 -35
  49. package/dist/llm-review.js.map +1 -1
  50. package/dist/mappers/ts-concepts.d.ts +1 -1
  51. package/dist/mappers/ts-concepts.js +303 -32
  52. package/dist/mappers/ts-concepts.js.map +1 -1
  53. package/dist/norm-miner.d.ts +31 -0
  54. package/dist/norm-miner.js +119 -0
  55. package/dist/norm-miner.js.map +1 -0
  56. package/dist/obligations.d.ts +63 -0
  57. package/dist/obligations.js +158 -0
  58. package/dist/obligations.js.map +1 -0
  59. package/dist/quality-rules.d.ts +3 -3
  60. package/dist/quality-rules.js +4 -2
  61. package/dist/quality-rules.js.map +1 -1
  62. package/dist/reporter.d.ts +7 -2
  63. package/dist/reporter.js +82 -51
  64. package/dist/reporter.js.map +1 -1
  65. package/dist/rule-eval.d.ts +1 -2
  66. package/dist/rule-eval.js +5 -9
  67. package/dist/rule-eval.js.map +1 -1
  68. package/dist/rule-loader.js +16 -14
  69. package/dist/rule-loader.js.map +1 -1
  70. package/dist/rules/base.js +153 -69
  71. package/dist/rules/base.js.map +1 -1
  72. package/dist/rules/cli.d.ts +7 -0
  73. package/dist/rules/cli.js +99 -0
  74. package/dist/rules/cli.js.map +1 -0
  75. package/dist/rules/confidence.d.ts +1 -1
  76. package/dist/rules/confidence.js +5 -5
  77. package/dist/rules/confidence.js.map +1 -1
  78. package/dist/rules/dead-code.d.ts +10 -0
  79. package/dist/rules/dead-code.js +75 -0
  80. package/dist/rules/dead-code.js.map +1 -0
  81. package/dist/rules/dead-logic.js +35 -31
  82. package/dist/rules/dead-logic.js.map +1 -1
  83. package/dist/rules/express.d.ts +2 -1
  84. package/dist/rules/express.js +380 -126
  85. package/dist/rules/express.js.map +1 -1
  86. package/dist/rules/fastapi.d.ts +10 -0
  87. package/dist/rules/fastapi.js +183 -0
  88. package/dist/rules/fastapi.js.map +1 -0
  89. package/dist/rules/ground-layer.js +3 -3
  90. package/dist/rules/ground-layer.js.map +1 -1
  91. package/dist/rules/index.d.ts +5 -1
  92. package/dist/rules/index.js +602 -84
  93. package/dist/rules/index.js.map +1 -1
  94. package/dist/rules/ink.d.ts +8 -0
  95. package/dist/rules/ink.js +88 -0
  96. package/dist/rules/ink.js.map +1 -0
  97. package/dist/rules/kern-source.js +202 -63
  98. package/dist/rules/kern-source.js.map +1 -1
  99. package/dist/rules/nextjs.js +88 -33
  100. package/dist/rules/nextjs.js.map +1 -1
  101. package/dist/rules/null-safety.js +52 -26
  102. package/dist/rules/null-safety.js.map +1 -1
  103. package/dist/rules/nuxt.js +24 -29
  104. package/dist/rules/nuxt.js.map +1 -1
  105. package/dist/rules/react.js +355 -69
  106. package/dist/rules/react.js.map +1 -1
  107. package/dist/rules/security-v2.js +71 -57
  108. package/dist/rules/security-v2.js.map +1 -1
  109. package/dist/rules/security-v3.js.map +1 -1
  110. package/dist/rules/security-v4.js +54 -27
  111. package/dist/rules/security-v4.js.map +1 -1
  112. package/dist/rules/security.js +35 -5
  113. package/dist/rules/security.js.map +1 -1
  114. package/dist/rules/terminal.d.ts +8 -0
  115. package/dist/rules/terminal.js +139 -0
  116. package/dist/rules/terminal.js.map +1 -0
  117. package/dist/rules/vue.js +162 -107
  118. package/dist/rules/vue.js.map +1 -1
  119. package/dist/semantic-diff.d.ts +52 -0
  120. package/dist/semantic-diff.js +342 -0
  121. package/dist/semantic-diff.js.map +1 -0
  122. package/dist/spec-checker.js +11 -10
  123. package/dist/spec-checker.js.map +1 -1
  124. package/dist/suppression/apply-suppression.d.ts +2 -3
  125. package/dist/suppression/apply-suppression.js +3 -3
  126. package/dist/suppression/apply-suppression.js.map +1 -1
  127. package/dist/suppression/index.d.ts +2 -2
  128. package/dist/suppression/index.js +1 -1
  129. package/dist/suppression/index.js.map +1 -1
  130. package/dist/suppression/parse-directives.d.ts +1 -1
  131. package/dist/suppression/parse-directives.js +9 -4
  132. package/dist/suppression/parse-directives.js.map +1 -1
  133. package/dist/taint-ast.d.ts +20 -0
  134. package/dist/taint-ast.js +427 -0
  135. package/dist/taint-ast.js.map +1 -0
  136. package/dist/taint-crossfile.d.ts +28 -0
  137. package/dist/taint-crossfile.js +174 -0
  138. package/dist/taint-crossfile.js.map +1 -0
  139. package/dist/taint-findings.d.ts +17 -0
  140. package/dist/taint-findings.js +131 -0
  141. package/dist/taint-findings.js.map +1 -0
  142. package/dist/taint-regex.d.ts +61 -0
  143. package/dist/taint-regex.js +379 -0
  144. package/dist/taint-regex.js.map +1 -0
  145. package/dist/taint-types.d.ts +128 -0
  146. package/dist/taint-types.js +174 -0
  147. package/dist/taint-types.js.map +1 -0
  148. package/dist/taint.d.ts +13 -107
  149. package/dist/taint.js +16 -1067
  150. package/dist/taint.js.map +1 -1
  151. package/dist/template-detector.d.ts +2 -2
  152. package/dist/template-detector.js +11 -16
  153. package/dist/template-detector.js.map +1 -1
  154. package/dist/types.d.ts +35 -0
  155. package/dist/types.js.map +1 -1
  156. package/package.json +3 -3
@@ -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 — source→sink analysis on KERN IR.
2
+ * Taint Tracking — barrel re-export module.
3
3
  *
4
- * Phase 2 of the security pipeline. Works on InferResult[] handler bodies.
5
- *
6
- * Two modes:
7
- * analyzeTaint() — intra-procedural (single file)
8
- * analyzeTaintCrossFile() inter-procedural (follows imports across files)
9
- *
10
- * Also validates sanitizer sufficiency: parseInt stops SQL injection on
11
- * numeric values but NOT command injection. DOMPurify stops XSS but
12
- * NOT SQL injection. The sufficiency matrix catches these mismatches.
13
- */
14
- import { type SourceFile } from 'ts-morph';
15
- import type { InferResult, ReviewFinding } from './types.js';
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 {};