circle-ir 4.4.0 → 4.6.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/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +10 -0
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/passes/insecure-deserialization-config-pass.d.ts +38 -0
- package/dist/analysis/passes/insecure-deserialization-config-pass.d.ts.map +1 -0
- package/dist/analysis/passes/insecure-deserialization-config-pass.js +69 -0
- package/dist/analysis/passes/insecure-deserialization-config-pass.js.map +1 -0
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +11 -2
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.js +39 -0
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +3 -0
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +92 -3
- package/dist/core/circle-ir-core.cjs +23 -1
- package/dist/core/circle-ir-core.js +23 -1
- package/dist/core/extractors/calls.js +15 -1
- package/dist/core/extractors/calls.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pass: insecure-deserialization-config (CWE-502, category: security)
|
|
3
|
+
*
|
|
4
|
+
* Pattern pass — flags a security *configuration* that renders a deserializer
|
|
5
|
+
* exploitable, independent of data flow. The vulnerability is the constant
|
|
6
|
+
* argument, not a source→sink taint path, so (like `weak-crypto`) this is a
|
|
7
|
+
* call-shape match rather than a taint sink.
|
|
8
|
+
*
|
|
9
|
+
* Java — XStream permissive type permission (cognium-dev#225):
|
|
10
|
+
* `xstream.addPermission(AnyTypePermission.ANY)` // grant-all, insecure
|
|
11
|
+
* `xstream.addPermission(new AnyTypePermission())` // same, constructed
|
|
12
|
+
*
|
|
13
|
+
* `AnyTypePermission` re-enables XStream's pre-1.4.10 grant-everything default,
|
|
14
|
+
* so a later `fromXML(untrusted)` can instantiate arbitrary gadget types
|
|
15
|
+
* (CVE-2013-7285, CVE-2020-26217, CVE-2021-21345, …). XStream's own docs call
|
|
16
|
+
* this out: production code with untrusted input must allow-list types, never
|
|
17
|
+
* `AnyTypePermission`. The argument is unambiguously XStream's security class,
|
|
18
|
+
* so the FP surface is near-zero — the *secure* shapes (`NoTypePermission.NONE`,
|
|
19
|
+
* `WildcardTypePermission(...)`, explicit `allowTypes(...)`) do not match.
|
|
20
|
+
*
|
|
21
|
+
* This is deterministic and complements the existing `fromXML` CWE-502 taint
|
|
22
|
+
* sink: the sink fires at the deserialization call site (only with a reachable
|
|
23
|
+
* source), while this fires at the misconfiguration site regardless of flow.
|
|
24
|
+
*/
|
|
25
|
+
import type { AnalysisPass, PassContext } from '../../graph/analysis-pass.js';
|
|
26
|
+
export interface InsecureDeserializationConfigResult {
|
|
27
|
+
findings: Array<{
|
|
28
|
+
line: number;
|
|
29
|
+
api: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare class InsecureDeserializationConfigPass implements AnalysisPass<InsecureDeserializationConfigResult> {
|
|
33
|
+
readonly name = "insecure-deserialization-config";
|
|
34
|
+
readonly category: "security";
|
|
35
|
+
run(ctx: PassContext): InsecureDeserializationConfigResult;
|
|
36
|
+
private isPermissiveXStreamConfig;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=insecure-deserialization-config-pass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-deserialization-config-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/insecure-deserialization-config-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG9E,MAAM,WAAW,mCAAmC;IAClD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAOD,qBAAa,iCACX,YAAW,YAAY,CAAC,mCAAmC,CAAC;IAE5D,QAAQ,CAAC,IAAI,qCAAqC;IAClD,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,mCAAmC;IAiC1D,OAAO,CAAC,yBAAyB;CAKlC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pass: insecure-deserialization-config (CWE-502, category: security)
|
|
3
|
+
*
|
|
4
|
+
* Pattern pass — flags a security *configuration* that renders a deserializer
|
|
5
|
+
* exploitable, independent of data flow. The vulnerability is the constant
|
|
6
|
+
* argument, not a source→sink taint path, so (like `weak-crypto`) this is a
|
|
7
|
+
* call-shape match rather than a taint sink.
|
|
8
|
+
*
|
|
9
|
+
* Java — XStream permissive type permission (cognium-dev#225):
|
|
10
|
+
* `xstream.addPermission(AnyTypePermission.ANY)` // grant-all, insecure
|
|
11
|
+
* `xstream.addPermission(new AnyTypePermission())` // same, constructed
|
|
12
|
+
*
|
|
13
|
+
* `AnyTypePermission` re-enables XStream's pre-1.4.10 grant-everything default,
|
|
14
|
+
* so a later `fromXML(untrusted)` can instantiate arbitrary gadget types
|
|
15
|
+
* (CVE-2013-7285, CVE-2020-26217, CVE-2021-21345, …). XStream's own docs call
|
|
16
|
+
* this out: production code with untrusted input must allow-list types, never
|
|
17
|
+
* `AnyTypePermission`. The argument is unambiguously XStream's security class,
|
|
18
|
+
* so the FP surface is near-zero — the *secure* shapes (`NoTypePermission.NONE`,
|
|
19
|
+
* `WildcardTypePermission(...)`, explicit `allowTypes(...)`) do not match.
|
|
20
|
+
*
|
|
21
|
+
* This is deterministic and complements the existing `fromXML` CWE-502 taint
|
|
22
|
+
* sink: the sink fires at the deserialization call site (only with a reachable
|
|
23
|
+
* source), while this fires at the misconfiguration site regardless of flow.
|
|
24
|
+
*/
|
|
25
|
+
// XStream's grant-all permission. Matches `AnyTypePermission.ANY` and
|
|
26
|
+
// `new AnyTypePermission()`, incl. fully-qualified
|
|
27
|
+
// `com.thoughtworks.xstream.security.AnyTypePermission`.
|
|
28
|
+
const ANY_TYPE_PERMISSION_RE = /\bAnyTypePermission\b/;
|
|
29
|
+
export class InsecureDeserializationConfigPass {
|
|
30
|
+
name = 'insecure-deserialization-config';
|
|
31
|
+
category = 'security';
|
|
32
|
+
run(ctx) {
|
|
33
|
+
const { graph, language } = ctx;
|
|
34
|
+
if (language !== 'java')
|
|
35
|
+
return { findings: [] };
|
|
36
|
+
const file = graph.ir.meta.file;
|
|
37
|
+
const findings = [];
|
|
38
|
+
for (const call of graph.ir.calls) {
|
|
39
|
+
if (!this.isPermissiveXStreamConfig(call))
|
|
40
|
+
continue;
|
|
41
|
+
const line = call.location.line;
|
|
42
|
+
const api = `addPermission(${call.arguments[0]?.expression ?? 'AnyTypePermission'})`;
|
|
43
|
+
findings.push({ line, api });
|
|
44
|
+
ctx.addFinding({
|
|
45
|
+
id: `${this.name}-${file}-${line}`,
|
|
46
|
+
pass: this.name,
|
|
47
|
+
category: this.category,
|
|
48
|
+
rule_id: this.name,
|
|
49
|
+
cwe: 'CWE-502',
|
|
50
|
+
severity: 'high',
|
|
51
|
+
level: 'error',
|
|
52
|
+
message: 'XStream configured with AnyTypePermission (grant-all): untrusted XML ' +
|
|
53
|
+
'passed to fromXML/unmarshal can instantiate arbitrary types (deserialization RCE)',
|
|
54
|
+
file,
|
|
55
|
+
line,
|
|
56
|
+
fix: 'Replace AnyTypePermission with an explicit type allow-list: xstream.addPermission(NoTypePermission.NONE) then allowTypes/allowTypesByWildcard for the classes you deserialize.',
|
|
57
|
+
evidence: { api, language },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { findings };
|
|
61
|
+
}
|
|
62
|
+
isPermissiveXStreamConfig(call) {
|
|
63
|
+
if (call.method_name !== 'addPermission')
|
|
64
|
+
return false;
|
|
65
|
+
const arg0 = call.arguments[0]?.expression;
|
|
66
|
+
return typeof arg0 === 'string' && ANY_TYPE_PERMISSION_RE.test(arg0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=insecure-deserialization-config-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-deserialization-config-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/insecure-deserialization-config-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AASH,sEAAsE;AACtE,mDAAmD;AACnD,yDAAyD;AACzD,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAEvD,MAAM,OAAO,iCAAiC;IAGnC,IAAI,GAAG,iCAAiC,CAAC;IACzC,QAAQ,GAAG,UAAmB,CAAC;IAExC,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;QAChC,IAAI,QAAQ,KAAK,MAAM;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAoD,EAAE,CAAC;QAErE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC,MAAM,GAAG,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,mBAAmB,GAAG,CAAC;YACrF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,UAAU,CAAC;gBACb,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;gBAClC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,GAAG,EAAE,SAAS;gBACd,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,OAAO;gBACd,OAAO,EACL,uEAAuE;oBACvE,mFAAmF;gBACrF,IAAI;gBACJ,IAAI;gBACJ,GAAG,EAAE,gLAAgL;gBACrL,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAEO,yBAAyB,CAAC,IAAc;QAC9C,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;QAC3C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-sources-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/language-sources-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAwB,WAAW,EAAO,MAAM,sBAAsB,CAAC;AAC3H,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAqB9E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoF/B,CAAC;AAwDF,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B;;;;OAIG;IACH,oBAAoB,EAAE,cAAc,EAAE,CAAC;IACvC;;;OAGG;IACH,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;;OAGG;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAMD,qBAAa,mBAAoB,YAAW,YAAY,CAAC,qBAAqB,CAAC;IAC7E,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,qBAAqB;CAgf7C;
|
|
1
|
+
{"version":3,"file":"language-sources-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/language-sources-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -1068,18 +1068,27 @@ function findCSharpRequestSources(sourceCode, language) {
|
|
|
1068
1068
|
const lines = sourceCode.split('\n');
|
|
1069
1069
|
const assignRe = /^\s*(?:var\s+|[A-Za-z_][\w.<>\[\]]*\s+)?([A-Za-z_]\w*)\s*=\s*(.+?);?\s*$/;
|
|
1070
1070
|
const requestReadRe = /\bRequest\s*\.\s*(?:Query|Form|Headers|Cookies|QueryString|RouteValues|Body|Files|Params)\b/;
|
|
1071
|
+
// Console/stdin reads bind their LHS too (dominant source shape in the NIST
|
|
1072
|
+
// Juliet C# corpus). Like `Request.*`, a bare `Console.ReadLine()` returns a
|
|
1073
|
+
// value that nothing else seeds a variable for, so bind it as `io_input`.
|
|
1074
|
+
const consoleReadRe = /\bConsole\s*\.\s*ReadLine\s*\(/;
|
|
1071
1075
|
for (let i = 0; i < lines.length; i++) {
|
|
1072
1076
|
const m = assignRe.exec(lines[i]);
|
|
1073
1077
|
if (!m)
|
|
1074
1078
|
continue;
|
|
1075
1079
|
const [, varName, rhs] = m;
|
|
1076
|
-
|
|
1080
|
+
const type = requestReadRe.test(rhs)
|
|
1081
|
+
? 'http_param'
|
|
1082
|
+
: consoleReadRe.test(rhs)
|
|
1083
|
+
? 'io_input'
|
|
1084
|
+
: null;
|
|
1085
|
+
if (!type)
|
|
1077
1086
|
continue;
|
|
1078
1087
|
const lineNumber = i + 1;
|
|
1079
1088
|
if (sources.some(s => s.line === lineNumber && s.variable === varName))
|
|
1080
1089
|
continue;
|
|
1081
1090
|
sources.push({
|
|
1082
|
-
type
|
|
1091
|
+
type,
|
|
1083
1092
|
location: `${varName} = ${rhs.trim().substring(0, 50)}${rhs.length > 50 ? '...' : ''}`,
|
|
1084
1093
|
severity: 'high',
|
|
1085
1094
|
line: lineNumber,
|