circle-ir 3.8.4 → 3.9.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.
- package/README.md +82 -5
- package/dist/analysis/dfg-verifier.d.ts +3 -14
- package/dist/analysis/dfg-verifier.js +43 -74
- package/dist/analysis/dfg-verifier.js.map +1 -1
- package/dist/analysis/interprocedural.d.ts +5 -1
- package/dist/analysis/interprocedural.js +62 -60
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/metrics/index.d.ts +2 -0
- package/dist/analysis/metrics/index.js +2 -0
- package/dist/analysis/metrics/index.js.map +1 -0
- package/dist/analysis/metrics/metric-pass.d.ts +27 -0
- package/dist/analysis/metrics/metric-pass.js +2 -0
- package/dist/analysis/metrics/metric-pass.js.map +1 -0
- package/dist/analysis/metrics/metric-runner.d.ts +21 -0
- package/dist/analysis/metrics/metric-runner.js +47 -0
- package/dist/analysis/metrics/metric-runner.js.map +1 -0
- package/dist/analysis/metrics/passes/cohesion-metrics-pass.d.ts +21 -0
- package/dist/analysis/metrics/passes/cohesion-metrics-pass.js +100 -0
- package/dist/analysis/metrics/passes/cohesion-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/complexity-metrics-pass.d.ts +15 -0
- package/dist/analysis/metrics/passes/complexity-metrics-pass.js +76 -0
- package/dist/analysis/metrics/passes/complexity-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/composite-metrics-pass.d.ts +17 -0
- package/dist/analysis/metrics/passes/composite-metrics-pass.js +77 -0
- package/dist/analysis/metrics/passes/composite-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/coupling-metrics-pass.d.ts +19 -0
- package/dist/analysis/metrics/passes/coupling-metrics-pass.js +94 -0
- package/dist/analysis/metrics/passes/coupling-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/data-flow-metrics-pass.d.ts +14 -0
- package/dist/analysis/metrics/passes/data-flow-metrics-pass.js +25 -0
- package/dist/analysis/metrics/passes/data-flow-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/documentation-metrics-pass.d.ts +15 -0
- package/dist/analysis/metrics/passes/documentation-metrics-pass.js +64 -0
- package/dist/analysis/metrics/passes/documentation-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/halstead-metrics-pass.d.ts +16 -0
- package/dist/analysis/metrics/passes/halstead-metrics-pass.js +95 -0
- package/dist/analysis/metrics/passes/halstead-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/inheritance-metrics-pass.d.ts +18 -0
- package/dist/analysis/metrics/passes/inheritance-metrics-pass.js +73 -0
- package/dist/analysis/metrics/passes/inheritance-metrics-pass.js.map +1 -0
- package/dist/analysis/metrics/passes/size-metrics-pass.d.ts +11 -0
- package/dist/analysis/metrics/passes/size-metrics-pass.js +64 -0
- package/dist/analysis/metrics/passes/size-metrics-pass.js.map +1 -0
- package/dist/analysis/passes/circular-dependency-pass.d.ts +18 -0
- package/dist/analysis/passes/circular-dependency-pass.js +39 -0
- package/dist/analysis/passes/circular-dependency-pass.js.map +1 -0
- package/dist/analysis/passes/constant-propagation-pass.d.ts +22 -0
- package/dist/analysis/passes/constant-propagation-pass.js +44 -0
- package/dist/analysis/passes/constant-propagation-pass.js.map +1 -0
- package/dist/analysis/passes/cross-file-pass.d.ts +27 -0
- package/dist/analysis/passes/cross-file-pass.js +102 -0
- package/dist/analysis/passes/cross-file-pass.js.map +1 -0
- package/dist/analysis/passes/dead-code-pass.d.ts +25 -0
- package/dist/analysis/passes/dead-code-pass.js +117 -0
- package/dist/analysis/passes/dead-code-pass.js.map +1 -0
- package/dist/analysis/passes/dependency-fan-out-pass.d.ts +19 -0
- package/dist/analysis/passes/dependency-fan-out-pass.js +35 -0
- package/dist/analysis/passes/dependency-fan-out-pass.js.map +1 -0
- package/dist/analysis/passes/interprocedural-pass.d.ts +29 -0
- package/dist/analysis/passes/interprocedural-pass.js +169 -0
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -0
- package/dist/analysis/passes/language-sources-pass.d.ts +76 -0
- package/dist/analysis/passes/language-sources-pass.js +491 -0
- package/dist/analysis/passes/language-sources-pass.js.map +1 -0
- package/dist/analysis/passes/leaked-global-pass.d.ts +34 -0
- package/dist/analysis/passes/leaked-global-pass.js +108 -0
- package/dist/analysis/passes/leaked-global-pass.js.map +1 -0
- package/dist/analysis/passes/missing-await-pass.d.ts +29 -0
- package/dist/analysis/passes/missing-await-pass.js +90 -0
- package/dist/analysis/passes/missing-await-pass.js.map +1 -0
- package/dist/analysis/passes/missing-public-doc-pass.d.ts +35 -0
- package/dist/analysis/passes/missing-public-doc-pass.js +148 -0
- package/dist/analysis/passes/missing-public-doc-pass.js.map +1 -0
- package/dist/analysis/passes/n-plus-one-pass.d.ts +29 -0
- package/dist/analysis/passes/n-plus-one-pass.js +100 -0
- package/dist/analysis/passes/n-plus-one-pass.js.map +1 -0
- package/dist/analysis/passes/null-deref-pass.d.ts +32 -0
- package/dist/analysis/passes/null-deref-pass.js +130 -0
- package/dist/analysis/passes/null-deref-pass.js.map +1 -0
- package/dist/analysis/passes/orphan-module-pass.d.ts +21 -0
- package/dist/analysis/passes/orphan-module-pass.js +38 -0
- package/dist/analysis/passes/orphan-module-pass.js.map +1 -0
- package/dist/analysis/passes/resource-leak-pass.d.ts +43 -0
- package/dist/analysis/passes/resource-leak-pass.js +156 -0
- package/dist/analysis/passes/resource-leak-pass.js.map +1 -0
- package/dist/analysis/passes/sink-filter-pass.d.ts +39 -0
- package/dist/analysis/passes/sink-filter-pass.js +231 -0
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -0
- package/dist/analysis/passes/stale-doc-ref-pass.d.ts +21 -0
- package/dist/analysis/passes/stale-doc-ref-pass.js +96 -0
- package/dist/analysis/passes/stale-doc-ref-pass.js.map +1 -0
- package/dist/analysis/passes/string-concat-loop-pass.d.ts +26 -0
- package/dist/analysis/passes/string-concat-loop-pass.js +87 -0
- package/dist/analysis/passes/string-concat-loop-pass.js.map +1 -0
- package/dist/analysis/passes/sync-io-async-pass.d.ts +28 -0
- package/dist/analysis/passes/sync-io-async-pass.js +80 -0
- package/dist/analysis/passes/sync-io-async-pass.js.map +1 -0
- package/dist/analysis/passes/taint-matcher-pass.d.ts +24 -0
- package/dist/analysis/passes/taint-matcher-pass.js +71 -0
- package/dist/analysis/passes/taint-matcher-pass.js.map +1 -0
- package/dist/analysis/passes/taint-propagation-pass.d.ts +22 -0
- package/dist/analysis/passes/taint-propagation-pass.js +266 -0
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -0
- package/dist/analysis/passes/todo-in-prod-pass.d.ts +28 -0
- package/dist/analysis/passes/todo-in-prod-pass.js +71 -0
- package/dist/analysis/passes/todo-in-prod-pass.js.map +1 -0
- package/dist/analysis/passes/unchecked-return-pass.d.ts +34 -0
- package/dist/analysis/passes/unchecked-return-pass.js +106 -0
- package/dist/analysis/passes/unchecked-return-pass.js.map +1 -0
- package/dist/analysis/passes/unused-variable-pass.d.ts +36 -0
- package/dist/analysis/passes/unused-variable-pass.js +150 -0
- package/dist/analysis/passes/unused-variable-pass.js.map +1 -0
- package/dist/analysis/passes/variable-shadowing-pass.d.ts +41 -0
- package/dist/analysis/passes/variable-shadowing-pass.js +211 -0
- package/dist/analysis/passes/variable-shadowing-pass.js.map +1 -0
- package/dist/analysis/path-finder.d.ts +3 -13
- package/dist/analysis/path-finder.js +48 -63
- package/dist/analysis/path-finder.js.map +1 -1
- package/dist/analysis/taint-matcher.js +8 -1
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analysis/taint-propagation.d.ts +5 -1
- package/dist/analysis/taint-propagation.js +44 -41
- package/dist/analysis/taint-propagation.js.map +1 -1
- package/dist/analyzer.d.ts +42 -1
- package/dist/analyzer.js +234 -1476
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +3413 -1271
- package/dist/core/circle-ir-core.cjs +360 -106
- package/dist/core/circle-ir-core.js +360 -106
- package/dist/core/extractors/imports.js +18 -0
- package/dist/core/extractors/imports.js.map +1 -1
- package/dist/graph/analysis-pass.d.ts +68 -0
- package/dist/graph/analysis-pass.js +51 -0
- package/dist/graph/analysis-pass.js.map +1 -0
- package/dist/graph/code-graph.d.ts +92 -0
- package/dist/graph/code-graph.js +262 -0
- package/dist/graph/code-graph.js.map +1 -0
- package/dist/graph/import-graph.d.ts +33 -0
- package/dist/graph/import-graph.js +170 -0
- package/dist/graph/import-graph.js.map +1 -0
- package/dist/graph/index.d.ts +4 -0
- package/dist/graph/index.js +5 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/project-graph.d.ts +43 -0
- package/dist/graph/project-graph.js +80 -0
- package/dist/graph/project-graph.js.map +1 -0
- package/dist/graph/scope-graph.d.ts +63 -0
- package/dist/graph/scope-graph.js +89 -0
- package/dist/graph/scope-graph.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/resolution/cross-file.js +52 -19
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/types/index.d.ts +151 -0
- package/docs/SPEC.md +10 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# circle-ir
|
|
2
2
|
|
|
3
|
-
A high-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis. Works in Node.js and browsers.
|
|
3
|
+
A high-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis, and code quality findings through an extensible analysis-pass pipeline. Works in Node.js and browsers.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Taint Analysis**: Track data flow from sources (user input) to sinks (dangerous operations)
|
|
8
8
|
- **Multi-language Support**: Java, JavaScript/TypeScript, Python, Rust, Bash/Shell
|
|
9
9
|
- **High Accuracy**: 100% on OWASP Benchmark, 100% on Juliet Test Suite, 97.7% TPR on SecuriBench Micro
|
|
10
|
+
- **11-Pass Pipeline**: Security taint passes + quality passes (dead code, missing await, N+1, doc coverage, TODO markers)
|
|
11
|
+
- **Cross-File Analysis**: `analyzeProject()` surfaces taint flows that span multiple files
|
|
10
12
|
- **Universal**: Works in Node.js and browsers with environment-agnostic core
|
|
11
13
|
- **Zero External Dependencies**: Core analysis runs without network calls or external services
|
|
12
14
|
- **Browser Compatible**: Tree-sitter WASM for universal parsing
|
|
@@ -31,12 +33,19 @@ await initAnalyzer();
|
|
|
31
33
|
// Analyze Java code
|
|
32
34
|
const result = await analyze(code, 'MyClass.java', 'java');
|
|
33
35
|
|
|
34
|
-
//
|
|
36
|
+
// Security taint flows
|
|
35
37
|
for (const flow of result.taint.flows || []) {
|
|
36
38
|
console.log(`Found ${flow.sink_type} vulnerability`);
|
|
37
39
|
console.log(` Source: line ${flow.source_line}`);
|
|
38
40
|
console.log(` Sink: line ${flow.sink_line}`);
|
|
39
41
|
}
|
|
42
|
+
|
|
43
|
+
// Quality findings from analysis passes (dead-code, missing-await, n-plus-one, etc.)
|
|
44
|
+
for (const finding of result.findings || []) {
|
|
45
|
+
console.log(`[${finding.severity}] ${finding.rule_id} at line ${finding.line}`);
|
|
46
|
+
console.log(` ${finding.message}`);
|
|
47
|
+
if (finding.fix) console.log(` Fix: ${finding.fix}`);
|
|
48
|
+
}
|
|
40
49
|
```
|
|
41
50
|
|
|
42
51
|
### Browser
|
|
@@ -78,7 +87,7 @@ interface AnalyzerOptions {
|
|
|
78
87
|
|
|
79
88
|
### `analyze(code, filePath, language, options?)`
|
|
80
89
|
|
|
81
|
-
Analyze
|
|
90
|
+
Analyze a single file and return Circle-IR output.
|
|
82
91
|
|
|
83
92
|
```typescript
|
|
84
93
|
const result = await analyze(code, 'File.java', 'java');
|
|
@@ -92,6 +101,38 @@ result.dfg // Data flow graph
|
|
|
92
101
|
result.taint // Taint sources, sinks, flows
|
|
93
102
|
result.imports // Import statements
|
|
94
103
|
result.exports // Exported symbols
|
|
104
|
+
result.findings // SastFinding[] from all 11 analysis passes
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### `analyzeProject(files, options?)`
|
|
108
|
+
|
|
109
|
+
Analyze multiple files together to detect cross-file taint flows.
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { analyzeProject } from 'circle-ir';
|
|
113
|
+
|
|
114
|
+
const result = await analyzeProject([
|
|
115
|
+
{ code: controllerCode, filePath: 'UserController.java', language: 'java' },
|
|
116
|
+
{ code: serviceCode, filePath: 'UserService.java', language: 'java' },
|
|
117
|
+
{ code: daoCode, filePath: 'UserDao.java', language: 'java' },
|
|
118
|
+
]);
|
|
119
|
+
|
|
120
|
+
// Per-file analysis (same as analyze() per file)
|
|
121
|
+
for (const { file, analysis } of result.files) {
|
|
122
|
+
console.log(`${file}: ${analysis.taint.flows?.length ?? 0} intra-file flows`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Cross-file taint paths (the key deliverable)
|
|
126
|
+
for (const path of result.taint_paths) {
|
|
127
|
+
console.log(`Cross-file ${path.sink.type}: ${path.source.file} → ${path.sink.file}`);
|
|
128
|
+
console.log(` Confidence: ${path.confidence.toFixed(2)}, CWE: ${path.sink.cwe}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Resolved inter-file method calls
|
|
132
|
+
console.log(`${result.cross_file_calls.length} cross-file calls resolved`);
|
|
133
|
+
|
|
134
|
+
// Project metadata
|
|
135
|
+
console.log(`${result.meta.total_files} files, ${result.meta.total_loc} LOC`);
|
|
95
136
|
```
|
|
96
137
|
|
|
97
138
|
### `analyzeForAPI(code, filePath, language, options?)`
|
|
@@ -169,6 +210,42 @@ sources:
|
|
|
169
210
|
tainted_args: [return]
|
|
170
211
|
```
|
|
171
212
|
|
|
213
|
+
## SAST Findings & Quality Passes
|
|
214
|
+
|
|
215
|
+
The 11-pass pipeline emits `SastFinding[]` via `result.findings`. Each finding is SARIF 2.1.0-aligned:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
interface SastFinding {
|
|
219
|
+
id: string; // e.g. "dead-code-42"
|
|
220
|
+
rule_id: string; // e.g. "dead-code"
|
|
221
|
+
category: PassCategory; // 'security' | 'reliability' | 'performance' | 'maintainability' | 'architecture'
|
|
222
|
+
severity: string; // 'critical' | 'high' | 'medium' | 'low'
|
|
223
|
+
level: SarifLevel; // 'error' | 'warning' | 'note' | 'none'
|
|
224
|
+
message: string;
|
|
225
|
+
file: string;
|
|
226
|
+
line: number;
|
|
227
|
+
cwe?: string; // e.g. "CWE-561"
|
|
228
|
+
fix?: string; // Instance-specific remediation hint
|
|
229
|
+
evidence?: Record<string, unknown>;
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Current passes** (see [docs/PASSES.md](docs/PASSES.md) for the full registry):
|
|
234
|
+
|
|
235
|
+
| Pass | rule_id | Category | CWE | Level |
|
|
236
|
+
|------|---------|----------|-----|-------|
|
|
237
|
+
| TaintMatcherPass | _(produces flows)_ | security | — | error |
|
|
238
|
+
| ConstantPropagationPass | _(reduces FP)_ | security | — | — |
|
|
239
|
+
| LanguageSourcesPass | _(enriches sources)_ | security | — | — |
|
|
240
|
+
| SinkFilterPass | _(filters sinks)_ | security | — | — |
|
|
241
|
+
| TaintPropagationPass | _(propagates taint)_ | security | — | error |
|
|
242
|
+
| InterproceduralPass | _(cross-method)_ | security | — | error |
|
|
243
|
+
| DeadCodePass | `dead-code` | reliability | CWE-561 | warning |
|
|
244
|
+
| MissingAwaitPass | `missing-await` | reliability | CWE-252 | warning |
|
|
245
|
+
| NPlusOnePass | `n-plus-one` | performance | CWE-1049 | warning |
|
|
246
|
+
| MissingPublicDocPass | `missing-public-doc` | maintainability | — | note |
|
|
247
|
+
| TodoInProdPass | `todo-in-prod` | maintainability | — | note |
|
|
248
|
+
|
|
172
249
|
## Key Analysis Features
|
|
173
250
|
|
|
174
251
|
- **Constant Propagation**: Eliminates false positives by tracking variable values and detecting dead code
|
|
@@ -191,11 +268,11 @@ All scores below are for **circle-ir static analysis only** (no LLM).
|
|
|
191
268
|
|
|
192
269
|
## Documentation
|
|
193
270
|
|
|
271
|
+
- [Pass & Metric Registry](docs/PASSES.md) - Canonical list of every pass and metric with rule_id, CWE, and status
|
|
194
272
|
- [Circle-IR Specification](docs/SPEC.md) - IR format specification
|
|
195
273
|
- [Architecture Guide](docs/ARCHITECTURE.md) - Detailed system architecture
|
|
196
|
-
- [Contributing Guide](CONTRIBUTING.md) - How to contribute
|
|
197
274
|
- [Changelog](CHANGELOG.md) - Version history
|
|
198
|
-
- [TODO](TODO.md) -
|
|
275
|
+
- [TODO](TODO.md) - Phase-based roadmap
|
|
199
276
|
|
|
200
277
|
## License
|
|
201
278
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* pattern matching alone.
|
|
7
7
|
*/
|
|
8
8
|
import type { DFG, DFGDef, CallInfo, TaintSource, TaintSink, TaintSanitizer } from '../types/index.js';
|
|
9
|
+
import { CodeGraph } from '../graph/index.js';
|
|
9
10
|
/**
|
|
10
11
|
* Result of DFG verification
|
|
11
12
|
*/
|
|
@@ -46,23 +47,11 @@ export interface VerifierConfig {
|
|
|
46
47
|
* DFGVerifier - Verifies taint flows using def-use chains
|
|
47
48
|
*/
|
|
48
49
|
export declare class DFGVerifier {
|
|
49
|
-
private
|
|
50
|
-
private calls;
|
|
50
|
+
private graph;
|
|
51
51
|
private sanitizers;
|
|
52
52
|
private config;
|
|
53
|
-
private defById;
|
|
54
|
-
private defsByLine;
|
|
55
|
-
private defsByVar;
|
|
56
|
-
private usesByDefId;
|
|
57
|
-
private usesByLine;
|
|
58
|
-
private callsByLine;
|
|
59
53
|
private sanitizerLines;
|
|
60
|
-
|
|
61
|
-
constructor(dfg: DFG, calls: CallInfo[], sanitizers: TaintSanitizer[], config?: VerifierConfig);
|
|
62
|
-
/**
|
|
63
|
-
* Build lookup maps for efficient querying
|
|
64
|
-
*/
|
|
65
|
-
private buildLookupMaps;
|
|
54
|
+
constructor(graphOrDfg: CodeGraph | DFG, callsOrSanitizers: CallInfo[] | TaintSanitizer[], sanitizersOrConfig?: TaintSanitizer[] | VerifierConfig, config?: VerifierConfig);
|
|
66
55
|
/**
|
|
67
56
|
* Verify if taint flows from source to sink
|
|
68
57
|
*/
|
|
@@ -5,81 +5,53 @@
|
|
|
5
5
|
* the data flow graph. This provides a more precise validation than
|
|
6
6
|
* pattern matching alone.
|
|
7
7
|
*/
|
|
8
|
+
import { CodeGraph } from '../graph/index.js';
|
|
8
9
|
/**
|
|
9
10
|
* DFGVerifier - Verifies taint flows using def-use chains
|
|
10
11
|
*/
|
|
11
12
|
export class DFGVerifier {
|
|
12
|
-
|
|
13
|
-
calls;
|
|
13
|
+
graph;
|
|
14
14
|
sanitizers;
|
|
15
15
|
config;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.calls = calls;
|
|
29
|
-
this.sanitizers = sanitizers;
|
|
30
|
-
this.config = {
|
|
31
|
-
maxDepth: config.maxDepth ?? 30,
|
|
32
|
-
requireDirectFlow: config.requireDirectFlow ?? false,
|
|
33
|
-
allowFieldFlows: config.allowFieldFlows ?? true,
|
|
34
|
-
};
|
|
35
|
-
this.buildLookupMaps();
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Build lookup maps for efficient querying
|
|
39
|
-
*/
|
|
40
|
-
buildLookupMaps() {
|
|
41
|
-
for (const def of this.dfg.defs) {
|
|
42
|
-
this.defById.set(def.id, def);
|
|
43
|
-
const byLine = this.defsByLine.get(def.line) ?? [];
|
|
44
|
-
byLine.push(def);
|
|
45
|
-
this.defsByLine.set(def.line, byLine);
|
|
46
|
-
const byVar = this.defsByVar.get(def.variable) ?? [];
|
|
47
|
-
byVar.push(def);
|
|
48
|
-
this.defsByVar.set(def.variable, byVar);
|
|
49
|
-
}
|
|
50
|
-
for (const use of this.dfg.uses) {
|
|
51
|
-
const byLine = this.usesByLine.get(use.line) ?? [];
|
|
52
|
-
byLine.push(use);
|
|
53
|
-
this.usesByLine.set(use.line, byLine);
|
|
54
|
-
if (use.def_id !== null) {
|
|
55
|
-
const byDefId = this.usesByDefId.get(use.def_id) ?? [];
|
|
56
|
-
byDefId.push(use);
|
|
57
|
-
this.usesByDefId.set(use.def_id, byDefId);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
for (const call of this.calls) {
|
|
61
|
-
const byLine = this.callsByLine.get(call.location.line) ?? [];
|
|
62
|
-
byLine.push(call);
|
|
63
|
-
this.callsByLine.set(call.location.line, byLine);
|
|
64
|
-
}
|
|
65
|
-
for (const sanitizer of this.sanitizers) {
|
|
66
|
-
this.sanitizerLines.add(sanitizer.line);
|
|
16
|
+
sanitizerLines;
|
|
17
|
+
constructor(graphOrDfg, callsOrSanitizers, sanitizersOrConfig, config = {}) {
|
|
18
|
+
// Support both new CodeGraph signature and legacy (dfg, calls, sanitizers, config) signature
|
|
19
|
+
if (graphOrDfg instanceof CodeGraph) {
|
|
20
|
+
this.graph = graphOrDfg;
|
|
21
|
+
this.sanitizers = callsOrSanitizers;
|
|
22
|
+
const cfg = sanitizersOrConfig;
|
|
23
|
+
this.config = {
|
|
24
|
+
maxDepth: cfg?.maxDepth ?? 30,
|
|
25
|
+
requireDirectFlow: cfg?.requireDirectFlow ?? false,
|
|
26
|
+
allowFieldFlows: cfg?.allowFieldFlows ?? true,
|
|
27
|
+
};
|
|
67
28
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
29
|
+
else {
|
|
30
|
+
// Legacy: (dfg, calls, sanitizers, config)
|
|
31
|
+
const dfg = graphOrDfg;
|
|
32
|
+
const calls = callsOrSanitizers;
|
|
33
|
+
const sanitizers = sanitizersOrConfig ?? [];
|
|
34
|
+
this.graph = new CodeGraph({
|
|
35
|
+
meta: { circle_ir: '3.0', file: '', language: 'java', loc: 0, hash: '' },
|
|
36
|
+
types: [], calls, cfg: { blocks: [], edges: [] }, dfg,
|
|
37
|
+
taint: { sources: [], sinks: [], sanitizers },
|
|
38
|
+
imports: [], exports: [], unresolved: [], enriched: {},
|
|
39
|
+
});
|
|
40
|
+
this.sanitizers = sanitizers;
|
|
41
|
+
this.config = {
|
|
42
|
+
maxDepth: config.maxDepth ?? 30,
|
|
43
|
+
requireDirectFlow: config.requireDirectFlow ?? false,
|
|
44
|
+
allowFieldFlows: config.allowFieldFlows ?? true,
|
|
45
|
+
};
|
|
75
46
|
}
|
|
47
|
+
this.sanitizerLines = new Set(this.sanitizers.map(s => s.line));
|
|
76
48
|
}
|
|
77
49
|
/**
|
|
78
50
|
* Verify if taint flows from source to sink
|
|
79
51
|
*/
|
|
80
52
|
verify(source, sink) {
|
|
81
53
|
// Find definitions at the source line
|
|
82
|
-
const sourceDefs = this.
|
|
54
|
+
const sourceDefs = this.graph.defsAtLine(source.line);
|
|
83
55
|
if (sourceDefs.length === 0) {
|
|
84
56
|
return {
|
|
85
57
|
verified: false,
|
|
@@ -156,9 +128,9 @@ export class DFGVerifier {
|
|
|
156
128
|
};
|
|
157
129
|
}
|
|
158
130
|
// Explore via def-use chains (if available)
|
|
159
|
-
const chains = this.
|
|
131
|
+
const chains = this.graph.chainsFrom(state.def.id);
|
|
160
132
|
for (const chain of chains) {
|
|
161
|
-
const nextDef = this.defById.get(chain.to_def);
|
|
133
|
+
const nextDef = this.graph.defById.get(chain.to_def);
|
|
162
134
|
if (!nextDef || state.visited.has(nextDef.id))
|
|
163
135
|
continue;
|
|
164
136
|
const step = {
|
|
@@ -177,10 +149,10 @@ export class DFGVerifier {
|
|
|
177
149
|
});
|
|
178
150
|
}
|
|
179
151
|
// Explore via uses of the current definition
|
|
180
|
-
const uses = this.
|
|
152
|
+
const uses = this.graph.usesOfDef(state.def.id);
|
|
181
153
|
for (const use of uses) {
|
|
182
154
|
// Find definitions at the use line
|
|
183
|
-
const nextDefs = this.
|
|
155
|
+
const nextDefs = this.graph.defsAtLine(use.line);
|
|
184
156
|
for (const nextDef of nextDefs) {
|
|
185
157
|
if (state.visited.has(nextDef.id))
|
|
186
158
|
continue;
|
|
@@ -206,8 +178,8 @@ export class DFGVerifier {
|
|
|
206
178
|
}
|
|
207
179
|
}
|
|
208
180
|
// Explore same-variable definitions at later lines
|
|
209
|
-
const laterDefs =
|
|
210
|
-
.filter(d =>
|
|
181
|
+
const laterDefs = this.graph.laterDefsOfVar(state.def.variable, state.def.line, sink.line)
|
|
182
|
+
.filter(d => !state.visited.has(d.id))
|
|
211
183
|
.slice(0, 5); // Limit branching
|
|
212
184
|
for (const nextDef of laterDefs) {
|
|
213
185
|
const step = {
|
|
@@ -233,15 +205,13 @@ export class DFGVerifier {
|
|
|
233
205
|
*/
|
|
234
206
|
reachesSink(def, sink) {
|
|
235
207
|
// Check uses at sink line
|
|
236
|
-
const
|
|
237
|
-
for (const use of uses) {
|
|
208
|
+
for (const use of this.graph.usesAtLine(sink.line)) {
|
|
238
209
|
if (use.variable === def.variable || use.def_id === def.id) {
|
|
239
210
|
return true;
|
|
240
211
|
}
|
|
241
212
|
}
|
|
242
213
|
// Check call arguments at sink line
|
|
243
|
-
const
|
|
244
|
-
for (const call of calls) {
|
|
214
|
+
for (const call of this.graph.callsAtLine(sink.line)) {
|
|
245
215
|
for (const arg of call.arguments) {
|
|
246
216
|
if (arg.variable === def.variable) {
|
|
247
217
|
return true;
|
|
@@ -250,8 +220,7 @@ export class DFGVerifier {
|
|
|
250
220
|
}
|
|
251
221
|
// Check if definition is at or before sink line with same variable
|
|
252
222
|
if (def.line <= sink.line) {
|
|
253
|
-
const laterDefs =
|
|
254
|
-
.filter(d => d.line > def.line && d.line <= sink.line);
|
|
223
|
+
const laterDefs = this.graph.laterDefsOfVar(def.variable, def.line, sink.line);
|
|
255
224
|
// If no redefinition between def and sink, it reaches
|
|
256
225
|
if (laterDefs.length === 0) {
|
|
257
226
|
return true;
|
|
@@ -264,7 +233,7 @@ export class DFGVerifier {
|
|
|
264
233
|
*/
|
|
265
234
|
determineFlowType(fromDef, toDef, useLine) {
|
|
266
235
|
// Check for call at the line
|
|
267
|
-
const calls = this.
|
|
236
|
+
const calls = this.graph.callsAtLine(useLine);
|
|
268
237
|
if (calls.length > 0) {
|
|
269
238
|
// If the variable changed, it's a return assignment
|
|
270
239
|
if (fromDef.variable !== toDef.variable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dfg-verifier.js","sourceRoot":"","sources":["../../src/analysis/dfg-verifier.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dfg-verifier.js","sourceRoot":"","sources":["../../src/analysis/dfg-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - Handles method call chains
|
|
8
8
|
*/
|
|
9
9
|
import type { CallInfo, TypeInfo, DFG, TaintSource, TaintSink, TaintSanitizer } from '../types/index.js';
|
|
10
|
+
import { CodeGraph } from '../graph/index.js';
|
|
10
11
|
/**
|
|
11
12
|
* Represents a method in the call graph.
|
|
12
13
|
*/
|
|
@@ -65,8 +66,11 @@ export interface InterproceduralOptions {
|
|
|
65
66
|
}
|
|
66
67
|
/**
|
|
67
68
|
* Perform inter-procedural taint analysis.
|
|
69
|
+
*
|
|
70
|
+
* Accepts either a CodeGraph (preferred) or the legacy (types, calls, dfg, ...)
|
|
71
|
+
* signature for backward compatibility.
|
|
68
72
|
*/
|
|
69
|
-
export declare function analyzeInterprocedural(
|
|
73
|
+
export declare function analyzeInterprocedural(graphOrTypes: CodeGraph | TypeInfo[], callsOrSources: CallInfo[] | TaintSource[], dfgOrSinks: DFG | TaintSink[], sourcesOrSanitizers: TaintSource[] | TaintSanitizer[], sinksOrOptions?: TaintSink[] | InterproceduralOptions, sanitizersArg?: TaintSanitizer[], optionsArg?: InterproceduralOptions): InterproceduralResult;
|
|
70
74
|
/**
|
|
71
75
|
* Get summary of inter-procedural analysis.
|
|
72
76
|
*/
|
|
@@ -6,10 +6,45 @@
|
|
|
6
6
|
* - Tracks taint through return values
|
|
7
7
|
* - Handles method call chains
|
|
8
8
|
*/
|
|
9
|
+
import { CodeGraph } from '../graph/index.js';
|
|
9
10
|
/**
|
|
10
11
|
* Perform inter-procedural taint analysis.
|
|
12
|
+
*
|
|
13
|
+
* Accepts either a CodeGraph (preferred) or the legacy (types, calls, dfg, ...)
|
|
14
|
+
* signature for backward compatibility.
|
|
11
15
|
*/
|
|
12
|
-
export function analyzeInterprocedural(
|
|
16
|
+
export function analyzeInterprocedural(graphOrTypes, callsOrSources, dfgOrSinks, sourcesOrSanitizers, sinksOrOptions, sanitizersArg, optionsArg = {}) {
|
|
17
|
+
let graph;
|
|
18
|
+
let sources;
|
|
19
|
+
let sinks;
|
|
20
|
+
let sanitizers;
|
|
21
|
+
let options;
|
|
22
|
+
if (graphOrTypes instanceof CodeGraph) {
|
|
23
|
+
// New signature: (graph, sources, sinks, sanitizers, options?)
|
|
24
|
+
graph = graphOrTypes;
|
|
25
|
+
sources = callsOrSources;
|
|
26
|
+
sinks = dfgOrSinks;
|
|
27
|
+
sanitizers = sourcesOrSanitizers;
|
|
28
|
+
options = sinksOrOptions ?? {};
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Legacy: (types, calls, dfg, sources, sinks, sanitizers, options?)
|
|
32
|
+
const types = graphOrTypes;
|
|
33
|
+
const calls = callsOrSources;
|
|
34
|
+
const dfg = dfgOrSinks;
|
|
35
|
+
sources = sourcesOrSanitizers;
|
|
36
|
+
sinks = sinksOrOptions ?? [];
|
|
37
|
+
sanitizers = sanitizersArg ?? [];
|
|
38
|
+
options = optionsArg;
|
|
39
|
+
graph = new CodeGraph({
|
|
40
|
+
meta: { circle_ir: '3.0', file: '', language: 'java', loc: 0, hash: '' },
|
|
41
|
+
types, calls, cfg: { blocks: [], edges: [] }, dfg,
|
|
42
|
+
taint: { sources: [], sinks: [], sanitizers },
|
|
43
|
+
imports: [], exports: [], unresolved: [], enriched: {},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const types = graph.ir.types;
|
|
47
|
+
const calls = graph.ir.calls;
|
|
13
48
|
// Build method nodes from type information
|
|
14
49
|
const methodNodes = buildMethodNodes(types);
|
|
15
50
|
// Build call graph edges with receiver type resolution
|
|
@@ -25,8 +60,14 @@ export function analyzeInterprocedural(types, calls, dfg, sources, sinks, saniti
|
|
|
25
60
|
taintedMethods.add(fqn);
|
|
26
61
|
}
|
|
27
62
|
}
|
|
28
|
-
// Build taint map from DFG
|
|
29
|
-
const
|
|
63
|
+
// Build taint map from DFG via CodeGraph (eliminates O(N) scan per source)
|
|
64
|
+
const seedIds = new Set();
|
|
65
|
+
for (const source of sources) {
|
|
66
|
+
for (const def of graph.defsAtLine(source.line)) {
|
|
67
|
+
seedIds.add(def.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const taintedDefIds = graph.propagateTaintedDefIds(seedIds);
|
|
30
71
|
// Get tainted variables from constant propagation (tracks collections with tainted elements)
|
|
31
72
|
const taintedVarsFromCP = options.taintedVariables ?? new Set();
|
|
32
73
|
// Analyze each call to propagate taint
|
|
@@ -82,8 +123,8 @@ export function analyzeInterprocedural(types, calls, dfg, sources, sinks, saniti
|
|
|
82
123
|
const taintedArgVars = [];
|
|
83
124
|
for (const arg of call.arguments) {
|
|
84
125
|
if (arg.variable) {
|
|
85
|
-
// Check 1: DFG-based taint tracking
|
|
86
|
-
const use =
|
|
126
|
+
// Check 1: DFG-based taint tracking (indexed lookup, no O(N) scan)
|
|
127
|
+
const use = graph.usesAtLine(call.location.line).find(u => u.variable === arg.variable) ?? null;
|
|
87
128
|
const isTaintedByDFG = use && use.def_id !== null && taintedDefIds.has(use.def_id);
|
|
88
129
|
// Check 2: Constant propagation taint tracking (for collections with tainted elements)
|
|
89
130
|
const isTaintedByCP = taintedVarsFromCP.has(arg.variable);
|
|
@@ -145,9 +186,9 @@ export function analyzeInterprocedural(types, calls, dfg, sources, sinks, saniti
|
|
|
145
186
|
}
|
|
146
187
|
}
|
|
147
188
|
// Propagate taint through return values
|
|
148
|
-
propagateReturnTaint(types,
|
|
189
|
+
propagateReturnTaint(types, graph, taintedDefIds, taintedReturns, taintedMethods, methodNodes);
|
|
149
190
|
// Iteratively propagate taint through call chains
|
|
150
|
-
propagateThroughCallChains(callEdges, methodNodes, taintedMethods, taintedReturns,
|
|
191
|
+
propagateThroughCallChains(callEdges, methodNodes, taintedMethods, taintedReturns, graph, taintedDefIds);
|
|
151
192
|
return {
|
|
152
193
|
methodNodes: methodNodes.byFqn,
|
|
153
194
|
callEdges,
|
|
@@ -280,47 +321,6 @@ function buildCallEdges(calls, methodNodes, types) {
|
|
|
280
321
|
}
|
|
281
322
|
return edges;
|
|
282
323
|
}
|
|
283
|
-
/**
|
|
284
|
-
* Build set of tainted definition IDs from sources.
|
|
285
|
-
*/
|
|
286
|
-
function buildTaintedDefIds(dfg, sources) {
|
|
287
|
-
const taintedDefIds = new Set();
|
|
288
|
-
// Find definitions on source lines
|
|
289
|
-
// Only mark defs on the EXACT source line as tainted
|
|
290
|
-
// (The previous +1 heuristic incorrectly marked unrelated defs as tainted)
|
|
291
|
-
for (const source of sources) {
|
|
292
|
-
for (const def of dfg.defs) {
|
|
293
|
-
if (def.line === source.line) {
|
|
294
|
-
taintedDefIds.add(def.id);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
// Propagate through chains
|
|
299
|
-
if (dfg.chains) {
|
|
300
|
-
let changed = true;
|
|
301
|
-
while (changed) {
|
|
302
|
-
changed = false;
|
|
303
|
-
for (const chain of dfg.chains) {
|
|
304
|
-
if (taintedDefIds.has(chain.from_def) && !taintedDefIds.has(chain.to_def)) {
|
|
305
|
-
taintedDefIds.add(chain.to_def);
|
|
306
|
-
changed = true;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return taintedDefIds;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Find a use at a specific line.
|
|
315
|
-
*/
|
|
316
|
-
function findUseAtLine(dfg, variable, line) {
|
|
317
|
-
for (const use of dfg.uses) {
|
|
318
|
-
if (use.variable === variable && use.line === line) {
|
|
319
|
-
return use;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
324
|
/**
|
|
325
325
|
* Find the method containing a specific line.
|
|
326
326
|
* Returns method info along with class and package context.
|
|
@@ -344,17 +344,17 @@ function findMethodAtLine(types, line) {
|
|
|
344
344
|
* Propagate taint through return values.
|
|
345
345
|
* Tracks which parameters flow to the return value for precise taint mapping.
|
|
346
346
|
*/
|
|
347
|
-
function propagateReturnTaint(types,
|
|
347
|
+
function propagateReturnTaint(types, graph, taintedDefIds, taintedReturns, taintedMethods, methodNodes) {
|
|
348
348
|
// Find return statements that return tainted values
|
|
349
|
-
const returnDefs = dfg.defs.filter(d => d.kind === 'return');
|
|
349
|
+
const returnDefs = graph.ir.dfg.defs.filter(d => d.kind === 'return');
|
|
350
350
|
for (const returnDef of returnDefs) {
|
|
351
351
|
// Find the method this return is in
|
|
352
352
|
const methodCtx = findMethodAtLine(types, returnDef.line);
|
|
353
353
|
if (!methodCtx)
|
|
354
354
|
continue;
|
|
355
355
|
const fqn = buildMethodFQN(methodCtx.packageName, methodCtx.className, methodCtx.methodName);
|
|
356
|
-
// Find uses on the same line (the returned value)
|
|
357
|
-
const usesOnLine =
|
|
356
|
+
// Find uses on the same line (the returned value) — indexed lookup
|
|
357
|
+
const usesOnLine = graph.usesAtLine(returnDef.line);
|
|
358
358
|
for (const use of usesOnLine) {
|
|
359
359
|
if (use.def_id !== null && taintedDefIds.has(use.def_id)) {
|
|
360
360
|
// This method returns a tainted value
|
|
@@ -383,7 +383,7 @@ function propagateReturnTaint(types, dfg, taintedDefIds, taintedReturns, tainted
|
|
|
383
383
|
/**
|
|
384
384
|
* Propagate taint through call chains iteratively.
|
|
385
385
|
*/
|
|
386
|
-
function propagateThroughCallChains(callEdges, methodNodes, taintedMethods, taintedReturns,
|
|
386
|
+
function propagateThroughCallChains(callEdges, methodNodes, taintedMethods, taintedReturns, graph, taintedDefIds) {
|
|
387
387
|
// Build reverse call graph (callee -> callers)
|
|
388
388
|
const callersOf = new Map();
|
|
389
389
|
for (const edge of callEdges) {
|
|
@@ -404,9 +404,9 @@ function propagateThroughCallChains(callEdges, methodNodes, taintedMethods, tain
|
|
|
404
404
|
const callers = callersOf.get(methodName) ?? [];
|
|
405
405
|
for (const edge of callers) {
|
|
406
406
|
// The call site now produces tainted data
|
|
407
|
-
//
|
|
408
|
-
for (const def of
|
|
409
|
-
if (
|
|
407
|
+
// Use indexed lookup instead of O(N) scan through all defs
|
|
408
|
+
for (const def of graph.defsAtLine(edge.callLine)) {
|
|
409
|
+
if (!taintedDefIds.has(def.id)) {
|
|
410
410
|
taintedDefIds.add(def.id);
|
|
411
411
|
changed = true;
|
|
412
412
|
// Mark the caller method as tainted
|
|
@@ -417,10 +417,12 @@ function propagateThroughCallChains(callEdges, methodNodes, taintedMethods, tain
|
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
419
|
}
|
|
420
|
-
// Propagate through chains
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
420
|
+
// Propagate through chains using indexed adjacency list
|
|
421
|
+
for (const [fromDef, chains] of graph.chainsByFromDef) {
|
|
422
|
+
if (!taintedDefIds.has(fromDef))
|
|
423
|
+
continue;
|
|
424
|
+
for (const chain of chains) {
|
|
425
|
+
if (!taintedDefIds.has(chain.to_def)) {
|
|
424
426
|
taintedDefIds.add(chain.to_def);
|
|
425
427
|
changed = true;
|
|
426
428
|
}
|