circle-ir-ai 2.12.5 → 2.13.2

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.
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Source classification gate (cognium-ai#110).
3
+ *
4
+ * Deterministic, AST-based pre-classification of a taint source into a
5
+ * trust-boundary category. Drives the severity gate in
6
+ * `runReport` — replaces the "any LLM-verified pair becomes critical"
7
+ * default with a context-aware promotion.
8
+ *
9
+ * # Why
10
+ *
11
+ * Top-20 Java OSS harness on circle-ir-ai 2.12.4 surfaced 18 critical
12
+ * findings — 14 had the same calibration smell: the LLM verifier
13
+ * returned `llm_verified: true, llm_confidence: 0.8` on a sink
14
+ * reachable only from a framework-internal source (Object `target`
15
+ * plugin arg, MyBatis SPI lifecycle param, etc.). Pattern-based
16
+ * suppression (#109 / 2.12.6 / #111) is reactive. This module is the
17
+ * root-cause fix: classify the source first; only TRUST_BOUNDARY
18
+ * sources can drive a critical finding.
19
+ *
20
+ * # Classification
21
+ *
22
+ * - **TRUST_BOUNDARY** — HTTP request param/body/header/path,
23
+ * `HttpServletRequest`, JAX-RS / Spring controller annotated params,
24
+ * Servlet `Filter.doFilter` request arg.
25
+ * - **CONFIG** — values from `application.properties` / `.yml`,
26
+ * env vars, system properties, config-file readers. Tainted in
27
+ * theory but operator-controlled; cap at medium.
28
+ * - **FRAMEWORK_INTERNAL** — method parameter inside a class
29
+ * implementing a framework SPI (MyBatis `Interceptor` /
30
+ * `InnerInterceptor` / `Executor`, AOP, plugin lifecycle). No
31
+ * trust boundary crossed; drop.
32
+ * - **LIBRARY_API** — public-API method parameter on a library
33
+ * utility class with no controller annotations. Caller validates;
34
+ * cap at medium.
35
+ * - **UNKNOWN** — fallback when nothing matches. Preserves existing
36
+ * severity behavior (more conservative than the issue spec, which
37
+ * says drop — but the harness evidence is dominated by the four
38
+ * classified buckets and dropping UNKNOWN risks recall loss on
39
+ * cases the classifier hasn't been trained on yet).
40
+ *
41
+ * # Reference
42
+ *
43
+ * - cognium-ai#110 (this issue) — root cause / source-classification gate.
44
+ * - cognium-ai#109 — assertion utility pattern suppression (shipped 2.12.5).
45
+ * - circle-ir-ai 2.12.6 — MyBatis SPI pattern suppression.
46
+ * - circle-ir-ai 2.12.7 / #111 — class-aware MyBatis Interceptor suppression.
47
+ */
48
+ // ---------------------------------------------------------------------------
49
+ // Pattern tables
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * Source `type` field semantic categories that map directly to a trust
53
+ * boundary regardless of surrounding AST context. circle-ir's taint
54
+ * sources are pre-categorized by the engine; when the type is already
55
+ * one of these, classification is unambiguous.
56
+ */
57
+ const TRUST_BOUNDARY_SOURCE_TYPES = new Set([
58
+ 'http_param',
59
+ 'http_body',
60
+ 'http_header',
61
+ 'http_cookie',
62
+ 'http_path',
63
+ 'user_input',
64
+ 'external_input',
65
+ 'http_request',
66
+ 'request_param',
67
+ 'request_body',
68
+ ]);
69
+ /**
70
+ * Annotations on the enclosing method's parameters that mark a
71
+ * trust-boundary source — even when the source-line code itself
72
+ * doesn't include the annotation (e.g. the source is a usage of the
73
+ * parameter several lines after the method declaration).
74
+ */
75
+ const TRUST_BOUNDARY_ANNOTATIONS = [
76
+ // Spring MVC / WebFlux
77
+ 'RequestParam',
78
+ 'RequestBody',
79
+ 'RequestHeader',
80
+ 'PathVariable',
81
+ 'RequestPart',
82
+ 'CookieValue',
83
+ 'ModelAttribute',
84
+ 'MatrixVariable',
85
+ // JAX-RS
86
+ 'QueryParam',
87
+ 'FormParam',
88
+ 'HeaderParam',
89
+ 'PathParam',
90
+ 'CookieParam',
91
+ 'MatrixParam',
92
+ 'BeanParam',
93
+ ];
94
+ /**
95
+ * Annotations on the enclosing class that mark it as an HTTP entry
96
+ * point. When the class is a controller, any parameter on its
97
+ * handler methods is a trust-boundary candidate even if the
98
+ * parameter itself isn't annotated (some frameworks bind by name).
99
+ */
100
+ const CONTROLLER_CLASS_ANNOTATIONS = new Set([
101
+ 'Controller',
102
+ 'RestController',
103
+ 'Path', // JAX-RS
104
+ 'WebServlet',
105
+ ]);
106
+ /**
107
+ * Framework SPI interfaces — when the enclosing class implements one
108
+ * of these, every method parameter is framework-internal plumbing,
109
+ * not a trust-boundary crossing.
110
+ */
111
+ const FRAMEWORK_SPI_INTERFACES = new Set([
112
+ // MyBatis core
113
+ 'Interceptor',
114
+ 'Executor',
115
+ 'StatementHandler',
116
+ 'ParameterHandler',
117
+ 'ResultSetHandler',
118
+ // MyBatis Plus
119
+ 'InnerInterceptor',
120
+ // Spring AOP / lifecycle
121
+ 'BeanFactoryAware',
122
+ 'ApplicationContextAware',
123
+ 'InitializingBean',
124
+ 'DisposableBean',
125
+ 'MethodInterceptor', // AOP Alliance
126
+ // Servlet filter chain
127
+ 'Filter',
128
+ 'FilterChain',
129
+ // Spring HandlerInterceptor
130
+ 'HandlerInterceptor',
131
+ 'AsyncHandlerInterceptor',
132
+ ]);
133
+ /**
134
+ * Variable names that signal a framework-internal plugin / SPI source.
135
+ * Plugin patterns canonically use `target` / `invocation` / `chain` /
136
+ * `joinPoint` — when the source variable is one of these, the source
137
+ * is almost certainly framework plumbing.
138
+ */
139
+ const FRAMEWORK_INTERNAL_VAR_NAMES = new Set([
140
+ 'target',
141
+ 'invocation',
142
+ 'joinPoint',
143
+ 'pjp',
144
+ 'chain',
145
+ 'filterChain',
146
+ 'methodInvocation',
147
+ ]);
148
+ /**
149
+ * Code patterns that signal a CONFIG source — values read from
150
+ * configuration / properties / environment / system properties.
151
+ */
152
+ const CONFIG_PATTERNS = [
153
+ /\bSystem\s*\.\s*getProperty\s*\(/,
154
+ /\bSystem\s*\.\s*getenv\s*\(/,
155
+ /\bgetEnvironment\s*\(\s*\)\s*\.\s*getProperty/,
156
+ /@Value\s*\(/,
157
+ /\bConfigurationProperties\b/,
158
+ /\bgetConfiguration\s*\(/,
159
+ // Spring Environment / PropertyResolver
160
+ /\benvironment\s*\.\s*get(Property|RequiredProperty)\s*\(/,
161
+ // Apache Commons Configuration
162
+ /\bgetConfig\s*\(\s*\)\s*\.\s*get(String|Int|Long|Boolean)\s*\(/,
163
+ ];
164
+ /**
165
+ * Find the innermost class (and method, if any) containing the given line.
166
+ * Returns `{type, method}` — either field may be undefined when the line
167
+ * isn't inside any tracked scope (top-level statements, missing TypeInfo).
168
+ */
169
+ export function findEnclosingScope(types, line) {
170
+ if (!types || !line || !Number.isFinite(line))
171
+ return {};
172
+ let bestType;
173
+ let bestMethod;
174
+ for (const t of types) {
175
+ if (line < t.start_line || line > t.end_line)
176
+ continue;
177
+ // Narrowest enclosing wins (nested classes).
178
+ if (!bestType ||
179
+ (t.end_line - t.start_line) < (bestType.end_line - bestType.start_line)) {
180
+ bestType = t;
181
+ }
182
+ }
183
+ if (bestType?.methods) {
184
+ for (const m of bestType.methods) {
185
+ if (line < m.start_line || line > m.end_line)
186
+ continue;
187
+ if (!bestMethod ||
188
+ (m.end_line - m.start_line) < (bestMethod.end_line - bestMethod.start_line)) {
189
+ bestMethod = m;
190
+ }
191
+ }
192
+ }
193
+ return { type: bestType, method: bestMethod };
194
+ }
195
+ /**
196
+ * Returns true if any annotation in `annotations` matches one of the
197
+ * `targets` (simple name, case-sensitive). Tolerates the
198
+ * `@Annotation(...)` and `Annotation` forms and ignores generic
199
+ * parameters.
200
+ */
201
+ function annotationsInclude(annotations, targets) {
202
+ if (!annotations || annotations.length === 0)
203
+ return false;
204
+ const set = targets instanceof Set ? targets : new Set(targets);
205
+ for (const raw of annotations) {
206
+ // Strip leading `@` and any `(args)` / `<generics>` suffix.
207
+ const simple = raw
208
+ .replace(/^@/, '')
209
+ .replace(/[<(].*$/, '')
210
+ .trim();
211
+ if (set.has(simple))
212
+ return true;
213
+ }
214
+ return false;
215
+ }
216
+ // ---------------------------------------------------------------------------
217
+ // Classifier
218
+ // ---------------------------------------------------------------------------
219
+ /**
220
+ * Classify a taint source against the trust-boundary taxonomy.
221
+ *
222
+ * Cheap, deterministic. Order matters: trust-boundary signal beats
223
+ * framework-internal signal (an annotated `@RequestParam` inside a
224
+ * controller class is a real HTTP source even if the controller itself
225
+ * registers as an interceptor somewhere).
226
+ */
227
+ export function classifySource(source, types) {
228
+ if (!source)
229
+ return 'UNKNOWN';
230
+ // ---- Signal 1: source type tag (cheapest, most specific) ------------
231
+ const sourceType = (source.type ?? '').toString();
232
+ if (TRUST_BOUNDARY_SOURCE_TYPES.has(sourceType))
233
+ return 'TRUST_BOUNDARY';
234
+ // ---- Signal 2: AST context — enclosing class + method ---------------
235
+ const scope = findEnclosingScope(types, source.line);
236
+ const enclosingType = scope.type;
237
+ const enclosingMethod = scope.method;
238
+ // 2a. Controller class — handler params are trust-boundary even when
239
+ // not individually annotated.
240
+ if (enclosingType &&
241
+ annotationsInclude(enclosingType.annotations, CONTROLLER_CLASS_ANNOTATIONS)) {
242
+ // If the source variable matches a method parameter, it's the
243
+ // HTTP-bound param. (We don't require annotation match because some
244
+ // frameworks bind by name on Controller-annotated classes.)
245
+ if (enclosingMethod && source.variable) {
246
+ const param = enclosingMethod.parameters?.find((p) => p.name === source.variable);
247
+ if (param)
248
+ return 'TRUST_BOUNDARY';
249
+ }
250
+ }
251
+ // 2b. Method parameter annotation — direct match.
252
+ if (enclosingMethod && source.variable) {
253
+ const param = enclosingMethod.parameters?.find((p) => p.name === source.variable);
254
+ if (param && annotationsInclude(param.annotations, TRUST_BOUNDARY_ANNOTATIONS)) {
255
+ return 'TRUST_BOUNDARY';
256
+ }
257
+ }
258
+ // ---- Signal 3: framework SPI class --------------------------------
259
+ // Once we've ruled out a trust-boundary above, an SPI class means
260
+ // every internal source is plumbing, not user input.
261
+ if (enclosingType) {
262
+ const implementsList = enclosingType.implements ?? [];
263
+ for (const impl of implementsList) {
264
+ const simple = impl.replace(/<.*$/, '').trim();
265
+ if (FRAMEWORK_SPI_INTERFACES.has(simple))
266
+ return 'FRAMEWORK_INTERNAL';
267
+ }
268
+ }
269
+ // ---- Signal 4: variable-name plugin convention ---------------------
270
+ if (source.variable && FRAMEWORK_INTERNAL_VAR_NAMES.has(source.variable)) {
271
+ return 'FRAMEWORK_INTERNAL';
272
+ }
273
+ // ---- Signal 5: code-pattern CONFIG --------------------------------
274
+ const code = (source.code ?? '').toString();
275
+ if (code) {
276
+ for (const re of CONFIG_PATTERNS) {
277
+ if (re.test(code))
278
+ return 'CONFIG';
279
+ }
280
+ }
281
+ // ---- Signal 6: LIBRARY_API fallback for plain method params -------
282
+ // If we found an enclosing method + matching parameter but the param
283
+ // has no annotation and the class isn't a controller / SPI, treat
284
+ // the source as a library-API surface.
285
+ if (enclosingMethod && source.variable) {
286
+ const param = enclosingMethod.parameters?.find((p) => p.name === source.variable);
287
+ if (param)
288
+ return 'LIBRARY_API';
289
+ }
290
+ return 'UNKNOWN';
291
+ }
292
+ // ---------------------------------------------------------------------------
293
+ // Severity gate
294
+ // ---------------------------------------------------------------------------
295
+ /**
296
+ * Apply the classification gate to a proposed severity. Returns either
297
+ * the (possibly-capped) severity or `null` to indicate the finding
298
+ * should be dropped entirely.
299
+ *
300
+ * Rules:
301
+ * - `TRUST_BOUNDARY` — pass through (allow critical).
302
+ * - `CONFIG`, `LIBRARY_API` — cap at `medium` (operator/library-author
303
+ * owned, not directly exploitable from an outside attacker).
304
+ * - `FRAMEWORK_INTERNAL` — drop (no trust boundary crossed).
305
+ * - `UNKNOWN` — pass through (preserve recall; the issue spec would
306
+ * drop here, but harness evidence is dominated by the four
307
+ * classified buckets; UNKNOWN as a drop risks regressions on
308
+ * pattern-only static sources without AST context).
309
+ */
310
+ export function applyClassificationGate(classification, proposedSeverity) {
311
+ switch (classification) {
312
+ case 'FRAMEWORK_INTERNAL':
313
+ return null;
314
+ case 'CONFIG':
315
+ case 'LIBRARY_API':
316
+ return capAtMedium(proposedSeverity);
317
+ case 'TRUST_BOUNDARY':
318
+ case 'UNKNOWN':
319
+ default:
320
+ return proposedSeverity;
321
+ }
322
+ }
323
+ function capAtMedium(severity) {
324
+ if (severity === 'critical' || severity === 'high')
325
+ return 'medium';
326
+ return severity;
327
+ }
328
+ //# sourceMappingURL=source-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-classifier.js","sourceRoot":"","sources":["../../src/security-scan/source-classifier.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir-ai",
3
- "version": "2.12.5",
3
+ "version": "2.13.2",
4
4
  "description": "LLM-enhanced SAST analysis built on circle-ir",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -95,7 +95,7 @@
95
95
  "dependencies": {
96
96
  "@ax-llm/ax": "^20.0.0",
97
97
  "@mastra/core": "^1.18.0",
98
- "circle-ir": "3.82.0",
98
+ "circle-ir": "3.85.0",
99
99
  "minimatch": "^10.2.5",
100
100
  "p-queue": "^9.1.0"
101
101
  },