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.
Files changed (2) hide show
  1. package/dist/cli.js +64 -1
  2. 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.100.0";
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.100.0",
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.100.0"
68
+ "circle-ir": "^3.101.0"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@types/node": "^25.5.0",