circle-ir-ai 2.8.10 → 2.8.14

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/CHANGELOG.md +139 -0
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,145 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.8.14] - 2026-06-12
9
+
10
+ ### Dependencies
11
+
12
+ - **`circle-ir`** `3.38.0` → `3.39.0` **(exact pin)**. Headline:
13
+ **cross-instance field-binding taint propagation** — `FieldTaintInfo`
14
+ summaries now record constructor-bound fields, setter writers, and
15
+ `@Autowired` / `@Inject` annotated fields. `findFieldBindingTaintPaths()`
16
+ detects local variable assignments from field reads (e.g.
17
+ `local = receiver.field`) and marks the local as tainted when the
18
+ receiver's type owns a tainted field. Also: **caller-body sink
19
+ emission** — after marking caller-side locals as tainted via wrapper
20
+ returns, the engine checks whether any sink in the caller's own
21
+ method body consumes the tainted variable, surfacing cases where the
22
+ final sink (`Paths.get(p)`, `Runtime.exec(cmd)`) lives in the
23
+ caller's file rather than a cross-file callee. Test suite expanded
24
+ 1935 → 1939 (4 new Jenkins/Spring DI fixtures).
25
+ - All 643 circle-ir-ai tests (+ 3 skipped) pass against `3.39.0` —
26
+ no API surface changes, drop-in upgrade.
27
+
28
+ ## [Unreleased]
29
+
30
+ ### Fixed
31
+
32
+ - **`benchmarks/runners/run-cwe-bench-java.ts`** — restore missing
33
+ `findFileRecursive` import from `../lib/find-file.js` (regression
34
+ introduced when `findFile`/`findFileRecursive` were extracted to
35
+ `benchmarks/lib/find-file.ts` per #66; only `findFile` was added to
36
+ the import, leaving the runner crashing at line 550 when it tried to
37
+ locate AntiSamy/ESAPI/Spring-Security config files for cross-file
38
+ context). Benchmark now runs end-to-end on CWE-Bench-Java with
39
+ `--llm-discovery`. Doc-only fix; no version bump (benchmarks/ is not
40
+ in the published `files` array).
41
+
42
+ ### Benchmarks
43
+
44
+ - **CWE-Bench-Java refresh on circle-ir@3.38.0** with `gemma3:12b` via
45
+ OpenRouter (`google/gemma-3-12b-it`) — **100/120 strict (83.3%)**,
46
+ 100/111 engine-evaluable (90.1%), 1/80 LLM failures (1.3%). **+6
47
+ CVEs over the 2026-06-09 Ollama 3.37.0 baseline** (94/120, 78.3%),
48
+ driven primarily by 3.38.0's frame-agnostic cross-file
49
+ inter-procedural taint walker (cognium-dev#19). gemma3:12b now ranks
50
+ #2 overall, within 4 CVEs of `claude-opus-latest` (104/120). Per-CWE:
51
+ CWE-022 85.5% (flat) · CWE-078 **92.3% (+23pp)** · CWE-079 **83.9%
52
+ (+6.5pp)** · CWE-094 **71.4% (+4.7pp)**. Wall-clock ~17 min (vs ~94
53
+ min local Ollama — ~5.5× speed-up from no GPU contention). Log:
54
+ `benchmarks/results/cwe-java-gemma3-12b-openrouter-2026-06-12.log`.
55
+ One transient HTTP error on OpenRouter (no retry-on-5xx in
56
+ `ax-client.ts` — filed as a follow-up).
57
+
58
+ ## [2.8.13] - 2026-06-12
59
+
60
+ ### Changed
61
+
62
+ - **Bump `circle-ir` pin `3.37.0` → `3.38.0` (exact).** Ships the
63
+ frame-agnostic cross-file inter-procedural taint propagation landed
64
+ via `cogniumhq/cognium-dev#19`. Same fix simultaneously resolves
65
+ `cogniumhq/cognium-dev#1` (Jenkins `@DataBoundConstructor` field
66
+ binding).
67
+
68
+ Four `CrossFileResolver` changes per maintainer's close-comment:
69
+ - `isMethodTaintSource` / `getSourceType` skip `interprocedural_param`
70
+ so internal helpers with typed parameters no longer ghost-taint
71
+ callers.
72
+ - `findTaintedParams` adds a sink-arg-matching heuristic — for each
73
+ sink inside a method body, scan call args and whole-word-match
74
+ against the method's parameter names → matching indices added to
75
+ `taintedParams`. Restores propagation through sink-wrapper methods
76
+ that lack `@RequestParam`/`@RequestBody`/`@PathVariable` (e.g.
77
+ `RedirectStrategy.sendRedirect(req, res, String url)`).
78
+ - New `findInterproceduralTaintPaths()` — walks each caller method
79
+ in line order, taints DFG `local` defs on `returnsSource`-callee
80
+ returns, emits multi-hop `TaintPath` when a tainted arg reaches a
81
+ callee's `taintedParam`. Confidence decay 0.85/hop, floor 0.30.
82
+ - Variable-connectivity gate on `findCrossFileTaintFlows()` —
83
+ eliminates sanitized-wrapper FPs.
84
+
85
+ Probe-verified in our checkout: the CVE-2011-2732 shape
86
+ (`UrlHandler.determineTargetUrl` → `LoginController.login` →
87
+ `RedirectStrategy.sendRedirect`) emits a 4-hop `taint_path` with
88
+ CWE-601 / open_redirect sink at confidence 0.614. Closes
89
+ `circle-ir-ai#69` (the OAuth approval + security redirect CVE pair).
90
+
91
+ ## [2.8.12] - 2026-06-12
92
+
93
+ ### Changed
94
+
95
+ - **Bump `circle-ir` pin from `3.36.0` → `3.37.0` (exact).** 3.37.0 ships
96
+ the multi-hop Python taint-propagation fix landed via
97
+ `cogniumhq/cognium-dev#20`. Two ~50-LOC surgical changes:
98
+ - `detectExpressionScanFlows` now expands `sourcesWithVar` with synthetic
99
+ source records for every derived variable in `buildPythonTaintedVars`
100
+ (Python-only — gated by `language === 'python'`, no Java regression).
101
+ - `buildPythonTaintedVars` adds a receiver-mutation rule for
102
+ `.append/.extend/.insert/.add/.push/.put/.appendleft(taintedExpr)`,
103
+ composing with existing dict-access propagation.
104
+
105
+ Verified end-to-end against the OWASP BenchmarkPython tail probes that
106
+ previously failed:
107
+
108
+ | Test | Pattern | 3.36.0 | 3.37.0 |
109
+ |------|---------|--------|--------|
110
+ | BenchmarkTest00099 | configparser round-trip → sqli | flows=0 | flows=2 |
111
+ | BenchmarkTest00165 | list append/pop → cmdi | flows=0 | flows=1 |
112
+
113
+ Effect on the regex-co-occurrence harness scoring is roughly neutral
114
+ (TPR +0.9 pp, FPR +0.9 pp, F1 unchanged) — the harness doesn't read
115
+ `taint.flows`, so the engine improvement is only visible via direct
116
+ flow-checking consumers (mastra workflow, downstream LLM verification,
117
+ the flow-first harness migration tracked separately in
118
+ `circle-ir-ai#75`).
119
+
120
+ Cross-module / cross-file helper indirection (shape D in #20) remains
121
+ deferred — requires inter-procedural taint summaries.
122
+
123
+ ## [2.8.11] - 2026-06-12
124
+
125
+ ### Changed
126
+
127
+ - **Pin `circle-ir` to exact version `3.36.0` (was `^3.34.0`).** Drops the
128
+ semver caret to eliminate float-on-publish drift between local installs,
129
+ CI, and consumers. `3.36.0` includes the engine fixes shipped this week:
130
+ - **3.35.0** — `cogniumhq/cognium-dev#17`: 16 new Jenkins Groovy sandbox
131
+ sinks registered to both `DEFAULT_SINKS` array and the YAML config
132
+ loader (`SandboxInterceptor.onMethodCall` etc.) — closes
133
+ `circle-ir-ai#68` (Jenkins script-security CVE-2023-24422 detection).
134
+ - **3.36.0** — `cogniumhq/cognium-dev#18`: Python taint-propagation
135
+ `detectExpressionScanFlows` supplement (language-agnostic word-boundary
136
+ matching of source variables in sink call-argument text). Restores
137
+ `result.taint.flows` population for direct one-hop Python cases across
138
+ all categories (sqli, cmdi, pathtraver, codeinj, deserialization, etc.).
139
+ OWASP BenchmarkPython multi-hop indirection patterns
140
+ (configparser / list / helper-module) remain a separate follow-up —
141
+ `cogniumhq/cognium-dev#20`.
142
+
143
+ Bumps are coordinated: `cognium-ai` (CLI) follows with a matching
144
+ `2.8.11` patch that pins `circle-ir-ai@2.8.11` exact and refreshes
145
+ the transitive `circle-ir` pin.
146
+
8
147
  ## [2.8.10] - 2026-06-11
9
148
 
10
149
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir-ai",
3
- "version": "2.8.10",
3
+ "version": "2.8.14",
4
4
  "description": "LLM-enhanced SAST analysis built on circle-ir",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -94,7 +94,7 @@
94
94
  "dependencies": {
95
95
  "@ax-llm/ax": "^20.0.0",
96
96
  "@mastra/core": "^1.18.0",
97
- "circle-ir": "^3.34.0",
97
+ "circle-ir": "3.39.0",
98
98
  "minimatch": "^10.2.5",
99
99
  "p-queue": "^9.1.0"
100
100
  },