circle-ir 3.199.0 → 3.201.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.
@@ -11082,6 +11082,26 @@ var DEFAULT_SOURCES = [
11082
11082
  { annotation: "FormParam", type: "http_param", severity: "high", param_tainted: true },
11083
11083
  { annotation: "PathParam", type: "http_path", severity: "medium", param_tainted: true },
11084
11084
  { annotation: "HeaderParam", type: "http_header", severity: "high", param_tainted: true },
11085
+ // JAX-RS params the block was missing (jakarta.ws.rs). Java-scoped — the
11086
+ // JS decorator ecosystem has its own distinct names and should not match.
11087
+ { annotation: "CookieParam", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
11088
+ { annotation: "MatrixParam", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
11089
+ { annotation: "BeanParam", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
11090
+ // Micronaut (io.micronaut.http.annotation). @Body / @Header / @CookieValue /
11091
+ // @PathVariable reuse Spring/JAX-RS names already covered above; these three
11092
+ // are Micronaut-specific. Java-scoped.
11093
+ { annotation: "QueryValue", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
11094
+ { annotation: "Part", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
11095
+ { annotation: "RequestBean", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
11096
+ // Quarkus / RESTEasy Reactive (org.jboss.resteasy.reactive) — the `@Rest*`
11097
+ // shortcut annotations that infer the binding name from the parameter name.
11098
+ // Java-scoped.
11099
+ { annotation: "RestQuery", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
11100
+ { annotation: "RestPath", type: "http_path", severity: "medium", param_tainted: true, languages: ["java"] },
11101
+ { annotation: "RestHeader", type: "http_header", severity: "high", param_tainted: true, languages: ["java"] },
11102
+ { annotation: "RestForm", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
11103
+ { annotation: "RestCookie", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
11104
+ { annotation: "RestMatrix", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
11085
11105
  // Jenkins data-binding: every parameter of an annotated constructor is wired
11086
11106
  // from form/JSON user input at construction time. Method-level annotation —
11087
11107
  // all params tainted.
@@ -12760,6 +12780,25 @@ var DEFAULT_SINKS = [
12760
12780
  { method: "each", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12761
12781
  { method: "get", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12762
12782
  { method: "exec", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12783
+ // TypeORM QueryBuilder raw fragments (CWE-89). TypeORM's raw `.query(sql)`
12784
+ // escape hatch is already covered by the classless `query` sink in the JS
12785
+ // plugin (getBuiltinSinks), so it is NOT re-registered here — the dedup
12786
+ // would discard the duplicate anyway. What was uncovered is the
12787
+ // QueryBuilder fragment API: `andWhere`/`orWhere`/`andHaving`/`orHaving`
12788
+ // take raw SQL strings. These names are TypeORM-idiomatic, so classless +
12789
+ // language-scoped is safe and recovers the dominant chained-builder shape
12790
+ // (`repo.createQueryBuilder('u').andWhere(raw)`) that class matching cannot
12791
+ // reach — the receiver of `.andWhere(...)` is the factory call, not a
12792
+ // class-named variable. Generic `where`/`having` are deliberately NOT added
12793
+ // (too generic for classless; a `*QueryBuilder`-scoped entry would be
12794
+ // near-dead since receivers are rarely named that). Precision is inherent
12795
+ // to the flow: parameterised use (`:id` placeholders + a params object)
12796
+ // keeps input out of the string literal, so a finding fires only on
12797
+ // concatenation.
12798
+ { method: "andWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12799
+ { method: "orWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12800
+ { method: "andHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12801
+ { method: "orHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12763
12802
  // Browser DOM XSS sinks
12764
12803
  { method: "setAttribute", type: "xss", cwe: "CWE-79", severity: "high", arg_positions: [1] },
12765
12804
  // Angular DomSanitizer.bypassSecurityTrust* — CWE-79 (#184 Sprint 55).
@@ -12961,6 +13000,12 @@ var DEFAULT_SINKS = [
12961
13000
  { method: "executemany", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12962
13001
  { method: "raw", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12963
13002
  { method: "extra", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["python"] },
13003
+ // Django RawSQL expression (django.db.models.expressions.RawSQL) — the raw
13004
+ // SQL fragment in arg[0] is embedded verbatim into the query when the
13005
+ // annotate/filter/order_by containing it runs. Distinctive constructor name,
13006
+ // so classless + python-scoped is safe. Parameterised use passes user input
13007
+ // through arg[1] (`RawSQL("... %s", [uid])`), which keeps it out of arg[0].
13008
+ { method: "RawSQL", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12964
13009
  // Python Path Traversal
12965
13010
  // Language-scoped: classless `open` collides with Java I/O / JS DOM.
12966
13011
  { method: "open", type: "path_traversal", cwe: "CWE-22", severity: "high", arg_positions: [0], languages: ["python"] },
@@ -25682,6 +25727,14 @@ var JS_TAINTED_PATTERNS = [
25682
25727
  { pattern: /\blocation\.href\b/, type: "http_path" },
25683
25728
  { pattern: /\bdocument\.getElementById\b/, type: "dom_input" },
25684
25729
  { pattern: /\bdocument\.querySelector\b/, type: "dom_input" },
25730
+ // Remaining DOM element-accessor siblings — a `.value` read off any of these
25731
+ // (`document.getElementsByName('q')[0].value`) is the same DOM-input source as
25732
+ // getElementById/querySelector above. Kept narrow by requiring the `document.`
25733
+ // receiver so they cannot match unrelated `.getElementsByTagName`-named helpers.
25734
+ { pattern: /\bdocument\.getElementsByName\b/, type: "dom_input" },
25735
+ { pattern: /\bdocument\.getElementsByClassName\b/, type: "dom_input" },
25736
+ { pattern: /\bdocument\.getElementsByTagName\b/, type: "dom_input" },
25737
+ { pattern: /\bdocument\.querySelectorAll\b/, type: "dom_input" },
25685
25738
  // Narrow to event-based DOM input reads: `e.target.value`, `event.target.value`.
25686
25739
  // The formerly broad `/\.value\b/` matched any `.value` property (e.g. `result.value`,
25687
25740
  // `node.value` in TypeScript) generating false positives in non-browser code.
@@ -10477,6 +10477,26 @@ var DEFAULT_SOURCES = [
10477
10477
  { annotation: "FormParam", type: "http_param", severity: "high", param_tainted: true },
10478
10478
  { annotation: "PathParam", type: "http_path", severity: "medium", param_tainted: true },
10479
10479
  { annotation: "HeaderParam", type: "http_header", severity: "high", param_tainted: true },
10480
+ // JAX-RS params the block was missing (jakarta.ws.rs). Java-scoped — the
10481
+ // JS decorator ecosystem has its own distinct names and should not match.
10482
+ { annotation: "CookieParam", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
10483
+ { annotation: "MatrixParam", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10484
+ { annotation: "BeanParam", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10485
+ // Micronaut (io.micronaut.http.annotation). @Body / @Header / @CookieValue /
10486
+ // @PathVariable reuse Spring/JAX-RS names already covered above; these three
10487
+ // are Micronaut-specific. Java-scoped.
10488
+ { annotation: "QueryValue", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10489
+ { annotation: "Part", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10490
+ { annotation: "RequestBean", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10491
+ // Quarkus / RESTEasy Reactive (org.jboss.resteasy.reactive) — the `@Rest*`
10492
+ // shortcut annotations that infer the binding name from the parameter name.
10493
+ // Java-scoped.
10494
+ { annotation: "RestQuery", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10495
+ { annotation: "RestPath", type: "http_path", severity: "medium", param_tainted: true, languages: ["java"] },
10496
+ { annotation: "RestHeader", type: "http_header", severity: "high", param_tainted: true, languages: ["java"] },
10497
+ { annotation: "RestForm", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10498
+ { annotation: "RestCookie", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
10499
+ { annotation: "RestMatrix", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10480
10500
  // Jenkins data-binding: every parameter of an annotated constructor is wired
10481
10501
  // from form/JSON user input at construction time. Method-level annotation —
10482
10502
  // all params tainted.
@@ -12155,6 +12175,25 @@ var DEFAULT_SINKS = [
12155
12175
  { method: "each", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12156
12176
  { method: "get", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12157
12177
  { method: "exec", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12178
+ // TypeORM QueryBuilder raw fragments (CWE-89). TypeORM's raw `.query(sql)`
12179
+ // escape hatch is already covered by the classless `query` sink in the JS
12180
+ // plugin (getBuiltinSinks), so it is NOT re-registered here — the dedup
12181
+ // would discard the duplicate anyway. What was uncovered is the
12182
+ // QueryBuilder fragment API: `andWhere`/`orWhere`/`andHaving`/`orHaving`
12183
+ // take raw SQL strings. These names are TypeORM-idiomatic, so classless +
12184
+ // language-scoped is safe and recovers the dominant chained-builder shape
12185
+ // (`repo.createQueryBuilder('u').andWhere(raw)`) that class matching cannot
12186
+ // reach — the receiver of `.andWhere(...)` is the factory call, not a
12187
+ // class-named variable. Generic `where`/`having` are deliberately NOT added
12188
+ // (too generic for classless; a `*QueryBuilder`-scoped entry would be
12189
+ // near-dead since receivers are rarely named that). Precision is inherent
12190
+ // to the flow: parameterised use (`:id` placeholders + a params object)
12191
+ // keeps input out of the string literal, so a finding fires only on
12192
+ // concatenation.
12193
+ { method: "andWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12194
+ { method: "orWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12195
+ { method: "andHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12196
+ { method: "orHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12158
12197
  // Browser DOM XSS sinks
12159
12198
  { method: "setAttribute", type: "xss", cwe: "CWE-79", severity: "high", arg_positions: [1] },
12160
12199
  // Angular DomSanitizer.bypassSecurityTrust* — CWE-79 (#184 Sprint 55).
@@ -12356,6 +12395,12 @@ var DEFAULT_SINKS = [
12356
12395
  { method: "executemany", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12357
12396
  { method: "raw", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12358
12397
  { method: "extra", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["python"] },
12398
+ // Django RawSQL expression (django.db.models.expressions.RawSQL) — the raw
12399
+ // SQL fragment in arg[0] is embedded verbatim into the query when the
12400
+ // annotate/filter/order_by containing it runs. Distinctive constructor name,
12401
+ // so classless + python-scoped is safe. Parameterised use passes user input
12402
+ // through arg[1] (`RawSQL("... %s", [uid])`), which keeps it out of arg[0].
12403
+ { method: "RawSQL", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12359
12404
  // Python Path Traversal
12360
12405
  // Language-scoped: classless `open` collides with Java I/O / JS DOM.
12361
12406
  { method: "open", type: "path_traversal", cwe: "CWE-22", severity: "high", arg_positions: [0], languages: ["python"] },
@@ -10411,6 +10411,26 @@ var DEFAULT_SOURCES = [
10411
10411
  { annotation: "FormParam", type: "http_param", severity: "high", param_tainted: true },
10412
10412
  { annotation: "PathParam", type: "http_path", severity: "medium", param_tainted: true },
10413
10413
  { annotation: "HeaderParam", type: "http_header", severity: "high", param_tainted: true },
10414
+ // JAX-RS params the block was missing (jakarta.ws.rs). Java-scoped — the
10415
+ // JS decorator ecosystem has its own distinct names and should not match.
10416
+ { annotation: "CookieParam", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
10417
+ { annotation: "MatrixParam", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10418
+ { annotation: "BeanParam", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10419
+ // Micronaut (io.micronaut.http.annotation). @Body / @Header / @CookieValue /
10420
+ // @PathVariable reuse Spring/JAX-RS names already covered above; these three
10421
+ // are Micronaut-specific. Java-scoped.
10422
+ { annotation: "QueryValue", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10423
+ { annotation: "Part", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10424
+ { annotation: "RequestBean", type: "http_body", severity: "high", param_tainted: true, languages: ["java"] },
10425
+ // Quarkus / RESTEasy Reactive (org.jboss.resteasy.reactive) — the `@Rest*`
10426
+ // shortcut annotations that infer the binding name from the parameter name.
10427
+ // Java-scoped.
10428
+ { annotation: "RestQuery", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10429
+ { annotation: "RestPath", type: "http_path", severity: "medium", param_tainted: true, languages: ["java"] },
10430
+ { annotation: "RestHeader", type: "http_header", severity: "high", param_tainted: true, languages: ["java"] },
10431
+ { annotation: "RestForm", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10432
+ { annotation: "RestCookie", type: "http_cookie", severity: "high", param_tainted: true, languages: ["java"] },
10433
+ { annotation: "RestMatrix", type: "http_param", severity: "high", param_tainted: true, languages: ["java"] },
10414
10434
  // Jenkins data-binding: every parameter of an annotated constructor is wired
10415
10435
  // from form/JSON user input at construction time. Method-level annotation —
10416
10436
  // all params tainted.
@@ -12089,6 +12109,25 @@ var DEFAULT_SINKS = [
12089
12109
  { method: "each", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12090
12110
  { method: "get", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12091
12111
  { method: "exec", class: "Connection", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["javascript", "typescript"], allow_unresolved_receiver: true },
12112
+ // TypeORM QueryBuilder raw fragments (CWE-89). TypeORM's raw `.query(sql)`
12113
+ // escape hatch is already covered by the classless `query` sink in the JS
12114
+ // plugin (getBuiltinSinks), so it is NOT re-registered here — the dedup
12115
+ // would discard the duplicate anyway. What was uncovered is the
12116
+ // QueryBuilder fragment API: `andWhere`/`orWhere`/`andHaving`/`orHaving`
12117
+ // take raw SQL strings. These names are TypeORM-idiomatic, so classless +
12118
+ // language-scoped is safe and recovers the dominant chained-builder shape
12119
+ // (`repo.createQueryBuilder('u').andWhere(raw)`) that class matching cannot
12120
+ // reach — the receiver of `.andWhere(...)` is the factory call, not a
12121
+ // class-named variable. Generic `where`/`having` are deliberately NOT added
12122
+ // (too generic for classless; a `*QueryBuilder`-scoped entry would be
12123
+ // near-dead since receivers are rarely named that). Precision is inherent
12124
+ // to the flow: parameterised use (`:id` placeholders + a params object)
12125
+ // keeps input out of the string literal, so a finding fires only on
12126
+ // concatenation.
12127
+ { method: "andWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12128
+ { method: "orWhere", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12129
+ { method: "andHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12130
+ { method: "orHaving", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["javascript", "typescript"] },
12092
12131
  // Browser DOM XSS sinks
12093
12132
  { method: "setAttribute", type: "xss", cwe: "CWE-79", severity: "high", arg_positions: [1] },
12094
12133
  // Angular DomSanitizer.bypassSecurityTrust* — CWE-79 (#184 Sprint 55).
@@ -12290,6 +12329,12 @@ var DEFAULT_SINKS = [
12290
12329
  { method: "executemany", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12291
12330
  { method: "raw", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12292
12331
  { method: "extra", type: "sql_injection", cwe: "CWE-89", severity: "high", arg_positions: [0], languages: ["python"] },
12332
+ // Django RawSQL expression (django.db.models.expressions.RawSQL) — the raw
12333
+ // SQL fragment in arg[0] is embedded verbatim into the query when the
12334
+ // annotate/filter/order_by containing it runs. Distinctive constructor name,
12335
+ // so classless + python-scoped is safe. Parameterised use passes user input
12336
+ // through arg[1] (`RawSQL("... %s", [uid])`), which keeps it out of arg[0].
12337
+ { method: "RawSQL", type: "sql_injection", cwe: "CWE-89", severity: "critical", arg_positions: [0], languages: ["python"] },
12293
12338
  // Python Path Traversal
12294
12339
  // Language-scoped: classless `open` collides with Java I/O / JS DOM.
12295
12340
  { method: "open", type: "path_traversal", cwe: "CWE-22", severity: "high", arg_positions: [0], languages: ["python"] },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir",
3
- "version": "3.199.0",
3
+ "version": "3.201.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",