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.
- package/CHANGELOG.md +301 -0
- package/dist/agents/mastra/workflow.d.ts +1 -1
- package/dist/agents/mastra/workflow.d.ts.map +1 -1
- package/dist/agents/mastra/workflow.js +39 -5
- package/dist/agents/mastra/workflow.js.map +1 -1
- package/dist/security-scan/index.d.ts +1 -0
- package/dist/security-scan/index.d.ts.map +1 -1
- package/dist/security-scan/index.js +2 -0
- package/dist/security-scan/index.js.map +1 -1
- package/dist/security-scan/scanner.js +1 -1
- package/dist/security-scan/scanner.js.map +1 -1
- package/dist/security-scan/sink-filters.d.ts +14 -1
- package/dist/security-scan/sink-filters.d.ts.map +1 -1
- package/dist/security-scan/sink-filters.js +121 -1
- package/dist/security-scan/sink-filters.js.map +1 -1
- package/dist/security-scan/source-classifier.d.ts +117 -0
- package/dist/security-scan/source-classifier.d.ts.map +1 -0
- package/dist/security-scan/source-classifier.js +328 -0
- package/dist/security-scan/source-classifier.js.map +1 -0
- package/package.json +2 -2
|
@@ -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.
|
|
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.
|
|
98
|
+
"circle-ir": "3.85.0",
|
|
99
99
|
"minimatch": "^10.2.5",
|
|
100
100
|
"p-queue": "^9.1.0"
|
|
101
101
|
},
|