circle-ir 3.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.
Files changed (194) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +200 -0
  3. package/configs/sinks/code_injection.yaml +672 -0
  4. package/configs/sinks/command.yaml +917 -0
  5. package/configs/sinks/deserialization.yaml +105 -0
  6. package/configs/sinks/ldap.yaml +136 -0
  7. package/configs/sinks/nodejs.json +629 -0
  8. package/configs/sinks/path.yaml +715 -0
  9. package/configs/sinks/python.json +501 -0
  10. package/configs/sinks/rust.json +339 -0
  11. package/configs/sinks/sql.yaml +233 -0
  12. package/configs/sinks/ssrf.yaml +160 -0
  13. package/configs/sinks/xpath.yaml +121 -0
  14. package/configs/sinks/xss.yaml +727 -0
  15. package/configs/sources/db_sources.yaml +90 -0
  16. package/configs/sources/env_sources.yaml +94 -0
  17. package/configs/sources/express.json +197 -0
  18. package/configs/sources/file_sources.yaml +164 -0
  19. package/configs/sources/http_sources.yaml +379 -0
  20. package/configs/sources/io_sources.yaml +519 -0
  21. package/configs/sources/network_sources.yaml +99 -0
  22. package/configs/sources/python.json +230 -0
  23. package/configs/sources/rust.json +286 -0
  24. package/configs/sources/spring.yaml +70 -0
  25. package/dist/analysis/advisory-db.d.ts +86 -0
  26. package/dist/analysis/advisory-db.js +104 -0
  27. package/dist/analysis/advisory-db.js.map +1 -0
  28. package/dist/analysis/cargo-parser.d.ts +42 -0
  29. package/dist/analysis/cargo-parser.js +102 -0
  30. package/dist/analysis/cargo-parser.js.map +1 -0
  31. package/dist/analysis/config-loader.d.ts +37 -0
  32. package/dist/analysis/config-loader.js +1561 -0
  33. package/dist/analysis/config-loader.js.map +1 -0
  34. package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
  35. package/dist/analysis/constant-propagation/ast-utils.js +34 -0
  36. package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
  37. package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
  38. package/dist/analysis/constant-propagation/evaluator.js +296 -0
  39. package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
  40. package/dist/analysis/constant-propagation/index.d.ts +62 -0
  41. package/dist/analysis/constant-propagation/index.js +152 -0
  42. package/dist/analysis/constant-propagation/index.js.map +1 -0
  43. package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
  44. package/dist/analysis/constant-propagation/patterns.js +126 -0
  45. package/dist/analysis/constant-propagation/patterns.js.map +1 -0
  46. package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
  47. package/dist/analysis/constant-propagation/propagator.js +1985 -0
  48. package/dist/analysis/constant-propagation/propagator.js.map +1 -0
  49. package/dist/analysis/constant-propagation/types.d.ts +63 -0
  50. package/dist/analysis/constant-propagation/types.js +5 -0
  51. package/dist/analysis/constant-propagation/types.js.map +1 -0
  52. package/dist/analysis/constant-propagation.d.ts +9 -0
  53. package/dist/analysis/constant-propagation.js +18 -0
  54. package/dist/analysis/constant-propagation.js.map +1 -0
  55. package/dist/analysis/dependency-scanner.d.ts +79 -0
  56. package/dist/analysis/dependency-scanner.js +122 -0
  57. package/dist/analysis/dependency-scanner.js.map +1 -0
  58. package/dist/analysis/dfg-verifier.d.ts +116 -0
  59. package/dist/analysis/dfg-verifier.js +399 -0
  60. package/dist/analysis/dfg-verifier.js.map +1 -0
  61. package/dist/analysis/findings.d.ts +11 -0
  62. package/dist/analysis/findings.js +228 -0
  63. package/dist/analysis/findings.js.map +1 -0
  64. package/dist/analysis/index.d.ts +16 -0
  65. package/dist/analysis/index.js +18 -0
  66. package/dist/analysis/index.js.map +1 -0
  67. package/dist/analysis/interprocedural.d.ts +99 -0
  68. package/dist/analysis/interprocedural.js +526 -0
  69. package/dist/analysis/interprocedural.js.map +1 -0
  70. package/dist/analysis/path-finder.d.ts +133 -0
  71. package/dist/analysis/path-finder.js +354 -0
  72. package/dist/analysis/path-finder.js.map +1 -0
  73. package/dist/analysis/rules.d.ts +75 -0
  74. package/dist/analysis/rules.js +332 -0
  75. package/dist/analysis/rules.js.map +1 -0
  76. package/dist/analysis/semver.d.ts +27 -0
  77. package/dist/analysis/semver.js +127 -0
  78. package/dist/analysis/semver.js.map +1 -0
  79. package/dist/analysis/taint-matcher.d.ts +15 -0
  80. package/dist/analysis/taint-matcher.js +634 -0
  81. package/dist/analysis/taint-matcher.js.map +1 -0
  82. package/dist/analysis/taint-propagation.d.ts +67 -0
  83. package/dist/analysis/taint-propagation.js +298 -0
  84. package/dist/analysis/taint-propagation.js.map +1 -0
  85. package/dist/analysis/unresolved.d.ts +14 -0
  86. package/dist/analysis/unresolved.js +202 -0
  87. package/dist/analysis/unresolved.js.map +1 -0
  88. package/dist/analyzer.d.ts +43 -0
  89. package/dist/analyzer.js +1010 -0
  90. package/dist/analyzer.js.map +1 -0
  91. package/dist/browser/circle-ir.js +16576 -0
  92. package/dist/browser.d.ts +38 -0
  93. package/dist/browser.js +38 -0
  94. package/dist/browser.js.map +1 -0
  95. package/dist/core/circle-ir-core.cjs +13626 -0
  96. package/dist/core/circle-ir-core.d.ts +59 -0
  97. package/dist/core/circle-ir-core.js +13591 -0
  98. package/dist/core/extractors/calls.d.ts +13 -0
  99. package/dist/core/extractors/calls.js +1429 -0
  100. package/dist/core/extractors/calls.js.map +1 -0
  101. package/dist/core/extractors/cfg.d.ts +9 -0
  102. package/dist/core/extractors/cfg.js +519 -0
  103. package/dist/core/extractors/cfg.js.map +1 -0
  104. package/dist/core/extractors/dfg.d.ts +12 -0
  105. package/dist/core/extractors/dfg.js +1081 -0
  106. package/dist/core/extractors/dfg.js.map +1 -0
  107. package/dist/core/extractors/exports.d.ts +14 -0
  108. package/dist/core/extractors/exports.js +80 -0
  109. package/dist/core/extractors/exports.js.map +1 -0
  110. package/dist/core/extractors/imports.d.ts +9 -0
  111. package/dist/core/extractors/imports.js +739 -0
  112. package/dist/core/extractors/imports.js.map +1 -0
  113. package/dist/core/extractors/index.d.ts +10 -0
  114. package/dist/core/extractors/index.js +11 -0
  115. package/dist/core/extractors/index.js.map +1 -0
  116. package/dist/core/extractors/meta.d.ts +10 -0
  117. package/dist/core/extractors/meta.js +109 -0
  118. package/dist/core/extractors/meta.js.map +1 -0
  119. package/dist/core/extractors/types.d.ts +10 -0
  120. package/dist/core/extractors/types.js +1479 -0
  121. package/dist/core/extractors/types.js.map +1 -0
  122. package/dist/core/index.d.ts +5 -0
  123. package/dist/core/index.js +8 -0
  124. package/dist/core/index.js.map +1 -0
  125. package/dist/core/parser.d.ts +84 -0
  126. package/dist/core/parser.js +250 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core-lib.d.ts +59 -0
  129. package/dist/core-lib.js +62 -0
  130. package/dist/core-lib.js.map +1 -0
  131. package/dist/index.d.ts +15 -0
  132. package/dist/index.js +20 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/languages/index.d.ts +11 -0
  135. package/dist/languages/index.js +14 -0
  136. package/dist/languages/index.js.map +1 -0
  137. package/dist/languages/plugins/base.d.ts +44 -0
  138. package/dist/languages/plugins/base.js +82 -0
  139. package/dist/languages/plugins/base.js.map +1 -0
  140. package/dist/languages/plugins/index.d.ts +14 -0
  141. package/dist/languages/plugins/index.js +25 -0
  142. package/dist/languages/plugins/index.js.map +1 -0
  143. package/dist/languages/plugins/java.d.ts +49 -0
  144. package/dist/languages/plugins/java.js +402 -0
  145. package/dist/languages/plugins/java.js.map +1 -0
  146. package/dist/languages/plugins/javascript.d.ts +48 -0
  147. package/dist/languages/plugins/javascript.js +445 -0
  148. package/dist/languages/plugins/javascript.js.map +1 -0
  149. package/dist/languages/plugins/python.d.ts +47 -0
  150. package/dist/languages/plugins/python.js +480 -0
  151. package/dist/languages/plugins/python.js.map +1 -0
  152. package/dist/languages/plugins/rust.d.ts +47 -0
  153. package/dist/languages/plugins/rust.js +405 -0
  154. package/dist/languages/plugins/rust.js.map +1 -0
  155. package/dist/languages/registry.d.ts +30 -0
  156. package/dist/languages/registry.js +80 -0
  157. package/dist/languages/registry.js.map +1 -0
  158. package/dist/languages/types.d.ts +184 -0
  159. package/dist/languages/types.js +8 -0
  160. package/dist/languages/types.js.map +1 -0
  161. package/dist/resolution/cross-file.d.ts +146 -0
  162. package/dist/resolution/cross-file.js +439 -0
  163. package/dist/resolution/cross-file.js.map +1 -0
  164. package/dist/resolution/index.d.ts +12 -0
  165. package/dist/resolution/index.js +10 -0
  166. package/dist/resolution/index.js.map +1 -0
  167. package/dist/resolution/symbol-table.d.ts +136 -0
  168. package/dist/resolution/symbol-table.js +336 -0
  169. package/dist/resolution/symbol-table.js.map +1 -0
  170. package/dist/resolution/type-hierarchy.d.ts +124 -0
  171. package/dist/resolution/type-hierarchy.js +515 -0
  172. package/dist/resolution/type-hierarchy.js.map +1 -0
  173. package/dist/types/config.d.ts +45 -0
  174. package/dist/types/config.js +5 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/index.d.ts +392 -0
  177. package/dist/types/index.js +7 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/utils/logger.d.ts +85 -0
  180. package/dist/utils/logger.js +198 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/wasm/tree-sitter-java.wasm +0 -0
  183. package/dist/wasm/tree-sitter-javascript.wasm +0 -0
  184. package/dist/wasm/tree-sitter-python.wasm +0 -0
  185. package/dist/wasm/tree-sitter-rust.wasm +0 -0
  186. package/dist/wasm/web-tree-sitter.wasm +0 -0
  187. package/docs/SPEC.md +1021 -0
  188. package/examples/browser-example.html +610 -0
  189. package/examples/node-example.ts +215 -0
  190. package/package.json +107 -0
  191. package/wasm/tree-sitter-java.wasm +0 -0
  192. package/wasm/tree-sitter-javascript.wasm +0 -0
  193. package/wasm/tree-sitter-python.wasm +0 -0
  194. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Taint source patterns, sanitizer methods, and propagator methods.
3
+ */
4
+ // =============================================================================
5
+ // Taint Source Patterns
6
+ // =============================================================================
7
+ export const TAINT_PATTERNS = [
8
+ // HTTP Sources (Servlet API)
9
+ 'request.getParameter',
10
+ 'request.getHeader',
11
+ 'request.getHeaders',
12
+ 'request.getCookies',
13
+ 'request.getInputStream',
14
+ 'request.getQueryString',
15
+ 'request.getPathInfo',
16
+ 'request.getRequestURI',
17
+ 'request.getParameterMap',
18
+ 'request.getReader',
19
+ '.getParameter(',
20
+ '.getParameterValues(',
21
+ '.getParameterMap(',
22
+ '.getHeader(',
23
+ '.getHeaders(',
24
+ '.getValue(', // Cookie.getValue()
25
+ '.getCookies(',
26
+ '.getReader(',
27
+ // Enumeration iteration (from request.getHeaders(), etc.)
28
+ 'headers.nextElement(',
29
+ 'names.nextElement(',
30
+ '.nextElement(',
31
+ // I/O Sources
32
+ '.readLine(',
33
+ '.readUTF(',
34
+ '.nextLine(',
35
+ '.next(',
36
+ '.readPassword(',
37
+ 'System.getenv(',
38
+ 'System.getProperty(',
39
+ '.getProperty(',
40
+ // Network Sources
41
+ 'socket.getInputStream(',
42
+ '.openStream(',
43
+ // Database Sources
44
+ '.getString(',
45
+ '.getObject(',
46
+ // File Sources
47
+ 'Files.readAllLines(',
48
+ 'Files.readString(',
49
+ 'Files.readAllBytes(',
50
+ ];
51
+ // Compile patterns into a single regex for faster matching
52
+ export const TAINT_PATTERN_REGEX = new RegExp(TAINT_PATTERNS.map(p => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'));
53
+ // =============================================================================
54
+ // Sanitizer Methods
55
+ // =============================================================================
56
+ export const SANITIZER_METHODS = new Set([
57
+ // ESAPI
58
+ 'encodeForHTML', 'encodeForHTMLAttribute', 'encodeForJavaScript',
59
+ 'encodeForCSS', 'encodeForURL', 'encodeForXML', 'encodeForXMLAttribute',
60
+ 'encodeForLDAP', 'encodeForDN', 'encodeForXPath', 'encodeForSQL',
61
+ 'encodeForOS', 'encodeForBase64', 'canonicalize',
62
+ // OWASP Java Encoder
63
+ 'forHtml', 'forHtmlAttribute', 'forHtmlContent', 'forHtmlUnquotedAttribute',
64
+ 'forJavaScript', 'forJavaScriptBlock', 'forJavaScriptAttribute',
65
+ 'forJavaScriptSource', 'forCssString', 'forCssUrl', 'forUri', 'forUriComponent',
66
+ 'forXml', 'forXmlAttribute', 'forXmlContent', 'forXmlComment', 'forCDATA',
67
+ // Apache Commons
68
+ 'escapeHtml', 'escapeHtml4', 'escapeHtml3', 'escapeXml', 'escapeXml10', 'escapeXml11',
69
+ 'escapeEcmaScript', 'escapeJson', 'escapeCsv', 'escapeJava', 'escapeSql',
70
+ // Spring HtmlUtils
71
+ 'htmlEscape', 'htmlEscapeDecimal', 'htmlEscapeHex',
72
+ // PreparedStatement
73
+ 'setString', 'setInt', 'setLong', 'setDouble', 'setFloat', 'setBoolean',
74
+ 'setDate', 'setTimestamp', 'setObject', 'setBytes', 'setBigDecimal',
75
+ // Path Traversal Prevention
76
+ 'getCanonicalPath', 'normalize', 'toRealPath',
77
+ // General
78
+ 'sanitize', 'encode', 'escape', 'clean', 'filter', 'validate',
79
+ ]);
80
+ // =============================================================================
81
+ // Anti-Sanitizer Methods
82
+ // These methods REVERSE sanitization - calling them on sanitized input produces tainted output
83
+ // =============================================================================
84
+ export const ANTI_SANITIZER_METHODS = new Set([
85
+ // URL decoding (reverses URL encoding)
86
+ 'decode', // URLDecoder.decode()
87
+ 'decodeURIComponent',
88
+ 'decodeURI',
89
+ // Base64 decoding (reverses base64 encoding)
90
+ 'decodeBase64',
91
+ 'decode', // Base64.getDecoder().decode()
92
+ // HTML unescaping (reverses HTML escaping)
93
+ 'unescapeHtml', 'unescapeHtml4', 'unescapeHtml3',
94
+ 'unescapeXml',
95
+ 'unescapeEcmaScript',
96
+ 'unescapeJson',
97
+ 'unescapeJava',
98
+ // General decoders
99
+ 'unescape',
100
+ 'decompress',
101
+ ]);
102
+ // =============================================================================
103
+ // Propagator Methods
104
+ // These static factory methods propagate taint from any argument to return value
105
+ // =============================================================================
106
+ export const PROPAGATOR_METHODS = new Set([
107
+ // Path/File construction
108
+ 'get', // Paths.get(string), Path.of(string)
109
+ 'of', // Path.of(string), etc.
110
+ 'resolve', // Path.resolve(other)
111
+ 'resolveSibling', // Path.resolveSibling(other)
112
+ 'relativize', // Path.relativize(other)
113
+ // URI/URL
114
+ 'create', // URI.create(string)
115
+ 'toUri', // File.toUri()
116
+ 'toURL', // URI.toURL()
117
+ 'toPath', // URI.toPath(), File.toPath()
118
+ // String utilities
119
+ 'valueOf', // String.valueOf(x)
120
+ 'format', // String.format(...)
121
+ 'join', // String.join(...)
122
+ 'concat', // String.concat(other)
123
+ // Object utilities
124
+ 'requireNonNull', // Objects.requireNonNull(obj)
125
+ ]);
126
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Main Constant Propagator class.
3
+ *
4
+ * Tracks constant values through variable assignments and evaluates expressions
5
+ * to detect dead code and reduce false positives in taint analysis.
6
+ */
7
+ import type { Node, Tree } from 'web-tree-sitter';
8
+ import type { ConstantValue, ConstantPropagatorResult, TaintedParameter } from './types.js';
9
+ /**
10
+ * Constant Propagator for taint analysis.
11
+ *
12
+ * Key features:
13
+ * - Tracks variable → constant value mappings
14
+ * - Evaluates arithmetic, comparison, and string expressions
15
+ * - Detects dead/unreachable code via if/switch/ternary evaluation
16
+ * - Integrates with taint analysis to skip false positives
17
+ */
18
+ export declare class ConstantPropagator {
19
+ private symbols;
20
+ private tainted;
21
+ private unreachableLines;
22
+ private taintedCollections;
23
+ private sanitizedVars;
24
+ private source;
25
+ private evaluator;
26
+ private definitionNodes;
27
+ private inConditionalBranch;
28
+ private methodReturnsConstant;
29
+ private methodReturnsSanitized;
30
+ private methodReturnsParameter;
31
+ private methodReturnsSafeValue;
32
+ private additionalTaintPatterns;
33
+ private listElements;
34
+ private loopVariables;
35
+ private taintedArrayElements;
36
+ private currentMethod;
37
+ private conditionalTaints;
38
+ private conditionStack;
39
+ private lineConditions;
40
+ private synchronizedLines;
41
+ private inSynchronizedBlock;
42
+ private iteratorSources;
43
+ private classFields;
44
+ private taintedParametersList;
45
+ private instanceFieldTaint;
46
+ private currentClassName;
47
+ private inConstructor;
48
+ private constructorParamPositions;
49
+ /**
50
+ * Analyze source code and build constant propagation state.
51
+ */
52
+ analyze(tree: Tree, sourceCode: string, additionalTaintPatterns?: string[], sanitizerMethods?: string[], taintedParameters?: TaintedParameter[]): ConstantPropagatorResult;
53
+ /**
54
+ * Evaluate an expression to determine its constant value.
55
+ */
56
+ evaluateExpression(node: Node): ConstantValue;
57
+ /**
58
+ * Check if a variable has a known constant value.
59
+ */
60
+ getValue(varName: string): ConstantValue | undefined;
61
+ /**
62
+ * Check if a variable is tainted.
63
+ */
64
+ isTainted(varName: string): boolean;
65
+ /**
66
+ * Check if a line is reachable (not dead code).
67
+ */
68
+ isLineReachable(line: number): boolean;
69
+ /**
70
+ * Pre-pass: Analyze all methods to detect those that always return constants or sanitized values.
71
+ */
72
+ private analyzeMethodReturns;
73
+ private findParameterSource;
74
+ private extractSourceVariable;
75
+ private getMethodParameters;
76
+ private isSanitizerCall;
77
+ private variableIsAssignedFromSanitizer;
78
+ /**
79
+ * Collect all class field names (instance/static variables declared at class level).
80
+ * These are variables declared directly in the class body, not inside methods.
81
+ */
82
+ private collectClassFields;
83
+ private findAllMethods;
84
+ private getMethodName;
85
+ private refineTaintFromConstants;
86
+ private visit;
87
+ /**
88
+ * Handle method declarations - scope local variables to this method.
89
+ * This prevents local variables from one method bleeding into another.
90
+ */
91
+ private handleMethodDeclaration;
92
+ /**
93
+ * Get the scoped name for a variable (includes method name if in a method).
94
+ * This ensures local variables from different methods don't conflict.
95
+ */
96
+ private getScopedName;
97
+ /**
98
+ * Look up a variable value, checking both scoped and unscoped names.
99
+ * This handles cases where we need to find a variable that might be
100
+ * either local (scoped) or global (unscoped, like class fields).
101
+ */
102
+ private lookupSymbol;
103
+ private handleLoopStatement;
104
+ private collectLoopVariableNames;
105
+ /**
106
+ * Handle synchronized statements.
107
+ * Operations inside synchronized blocks are atomic, so field strong updates are safe.
108
+ */
109
+ private handleSynchronizedStatement;
110
+ /**
111
+ * Recursively collect line numbers that are inside a synchronized block.
112
+ */
113
+ private collectSynchronizedLines;
114
+ private markLoopVariables;
115
+ private handleVariableDeclaration;
116
+ private handleAssignment;
117
+ private handleArrayElementAssignment;
118
+ private handleUpdateExpression;
119
+ private handleIfStatement;
120
+ /**
121
+ * Normalize a condition expression for comparison.
122
+ * Strips parentheses and whitespace for consistent matching.
123
+ */
124
+ private normalizeCondition;
125
+ /**
126
+ * Get the negated form of a condition expression.
127
+ * "x" -> "!x"
128
+ * "!x" -> "x"
129
+ */
130
+ private getNegatedCondition;
131
+ /**
132
+ * Check if a variable's taint should be excluded in the current condition context.
133
+ * Returns true if the variable was tainted under a condition that is mutually
134
+ * exclusive with the current condition context.
135
+ */
136
+ isExcludedByCondition(varName: string): boolean;
137
+ private handleSwitch;
138
+ private handleTernary;
139
+ private handleExpressionStatement;
140
+ private markUnreachable;
141
+ private hasBreakStatement;
142
+ private extractCaseValue;
143
+ /**
144
+ * Check if an expression is a call to a sanitizer method.
145
+ * This includes both built-in sanitizers and @sanitizer annotated methods.
146
+ */
147
+ isSanitizerMethodCall(node: Node): boolean;
148
+ /**
149
+ * Check if an expression is a call to an anti-sanitizer method.
150
+ * Anti-sanitizers reverse the effect of sanitization (e.g., URLDecoder.decode reverses URLEncoder.encode).
151
+ * If an argument to the anti-sanitizer was previously sanitized, the result is tainted again.
152
+ */
153
+ isAntiSanitizerCall(node: Node): boolean;
154
+ /**
155
+ * Check if an anti-sanitizer call has a sanitized argument (which means the result should be tainted).
156
+ * For example: URLDecoder.decode(sanitizedVar) should produce tainted output.
157
+ */
158
+ antiSanitizerReintroducesTaint(node: Node): boolean;
159
+ /**
160
+ * Recursively track iterator assignments in a node (for handling for-loop init).
161
+ */
162
+ private trackIteratorsInNode;
163
+ /**
164
+ * Track iterator assignments: when iter = collection.iterator() is called,
165
+ * record that 'iter' was created from 'collection' so we can propagate taint
166
+ * through iter.next() calls.
167
+ */
168
+ private trackIteratorAssignment;
169
+ /**
170
+ * Check if a collection is tainted (has any tainted elements).
171
+ */
172
+ private isCollectionTainted;
173
+ /**
174
+ * Get the taint type for a variable based on how it was tainted.
175
+ * Returns the taint type (e.g., 'http_param', 'io_input') or null if not found.
176
+ */
177
+ private getTaintTypeForVariable;
178
+ isTaintedExpression(node: Node): boolean;
179
+ private checkCollectionTaint;
180
+ }