circle-ir 3.80.0 → 3.82.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 (39) hide show
  1. package/configs/sinks/xss.yaml +2 -1
  2. package/dist/analysis/config-loader.d.ts.map +1 -1
  3. package/dist/analysis/config-loader.js +26 -4
  4. package/dist/analysis/config-loader.js.map +1 -1
  5. package/dist/analysis/passes/_credential-helpers.d.ts +40 -0
  6. package/dist/analysis/passes/_credential-helpers.d.ts.map +1 -0
  7. package/dist/analysis/passes/_credential-helpers.js +152 -0
  8. package/dist/analysis/passes/_credential-helpers.js.map +1 -0
  9. package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts +42 -0
  10. package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts.map +1 -0
  11. package/dist/analysis/passes/cleartext-credential-transport-pass.js +196 -0
  12. package/dist/analysis/passes/cleartext-credential-transport-pass.js.map +1 -0
  13. package/dist/analysis/passes/info-disclosure-stacktrace-pass.d.ts +48 -0
  14. package/dist/analysis/passes/info-disclosure-stacktrace-pass.d.ts.map +1 -0
  15. package/dist/analysis/passes/info-disclosure-stacktrace-pass.js +222 -0
  16. package/dist/analysis/passes/info-disclosure-stacktrace-pass.js.map +1 -0
  17. package/dist/analysis/passes/plaintext-password-storage-pass.d.ts +47 -0
  18. package/dist/analysis/passes/plaintext-password-storage-pass.d.ts.map +1 -0
  19. package/dist/analysis/passes/plaintext-password-storage-pass.js +159 -0
  20. package/dist/analysis/passes/plaintext-password-storage-pass.js.map +1 -0
  21. package/dist/analysis/passes/unrestricted-file-upload-pass.d.ts +46 -0
  22. package/dist/analysis/passes/unrestricted-file-upload-pass.d.ts.map +1 -0
  23. package/dist/analysis/passes/unrestricted-file-upload-pass.js +193 -0
  24. package/dist/analysis/passes/unrestricted-file-upload-pass.js.map +1 -0
  25. package/dist/analysis/passes/weak-password-encoding-pass.d.ts +40 -0
  26. package/dist/analysis/passes/weak-password-encoding-pass.d.ts.map +1 -0
  27. package/dist/analysis/passes/weak-password-encoding-pass.js +157 -0
  28. package/dist/analysis/passes/weak-password-encoding-pass.js.map +1 -0
  29. package/dist/analysis/passes/weak-password-hash-pass.d.ts +49 -0
  30. package/dist/analysis/passes/weak-password-hash-pass.d.ts.map +1 -0
  31. package/dist/analysis/passes/weak-password-hash-pass.js +225 -0
  32. package/dist/analysis/passes/weak-password-hash-pass.js.map +1 -0
  33. package/dist/analyzer.d.ts.map +1 -1
  34. package/dist/analyzer.js +18 -0
  35. package/dist/analyzer.js.map +1 -1
  36. package/dist/browser/circle-ir.js +912 -4
  37. package/dist/core/circle-ir-core.cjs +26 -4
  38. package/dist/core/circle-ir-core.js +26 -4
  39. package/package.json +1 -1
@@ -10759,7 +10759,12 @@ var DEFAULT_SINKS = [
10759
10759
  // Class-less XSS patterns for cases where receiver type is inferred
10760
10760
  { method: "println", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10761
10761
  { method: "print", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10762
- { method: "write", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10762
+ // NOTE: the unscoped { method: 'write', type: 'xss' } entry was removed in
10763
+ // Sprint 28 (#110). It mistyped every non-XSS .write() across all languages
10764
+ // (fs.writeFile, open().write, bcrypt callbacks, credential file writes,
10765
+ // node ClientRequest.write, etc.) as xss. Real HTML writers are covered
10766
+ // by class-scoped entries: PrintWriter.write (line 843), ServletOutputStream.write
10767
+ // (line 849), JspWriter.write (xss.yaml), Response.write (nodejs.json).
10763
10768
  { method: "append", class: "StringBuilder", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10764
10769
  { method: "append", class: "StringBuffer", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10765
10770
  // Wiki/CMS XSS sinks (JSPWiki, Confluence, etc.)
@@ -11956,9 +11961,26 @@ var DEFAULT_SANITIZERS = [
11956
11961
  // JSON.parse (data is validated against JSON grammar, prevents XSS/code injection)
11957
11962
  { method: "parse", class: "JSON", removes: ["xss", "code_injection"] },
11958
11963
  // Type coercion (removes string-based injections)
11959
- { method: "parseInt", removes: ["sql_injection", "nosql_injection", "command_injection", "xss"] },
11960
- { method: "parseFloat", removes: ["sql_injection", "nosql_injection", "command_injection"] },
11961
- { method: "Number", removes: ["sql_injection", "nosql_injection", "command_injection"] },
11964
+ // Sprint 29 (#113): include external_taint_escape a numeric cast cannot
11965
+ // carry an unvalidated string payload across a function boundary.
11966
+ { method: "parseInt", removes: ["sql_injection", "nosql_injection", "command_injection", "xss", "external_taint_escape", "path_traversal", "code_injection"] },
11967
+ { method: "parseFloat", removes: ["sql_injection", "nosql_injection", "command_injection", "external_taint_escape", "path_traversal", "code_injection"] },
11968
+ { method: "Number", removes: ["sql_injection", "nosql_injection", "command_injection", "external_taint_escape", "path_traversal", "code_injection"] },
11969
+ // Sprint 29 (#113): bounds-clamp Math.min / Math.max — when used to bound
11970
+ // a numeric/size value (e.g. `Math.min(size, MAX_BYTES)`), the result is
11971
+ // safely bounded and cannot resource-exhaust downstream. Only suppress
11972
+ // external_taint_escape — these helpers do NOT sanitize string injection.
11973
+ { method: "min", class: "Math", removes: ["external_taint_escape"] },
11974
+ { method: "max", class: "Math", removes: ["external_taint_escape"] },
11975
+ // Sprint 29 (#113): allow-list / membership guards — when an external value
11976
+ // is tested against an allow-list (`ALLOWED.includes(x)`, `set.has(x)`,
11977
+ // `list.contains(x)`) before being forwarded, it cannot escape unbounded.
11978
+ // Only suppress `external_taint_escape`; real string-injection sinks should
11979
+ // still rely on their own escaping.
11980
+ { method: "includes", removes: ["external_taint_escape"] },
11981
+ { method: "has", removes: ["external_taint_escape"] },
11982
+ { method: "contains", removes: ["external_taint_escape"] },
11983
+ { method: "indexOf", removes: ["external_taint_escape"] },
11962
11984
  // Path sanitization
11963
11985
  { method: "basename", class: "path", removes: ["path_traversal"] },
11964
11986
  { method: "normalize", class: "path", removes: ["path_traversal"] },
@@ -10693,7 +10693,12 @@ var DEFAULT_SINKS = [
10693
10693
  // Class-less XSS patterns for cases where receiver type is inferred
10694
10694
  { method: "println", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10695
10695
  { method: "print", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10696
- { method: "write", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10696
+ // NOTE: the unscoped { method: 'write', type: 'xss' } entry was removed in
10697
+ // Sprint 28 (#110). It mistyped every non-XSS .write() across all languages
10698
+ // (fs.writeFile, open().write, bcrypt callbacks, credential file writes,
10699
+ // node ClientRequest.write, etc.) as xss. Real HTML writers are covered
10700
+ // by class-scoped entries: PrintWriter.write (line 843), ServletOutputStream.write
10701
+ // (line 849), JspWriter.write (xss.yaml), Response.write (nodejs.json).
10697
10702
  { method: "append", class: "StringBuilder", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10698
10703
  { method: "append", class: "StringBuffer", type: "xss", cwe: "CWE-79", severity: "medium", arg_positions: [0] },
10699
10704
  // Wiki/CMS XSS sinks (JSPWiki, Confluence, etc.)
@@ -11890,9 +11895,26 @@ var DEFAULT_SANITIZERS = [
11890
11895
  // JSON.parse (data is validated against JSON grammar, prevents XSS/code injection)
11891
11896
  { method: "parse", class: "JSON", removes: ["xss", "code_injection"] },
11892
11897
  // Type coercion (removes string-based injections)
11893
- { method: "parseInt", removes: ["sql_injection", "nosql_injection", "command_injection", "xss"] },
11894
- { method: "parseFloat", removes: ["sql_injection", "nosql_injection", "command_injection"] },
11895
- { method: "Number", removes: ["sql_injection", "nosql_injection", "command_injection"] },
11898
+ // Sprint 29 (#113): include external_taint_escape a numeric cast cannot
11899
+ // carry an unvalidated string payload across a function boundary.
11900
+ { method: "parseInt", removes: ["sql_injection", "nosql_injection", "command_injection", "xss", "external_taint_escape", "path_traversal", "code_injection"] },
11901
+ { method: "parseFloat", removes: ["sql_injection", "nosql_injection", "command_injection", "external_taint_escape", "path_traversal", "code_injection"] },
11902
+ { method: "Number", removes: ["sql_injection", "nosql_injection", "command_injection", "external_taint_escape", "path_traversal", "code_injection"] },
11903
+ // Sprint 29 (#113): bounds-clamp Math.min / Math.max — when used to bound
11904
+ // a numeric/size value (e.g. `Math.min(size, MAX_BYTES)`), the result is
11905
+ // safely bounded and cannot resource-exhaust downstream. Only suppress
11906
+ // external_taint_escape — these helpers do NOT sanitize string injection.
11907
+ { method: "min", class: "Math", removes: ["external_taint_escape"] },
11908
+ { method: "max", class: "Math", removes: ["external_taint_escape"] },
11909
+ // Sprint 29 (#113): allow-list / membership guards — when an external value
11910
+ // is tested against an allow-list (`ALLOWED.includes(x)`, `set.has(x)`,
11911
+ // `list.contains(x)`) before being forwarded, it cannot escape unbounded.
11912
+ // Only suppress `external_taint_escape`; real string-injection sinks should
11913
+ // still rely on their own escaping.
11914
+ { method: "includes", removes: ["external_taint_escape"] },
11915
+ { method: "has", removes: ["external_taint_escape"] },
11916
+ { method: "contains", removes: ["external_taint_escape"] },
11917
+ { method: "indexOf", removes: ["external_taint_escape"] },
11896
11918
  // Path sanitization
11897
11919
  { method: "basename", class: "path", removes: ["path_traversal"] },
11898
11920
  { method: "normalize", class: "path", removes: ["path_traversal"] },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir",
3
- "version": "3.80.0",
3
+ "version": "3.82.0",
4
4
  "description": "High-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",