cognium-dev 3.101.0 → 3.103.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 +78 -2
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -23543,6 +23543,8 @@ var PROTOCOL_CLIENT_PACKAGES = [
23543
23543
  "org.eclipse.paho"
23544
23544
  ];
23545
23545
  var OS_EXEC_RECEIVER_RE = /\b(?:Runtime|ProcessBuilder|DefaultExecutor|Executor|Exec|Launcher|ProcStarter|ProcessExecutor|RuntimeUtil)\s*[.(]/;
23546
+ var PROCESS_BUILDER_ARGV_FORM_RE = /\bnew\s+ProcessBuilder\s*\(\s*(?:Arrays\.asList\b|List\.of\b|Collections\.singletonList\b|new\s+ArrayList\b|new\s+String\s*\[\s*\]\s*\{|"[^"]*"\s*,)/;
23547
+ var JAVA_THROW_STATEMENT_RE = /^\s*throw\s+new\s+\w+(?:Exception|Error)\b/;
23546
23548
  function resolveJavaReceiverType(receiver, sinkLine, sourceLines) {
23547
23549
  if (!receiver || !/^[A-Za-z_]\w*$/.test(receiver))
23548
23550
  return null;
@@ -23814,6 +23816,32 @@ class SinkFilterPass {
23814
23816
  return true;
23815
23817
  });
23816
23818
  }
23819
+ if (language === "java") {
23820
+ const sourceLines = ctx.code.split(`
23821
+ `);
23822
+ filtered = filtered.filter((sink) => {
23823
+ if (sink.type !== "command_injection")
23824
+ return true;
23825
+ if (sink.method !== "ProcessBuilder")
23826
+ return true;
23827
+ const sinkLineText = sourceLines[sink.line - 1] ?? "";
23828
+ if (!/\bnew\s+ProcessBuilder\s*\(/.test(sinkLineText))
23829
+ return true;
23830
+ if (PROCESS_BUILDER_ARGV_FORM_RE.test(sinkLineText))
23831
+ return false;
23832
+ return true;
23833
+ });
23834
+ }
23835
+ if (language === "java") {
23836
+ const sourceLines = ctx.code.split(`
23837
+ `);
23838
+ filtered = filtered.filter((sink) => {
23839
+ const sinkLineText = sourceLines[sink.line - 1] ?? "";
23840
+ if (JAVA_THROW_STATEMENT_RE.test(sinkLineText))
23841
+ return false;
23842
+ return true;
23843
+ });
23844
+ }
23817
23845
  return { sources, sinks: filtered, sanitizers };
23818
23846
  }
23819
23847
  }
@@ -26446,6 +26474,10 @@ class NullDerefPass {
26446
26474
  }
26447
26475
 
26448
26476
  // ../circle-ir/dist/analysis/passes/resource-leak-pass.js
26477
+ function escapeRegex(s) {
26478
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26479
+ }
26480
+ var FACTORY_METHOD_NAME_RE = /^(?:open|create|new|get|make|build)[A-Z]/;
26449
26481
  var RESOURCE_CTORS = new Set([
26450
26482
  "FileInputStream",
26451
26483
  "FileOutputStream",
@@ -26520,7 +26552,18 @@ class ResourceLeakPass {
26520
26552
  const methodInfo = graph.methodAtLine(openLine);
26521
26553
  if (!methodInfo)
26522
26554
  continue;
26555
+ const methodStart = methodInfo.method.start_line;
26523
26556
  const methodEnd = methodInfo.method.end_line;
26557
+ if (this.isReturnedToCaller(codeLines, resourceVar, methodStart, methodEnd)) {
26558
+ continue;
26559
+ }
26560
+ const fieldName = this.fieldStoredName(codeLines, resourceVar, openLine, methodEnd);
26561
+ if (fieldName && this.classHasCloseMethodFor(graph, fieldName, methodInfo.type)) {
26562
+ continue;
26563
+ }
26564
+ if (this.isFactoryMethod(methodInfo.method)) {
26565
+ continue;
26566
+ }
26524
26567
  const closeCall = graph.ir.calls.find((c) => CLOSE_METHODS.has(c.method_name) && c.receiver === resourceVar && c.location.line > openLine && c.location.line <= methodEnd);
26525
26568
  const snippet = (codeLines[openLine - 1] ?? "").trim();
26526
26569
  if (!closeCall) {
@@ -26584,6 +26627,39 @@ class ResourceLeakPass {
26584
26627
  }
26585
26628
  return false;
26586
26629
  }
26630
+ isReturnedToCaller(lines, variable, fromLine, toLine) {
26631
+ const varRe = new RegExp(`\\breturn\\b[^;]*\\b${escapeRegex(variable)}\\b`);
26632
+ for (let l = fromLine;l <= toLine && l <= lines.length; l++) {
26633
+ if (varRe.test(lines[l - 1] ?? ""))
26634
+ return true;
26635
+ }
26636
+ return false;
26637
+ }
26638
+ fieldStoredName(lines, variable, openLine, toLine) {
26639
+ const thisAssignRe = new RegExp(`\\bthis\\s*\\.\\s*(\\w+)\\s*=\\s*${escapeRegex(variable)}\\b`);
26640
+ for (let l = openLine;l <= toLine && l <= lines.length; l++) {
26641
+ const m = thisAssignRe.exec(lines[l - 1] ?? "");
26642
+ if (m)
26643
+ return m[1];
26644
+ }
26645
+ return null;
26646
+ }
26647
+ classHasCloseMethodFor(graph, fieldName, type) {
26648
+ for (const c of graph.ir.calls) {
26649
+ if (c.location.line < type.start_line || c.location.line > type.end_line)
26650
+ continue;
26651
+ if (c.receiver !== fieldName)
26652
+ continue;
26653
+ if (CLOSE_METHODS.has(c.method_name))
26654
+ return true;
26655
+ }
26656
+ return false;
26657
+ }
26658
+ isFactoryMethod(method) {
26659
+ if (!method.return_type || method.return_type === "void")
26660
+ return false;
26661
+ return FACTORY_METHOD_NAME_RE.test(method.name);
26662
+ }
26587
26663
  }
26588
26664
 
26589
26665
  // ../circle-ir/dist/graph/scope-graph.js
@@ -33363,7 +33439,7 @@ var JAVA_FACTORIES = new Set([
33363
33439
  "SchemaFactory",
33364
33440
  "TransformerFactory"
33365
33441
  ]);
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*\))/;
33442
+ var JAVA_SAFE_EVIDENCE_RE = /(disallow-doctype-decl|external-general-entities|external-parameter-entities|SUPPORT_DTD|ACCESS_EXTERNAL_DTD|ACCESS_EXTERNAL_SCHEMA|load-external-dtd|feature\/secure-processing|FEATURE_SECURE_PROCESSING|jdk\.xml\.(?:totalEntitySizeLimit|entityExpansionLimit|maxGeneralEntitySizeLimit|maxParameterEntitySizeLimit|elementAttributeLimit)|setXIncludeAware\s*\(\s*false\s*\)|setExpandEntityReferences\s*\(\s*false\s*\))/;
33367
33443
  var JAVA_XML_OUTPUT_ONLY_RE = /\bnew\s+(?:DOMSource|StreamResult)\s*\(/;
33368
33444
  var JAVA_XML_PARSE_INPUT_RE = /\bnew\s+(?:StreamSource|SAXSource|InputSource)\s*\(/;
33369
33445
  var JAVA_DOC_BUILDER_NEW_DOCUMENT_RE = /\.\s*newDocument\s*\(\s*\)/;
@@ -34939,7 +35015,7 @@ var colors = {
34939
35015
  };
34940
35016
 
34941
35017
  // src/version.ts
34942
- var version = "3.101.0";
35018
+ var version = "3.103.0";
34943
35019
 
34944
35020
  // src/formatters.ts
34945
35021
  var SINK_SEVERITY = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cognium-dev",
3
- "version": "3.101.0",
3
+ "version": "3.103.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.101.0"
68
+ "circle-ir": "^3.103.0"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@types/node": "^25.5.0",