circle-ir 4.5.0 → 4.7.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 +20 -1
- 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 +8 -1
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/missing-public-doc-pass.d.ts.map +1 -1
- package/dist/analysis/passes/missing-public-doc-pass.js +6 -1
- package/dist/analysis/passes/missing-public-doc-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +10 -0
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
- package/dist/analysis/passes/weak-crypto-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-crypto-pass.js +66 -0
- package/dist/analysis/passes/weak-crypto-pass.js.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.js +46 -0
- package/dist/analysis/passes/weak-hash-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 +151 -3
- package/dist/core/circle-ir-core.cjs +20 -1
- package/dist/core/circle-ir-core.js +20 -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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"}
|
|
@@ -1072,6 +1072,11 @@ function findCSharpRequestSources(sourceCode, language) {
|
|
|
1072
1072
|
// Juliet C# corpus). Like `Request.*`, a bare `Console.ReadLine()` returns a
|
|
1073
1073
|
// value that nothing else seeds a variable for, so bind it as `io_input`.
|
|
1074
1074
|
const consoleReadRe = /\bConsole\s*\.\s*ReadLine\s*\(/;
|
|
1075
|
+
// Environment reads are attacker-influenced on many deployments (containers,
|
|
1076
|
+
// CI, .env loaders) — env→sql / env→shell FNs (#277). Bind the LHS as
|
|
1077
|
+
// `env_input`. Binding here (not a bare return_tainted source) avoids the
|
|
1078
|
+
// unbound-source over-fire seen in #271.
|
|
1079
|
+
const envReadRe = /\bEnvironment\s*\.\s*GetEnvironmentVariables?\s*(?:\(|\[)/;
|
|
1075
1080
|
for (let i = 0; i < lines.length; i++) {
|
|
1076
1081
|
const m = assignRe.exec(lines[i]);
|
|
1077
1082
|
if (!m)
|
|
@@ -1081,7 +1086,9 @@ function findCSharpRequestSources(sourceCode, language) {
|
|
|
1081
1086
|
? 'http_param'
|
|
1082
1087
|
: consoleReadRe.test(rhs)
|
|
1083
1088
|
? 'io_input'
|
|
1084
|
-
:
|
|
1089
|
+
: envReadRe.test(rhs)
|
|
1090
|
+
? 'env_input'
|
|
1091
|
+
: null;
|
|
1085
1092
|
if (!type)
|
|
1086
1093
|
continue;
|
|
1087
1094
|
const lineNumber = i + 1;
|