circle-ir 3.37.0 → 3.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cross-file-pass.js +64 -1
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/resolution/cross-file.d.ts +153 -3
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +753 -12
- package/dist/resolution/cross-file.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAGd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAGd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,mBAAmB;CA6JvB"}
|
|
@@ -66,13 +66,76 @@ export class CrossFilePass {
|
|
|
66
66
|
confidence: 0.7,
|
|
67
67
|
}];
|
|
68
68
|
});
|
|
69
|
+
// --- 1b. Inter-procedural multi-hop taint chains -----------------------
|
|
70
|
+
// Source in callee A → caller-side wrapper-return → caller-side sink-call
|
|
71
|
+
// → sink in callee B. These are flows that `findCrossFileTaintFlows()`
|
|
72
|
+
// can't see because no single file has both source and sink.
|
|
73
|
+
//
|
|
74
|
+
// Also includes cross-instance field-binding flows
|
|
75
|
+
// (`findFieldBindingTaintPaths()`): canonical Jenkins shape where one
|
|
76
|
+
// class writes `this.field = param` in a `@DataBoundConstructor` and
|
|
77
|
+
// another class reads that field on an aliased instance and forwards to
|
|
78
|
+
// a sink.
|
|
79
|
+
const ipPaths = [
|
|
80
|
+
...resolver.findInterproceduralTaintPaths(),
|
|
81
|
+
...resolver.findFieldBindingTaintPaths(),
|
|
82
|
+
];
|
|
83
|
+
for (let i = 0; i < ipPaths.length; i++) {
|
|
84
|
+
const p = ipPaths[i];
|
|
85
|
+
const sinkIR = projectGraph.getIR(p.sink.file);
|
|
86
|
+
if (!sinkIR)
|
|
87
|
+
continue;
|
|
88
|
+
const matchedSink = sinkIR.taint.sinks.find(s => s.line === p.sink.line);
|
|
89
|
+
if (!matchedSink)
|
|
90
|
+
continue;
|
|
91
|
+
const srcLines = sourceLines.get(p.source.file) ?? [];
|
|
92
|
+
const tgtLines = sourceLines.get(p.sink.file) ?? [];
|
|
93
|
+
// Dedup against any direct cross-file taint already emitted at the same
|
|
94
|
+
// source/sink coordinates.
|
|
95
|
+
const dupId = `${p.source.file}:${p.source.line}→${p.sink.file}:${p.sink.line}`;
|
|
96
|
+
if (taintPaths.some(tp => tp.source.file === p.source.file && tp.source.line === p.source.line &&
|
|
97
|
+
tp.sink.file === p.sink.file && tp.sink.line === p.sink.line)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
taintPaths.push({
|
|
101
|
+
id: `cf-ip-${i}-${dupId}`,
|
|
102
|
+
source: {
|
|
103
|
+
file: p.source.file,
|
|
104
|
+
line: p.source.line,
|
|
105
|
+
type: p.source.type,
|
|
106
|
+
code: srcLines[p.source.line - 1] ?? '',
|
|
107
|
+
},
|
|
108
|
+
sink: {
|
|
109
|
+
file: p.sink.file,
|
|
110
|
+
line: p.sink.line,
|
|
111
|
+
type: matchedSink.type,
|
|
112
|
+
cwe: matchedSink.cwe,
|
|
113
|
+
code: tgtLines[p.sink.line - 1] ?? '',
|
|
114
|
+
},
|
|
115
|
+
hops: p.hops.map(h => ({
|
|
116
|
+
file: h.file,
|
|
117
|
+
method: h.method,
|
|
118
|
+
line: h.line,
|
|
119
|
+
code: (sourceLines.get(h.file) ?? [])[h.line - 1] ?? '',
|
|
120
|
+
variable: '',
|
|
121
|
+
})),
|
|
122
|
+
sanitizers_in_path: [],
|
|
123
|
+
path_exists: true,
|
|
124
|
+
confidence: p.confidence,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
69
127
|
// --- 2. Resolved inter-file calls → CrossFileCall[] --------------------
|
|
128
|
+
// `args_mapping[].taint_propagates` is populated from the callee's
|
|
129
|
+
// `taintedParams` summary so callers can see at a glance which args of
|
|
130
|
+
// a cross-file call lead to a downstream sink.
|
|
70
131
|
const crossFileCalls = [];
|
|
71
132
|
for (const filePath of projectGraph.filePaths) {
|
|
72
133
|
const resolved = resolver.getResolvedCallsFromFile(filePath);
|
|
73
134
|
for (const rc of resolved) {
|
|
74
135
|
if (rc.sourceFile === rc.targetFile)
|
|
75
136
|
continue; // same-file, skip
|
|
137
|
+
const calleeInfo = resolver.getMethodTaintInfo(rc.targetMethod);
|
|
138
|
+
const taintedParamSet = new Set(calleeInfo?.taintedParams ?? []);
|
|
76
139
|
crossFileCalls.push({
|
|
77
140
|
id: `${rc.sourceFile}:${rc.call.location.line}:${rc.targetMethod}`,
|
|
78
141
|
from: {
|
|
@@ -88,7 +151,7 @@ export class CrossFilePass {
|
|
|
88
151
|
args_mapping: (rc.call.arguments ?? []).map((_, i) => ({
|
|
89
152
|
caller_arg: i,
|
|
90
153
|
callee_param: i,
|
|
91
|
-
taint_propagates:
|
|
154
|
+
taint_propagates: taintedParamSet.has(i),
|
|
92
155
|
})),
|
|
93
156
|
resolved: rc.resolution === 'exact',
|
|
94
157
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cross-file-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,58 @@ export interface CrossFileTaintFlow {
|
|
|
44
44
|
flowType: 'call_arg' | 'return_value' | 'field_access';
|
|
45
45
|
taintedArgPositions?: number[];
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Inter-procedural taint chain that spans multiple files / call sites.
|
|
49
|
+
*
|
|
50
|
+
* Shape: SOURCE in file A → caller's wrapper-return site → caller's sink-call
|
|
51
|
+
* site → SINK in file B. Used when no per-file source/sink is co-located in
|
|
52
|
+
* a single caller frame, so `findCrossFileTaintFlows()` cannot fire.
|
|
53
|
+
*/
|
|
54
|
+
export interface InterproceduralTaintPath {
|
|
55
|
+
source: {
|
|
56
|
+
file: string;
|
|
57
|
+
line: number;
|
|
58
|
+
type: string;
|
|
59
|
+
};
|
|
60
|
+
sink: {
|
|
61
|
+
file: string;
|
|
62
|
+
line: number;
|
|
63
|
+
type: string;
|
|
64
|
+
cwe: string;
|
|
65
|
+
};
|
|
66
|
+
hops: Array<{
|
|
67
|
+
file: string;
|
|
68
|
+
line: number;
|
|
69
|
+
method: string;
|
|
70
|
+
kind: 'source' | 'wrapper_return' | 'field_write' | 'field_read' | 'sink_call' | 'sink';
|
|
71
|
+
}>;
|
|
72
|
+
confidence: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Per-type field-binding taint summary.
|
|
76
|
+
*
|
|
77
|
+
* Records which fields on a class hold tainted data because a method in the
|
|
78
|
+
* class wrote a tainted parameter into the field (`this.field = param`).
|
|
79
|
+
* Used to surface cross-instance flows of the canonical Jenkins shape:
|
|
80
|
+
* `@DataBoundConstructor C(p)` writes `this.f = p` → another class holds a
|
|
81
|
+
* `C` instance and reads `instance.f` → that read flows to a sink.
|
|
82
|
+
*/
|
|
83
|
+
export interface FieldTaintInfo {
|
|
84
|
+
typeFqn: string;
|
|
85
|
+
fieldName: string;
|
|
86
|
+
fieldType: string | null;
|
|
87
|
+
file: string;
|
|
88
|
+
/** Methods that write tainted data into this field. */
|
|
89
|
+
writers: Array<{
|
|
90
|
+
methodFqn: string;
|
|
91
|
+
methodName: string;
|
|
92
|
+
writeLine: number;
|
|
93
|
+
/** Source type carried into the field (`http_param`, `autowired`, etc.). */
|
|
94
|
+
sourceType: string;
|
|
95
|
+
/** Original source line in the writer's method body. */
|
|
96
|
+
sourceLine: number;
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
47
99
|
/**
|
|
48
100
|
* CrossFileResolver - Resolves calls and tracks taint across files
|
|
49
101
|
*/
|
|
@@ -52,6 +104,7 @@ export declare class CrossFileResolver {
|
|
|
52
104
|
private typeHierarchy;
|
|
53
105
|
private fileIRs;
|
|
54
106
|
private methodTaintInfo;
|
|
107
|
+
private fieldTaintInfo;
|
|
55
108
|
private resolvedCalls;
|
|
56
109
|
constructor(symbolTable: SymbolTable, typeHierarchy: TypeHierarchyResolver);
|
|
57
110
|
/**
|
|
@@ -87,15 +140,45 @@ export declare class CrossFileResolver {
|
|
|
87
140
|
*/
|
|
88
141
|
private analyzeMethodTaint;
|
|
89
142
|
/**
|
|
90
|
-
*
|
|
143
|
+
* Per-file analysis of cross-instance field bindings.
|
|
144
|
+
*
|
|
145
|
+
* Records `FieldTaintInfo` entries for fields written by:
|
|
146
|
+
* 1. `@DataBoundConstructor`-style constructors — surfaced as
|
|
147
|
+
* `constructor_field` sources by `LanguageSourcesPass`.
|
|
148
|
+
* 2. Setter methods `set<Field>(<param>)` — assume the canonical
|
|
149
|
+
* `this.<field> = <param>` body shape, so the setter PARAMETER acts
|
|
150
|
+
* as the taint conduit at call sites.
|
|
151
|
+
* 3. `@Autowired` field annotations — the field itself is a framework
|
|
152
|
+
* injection point; the writer is synthetic (line = field decl).
|
|
153
|
+
*
|
|
154
|
+
* The entries are keyed `${typeFqn}.${fieldName}` and consumed by
|
|
155
|
+
* `findFieldBindingTaintPaths()` to surface flows of the canonical Jenkins
|
|
156
|
+
* shape: ctor writes field → another class reads instance.field → sink.
|
|
157
|
+
*/
|
|
158
|
+
private analyzeFieldTaint;
|
|
159
|
+
/**
|
|
160
|
+
* Check if method is a taint source.
|
|
161
|
+
*
|
|
162
|
+
* Excludes synthetic `interprocedural_param` sources — those are per-file
|
|
163
|
+
* meta-analysis signals saying "this method's parameter MIGHT be tainted
|
|
164
|
+
* when called with tainted data", not confirmed external inputs. Treating
|
|
165
|
+
* them as sources for cross-file `returnsSource` would propagate ghost
|
|
166
|
+
* taint into every callee with typed parameters.
|
|
91
167
|
*/
|
|
92
168
|
private isMethodTaintSource;
|
|
93
169
|
/**
|
|
94
|
-
* Get source type for a method
|
|
170
|
+
* Get source type for a method (excluding synthetic interprocedural_param)
|
|
95
171
|
*/
|
|
96
172
|
private getSourceType;
|
|
97
173
|
/**
|
|
98
|
-
* Find which parameters propagate taint to
|
|
174
|
+
* Find which parameters propagate taint to a sink within this method.
|
|
175
|
+
*
|
|
176
|
+
* Two heuristics, combined:
|
|
177
|
+
* 1. Annotation-based: params with @RequestParam/@RequestBody/@PathVariable.
|
|
178
|
+
* 2. Sink-arg matching: if a known sink call in the method body references
|
|
179
|
+
* a param by name in its arguments, that param propagates taint to a
|
|
180
|
+
* sink — this is the summary that cross-file chaining needs to link
|
|
181
|
+
* a caller's tainted argument to a downstream dangerous operation.
|
|
99
182
|
*/
|
|
100
183
|
private findTaintedParams;
|
|
101
184
|
/**
|
|
@@ -114,6 +197,71 @@ export declare class CrossFileResolver {
|
|
|
114
197
|
* Find cross-file taint flows
|
|
115
198
|
*/
|
|
116
199
|
findCrossFileTaintFlows(): CrossFileTaintFlow[];
|
|
200
|
+
/**
|
|
201
|
+
* Find inter-procedural taint chains spanning multiple files / call sites.
|
|
202
|
+
*
|
|
203
|
+
* Bridges the gap that `findCrossFileTaintFlows()` cannot cover: a real
|
|
204
|
+
* source lives in callee A, its return value bubbles up to caller C as a
|
|
205
|
+
* tainted local, and C then passes that local to callee B which contains
|
|
206
|
+
* the actual dangerous sink. Neither A nor C alone has a co-located
|
|
207
|
+
* source-and-sink, but the chain A → C → B is a real vulnerability.
|
|
208
|
+
*
|
|
209
|
+
* Algorithm (per caller method M):
|
|
210
|
+
* 1. Seed `tainted` with real (non-`interprocedural_param`) sources in M.
|
|
211
|
+
* 2. Walk calls in M in line order:
|
|
212
|
+
* a. If callee has `returnsSource = true` and is not a sanitizer,
|
|
213
|
+
* mark every `local` DFG def at this line as tainted, anchored to
|
|
214
|
+
* the callee's source.
|
|
215
|
+
* b. For each tainted arg in this call, if the callee's
|
|
216
|
+
* `taintedParams` covers that position, emit one
|
|
217
|
+
* `InterproceduralTaintPath` per sink inside the callee body.
|
|
218
|
+
*/
|
|
219
|
+
findInterproceduralTaintPaths(): InterproceduralTaintPath[];
|
|
220
|
+
/**
|
|
221
|
+
* Find cross-instance field-binding taint paths.
|
|
222
|
+
*
|
|
223
|
+
* Closes the canonical Jenkins / framework-DI shape that
|
|
224
|
+
* `findInterproceduralTaintPaths()` cannot cover because the "source" lives
|
|
225
|
+
* on an aliased object's field, not in a callee return:
|
|
226
|
+
*
|
|
227
|
+
* File A: class C { @DataBoundConstructor C(p) { this.f = p; } }
|
|
228
|
+
* File B: class E { final C step; E(C step){ this.step = step; }
|
|
229
|
+
* m() { String x = step.f; sink(x); } }
|
|
230
|
+
*
|
|
231
|
+
* Algorithm (per caller method M in file B):
|
|
232
|
+
* 1. Seed `tainted` with sources inside M (mirrors findInterproc step 1).
|
|
233
|
+
* 2. Scan M's local-def DFG entries for expressions of shape
|
|
234
|
+
* `<receiver>.<field>` where receiver's declared type owns `<field>`
|
|
235
|
+
* in the FieldTaintInfo cache. Mark the LHS local as tainted, anchor
|
|
236
|
+
* its origin to the field-binding writer (e.g. the ctor in file A).
|
|
237
|
+
* 3. After seeding, walk caller-body sinks the same way
|
|
238
|
+
* `findInterproceduralTaintPaths()` step 2c does, and also forward
|
|
239
|
+
* tainted locals into cross-file callees whose `taintedParams` mark
|
|
240
|
+
* the arg position as sink-propagating.
|
|
241
|
+
*/
|
|
242
|
+
findFieldBindingTaintPaths(): InterproceduralTaintPath[];
|
|
243
|
+
/**
|
|
244
|
+
* Check whether any loaded type with name `typeName` (simple or FQN suffix)
|
|
245
|
+
* declares a field named `fieldName`.
|
|
246
|
+
*/
|
|
247
|
+
private typeHasField;
|
|
248
|
+
/**
|
|
249
|
+
* Resolve a receiver type-name + field-name to the cache key used by
|
|
250
|
+
* `fieldTaintInfo`. Handles simple-name receivers (e.g. `ReadTrustedStep`)
|
|
251
|
+
* by looking up matching FQN keys across loaded files.
|
|
252
|
+
*/
|
|
253
|
+
private resolveFieldTaintKey;
|
|
254
|
+
/**
|
|
255
|
+
* Find which method a tainted arg expression references.
|
|
256
|
+
*/
|
|
257
|
+
private matchTaintedArg;
|
|
258
|
+
/**
|
|
259
|
+
* Index methods by FQN for quick lookup during chain construction.
|
|
260
|
+
*/
|
|
261
|
+
private buildMethodIndex;
|
|
262
|
+
/** Return the first local-def variable name at a given line, if any. */
|
|
263
|
+
private getLocalDefVarAt;
|
|
264
|
+
private findRealSourceLineInMethod;
|
|
117
265
|
/**
|
|
118
266
|
* Get taint info for a method
|
|
119
267
|
*/
|
|
@@ -136,6 +284,8 @@ export declare class CrossFileResolver {
|
|
|
136
284
|
* Clear all caches
|
|
137
285
|
*/
|
|
138
286
|
clear(): void;
|
|
287
|
+
/** Expose field-taint summary (for tests + diagnostics). */
|
|
288
|
+
getFieldTaintInfo(typeFqn: string, fieldName: string): FieldTaintInfo | undefined;
|
|
139
289
|
}
|
|
140
290
|
/**
|
|
141
291
|
* Build a cross-file resolver from multiple IR results
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file.d.ts","sourceRoot":"","sources":["../../src/resolution/cross-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,QAAQ,EAER,QAAQ,EAET,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,aAAa,EAAE,MAAM,EAAE,CAAC;IAExB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,CAAC;IACvD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAwB;IAG7C,OAAO,CAAC,OAAO,CAAoC;IAGnD,OAAO,CAAC,eAAe,CAA2C;IAGlE,OAAO,CAAC,aAAa,CAAwC;gBAG3D,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,qBAAqB;IAMtC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"cross-file.d.ts","sourceRoot":"","sources":["../../src/resolution/cross-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ export class CrossFileResolver {
|
|
|
16
16
|
fileIRs = new Map();
|
|
17
17
|
// Cache: method FQN -> taint info
|
|
18
18
|
methodTaintInfo = new Map();
|
|
19
|
+
// Cache: `${typeFqn}.${fieldName}` -> field taint info
|
|
20
|
+
fieldTaintInfo = new Map();
|
|
19
21
|
// Resolved calls cache
|
|
20
22
|
resolvedCalls = new Map();
|
|
21
23
|
constructor(symbolTable, typeHierarchy) {
|
|
@@ -31,6 +33,8 @@ export class CrossFileResolver {
|
|
|
31
33
|
this.typeHierarchy.addFromIR(ir, filePath);
|
|
32
34
|
// Analyze methods for taint propagation characteristics
|
|
33
35
|
this.analyzeMethodTaint(ir, filePath);
|
|
36
|
+
// Analyze cross-instance field bindings (constructor + setter writers)
|
|
37
|
+
this.analyzeFieldTaint(ir, filePath);
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Resolve a call to its target method(s)
|
|
@@ -220,9 +224,14 @@ export class CrossFileResolver {
|
|
|
220
224
|
const typeFqn = pkg ? `${pkg}.${type.name}` : type.name;
|
|
221
225
|
for (const method of type.methods) {
|
|
222
226
|
const methodFqn = `${typeFqn}.${method.name}`;
|
|
223
|
-
// Check if method is a taint source
|
|
227
|
+
// Check if method is a taint source (excludes synthetic interprocedural_param)
|
|
224
228
|
const isSource = this.isMethodTaintSource(method, ir.taint.sources);
|
|
225
|
-
// Check if method propagates taint from parameters
|
|
229
|
+
// Check if method propagates taint from parameters.
|
|
230
|
+
// Combines (a) annotation-based params (e.g. @RequestParam) with
|
|
231
|
+
// (b) per-file sink arg matching: any sink in the method body whose
|
|
232
|
+
// call expression references a param by name marks that param as
|
|
233
|
+
// taint-propagating to a sink — this is the summary needed for
|
|
234
|
+
// cross-file chaining of `wrapper(taintedArg)` → sink calls.
|
|
226
235
|
const taintedParams = this.findTaintedParams(method, ir);
|
|
227
236
|
// Check if method sanitizes
|
|
228
237
|
const sanitizes = method.annotations.includes('sanitizer') ||
|
|
@@ -241,7 +250,155 @@ export class CrossFileResolver {
|
|
|
241
250
|
}
|
|
242
251
|
}
|
|
243
252
|
/**
|
|
244
|
-
*
|
|
253
|
+
* Per-file analysis of cross-instance field bindings.
|
|
254
|
+
*
|
|
255
|
+
* Records `FieldTaintInfo` entries for fields written by:
|
|
256
|
+
* 1. `@DataBoundConstructor`-style constructors — surfaced as
|
|
257
|
+
* `constructor_field` sources by `LanguageSourcesPass`.
|
|
258
|
+
* 2. Setter methods `set<Field>(<param>)` — assume the canonical
|
|
259
|
+
* `this.<field> = <param>` body shape, so the setter PARAMETER acts
|
|
260
|
+
* as the taint conduit at call sites.
|
|
261
|
+
* 3. `@Autowired` field annotations — the field itself is a framework
|
|
262
|
+
* injection point; the writer is synthetic (line = field decl).
|
|
263
|
+
*
|
|
264
|
+
* The entries are keyed `${typeFqn}.${fieldName}` and consumed by
|
|
265
|
+
* `findFieldBindingTaintPaths()` to surface flows of the canonical Jenkins
|
|
266
|
+
* shape: ctor writes field → another class reads instance.field → sink.
|
|
267
|
+
*/
|
|
268
|
+
analyzeFieldTaint(ir, filePath) {
|
|
269
|
+
const pkg = ir.meta.package || '';
|
|
270
|
+
// (1) Constructor-bound fields surfaced by LanguageSourcesPass via
|
|
271
|
+
// `constructor_field` sources. Location string format:
|
|
272
|
+
// `${className}.${methodName}() returns tainted field '${field}'
|
|
273
|
+
// (from constructor param '${sourceParam}')`
|
|
274
|
+
const ctorFieldRe = /^(\w+)\.(\w+)\(\) returns tainted field '([^']+)' \(from constructor param '([^']+)'\)/;
|
|
275
|
+
for (const src of ir.taint.sources) {
|
|
276
|
+
if (src.type !== 'constructor_field')
|
|
277
|
+
continue;
|
|
278
|
+
const m = ctorFieldRe.exec(src.location);
|
|
279
|
+
if (!m)
|
|
280
|
+
continue;
|
|
281
|
+
const [, className, , fieldName, sourceParam] = m;
|
|
282
|
+
const typeFqn = pkg ? `${pkg}.${className}` : className;
|
|
283
|
+
const type = ir.types.find(t => t.name === className);
|
|
284
|
+
if (!type)
|
|
285
|
+
continue;
|
|
286
|
+
// Locate the constructor (or first method) whose param name matches.
|
|
287
|
+
const writerMethod = type.methods.find(mth => mth.name === className && mth.parameters.some(p => p.name === sourceParam)) ??
|
|
288
|
+
type.methods.find(mth => mth.parameters.some(p => p.name === sourceParam));
|
|
289
|
+
if (!writerMethod)
|
|
290
|
+
continue;
|
|
291
|
+
const field = type.fields?.find(f => f.name === fieldName);
|
|
292
|
+
const key = `${typeFqn}.${fieldName}`;
|
|
293
|
+
const existing = this.fieldTaintInfo.get(key);
|
|
294
|
+
const writer = {
|
|
295
|
+
methodFqn: `${typeFqn}.${writerMethod.name}`,
|
|
296
|
+
methodName: writerMethod.name,
|
|
297
|
+
writeLine: writerMethod.start_line,
|
|
298
|
+
sourceType: 'constructor_field',
|
|
299
|
+
sourceLine: src.line,
|
|
300
|
+
};
|
|
301
|
+
if (existing) {
|
|
302
|
+
if (!existing.writers.some(w => w.methodFqn === writer.methodFqn)) {
|
|
303
|
+
existing.writers.push(writer);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.fieldTaintInfo.set(key, {
|
|
308
|
+
typeFqn,
|
|
309
|
+
fieldName,
|
|
310
|
+
fieldType: field?.type ?? null,
|
|
311
|
+
file: filePath,
|
|
312
|
+
writers: [writer],
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// (2) Setter chains: `setX(x)` with one param. The PARAMETER acts as the
|
|
317
|
+
// taint conduit — the writer record reflects this so caller-side
|
|
318
|
+
// `obj.setX(tainted)` followed by `obj.x` read can be wired by
|
|
319
|
+
// `findFieldBindingTaintPaths()`. We do NOT pre-mark the field as
|
|
320
|
+
// tainted; tainting requires a tainted argument at call site (handled
|
|
321
|
+
// by the consumer pass).
|
|
322
|
+
for (const type of ir.types) {
|
|
323
|
+
const typeFqn = pkg ? `${pkg}.${type.name}` : type.name;
|
|
324
|
+
for (const method of type.methods) {
|
|
325
|
+
if (!method.name.startsWith('set') || method.name.length <= 3)
|
|
326
|
+
continue;
|
|
327
|
+
if (method.parameters.length !== 1)
|
|
328
|
+
continue;
|
|
329
|
+
const fieldName = method.name.charAt(3).toLowerCase() + method.name.substring(4);
|
|
330
|
+
const field = type.fields?.find(f => f.name === fieldName);
|
|
331
|
+
if (!field)
|
|
332
|
+
continue;
|
|
333
|
+
const key = `${typeFqn}.${fieldName}`;
|
|
334
|
+
const writer = {
|
|
335
|
+
methodFqn: `${typeFqn}.${method.name}`,
|
|
336
|
+
methodName: method.name,
|
|
337
|
+
writeLine: method.start_line,
|
|
338
|
+
sourceType: 'setter_param',
|
|
339
|
+
sourceLine: method.start_line,
|
|
340
|
+
};
|
|
341
|
+
const existing = this.fieldTaintInfo.get(key);
|
|
342
|
+
if (existing) {
|
|
343
|
+
if (!existing.writers.some(w => w.methodFqn === writer.methodFqn)) {
|
|
344
|
+
existing.writers.push(writer);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.fieldTaintInfo.set(key, {
|
|
349
|
+
typeFqn,
|
|
350
|
+
fieldName,
|
|
351
|
+
fieldType: field.type ?? null,
|
|
352
|
+
file: filePath,
|
|
353
|
+
writers: [writer],
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// (3) @Autowired / @Inject fields: framework-injected. Treat the field
|
|
359
|
+
// as unconditionally tainted (writer is synthetic at the field's
|
|
360
|
+
// declaration line). Covers Spring `@Autowired`, JSR-330 `@Inject`,
|
|
361
|
+
// CDI `@Inject`, Micronaut `@Inject`, Quarkus `@Inject`.
|
|
362
|
+
const injectAnnotations = new Set(['Autowired', 'Inject', 'Resource']);
|
|
363
|
+
for (const type of ir.types) {
|
|
364
|
+
const typeFqn = pkg ? `${pkg}.${type.name}` : type.name;
|
|
365
|
+
for (const field of type.fields ?? []) {
|
|
366
|
+
if (!field.annotations?.some(a => injectAnnotations.has(a)))
|
|
367
|
+
continue;
|
|
368
|
+
const key = `${typeFqn}.${field.name}`;
|
|
369
|
+
const writer = {
|
|
370
|
+
methodFqn: `${typeFqn}.<injected>`,
|
|
371
|
+
methodName: '<injected>',
|
|
372
|
+
writeLine: type.start_line,
|
|
373
|
+
sourceType: 'autowired_field',
|
|
374
|
+
sourceLine: type.start_line,
|
|
375
|
+
};
|
|
376
|
+
const existing = this.fieldTaintInfo.get(key);
|
|
377
|
+
if (existing) {
|
|
378
|
+
if (!existing.writers.some(w => w.methodFqn === writer.methodFqn)) {
|
|
379
|
+
existing.writers.push(writer);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
this.fieldTaintInfo.set(key, {
|
|
384
|
+
typeFqn,
|
|
385
|
+
fieldName: field.name,
|
|
386
|
+
fieldType: field.type ?? null,
|
|
387
|
+
file: filePath,
|
|
388
|
+
writers: [writer],
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Check if method is a taint source.
|
|
396
|
+
*
|
|
397
|
+
* Excludes synthetic `interprocedural_param` sources — those are per-file
|
|
398
|
+
* meta-analysis signals saying "this method's parameter MIGHT be tainted
|
|
399
|
+
* when called with tainted data", not confirmed external inputs. Treating
|
|
400
|
+
* them as sources for cross-file `returnsSource` would propagate ghost
|
|
401
|
+
* taint into every callee with typed parameters.
|
|
245
402
|
*/
|
|
246
403
|
isMethodTaintSource(method, sources) {
|
|
247
404
|
// Check annotation-based sources
|
|
@@ -251,8 +408,10 @@ export class CrossFileResolver {
|
|
|
251
408
|
return true;
|
|
252
409
|
}
|
|
253
410
|
}
|
|
254
|
-
// Check if any source is within this method
|
|
411
|
+
// Check if any REAL source is within this method
|
|
255
412
|
for (const source of sources) {
|
|
413
|
+
if (source.type === 'interprocedural_param')
|
|
414
|
+
continue;
|
|
256
415
|
if (source.line >= method.start_line && source.line <= method.end_line) {
|
|
257
416
|
return true;
|
|
258
417
|
}
|
|
@@ -260,10 +419,12 @@ export class CrossFileResolver {
|
|
|
260
419
|
return false;
|
|
261
420
|
}
|
|
262
421
|
/**
|
|
263
|
-
* Get source type for a method
|
|
422
|
+
* Get source type for a method (excluding synthetic interprocedural_param)
|
|
264
423
|
*/
|
|
265
424
|
getSourceType(method, sources) {
|
|
266
425
|
for (const source of sources) {
|
|
426
|
+
if (source.type === 'interprocedural_param')
|
|
427
|
+
continue;
|
|
267
428
|
if (source.line >= method.start_line && source.line <= method.end_line) {
|
|
268
429
|
return source.type;
|
|
269
430
|
}
|
|
@@ -271,21 +432,63 @@ export class CrossFileResolver {
|
|
|
271
432
|
return undefined;
|
|
272
433
|
}
|
|
273
434
|
/**
|
|
274
|
-
* Find which parameters propagate taint to
|
|
435
|
+
* Find which parameters propagate taint to a sink within this method.
|
|
436
|
+
*
|
|
437
|
+
* Two heuristics, combined:
|
|
438
|
+
* 1. Annotation-based: params with @RequestParam/@RequestBody/@PathVariable.
|
|
439
|
+
* 2. Sink-arg matching: if a known sink call in the method body references
|
|
440
|
+
* a param by name in its arguments, that param propagates taint to a
|
|
441
|
+
* sink — this is the summary that cross-file chaining needs to link
|
|
442
|
+
* a caller's tainted argument to a downstream dangerous operation.
|
|
275
443
|
*/
|
|
276
444
|
findTaintedParams(method, ir) {
|
|
277
|
-
const taintedParams =
|
|
278
|
-
// Simple heuristic: if parameter is used in return statement, it propagates taint
|
|
279
|
-
// More sophisticated analysis would track actual data flow
|
|
445
|
+
const taintedParams = new Set();
|
|
280
446
|
const numParams = method.parameters.length;
|
|
447
|
+
// Heuristic 1: annotation-based
|
|
281
448
|
for (let i = 0; i < numParams; i++) {
|
|
282
449
|
const param = method.parameters[i];
|
|
283
|
-
// Check if param has taint-related annotation
|
|
284
450
|
if (param.annotations.some(a => ['RequestParam', 'RequestBody', 'PathVariable'].includes(a))) {
|
|
285
|
-
taintedParams.
|
|
451
|
+
taintedParams.add(i);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Heuristic 2: sink-arg matching. For each sink inside this method, look
|
|
455
|
+
// at the corresponding call expression's argument variables and mark any
|
|
456
|
+
// matching parameter as taint-propagating.
|
|
457
|
+
const paramNameToIndex = new Map();
|
|
458
|
+
for (let i = 0; i < numParams; i++) {
|
|
459
|
+
const name = method.parameters[i].name;
|
|
460
|
+
if (name)
|
|
461
|
+
paramNameToIndex.set(name, i);
|
|
462
|
+
}
|
|
463
|
+
for (const sink of ir.taint.sinks) {
|
|
464
|
+
if (sink.line < method.start_line || sink.line > method.end_line)
|
|
465
|
+
continue;
|
|
466
|
+
// Find the call(s) at the sink line — match by line number.
|
|
467
|
+
const callsAtSink = ir.calls.filter(c => c.location.line === sink.line);
|
|
468
|
+
for (const call of callsAtSink) {
|
|
469
|
+
for (const arg of call.arguments) {
|
|
470
|
+
// Argument that's a direct variable reference.
|
|
471
|
+
const candidates = [];
|
|
472
|
+
if (arg.variable)
|
|
473
|
+
candidates.push(arg.variable);
|
|
474
|
+
if (arg.expression) {
|
|
475
|
+
// Heuristic: scan the expression for whole-word param-name tokens.
|
|
476
|
+
// Catches concatenations / nested expressions like `prefix + url`.
|
|
477
|
+
for (const [name] of paramNameToIndex) {
|
|
478
|
+
const re = new RegExp(`\\b${name}\\b`);
|
|
479
|
+
if (re.test(arg.expression))
|
|
480
|
+
candidates.push(name);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
for (const cand of candidates) {
|
|
484
|
+
const idx = paramNameToIndex.get(cand);
|
|
485
|
+
if (idx !== undefined)
|
|
486
|
+
taintedParams.add(idx);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
286
489
|
}
|
|
287
490
|
}
|
|
288
|
-
return taintedParams;
|
|
491
|
+
return [...taintedParams].sort((a, b) => a - b);
|
|
289
492
|
}
|
|
290
493
|
/**
|
|
291
494
|
* Check if method name suggests sanitization
|
|
@@ -350,6 +553,11 @@ export class CrossFileResolver {
|
|
|
350
553
|
// has typed parameters and happens to call another file that contains any sink.
|
|
351
554
|
if (source.type === 'interprocedural_param')
|
|
352
555
|
continue;
|
|
556
|
+
// Derive the variable that holds the source value (if it's assigned).
|
|
557
|
+
// When known, require the cross-file call's arguments to actually
|
|
558
|
+
// reference it — otherwise the flow is at best speculative and at
|
|
559
|
+
// worst a false positive when the value is sanitized in between.
|
|
560
|
+
const sourceVar = source.variable ?? this.getLocalDefVarAt(ir, source.line);
|
|
353
561
|
// Find calls at or after the source line
|
|
354
562
|
for (const call of ir.calls) {
|
|
355
563
|
if (call.location.line < source.line)
|
|
@@ -357,6 +565,19 @@ export class CrossFileResolver {
|
|
|
357
565
|
const resolved = this.resolveCall(call, filePath);
|
|
358
566
|
if (!resolved || resolved.targetFile === filePath)
|
|
359
567
|
continue;
|
|
568
|
+
// Variable-connectivity gate: when we know the source variable, the
|
|
569
|
+
// call's arguments must reference it (directly or by expression).
|
|
570
|
+
if (sourceVar) {
|
|
571
|
+
const argMentions = call.arguments.some(arg => {
|
|
572
|
+
if (arg.variable === sourceVar)
|
|
573
|
+
return true;
|
|
574
|
+
if (arg.expression && new RegExp(`\\b${sourceVar}\\b`).test(arg.expression))
|
|
575
|
+
return true;
|
|
576
|
+
return false;
|
|
577
|
+
});
|
|
578
|
+
if (!argMentions)
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
360
581
|
// Only proceed if the target file has any YAML-matched sinks at all.
|
|
361
582
|
// Skipping sink-free files prevents the cartesian explosion of flows into
|
|
362
583
|
// utility modules (AST helpers, string utilities, etc.) that have no
|
|
@@ -405,6 +626,521 @@ export class CrossFileResolver {
|
|
|
405
626
|
}
|
|
406
627
|
return flows;
|
|
407
628
|
}
|
|
629
|
+
/**
|
|
630
|
+
* Find inter-procedural taint chains spanning multiple files / call sites.
|
|
631
|
+
*
|
|
632
|
+
* Bridges the gap that `findCrossFileTaintFlows()` cannot cover: a real
|
|
633
|
+
* source lives in callee A, its return value bubbles up to caller C as a
|
|
634
|
+
* tainted local, and C then passes that local to callee B which contains
|
|
635
|
+
* the actual dangerous sink. Neither A nor C alone has a co-located
|
|
636
|
+
* source-and-sink, but the chain A → C → B is a real vulnerability.
|
|
637
|
+
*
|
|
638
|
+
* Algorithm (per caller method M):
|
|
639
|
+
* 1. Seed `tainted` with real (non-`interprocedural_param`) sources in M.
|
|
640
|
+
* 2. Walk calls in M in line order:
|
|
641
|
+
* a. If callee has `returnsSource = true` and is not a sanitizer,
|
|
642
|
+
* mark every `local` DFG def at this line as tainted, anchored to
|
|
643
|
+
* the callee's source.
|
|
644
|
+
* b. For each tainted arg in this call, if the callee's
|
|
645
|
+
* `taintedParams` covers that position, emit one
|
|
646
|
+
* `InterproceduralTaintPath` per sink inside the callee body.
|
|
647
|
+
*/
|
|
648
|
+
findInterproceduralTaintPaths() {
|
|
649
|
+
const paths = [];
|
|
650
|
+
const seen = new Set();
|
|
651
|
+
// Cache: method FQN → { ir, method }
|
|
652
|
+
const methodIndex = this.buildMethodIndex();
|
|
653
|
+
for (const [callerFile, callerIR] of this.fileIRs) {
|
|
654
|
+
for (const type of callerIR.types) {
|
|
655
|
+
for (const method of type.methods) {
|
|
656
|
+
// 1. Seed tainted vars with real sources inside this method.
|
|
657
|
+
const tainted = new Map();
|
|
658
|
+
for (const src of callerIR.taint.sources) {
|
|
659
|
+
if (src.type === 'interprocedural_param')
|
|
660
|
+
continue;
|
|
661
|
+
if (src.line < method.start_line || src.line > method.end_line)
|
|
662
|
+
continue;
|
|
663
|
+
if (!src.variable)
|
|
664
|
+
continue;
|
|
665
|
+
tainted.set(src.variable, {
|
|
666
|
+
file: callerFile,
|
|
667
|
+
line: src.line,
|
|
668
|
+
type: src.type,
|
|
669
|
+
hopChain: [{ file: callerFile, line: src.line, method: method.name, kind: 'source' }],
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
// 2. Walk calls in M in line order.
|
|
673
|
+
const callsInMethod = callerIR.calls
|
|
674
|
+
.filter(c => c.location.line >= method.start_line && c.location.line <= method.end_line)
|
|
675
|
+
.sort((a, b) => a.location.line - b.location.line);
|
|
676
|
+
for (const call of callsInMethod) {
|
|
677
|
+
const resolved = this.resolveCall(call, callerFile);
|
|
678
|
+
if (!resolved)
|
|
679
|
+
continue;
|
|
680
|
+
const callee = this.methodTaintInfo.get(resolved.targetMethod);
|
|
681
|
+
if (!callee)
|
|
682
|
+
continue;
|
|
683
|
+
// 2a. If callee returns a source and is NOT a sanitizer, mark every
|
|
684
|
+
// local def on this caller line as tainted (the assignment LHS).
|
|
685
|
+
if (callee.returnsSource && !callee.sanitizes && callee.sourceType) {
|
|
686
|
+
const calleeNode = methodIndex.get(resolved.targetMethod);
|
|
687
|
+
const calleeSourceLine = calleeNode
|
|
688
|
+
? this.findRealSourceLineInMethod(calleeNode.ir, calleeNode.method)
|
|
689
|
+
: undefined;
|
|
690
|
+
const sourceLine = calleeSourceLine ?? call.location.line;
|
|
691
|
+
const sourceFile = callee.file;
|
|
692
|
+
const sourceType = callee.sourceType;
|
|
693
|
+
const defsAtLine = callerIR.dfg.defs.filter(d => d.line === call.location.line && d.kind === 'local');
|
|
694
|
+
for (const def of defsAtLine) {
|
|
695
|
+
if (!def.variable)
|
|
696
|
+
continue;
|
|
697
|
+
const baseChain = [
|
|
698
|
+
{ file: sourceFile, line: sourceLine, method: resolved.targetMethod, kind: 'source' },
|
|
699
|
+
{ file: callerFile, line: call.location.line, method: method.name, kind: 'wrapper_return' },
|
|
700
|
+
];
|
|
701
|
+
tainted.set(def.variable, {
|
|
702
|
+
file: sourceFile,
|
|
703
|
+
line: sourceLine,
|
|
704
|
+
type: sourceType,
|
|
705
|
+
hopChain: baseChain,
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
// 2b. For each tainted arg passed to a callee param that propagates
|
|
710
|
+
// to a sink, emit a multi-hop path.
|
|
711
|
+
if (callee.taintedParams.length === 0 || callee.sanitizes)
|
|
712
|
+
continue;
|
|
713
|
+
for (let argIdx = 0; argIdx < call.arguments.length; argIdx++) {
|
|
714
|
+
if (!callee.taintedParams.includes(argIdx))
|
|
715
|
+
continue;
|
|
716
|
+
const arg = call.arguments[argIdx];
|
|
717
|
+
const matched = this.matchTaintedArg(arg, tainted);
|
|
718
|
+
if (!matched)
|
|
719
|
+
continue;
|
|
720
|
+
const calleeNode = methodIndex.get(resolved.targetMethod);
|
|
721
|
+
if (!calleeNode)
|
|
722
|
+
continue;
|
|
723
|
+
const sinksInCallee = calleeNode.ir.taint.sinks.filter(s => s.line >= calleeNode.method.start_line && s.line <= calleeNode.method.end_line);
|
|
724
|
+
for (const sink of sinksInCallee) {
|
|
725
|
+
const key = `${matched.origin.file}:${matched.origin.line}→${callee.file}:${sink.line}`;
|
|
726
|
+
if (seen.has(key))
|
|
727
|
+
continue;
|
|
728
|
+
seen.add(key);
|
|
729
|
+
const hops = [
|
|
730
|
+
...matched.origin.hopChain,
|
|
731
|
+
{ file: callerFile, line: call.location.line, method: method.name, kind: 'sink_call' },
|
|
732
|
+
{ file: callee.file, line: sink.line, method: resolved.targetMethod, kind: 'sink' },
|
|
733
|
+
];
|
|
734
|
+
// Confidence: decay by 0.85 per hop beyond the first.
|
|
735
|
+
const decay = Math.max(0.3, Math.pow(0.85, Math.max(hops.length - 1, 0)));
|
|
736
|
+
paths.push({
|
|
737
|
+
source: {
|
|
738
|
+
file: matched.origin.file,
|
|
739
|
+
line: matched.origin.line,
|
|
740
|
+
type: matched.origin.type,
|
|
741
|
+
},
|
|
742
|
+
sink: {
|
|
743
|
+
file: callee.file,
|
|
744
|
+
line: sink.line,
|
|
745
|
+
type: sink.type,
|
|
746
|
+
cwe: sink.cwe,
|
|
747
|
+
},
|
|
748
|
+
hops,
|
|
749
|
+
confidence: decay,
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
// 2c. Caller-body sinks: after marking locals tainted via wrapper-return,
|
|
755
|
+
// check whether any sink in the CALLER'S OWN method body consumes a
|
|
756
|
+
// tainted variable. This closes the canonical Jenkins shape where the
|
|
757
|
+
// final sink (e.g. `Paths.get(p)`, `Runtime.exec(cmd)`) lives in the
|
|
758
|
+
// caller's file rather than in a cross-file callee.
|
|
759
|
+
if (tainted.size > 0) {
|
|
760
|
+
const sinksInCaller = callerIR.taint.sinks.filter(s => s.line >= method.start_line && s.line <= method.end_line);
|
|
761
|
+
for (const sink of sinksInCaller) {
|
|
762
|
+
const callsAtSink = callerIR.calls.filter(c => c.location.line === sink.line);
|
|
763
|
+
for (const sinkCall of callsAtSink) {
|
|
764
|
+
for (const arg of sinkCall.arguments ?? []) {
|
|
765
|
+
const matched = this.matchTaintedArg(arg, tainted);
|
|
766
|
+
if (!matched)
|
|
767
|
+
continue;
|
|
768
|
+
const key = `${matched.origin.file}:${matched.origin.line}→${callerFile}:${sink.line}`;
|
|
769
|
+
if (seen.has(key))
|
|
770
|
+
continue;
|
|
771
|
+
seen.add(key);
|
|
772
|
+
const hops = [
|
|
773
|
+
...matched.origin.hopChain,
|
|
774
|
+
{ file: callerFile, line: sink.line, method: method.name, kind: 'sink' },
|
|
775
|
+
];
|
|
776
|
+
const decay = Math.max(0.3, Math.pow(0.85, Math.max(hops.length - 1, 0)));
|
|
777
|
+
paths.push({
|
|
778
|
+
source: {
|
|
779
|
+
file: matched.origin.file,
|
|
780
|
+
line: matched.origin.line,
|
|
781
|
+
type: matched.origin.type,
|
|
782
|
+
},
|
|
783
|
+
sink: {
|
|
784
|
+
file: callerFile,
|
|
785
|
+
line: sink.line,
|
|
786
|
+
type: sink.type,
|
|
787
|
+
cwe: sink.cwe,
|
|
788
|
+
},
|
|
789
|
+
hops,
|
|
790
|
+
confidence: decay,
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
return paths;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Find cross-instance field-binding taint paths.
|
|
803
|
+
*
|
|
804
|
+
* Closes the canonical Jenkins / framework-DI shape that
|
|
805
|
+
* `findInterproceduralTaintPaths()` cannot cover because the "source" lives
|
|
806
|
+
* on an aliased object's field, not in a callee return:
|
|
807
|
+
*
|
|
808
|
+
* File A: class C { @DataBoundConstructor C(p) { this.f = p; } }
|
|
809
|
+
* File B: class E { final C step; E(C step){ this.step = step; }
|
|
810
|
+
* m() { String x = step.f; sink(x); } }
|
|
811
|
+
*
|
|
812
|
+
* Algorithm (per caller method M in file B):
|
|
813
|
+
* 1. Seed `tainted` with sources inside M (mirrors findInterproc step 1).
|
|
814
|
+
* 2. Scan M's local-def DFG entries for expressions of shape
|
|
815
|
+
* `<receiver>.<field>` where receiver's declared type owns `<field>`
|
|
816
|
+
* in the FieldTaintInfo cache. Mark the LHS local as tainted, anchor
|
|
817
|
+
* its origin to the field-binding writer (e.g. the ctor in file A).
|
|
818
|
+
* 3. After seeding, walk caller-body sinks the same way
|
|
819
|
+
* `findInterproceduralTaintPaths()` step 2c does, and also forward
|
|
820
|
+
* tainted locals into cross-file callees whose `taintedParams` mark
|
|
821
|
+
* the arg position as sink-propagating.
|
|
822
|
+
*/
|
|
823
|
+
findFieldBindingTaintPaths() {
|
|
824
|
+
const paths = [];
|
|
825
|
+
const seen = new Set();
|
|
826
|
+
if (this.fieldTaintInfo.size === 0)
|
|
827
|
+
return paths;
|
|
828
|
+
const fieldExprRe = /^(\w+)\.(\w+)$/;
|
|
829
|
+
const methodIndex = this.buildMethodIndex();
|
|
830
|
+
for (const [callerFile, callerIR] of this.fileIRs) {
|
|
831
|
+
for (const type of callerIR.types) {
|
|
832
|
+
const callerTypeFqn = callerIR.meta.package
|
|
833
|
+
? `${callerIR.meta.package}.${type.name}`
|
|
834
|
+
: type.name;
|
|
835
|
+
for (const method of type.methods) {
|
|
836
|
+
const tainted = new Map();
|
|
837
|
+
for (const src of callerIR.taint.sources) {
|
|
838
|
+
if (src.type === 'interprocedural_param')
|
|
839
|
+
continue;
|
|
840
|
+
if (src.line < method.start_line || src.line > method.end_line)
|
|
841
|
+
continue;
|
|
842
|
+
if (!src.variable)
|
|
843
|
+
continue;
|
|
844
|
+
tainted.set(src.variable, {
|
|
845
|
+
file: callerFile,
|
|
846
|
+
line: src.line,
|
|
847
|
+
type: src.type,
|
|
848
|
+
hopChain: [{ file: callerFile, line: src.line, method: method.name, kind: 'source' }],
|
|
849
|
+
});
|
|
850
|
+
}
|
|
851
|
+
// 2. Scan local defs for `receiver.field` patterns.
|
|
852
|
+
//
|
|
853
|
+
// DFG defs don't carry RHS expressions on locals, so we co-locate:
|
|
854
|
+
// - a `local` def at line L
|
|
855
|
+
// - two uses at line L: a known receiver variable (param or
|
|
856
|
+
// containing-class field) AND a token matching a field on the
|
|
857
|
+
// receiver's declared type.
|
|
858
|
+
const defsInMethod = callerIR.dfg.defs.filter(d => d.kind === 'local' &&
|
|
859
|
+
d.line >= method.start_line &&
|
|
860
|
+
d.line <= method.end_line &&
|
|
861
|
+
!!d.variable);
|
|
862
|
+
for (const def of defsInMethod) {
|
|
863
|
+
const usesAtLine = callerIR.dfg.uses.filter(u => u.line === def.line);
|
|
864
|
+
if (usesAtLine.length < 2)
|
|
865
|
+
continue;
|
|
866
|
+
// First pass: expression-based (preferred if available).
|
|
867
|
+
let receiver = null;
|
|
868
|
+
let fieldName = null;
|
|
869
|
+
if (def.expression) {
|
|
870
|
+
const exprMatch = fieldExprRe.exec(def.expression.trim());
|
|
871
|
+
if (exprMatch) {
|
|
872
|
+
receiver = exprMatch[1];
|
|
873
|
+
fieldName = exprMatch[2];
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
// Resolve receiver type from local context.
|
|
877
|
+
const resolveReceiverType = (rcv) => {
|
|
878
|
+
const param = method.parameters.find(p => p.name === rcv);
|
|
879
|
+
if (param?.type)
|
|
880
|
+
return param.type;
|
|
881
|
+
const fieldOnSelf = type.fields?.find(f => f.name === rcv);
|
|
882
|
+
if (fieldOnSelf?.type)
|
|
883
|
+
return fieldOnSelf.type;
|
|
884
|
+
return null;
|
|
885
|
+
};
|
|
886
|
+
// Fallback: co-located uses heuristic. For each (receiverUse,
|
|
887
|
+
// fieldUse) pair, check whether receiver's declared type owns
|
|
888
|
+
// fieldUse.variable as a field.
|
|
889
|
+
let receiverType = null;
|
|
890
|
+
if (receiver && fieldName) {
|
|
891
|
+
receiverType = resolveReceiverType(receiver);
|
|
892
|
+
}
|
|
893
|
+
if (!receiverType) {
|
|
894
|
+
for (const rcvUse of usesAtLine) {
|
|
895
|
+
if (!rcvUse.variable || rcvUse.variable === def.variable)
|
|
896
|
+
continue;
|
|
897
|
+
const rt = resolveReceiverType(rcvUse.variable);
|
|
898
|
+
if (!rt)
|
|
899
|
+
continue;
|
|
900
|
+
// Find any other use at this line matching a field on rt.
|
|
901
|
+
const fieldUse = usesAtLine.find(u => u !== rcvUse &&
|
|
902
|
+
!!u.variable &&
|
|
903
|
+
u.variable !== def.variable &&
|
|
904
|
+
u.variable !== rcvUse.variable &&
|
|
905
|
+
this.typeHasField(rt, u.variable));
|
|
906
|
+
if (fieldUse) {
|
|
907
|
+
receiver = rcvUse.variable;
|
|
908
|
+
fieldName = fieldUse.variable;
|
|
909
|
+
receiverType = rt;
|
|
910
|
+
break;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
if (!receiver || !fieldName || !receiverType)
|
|
915
|
+
continue;
|
|
916
|
+
// FieldTaintInfo is keyed by FQN, but the receiver type may be a
|
|
917
|
+
// simple name. Resolve via symbol table / scan fileIRs.
|
|
918
|
+
const fieldKey = this.resolveFieldTaintKey(receiverType, fieldName, callerIR);
|
|
919
|
+
if (!fieldKey)
|
|
920
|
+
continue;
|
|
921
|
+
const fieldInfo = this.fieldTaintInfo.get(fieldKey);
|
|
922
|
+
if (!fieldInfo || fieldInfo.writers.length === 0)
|
|
923
|
+
continue;
|
|
924
|
+
// Anchor origin to the most informative writer (prefer ctor /
|
|
925
|
+
// autowired over setter). Setter writers require a tainted arg
|
|
926
|
+
// at call-site to be relevant; without seeing the call we treat
|
|
927
|
+
// them as non-anchoring here.
|
|
928
|
+
const writer = fieldInfo.writers.find(w => w.sourceType === 'constructor_field' || w.sourceType === 'autowired_field') ?? null;
|
|
929
|
+
if (!writer)
|
|
930
|
+
continue;
|
|
931
|
+
const hopChain = [
|
|
932
|
+
{
|
|
933
|
+
file: fieldInfo.file,
|
|
934
|
+
line: writer.sourceLine,
|
|
935
|
+
method: writer.methodName,
|
|
936
|
+
kind: 'source',
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
file: fieldInfo.file,
|
|
940
|
+
line: writer.writeLine,
|
|
941
|
+
method: writer.methodName,
|
|
942
|
+
kind: 'field_write',
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
file: callerFile,
|
|
946
|
+
line: def.line,
|
|
947
|
+
method: method.name,
|
|
948
|
+
kind: 'field_read',
|
|
949
|
+
},
|
|
950
|
+
];
|
|
951
|
+
tainted.set(def.variable, {
|
|
952
|
+
file: fieldInfo.file,
|
|
953
|
+
line: writer.sourceLine,
|
|
954
|
+
type: writer.sourceType,
|
|
955
|
+
hopChain,
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
if (tainted.size === 0)
|
|
959
|
+
continue;
|
|
960
|
+
// 3a. Caller-body sinks consuming a tainted local.
|
|
961
|
+
const sinksInCaller = callerIR.taint.sinks.filter(s => s.line >= method.start_line && s.line <= method.end_line);
|
|
962
|
+
for (const sink of sinksInCaller) {
|
|
963
|
+
const callsAtSink = callerIR.calls.filter(c => c.location.line === sink.line);
|
|
964
|
+
for (const sinkCall of callsAtSink) {
|
|
965
|
+
for (const arg of sinkCall.arguments ?? []) {
|
|
966
|
+
const matched = this.matchTaintedArg(arg, tainted);
|
|
967
|
+
if (!matched)
|
|
968
|
+
continue;
|
|
969
|
+
const key = `fb:${matched.origin.file}:${matched.origin.line}→${callerFile}:${sink.line}`;
|
|
970
|
+
if (seen.has(key))
|
|
971
|
+
continue;
|
|
972
|
+
seen.add(key);
|
|
973
|
+
const hops = [
|
|
974
|
+
...matched.origin.hopChain,
|
|
975
|
+
{ file: callerFile, line: sink.line, method: method.name, kind: 'sink' },
|
|
976
|
+
];
|
|
977
|
+
const decay = Math.max(0.3, Math.pow(0.85, Math.max(hops.length - 1, 0)));
|
|
978
|
+
paths.push({
|
|
979
|
+
source: {
|
|
980
|
+
file: matched.origin.file,
|
|
981
|
+
line: matched.origin.line,
|
|
982
|
+
type: matched.origin.type,
|
|
983
|
+
},
|
|
984
|
+
sink: {
|
|
985
|
+
file: callerFile,
|
|
986
|
+
line: sink.line,
|
|
987
|
+
type: sink.type,
|
|
988
|
+
cwe: sink.cwe,
|
|
989
|
+
},
|
|
990
|
+
hops,
|
|
991
|
+
confidence: decay,
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
// 3b. Cross-file callees: forward tainted locals into resolved
|
|
997
|
+
// callees whose taintedParams mark the arg as sink-propagating.
|
|
998
|
+
const callsInMethod = callerIR.calls
|
|
999
|
+
.filter(c => c.location.line >= method.start_line && c.location.line <= method.end_line)
|
|
1000
|
+
.sort((a, b) => a.location.line - b.location.line);
|
|
1001
|
+
for (const call of callsInMethod) {
|
|
1002
|
+
const resolved = this.resolveCall(call, callerFile);
|
|
1003
|
+
if (!resolved)
|
|
1004
|
+
continue;
|
|
1005
|
+
const callee = this.methodTaintInfo.get(resolved.targetMethod);
|
|
1006
|
+
if (!callee || callee.sanitizes || callee.taintedParams.length === 0)
|
|
1007
|
+
continue;
|
|
1008
|
+
for (let argIdx = 0; argIdx < call.arguments.length; argIdx++) {
|
|
1009
|
+
if (!callee.taintedParams.includes(argIdx))
|
|
1010
|
+
continue;
|
|
1011
|
+
const matched = this.matchTaintedArg(call.arguments[argIdx], tainted);
|
|
1012
|
+
if (!matched)
|
|
1013
|
+
continue;
|
|
1014
|
+
const calleeNode = methodIndex.get(resolved.targetMethod);
|
|
1015
|
+
if (!calleeNode)
|
|
1016
|
+
continue;
|
|
1017
|
+
const sinksInCallee = calleeNode.ir.taint.sinks.filter(s => s.line >= calleeNode.method.start_line && s.line <= calleeNode.method.end_line);
|
|
1018
|
+
for (const sink of sinksInCallee) {
|
|
1019
|
+
const key = `fb:${matched.origin.file}:${matched.origin.line}→${callee.file}:${sink.line}`;
|
|
1020
|
+
if (seen.has(key))
|
|
1021
|
+
continue;
|
|
1022
|
+
seen.add(key);
|
|
1023
|
+
const hops = [
|
|
1024
|
+
...matched.origin.hopChain,
|
|
1025
|
+
{ file: callerFile, line: call.location.line, method: method.name, kind: 'sink_call' },
|
|
1026
|
+
{ file: callee.file, line: sink.line, method: resolved.targetMethod, kind: 'sink' },
|
|
1027
|
+
];
|
|
1028
|
+
const decay = Math.max(0.3, Math.pow(0.85, Math.max(hops.length - 1, 0)));
|
|
1029
|
+
paths.push({
|
|
1030
|
+
source: {
|
|
1031
|
+
file: matched.origin.file,
|
|
1032
|
+
line: matched.origin.line,
|
|
1033
|
+
type: matched.origin.type,
|
|
1034
|
+
},
|
|
1035
|
+
sink: {
|
|
1036
|
+
file: callee.file,
|
|
1037
|
+
line: sink.line,
|
|
1038
|
+
type: sink.type,
|
|
1039
|
+
cwe: sink.cwe,
|
|
1040
|
+
},
|
|
1041
|
+
hops,
|
|
1042
|
+
confidence: decay,
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
// (silence unused warning for callerTypeFqn — reserved for future
|
|
1048
|
+
// same-class field-read detection)
|
|
1049
|
+
void callerTypeFqn;
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
return paths;
|
|
1054
|
+
}
|
|
1055
|
+
/**
|
|
1056
|
+
* Check whether any loaded type with name `typeName` (simple or FQN suffix)
|
|
1057
|
+
* declares a field named `fieldName`.
|
|
1058
|
+
*/
|
|
1059
|
+
typeHasField(typeName, fieldName) {
|
|
1060
|
+
for (const [, ir] of this.fileIRs) {
|
|
1061
|
+
for (const t of ir.types) {
|
|
1062
|
+
if (t.name !== typeName)
|
|
1063
|
+
continue;
|
|
1064
|
+
if ((t.fields ?? []).some(f => f.name === fieldName))
|
|
1065
|
+
return true;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
return false;
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* Resolve a receiver type-name + field-name to the cache key used by
|
|
1072
|
+
* `fieldTaintInfo`. Handles simple-name receivers (e.g. `ReadTrustedStep`)
|
|
1073
|
+
* by looking up matching FQN keys across loaded files.
|
|
1074
|
+
*/
|
|
1075
|
+
resolveFieldTaintKey(receiverType, fieldName, _callerIR) {
|
|
1076
|
+
// Exact FQN hit.
|
|
1077
|
+
const direct = `${receiverType}.${fieldName}`;
|
|
1078
|
+
if (this.fieldTaintInfo.has(direct))
|
|
1079
|
+
return direct;
|
|
1080
|
+
// Simple-name match: scan keys for `*.<receiver>.<field>` suffix.
|
|
1081
|
+
const suffix = `.${receiverType}.${fieldName}`;
|
|
1082
|
+
for (const key of this.fieldTaintInfo.keys()) {
|
|
1083
|
+
if (key === direct)
|
|
1084
|
+
return key;
|
|
1085
|
+
if (key.endsWith(suffix))
|
|
1086
|
+
return key;
|
|
1087
|
+
}
|
|
1088
|
+
return undefined;
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Find which method a tainted arg expression references.
|
|
1092
|
+
*/
|
|
1093
|
+
matchTaintedArg(arg, tainted) {
|
|
1094
|
+
if (tainted.size === 0)
|
|
1095
|
+
return null;
|
|
1096
|
+
// Direct variable reference
|
|
1097
|
+
if (arg.variable && tainted.has(arg.variable)) {
|
|
1098
|
+
return { var: arg.variable, origin: tainted.get(arg.variable) };
|
|
1099
|
+
}
|
|
1100
|
+
// Whole-word scan inside the expression (handles `prefix + url`, `url.trim()`, etc.)
|
|
1101
|
+
if (arg.expression) {
|
|
1102
|
+
for (const [tv, origin] of tainted) {
|
|
1103
|
+
const re = new RegExp(`\\b${tv}\\b`);
|
|
1104
|
+
if (re.test(arg.expression))
|
|
1105
|
+
return { var: tv, origin };
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
return null;
|
|
1109
|
+
}
|
|
1110
|
+
/**
|
|
1111
|
+
* Index methods by FQN for quick lookup during chain construction.
|
|
1112
|
+
*/
|
|
1113
|
+
buildMethodIndex() {
|
|
1114
|
+
const idx = new Map();
|
|
1115
|
+
for (const [, ir] of this.fileIRs) {
|
|
1116
|
+
const pkg = ir.meta.package || '';
|
|
1117
|
+
for (const type of ir.types) {
|
|
1118
|
+
const typeFqn = pkg ? `${pkg}.${type.name}` : type.name;
|
|
1119
|
+
for (const method of type.methods) {
|
|
1120
|
+
idx.set(`${typeFqn}.${method.name}`, { ir, method });
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
return idx;
|
|
1125
|
+
}
|
|
1126
|
+
/** Return the first local-def variable name at a given line, if any. */
|
|
1127
|
+
getLocalDefVarAt(ir, line) {
|
|
1128
|
+
for (const def of ir.dfg.defs) {
|
|
1129
|
+
if (def.line === line && def.kind === 'local' && def.variable)
|
|
1130
|
+
return def.variable;
|
|
1131
|
+
}
|
|
1132
|
+
return undefined;
|
|
1133
|
+
}
|
|
1134
|
+
findRealSourceLineInMethod(ir, method) {
|
|
1135
|
+
for (const src of ir.taint.sources) {
|
|
1136
|
+
if (src.type === 'interprocedural_param')
|
|
1137
|
+
continue;
|
|
1138
|
+
if (src.line >= method.start_line && src.line <= method.end_line) {
|
|
1139
|
+
return src.line;
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
return undefined;
|
|
1143
|
+
}
|
|
408
1144
|
/**
|
|
409
1145
|
* Get taint info for a method
|
|
410
1146
|
*/
|
|
@@ -456,8 +1192,13 @@ export class CrossFileResolver {
|
|
|
456
1192
|
clear() {
|
|
457
1193
|
this.fileIRs.clear();
|
|
458
1194
|
this.methodTaintInfo.clear();
|
|
1195
|
+
this.fieldTaintInfo.clear();
|
|
459
1196
|
this.resolvedCalls.clear();
|
|
460
1197
|
}
|
|
1198
|
+
/** Expose field-taint summary (for tests + diagnostics). */
|
|
1199
|
+
getFieldTaintInfo(typeFqn, fieldName) {
|
|
1200
|
+
return this.fieldTaintInfo.get(`${typeFqn}.${fieldName}`);
|
|
1201
|
+
}
|
|
461
1202
|
}
|
|
462
1203
|
/**
|
|
463
1204
|
* Build a cross-file resolver from multiple IR results
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file.js","sourceRoot":"","sources":["../../src/resolution/cross-file.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cross-file.js","sourceRoot":"","sources":["../../src/resolution/cross-file.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "circle-ir",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.39.0",
|
|
4
4
|
"description": "High-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|