circle-ir 3.22.0 → 3.22.1

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/README.md CHANGED
@@ -8,7 +8,7 @@ A high-performance Static Application Security Testing (SAST) library for detect
8
8
  ## Features
9
9
 
10
10
  - **Taint Analysis**: Track data flow from sources (user input) to sinks (dangerous operations)
11
- - **Multi-language Support**: Java, JavaScript/TypeScript, Python, Rust, Bash/Shell, HTML
11
+ - **Multi-language Support**: Java, JavaScript/TypeScript, Python, Go, Rust, Bash/Shell, HTML
12
12
  - **High Accuracy**: 100% on OWASP Benchmark, 100% on Juliet Test Suite, 97.7% TPR on SecuriBench Micro
13
13
  - **36-Pass Pipeline**: 19 security taint passes + 17 reliability/performance/maintainability/architecture quality passes
14
14
  - **Metrics Engine**: 24 software quality metrics (cyclomatic complexity, Halstead, CBO, RFC, LCOM, DIT, and 4 composite scores)
@@ -205,6 +205,7 @@ const response = await analyzeForAPI(code, 'File.java', 'java');
205
205
  | **Java** | tree-sitter-java | Spring, JAX-RS, Servlet API |
206
206
  | **JavaScript/TypeScript** | tree-sitter-javascript | Express, Fastify, Koa, Node.js |
207
207
  | **Python** | tree-sitter-python | Flask, Django, FastAPI |
208
+ | **Go** | tree-sitter-go | net/http, Gin, Echo, Fiber, Chi |
208
209
  | **Rust** | tree-sitter-rust | Actix-web, Rocket, Axum |
209
210
  | **Bash/Shell** | tree-sitter-bash | Shell scripts (.sh, .bash, .zsh, .ksh) |
210
211
  | **HTML** | tree-sitter-html | Web extraction preprocessor (.html, .htm, .xhtml) |
@@ -220,6 +221,9 @@ const jsResult = await analyze(jsCode, 'server.js', 'javascript');
220
221
  // Analyze Python
221
222
  const pyResult = await analyze(pyCode, 'app.py', 'python');
222
223
 
224
+ // Analyze Go
225
+ const goResult = await analyze(goCode, 'main.go', 'go');
226
+
223
227
  // Analyze Rust
224
228
  const rsResult = await analyze(rsCode, 'main.rs', 'rust');
225
229
 
@@ -471,9 +471,8 @@ export const DEFAULT_SINKS = [
471
471
  { method: 'FlowExecution', class: 'constructor', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
472
472
  // ActiveMQ control commands
473
473
  { method: 'processControlCommand', class: 'TransportConnection', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
474
- // XStream deserialization (leads to RCE via gadget chains)
475
- { method: 'fromXML', class: 'XStream', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
476
- { method: 'unmarshal', class: 'XStream', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
474
+ // XStream deserialization — classified as CWE-502 (deserialization), not CWE-78 (command injection).
475
+ // The deserialization sink entries at lines ~1059 handle this correctly.
477
476
  { method: 'fromString', class: 'FileConverter', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
478
477
  // Plexus command line
479
478
  { method: 'getPosition', class: 'Commandline', type: 'command_injection', cwe: 'CWE-78', severity: 'critical', arg_positions: [0] },
@@ -1156,7 +1155,8 @@ export const DEFAULT_SINKS = [
1156
1155
  { method: 'query', class: 'Connection', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1157
1156
  { method: 'query', class: 'Pool', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1158
1157
  { method: 'query', class: 'Client', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1159
- { method: 'query', type: 'sql_injection', cwe: 'CWE-89', severity: 'high', arg_positions: [0] },
1158
+ // Note: classless { method: 'query' } removed too many FPs (UriComponentsBuilder.query(), etc.)
1159
+ // SQL query calls are covered by class-specific patterns above (Connection, Pool, Client, JdbcTemplate)
1160
1160
  { method: 'raw', type: 'sql_injection', cwe: 'CWE-89', severity: 'high', arg_positions: [0] },
1161
1161
  // Browser DOM XSS sinks
1162
1162
  { method: 'setAttribute', type: 'xss', cwe: 'CWE-79', severity: 'high', arg_positions: [1] },
@@ -1353,8 +1353,8 @@ export const DEFAULT_SINKS = [
1353
1353
  { method: 'execute', class: 'Connection', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1354
1354
  { method: 'query_row', class: 'Connection', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1355
1355
  { method: 'prepare', class: 'Connection', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1356
- // sqlx::query macro
1357
- { method: 'query', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1356
+ // sqlx::query macro — use class-specific pattern
1357
+ { method: 'query', class: 'sqlx', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1358
1358
  // rusqlite specific
1359
1359
  { method: 'prepare', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },
1360
1360
  { method: 'execute', type: 'sql_injection', cwe: 'CWE-89', severity: 'critical', arg_positions: [0] },