cognium-dev 3.100.0 → 3.101.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 +64 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -23523,6 +23523,26 @@ var REFLECTION_LITERAL_METHODS = new Set([
|
|
|
23523
23523
|
"invoke"
|
|
23524
23524
|
]);
|
|
23525
23525
|
var JAVA_DECL_RE_TEMPLATE = "(?:\\b(?:final|public|private|protected|static)\\s+)*" + "([A-Z]\\w*(?:\\.[A-Z]\\w*)?(?:<[^>]*>)?)\\s+RECV\\b\\s*[=;,)]";
|
|
23526
|
+
var PROTOCOL_WIRE_METHODS = new Set([
|
|
23527
|
+
"executeCommand",
|
|
23528
|
+
"execute",
|
|
23529
|
+
"dispatch",
|
|
23530
|
+
"send",
|
|
23531
|
+
"publish",
|
|
23532
|
+
"command",
|
|
23533
|
+
"run"
|
|
23534
|
+
]);
|
|
23535
|
+
var PROTOCOL_CLIENT_PACKAGES = [
|
|
23536
|
+
"redis.clients.jedis",
|
|
23537
|
+
"io.lettuce",
|
|
23538
|
+
"org.springframework.data.redis",
|
|
23539
|
+
"org.springframework.data.mongodb",
|
|
23540
|
+
"org.springframework.amqp",
|
|
23541
|
+
"com.rabbitmq",
|
|
23542
|
+
"org.apache.kafka",
|
|
23543
|
+
"org.eclipse.paho"
|
|
23544
|
+
];
|
|
23545
|
+
var OS_EXEC_RECEIVER_RE = /\b(?:Runtime|ProcessBuilder|DefaultExecutor|Executor|Exec|Launcher|ProcStarter|ProcessExecutor|RuntimeUtil)\s*[.(]/;
|
|
23526
23546
|
function resolveJavaReceiverType(receiver, sinkLine, sourceLines) {
|
|
23527
23547
|
if (!receiver || !/^[A-Za-z_]\w*$/.test(receiver))
|
|
23528
23548
|
return null;
|
|
@@ -23559,6 +23579,17 @@ function extractJavaCallArgs(method, line) {
|
|
|
23559
23579
|
return [];
|
|
23560
23580
|
return argsText.split(",").map((s) => s.trim());
|
|
23561
23581
|
}
|
|
23582
|
+
function hasJavaImportFromPackage(packagePrefix, sourceLines) {
|
|
23583
|
+
if (!/^[A-Za-z_][\w.]*$/.test(packagePrefix))
|
|
23584
|
+
return false;
|
|
23585
|
+
const limit = Math.min(sourceLines.length, 80);
|
|
23586
|
+
const re = new RegExp(`^\\s*import\\s+(?:static\\s+)?${packagePrefix.replace(/\./g, "\\.")}\\b`);
|
|
23587
|
+
for (let i2 = 0;i2 < limit; i2++) {
|
|
23588
|
+
if (re.test(sourceLines[i2] ?? ""))
|
|
23589
|
+
return true;
|
|
23590
|
+
}
|
|
23591
|
+
return false;
|
|
23592
|
+
}
|
|
23562
23593
|
|
|
23563
23594
|
class SinkFilterPass {
|
|
23564
23595
|
name = "sink-filter";
|
|
@@ -23761,6 +23792,28 @@ class SinkFilterPass {
|
|
|
23761
23792
|
return true;
|
|
23762
23793
|
});
|
|
23763
23794
|
}
|
|
23795
|
+
if (language === "java") {
|
|
23796
|
+
const sourceLines = ctx.code.split(`
|
|
23797
|
+
`);
|
|
23798
|
+
filtered = filtered.filter((sink) => {
|
|
23799
|
+
if (sink.type !== "command_injection")
|
|
23800
|
+
return true;
|
|
23801
|
+
const sinkLineText = sourceLines[sink.line - 1] ?? "";
|
|
23802
|
+
if (sink.method === "CommandLine" && /\bnew\s+CommandLine\s*\(/.test(sinkLineText) && hasJavaImportFromPackage("picocli", sourceLines)) {
|
|
23803
|
+
return false;
|
|
23804
|
+
}
|
|
23805
|
+
if (sink.method && PROTOCOL_WIRE_METHODS.has(sink.method)) {
|
|
23806
|
+
for (const pkg of PROTOCOL_CLIENT_PACKAGES) {
|
|
23807
|
+
if (hasJavaImportFromPackage(pkg, sourceLines)) {
|
|
23808
|
+
if (!OS_EXEC_RECEIVER_RE.test(sinkLineText)) {
|
|
23809
|
+
return false;
|
|
23810
|
+
}
|
|
23811
|
+
}
|
|
23812
|
+
}
|
|
23813
|
+
}
|
|
23814
|
+
return true;
|
|
23815
|
+
});
|
|
23816
|
+
}
|
|
23764
23817
|
return { sources, sinks: filtered, sanitizers };
|
|
23765
23818
|
}
|
|
23766
23819
|
}
|
|
@@ -33311,6 +33364,10 @@ var JAVA_FACTORIES = new Set([
|
|
|
33311
33364
|
"TransformerFactory"
|
|
33312
33365
|
]);
|
|
33313
33366
|
var JAVA_SAFE_EVIDENCE_RE = /(disallow-doctype-decl|external-general-entities|external-parameter-entities|SUPPORT_DTD|ACCESS_EXTERNAL_DTD|ACCESS_EXTERNAL_SCHEMA|setXIncludeAware\s*\(\s*false\s*\)|setExpandEntityReferences\s*\(\s*false\s*\))/;
|
|
33367
|
+
var JAVA_XML_OUTPUT_ONLY_RE = /\bnew\s+(?:DOMSource|StreamResult)\s*\(/;
|
|
33368
|
+
var JAVA_XML_PARSE_INPUT_RE = /\bnew\s+(?:StreamSource|SAXSource|InputSource)\s*\(/;
|
|
33369
|
+
var JAVA_DOC_BUILDER_NEW_DOCUMENT_RE = /\.\s*newDocument\s*\(\s*\)/;
|
|
33370
|
+
var JAVA_DOC_BUILDER_PARSE_RE = /(?:DocumentBuilder|builder)\s*\.\s*parse\s*\(/;
|
|
33314
33371
|
var PY_LXML_PARSER_INSECURE_DEFAULT_RE = /\bresolve_entities\s*=\s*False\b/;
|
|
33315
33372
|
|
|
33316
33373
|
class XmlEntityExpansionPass {
|
|
@@ -33325,10 +33382,16 @@ class XmlEntityExpansionPass {
|
|
|
33325
33382
|
const safeInFile = JAVA_SAFE_EVIDENCE_RE.test(code);
|
|
33326
33383
|
if (safeInFile)
|
|
33327
33384
|
return { findings };
|
|
33385
|
+
const isXmlOutputOnly = JAVA_XML_OUTPUT_ONLY_RE.test(code) && !JAVA_XML_PARSE_INPUT_RE.test(code);
|
|
33386
|
+
const isDocumentBuilderEmptyOnly = JAVA_DOC_BUILDER_NEW_DOCUMENT_RE.test(code) && !JAVA_DOC_BUILDER_PARSE_RE.test(code);
|
|
33328
33387
|
for (const call of graph.ir.calls) {
|
|
33329
33388
|
const det = this.detectJavaCall(call);
|
|
33330
33389
|
if (!det)
|
|
33331
33390
|
continue;
|
|
33391
|
+
if (det.api === "TransformerFactory" && isXmlOutputOnly)
|
|
33392
|
+
continue;
|
|
33393
|
+
if (det.api === "DocumentBuilderFactory" && isDocumentBuilderEmptyOnly)
|
|
33394
|
+
continue;
|
|
33332
33395
|
const line = call.location.line;
|
|
33333
33396
|
findings.push({ line, language, ...det });
|
|
33334
33397
|
ctx.addFinding({
|
|
@@ -34876,7 +34939,7 @@ var colors = {
|
|
|
34876
34939
|
};
|
|
34877
34940
|
|
|
34878
34941
|
// src/version.ts
|
|
34879
|
-
var version = "3.
|
|
34942
|
+
var version = "3.101.0";
|
|
34880
34943
|
|
|
34881
34944
|
// src/formatters.ts
|
|
34882
34945
|
var SINK_SEVERITY = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cognium-dev",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.101.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.101.0"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@types/node": "^25.5.0",
|