|
2 | 2 |
|
3 | 3 | All notable changes to this project will be documented in this file. |
4 | 4 |
|
| 5 | +## [1.6.1] - 2026-03-09 |
| 6 | + |
| 7 | +### Changed |
| 8 | +- **JDBC Sink Taxonomy**: |
| 9 | + - Reclassified `java.sql.DriverManager.getConnection(...)` from generic `SSRF` to `JDBC_Driver_RCE` in `default_rules.yaml`. |
| 10 | + - Scoring now treats `jdbc_driver_rce` as a critical category; exploitability remains a human-triage decision based on actual driver and URL semantics. |
| 11 | + |
| 12 | +### Fixed |
| 13 | +- **False Positive: Taint Explosion via Broad Setter Tainting**: |
| 14 | + - `IntraTaintAnalysis.flowThrough`: Receiver tainting for `InvokeStmt` is now restricted to **setter-like methods** (`set*`, `add*`, `put*`, `append*`, `insert*`, `with*`, `push*`, `enqueue*`, `load*`, `init*`, `configure*`, `update*`, `register*`) and constructors. Previously, ANY `InstanceInvokeExpr` with a tainted argument would taint the receiver, causing taint to explode through service-layer objects (repositories, HTTP clients, APM agents) and generate hundreds of false positives. |
| 15 | +- **False Positive: `URL.<init>` / `URI.<init>` as SSRF Sinks**: |
| 16 | + - Removed `<java.net.URL: void <init>(java.lang.String)>` and `<java.net.URI: void <init>(java.lang.String)>` from SSRF sinks in `default_rules.yaml`. Object construction alone does not make a network request; the real sinks (`URL.openStream()`, `URL.openConnection()`) are retained. |
| 17 | +- **False Positive: `ObjectMapper.readValue(String, Class)` as Deserialization Sink**: |
| 18 | + - Removed `<com.fasterxml.jackson.databind.ObjectMapper: java.lang.Object readValue(java.lang.String,java.lang.Class)>` from deserialization sinks. Jackson's `readValue` with an explicit target class is standard safe JSON parsing, not arbitrary deserialization. Dangerous Jackson deserialization requires `enableDefaultTyping()` + polymorphic type handling, which is not modeled by this sink. |
| 19 | +- **False Positive: Overly Broad Instance-Method Return Value Taint**: |
| 20 | + - `IntraTaintAnalysis.applyDefinition`: For `InstanceInvokeExpr` (instance method calls whose return value is assigned), `arg tainted → return tainted` is now restricted to **setter-like methods** (same `isSetterLike()` predicate as the receiver-tainting rule). General pass-through instance calls are handled correctly by the inter-procedural scheduler (callee is analyzed with tainted params). The `receiver tainted → return tainted` rule (for getters and chain calls) is unchanged. |
| 21 | + - Static invocations (`StaticInvokeExpr`) retain full `arg → return` propagation, which is correct for transformation functions (`String.format`, `Paths.get`, etc.). |
| 22 | +- **False Positive: Receiver-Tainted Sink Check for SQL Injection**: |
| 23 | + - `WorklistEngine.checkSink()` and `InterproceduralTaintAnalysis`: Receiver-based sink triggering (`taintedObj.sinkMethod()`) is now **disabled for the `sqli` category**. SQLi requires a tainted SQL string argument; triggering on a tainted `Statement` or `Connection` receiver generates false positives from taint reaching database objects via field propagation. SSRF, Path_Traversal, RCE, and other categories retain receiver-based detection. |
| 24 | + |
| 25 | +## [1.6.0] - 2026-03-09 |
| 26 | + |
| 27 | +### Added |
| 28 | +- **Field Taint Propagation (Phase 8.5)**: |
| 29 | + - `IntraTaintAnalysis.flowThrough`: Any `InstanceInvokeExpr` (virtual, interface, or special/constructor) with a tainted argument now taints the receiver object. This covers the common setter pattern: `obj.setUrl(tainted)` propagates taint onto `obj` so that subsequent reads (`obj.getUrl()`, `obj.field`) stay tainted through the rest of the method. |
| 30 | + - `IntraTaintAnalysis`: Added `taintedStaticFields: Set<SootField>` to track writes of the form `SomeClass.field = tainted`. Subsequent reads `x = SomeClass.field` within the same method body are now correctly tainted. The set is monotone (only grows) consistent with MAY-analysis semantics. |
| 31 | + - `WorklistEngine.checkSink` + `InterproceduralTaintAnalysis`: Sink detection now also fires when the **receiver** of an instance-method sink is tainted (e.g., `taintedStmt.execute()`), in addition to the existing argument check. This closes a class of false negatives for builder/fluent API sink patterns. |
| 32 | + |
| 33 | +### Fixed |
| 34 | +- **False Negatives: Interprocedural Receiver Taint (Phase 8.5 pre-work, commit `1ca012a`)**: |
| 35 | + - `AnalysisState`: Added `thisTainted` boolean to the memoization key (`equals`/`hashCode`). Previously, a method entered with a tainted receiver and without a tainted receiver mapped to the same state; the second visit was silently skipped, dropping real flows. |
| 36 | + - `WorklistEngine.scheduleCallee` + `InterproceduralTaintAnalysis`: When an `InstanceInvokeExpr` base object is tainted, the callee's `this` local is now seeded as tainted before scheduling. This enables `source → obj (tainted) → callee(this tainted) → sink` chains. |
| 37 | + - `IntraTaintAnalysis.applyDefinition`: Constructor calls (`SpecialInvokeExpr.isConstructor()`) with tainted arguments now taint the base object (previously missed, leaving `new Obj(tainted)` chains broken). |
| 38 | + - `IntraTaintAnalysis.applyDefinition`: Static method calls (`StaticInvokeExpr`) with tainted arguments now taint the return-value local, covering `x = Utils.process(tainted)` chains that were previously dropped. |
| 39 | +- **False Negatives: Missing JDBC URL / Connection Sinks (Phase 8.4, commit `1ca012a`)**: |
| 40 | + - Added `java.sql.DriverManager.getConnection(String)`, `getConnection(String, Properties)`, and `getConnection(String, String, String)` as SSRF/JDBC-URL-Injection sinks in `default_rules.yaml`. |
| 41 | +- **Config Merge (commit `1ca012a`)**: |
| 42 | + - `ConfigManager`: When a workspace `rules.yaml` exists, its source/sink rules are now **merged** with the bundled defaults instead of replacing them. Rules present in the workspace file take precedence; rules only in defaults are appended. This prevents sink/source coverage regressions when users customize their rule files. |
| 43 | +- **Graph Stability (commits `b9fc2ef`, `6e8f79b`, `ef8bc48`)**: |
| 44 | + - Auto-resolve dangling Soot classes during call-graph construction to reduce phantom-class noise. |
| 45 | + - Bulk resolution pass for recurring dangling packages. |
| 46 | + - Tightened retry budget for dangling resolution to avoid runaway retries. |
| 47 | +- **JAX-RS Route Extraction**: |
| 48 | + - `RouteExtractor`: POJO parameters annotated with JAX-RS path/query annotations are now correctly captured in `api.txt`. |
| 49 | + - Added support for `@Path`, `@GET/@POST/@PUT/@DELETE/@PATCH` on JAX-RS controllers. |
| 50 | + |
5 | 51 | ## [1.5.0] - 2026-02-10 |
6 | 52 |
|
7 | 53 | ### Added |
|
0 commit comments