cognium-dev 3.99.0 → 3.100.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/cli.js +109 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -23490,6 +23490,75 @@ var JS_XSS_SANITIZERS = [
|
|
|
23490
23490
|
/\btrustAsHtml\s*\(/,
|
|
23491
23491
|
/\bbypassSecurityTrust/
|
|
23492
23492
|
];
|
|
23493
|
+
var DATA_PARSER_TYPES = new Set([
|
|
23494
|
+
"Parser",
|
|
23495
|
+
"CommandLine",
|
|
23496
|
+
"JCommander",
|
|
23497
|
+
"DateParser",
|
|
23498
|
+
"FastDateFormat",
|
|
23499
|
+
"FastDatePrinter",
|
|
23500
|
+
"ResultParser",
|
|
23501
|
+
"DateFormat",
|
|
23502
|
+
"SimpleDateFormat",
|
|
23503
|
+
"NumberFormat",
|
|
23504
|
+
"DecimalFormat",
|
|
23505
|
+
"OptionParser",
|
|
23506
|
+
"CmdLineParser"
|
|
23507
|
+
]);
|
|
23508
|
+
var COMPILED_TEMPLATE_TYPES = new Set([
|
|
23509
|
+
"Template",
|
|
23510
|
+
"JetTemplate",
|
|
23511
|
+
"ITemplate",
|
|
23512
|
+
"VelocityTemplate",
|
|
23513
|
+
"BeetlTemplate"
|
|
23514
|
+
]);
|
|
23515
|
+
var REFLECTION_LITERAL_METHODS = new Set([
|
|
23516
|
+
"forName",
|
|
23517
|
+
"loadClass",
|
|
23518
|
+
"getMethod",
|
|
23519
|
+
"getDeclaredMethod",
|
|
23520
|
+
"getConstructor",
|
|
23521
|
+
"getDeclaredConstructor",
|
|
23522
|
+
"parseExpression",
|
|
23523
|
+
"invoke"
|
|
23524
|
+
]);
|
|
23525
|
+
var JAVA_DECL_RE_TEMPLATE = "(?:\\b(?:final|public|private|protected|static)\\s+)*" + "([A-Z]\\w*(?:\\.[A-Z]\\w*)?(?:<[^>]*>)?)\\s+RECV\\b\\s*[=;,)]";
|
|
23526
|
+
function resolveJavaReceiverType(receiver, sinkLine, sourceLines) {
|
|
23527
|
+
if (!receiver || !/^[A-Za-z_]\w*$/.test(receiver))
|
|
23528
|
+
return null;
|
|
23529
|
+
const start2 = Math.max(0, sinkLine - 31);
|
|
23530
|
+
const declRe = new RegExp(JAVA_DECL_RE_TEMPLATE.replace("RECV", receiver));
|
|
23531
|
+
for (let i2 = sinkLine - 2;i2 >= start2; i2--) {
|
|
23532
|
+
const ln = sourceLines[i2] ?? "";
|
|
23533
|
+
const m = ln.match(declRe);
|
|
23534
|
+
if (m) {
|
|
23535
|
+
const raw = m[1].replace(/<[^>]*>/g, "").trim();
|
|
23536
|
+
const parts2 = raw.split(".");
|
|
23537
|
+
return parts2[parts2.length - 1] ?? null;
|
|
23538
|
+
}
|
|
23539
|
+
}
|
|
23540
|
+
return null;
|
|
23541
|
+
}
|
|
23542
|
+
function isJavaLiteralOrAnnotationAccessor(expr) {
|
|
23543
|
+
const e = expr.trim();
|
|
23544
|
+
if (e === "")
|
|
23545
|
+
return true;
|
|
23546
|
+
if (/^"(?:[^"\\]|\\.)*"$/.test(e))
|
|
23547
|
+
return true;
|
|
23548
|
+
if (/^[A-Za-z_]\w*\s*\.\s*(?:value|name|key)\s*\(\s*\)$/.test(e))
|
|
23549
|
+
return true;
|
|
23550
|
+
return false;
|
|
23551
|
+
}
|
|
23552
|
+
function extractJavaCallArgs(method, line) {
|
|
23553
|
+
const re = new RegExp(`\\b${method}\\s*\\(([^()]*(?:\\([^()]*\\)[^()]*)*)\\)`);
|
|
23554
|
+
const m = line.match(re);
|
|
23555
|
+
if (!m)
|
|
23556
|
+
return null;
|
|
23557
|
+
const argsText = m[1].trim();
|
|
23558
|
+
if (argsText === "")
|
|
23559
|
+
return [];
|
|
23560
|
+
return argsText.split(",").map((s) => s.trim());
|
|
23561
|
+
}
|
|
23493
23562
|
|
|
23494
23563
|
class SinkFilterPass {
|
|
23495
23564
|
name = "sink-filter";
|
|
@@ -23653,6 +23722,45 @@ class SinkFilterPass {
|
|
|
23653
23722
|
return true;
|
|
23654
23723
|
});
|
|
23655
23724
|
}
|
|
23725
|
+
if (language === "java") {
|
|
23726
|
+
const sourceLines = ctx.code.split(`
|
|
23727
|
+
`);
|
|
23728
|
+
filtered = filtered.filter((sink) => {
|
|
23729
|
+
if (sink.type !== "code_injection")
|
|
23730
|
+
return true;
|
|
23731
|
+
const sinkLineText = sourceLines[sink.line - 1] ?? "";
|
|
23732
|
+
const receiverMatch = sinkLineText.match(/\b(\w+)\s*\.\s*(\w+)\s*\(/);
|
|
23733
|
+
const receiver = receiverMatch?.[1];
|
|
23734
|
+
const method = sink.method ?? receiverMatch?.[2];
|
|
23735
|
+
if (method === "parse" && receiver) {
|
|
23736
|
+
const recvType = resolveJavaReceiverType(receiver, sink.line, sourceLines);
|
|
23737
|
+
if (recvType && DATA_PARSER_TYPES.has(recvType))
|
|
23738
|
+
return false;
|
|
23739
|
+
}
|
|
23740
|
+
if ((method === "render" || method === "process" || method === "merge" || method === "renderTo") && receiver) {
|
|
23741
|
+
const recvType = resolveJavaReceiverType(receiver, sink.line, sourceLines);
|
|
23742
|
+
if (recvType && COMPILED_TEMPLATE_TYPES.has(recvType))
|
|
23743
|
+
return false;
|
|
23744
|
+
}
|
|
23745
|
+
if (method && REFLECTION_LITERAL_METHODS.has(method)) {
|
|
23746
|
+
const args2 = extractJavaCallArgs(method, sinkLineText);
|
|
23747
|
+
if (args2 !== null) {
|
|
23748
|
+
if (method === "invoke") {
|
|
23749
|
+
if (args2.length <= 1)
|
|
23750
|
+
return false;
|
|
23751
|
+
} else {
|
|
23752
|
+
const firstArg = args2[0] ?? "";
|
|
23753
|
+
if (isJavaLiteralOrAnnotationAccessor(firstArg))
|
|
23754
|
+
return false;
|
|
23755
|
+
}
|
|
23756
|
+
}
|
|
23757
|
+
}
|
|
23758
|
+
if (method === "newInstance" && /\.\s*newInstance\s*\(\s*\)/.test(sinkLineText)) {
|
|
23759
|
+
return false;
|
|
23760
|
+
}
|
|
23761
|
+
return true;
|
|
23762
|
+
});
|
|
23763
|
+
}
|
|
23656
23764
|
return { sources, sinks: filtered, sanitizers };
|
|
23657
23765
|
}
|
|
23658
23766
|
}
|
|
@@ -34768,7 +34876,7 @@ var colors = {
|
|
|
34768
34876
|
};
|
|
34769
34877
|
|
|
34770
34878
|
// src/version.ts
|
|
34771
|
-
var version = "3.
|
|
34879
|
+
var version = "3.100.0";
|
|
34772
34880
|
|
|
34773
34881
|
// src/formatters.ts
|
|
34774
34882
|
var SINK_SEVERITY = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cognium-dev",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.100.0",
|
|
4
4
|
"description": "Static Application Security Testing CLI for detecting security vulnerabilities via taint tracking",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"registry": "https://registry.npmjs.org/"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"circle-ir": "^3.
|
|
68
|
+
"circle-ir": "^3.100.0"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@types/node": "^25.5.0",
|