circle-ir-ai 2.33.4 → 2.34.0
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 +270 -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 -8
- package/dist/agents/mastra/workflow.js.map +1 -1
- package/dist/security-scan/scanner.d.ts.map +1 -1
- package/dist/security-scan/scanner.js +16 -2
- package/dist/security-scan/scanner.js.map +1 -1
- package/dist/security-scan/sink-filters.d.ts +105 -3
- package/dist/security-scan/sink-filters.d.ts.map +1 -1
- package/dist/security-scan/sink-filters.js +395 -14
- package/dist/security-scan/sink-filters.js.map +1 -1
- package/dist/trust/passes/input-validation.d.ts.map +1 -1
- package/dist/trust/passes/input-validation.js +21 -0
- package/dist/trust/passes/input-validation.js.map +1 -1
- package/package.json +2 -2
|
@@ -282,16 +282,51 @@ export function isKnownNonSink(code, sinkType) {
|
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
284
|
// ---------------------------------------------------------------------------
|
|
285
|
-
// Fix 4 — nosql_injection on browser-side JS/HTML (#94)
|
|
285
|
+
// Fix 4 — nosql_injection on browser-side JS/HTML (#94) + browser-side
|
|
286
|
+
// SQL FP on Chrome-extension / Web-API `.query()` calls (cognium-ai#186)
|
|
286
287
|
// ---------------------------------------------------------------------------
|
|
287
288
|
/**
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
289
|
+
* Strict browser-only file extensions used by `#94` `isNosqlOnBrowserFile`.
|
|
290
|
+
*
|
|
291
|
+
* MUST NOT include `.ts` / `.tsx` / `.mts` / `.cts` — Node.js / Nest / Express
|
|
292
|
+
* backends written in TypeScript legitimately import `mongodb` / `mongoose`
|
|
293
|
+
* and call `.find()` / `.aggregate()` server-side. Extending this set to
|
|
294
|
+
* include `.ts` would silently drop real NoSQL injection findings on any
|
|
295
|
+
* TypeScript backend. `.js` / `.jsx` / `.mjs` / `.cjs` / `.html` / `.htm` are
|
|
296
|
+
* kept because the mongodb driver has no browser build for those either, and
|
|
297
|
+
* the historical evidence (`#94`) came from browser-side jQuery / DOM
|
|
298
|
+
* collections mis-classified as `.find()` sinks.
|
|
293
299
|
*/
|
|
294
300
|
const BROWSER_JS_EXTS = new Set(['.js', '.jsx', '.mjs', '.cjs', '.html', '.htm']);
|
|
301
|
+
/**
|
|
302
|
+
* Wider "renderer / browser context" extension set used by
|
|
303
|
+
* `isBrowserQueryApi` (cognium-ai#186). Safe to include TypeScript / Vue /
|
|
304
|
+
* Svelte here because the code-shape regexes in `isBrowserQueryApi` are
|
|
305
|
+
* unambiguous browser signals:
|
|
306
|
+
*
|
|
307
|
+
* - `chrome.tabs.query(...)` / `browser.storage.local.query(...)` — WebExt
|
|
308
|
+
* - `navigator.permissions.query(...)` — Web Permissions API
|
|
309
|
+
* - `document.querySelector*(...)` — DOM
|
|
310
|
+
*
|
|
311
|
+
* None of these globals exist in Node.js, so gating on this wider extension
|
|
312
|
+
* set only suppresses code that had no chance of hitting a real DB driver.
|
|
313
|
+
* Kept separate from `BROWSER_JS_EXTS` so `isNosqlOnBrowserFile` continues
|
|
314
|
+
* to treat `.ts` as server-side.
|
|
315
|
+
*/
|
|
316
|
+
const BROWSER_RENDERER_EXTS = new Set([
|
|
317
|
+
'.js',
|
|
318
|
+
'.jsx',
|
|
319
|
+
'.mjs',
|
|
320
|
+
'.cjs',
|
|
321
|
+
'.ts',
|
|
322
|
+
'.tsx',
|
|
323
|
+
'.mts',
|
|
324
|
+
'.cts',
|
|
325
|
+
'.html',
|
|
326
|
+
'.htm',
|
|
327
|
+
'.vue',
|
|
328
|
+
'.svelte',
|
|
329
|
+
]);
|
|
295
330
|
function fileExtension(file) {
|
|
296
331
|
if (!file)
|
|
297
332
|
return '';
|
|
@@ -306,6 +341,223 @@ export function isNosqlOnBrowserFile(sinkType, sinkFile) {
|
|
|
306
341
|
return BROWSER_JS_EXTS.has(fileExtension(sinkFile));
|
|
307
342
|
}
|
|
308
343
|
// ---------------------------------------------------------------------------
|
|
344
|
+
// cognium-ai#186 — browser-side `.query()` mis-classified as SQL injection
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
/**
|
|
347
|
+
* Sink types this filter can suppress. `sql_injection` is the observed
|
|
348
|
+
* failure (BLOCKED tier on a Chrome MV3 extension in #186). `nosql_injection`
|
|
349
|
+
* is included defensively — the same call shapes (`.query({...})`) are
|
|
350
|
+
* plausible bait for the same misclassification on the LLM path.
|
|
351
|
+
*/
|
|
352
|
+
const BROWSER_QUERY_SUPPRESSIBLE_SINK_TYPES = new Set([
|
|
353
|
+
'sql_injection',
|
|
354
|
+
'nosql_injection',
|
|
355
|
+
]);
|
|
356
|
+
/**
|
|
357
|
+
* Regex for Chrome-extension `.query()` APIs and Web `navigator`/document
|
|
358
|
+
* `.query()` / `.querySelector*()` shapes that share the method name with
|
|
359
|
+
* SQL drivers but never route to a database.
|
|
360
|
+
*
|
|
361
|
+
* Anchored on the receiver so a real DB call (`db.query(...)`,
|
|
362
|
+
* `client.query(...)`, `pool.query(...)`) with an unfamiliar variable name
|
|
363
|
+
* still fires. The listed receivers are the standardised browser globals
|
|
364
|
+
* (`chrome`, `browser`, `navigator`, `document`, `window`) — user code
|
|
365
|
+
* that names a variable `chrome` will hit this filter, which is the
|
|
366
|
+
* accepted trade-off for suppressing the standard-API FP class.
|
|
367
|
+
*
|
|
368
|
+
* Coverage:
|
|
369
|
+
* - Chrome / WebExtension APIs:
|
|
370
|
+
* chrome.tabs.query, chrome.bookmarks.query, chrome.history.query,
|
|
371
|
+
* chrome.sessions.query, chrome.management.query,
|
|
372
|
+
* chrome.windows.getAll, chrome.storage.local.query (rare),
|
|
373
|
+
* chrome.notifications.getAll (not .query), and the equivalent
|
|
374
|
+
* `browser.*` namespace used by Firefox / Safari extensions.
|
|
375
|
+
* - Web Permissions API: navigator.permissions.query
|
|
376
|
+
* - DOM query APIs: document.querySelector, .querySelectorAll,
|
|
377
|
+
* element.querySelector*, window.matchMedia (adjacent shape)
|
|
378
|
+
*
|
|
379
|
+
* Non-goals (still real sinks):
|
|
380
|
+
* - `db.query(...)`, `client.query(...)`, `knex.raw(...)`,
|
|
381
|
+
* `mongoose.<model>.find(...)` — receiver isn't a browser global.
|
|
382
|
+
* - `req.query.<key>` — that's a *source*, not a sink; the source-type
|
|
383
|
+
* tagger already handles it.
|
|
384
|
+
*/
|
|
385
|
+
const BROWSER_QUERY_RE = /\b(?:chrome|browser)\s*\.\s*(?:tabs|bookmarks|history|sessions|management|windows|storage(?:\.\s*(?:local|sync|managed|session))?|notifications|permissions|contextMenus)\s*\.\s*query\s*\(/;
|
|
386
|
+
const NAVIGATOR_PERMISSIONS_RE = /\bnavigator\s*\.\s*permissions\s*\.\s*query\s*\(/;
|
|
387
|
+
const DOM_QUERY_SELECTOR_RE = /\b(?:document|window|this|self|globalThis|[A-Za-z_$][\w$]*)\s*\.\s*querySelector(?:All)?\s*\(/;
|
|
388
|
+
/**
|
|
389
|
+
* True if the sink line is a browser / WebExtension `.query()` /
|
|
390
|
+
* `querySelector*` call. Gated on file extension so that server-side
|
|
391
|
+
* `chrome.query(...)` on a Node.js repo (unlikely but possible: a variable
|
|
392
|
+
* named `chrome` in server code) still fires normally.
|
|
393
|
+
*
|
|
394
|
+
* Confirmed downstream sighting: `cognium-meet` Chrome extension —
|
|
395
|
+
* `apps/extension/src/lib/settings-form.ts:177`
|
|
396
|
+
* (`navigator.permissions.query({ name: 'microphone' })`) and
|
|
397
|
+
* `apps/extension/src/popup/popup.ts:717`
|
|
398
|
+
* (`chrome.tabs.query({ active: true, currentWindow: true })`) both
|
|
399
|
+
* flagged as CRITICAL `sql_injection` → BLOCKED tier on trust score.
|
|
400
|
+
* Neither call touches a SQL driver.
|
|
401
|
+
*/
|
|
402
|
+
export function isBrowserQueryApi(sinkCode, sinkType, sinkFile) {
|
|
403
|
+
if (!sinkCode || !sinkType)
|
|
404
|
+
return false;
|
|
405
|
+
if (!BROWSER_QUERY_SUPPRESSIBLE_SINK_TYPES.has(sinkType))
|
|
406
|
+
return false;
|
|
407
|
+
// File-extension gate: only browser / renderer-side files. Prevents a
|
|
408
|
+
// server-side variable named `chrome` from being silently suppressed.
|
|
409
|
+
// Uses BROWSER_RENDERER_EXTS (wider than BROWSER_JS_EXTS) because the
|
|
410
|
+
// chrome.*/navigator.*/document.* code shapes below are unambiguously
|
|
411
|
+
// browser — safe to widen to `.ts` / `.tsx` / `.vue` / `.svelte`.
|
|
412
|
+
if (!BROWSER_RENDERER_EXTS.has(fileExtension(sinkFile)))
|
|
413
|
+
return false;
|
|
414
|
+
const trimmed = sinkCode.trim();
|
|
415
|
+
if (!trimmed)
|
|
416
|
+
return false;
|
|
417
|
+
if (BROWSER_QUERY_RE.test(trimmed))
|
|
418
|
+
return true;
|
|
419
|
+
if (NAVIGATOR_PERMISSIONS_RE.test(trimmed))
|
|
420
|
+
return true;
|
|
421
|
+
if (DOM_QUERY_SELECTOR_RE.test(trimmed))
|
|
422
|
+
return true;
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
// ---------------------------------------------------------------------------
|
|
426
|
+
// cognium-ai#167 — library-internal FP gates 5, 6, 7 for XPath / XXE / crypto
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
//
|
|
429
|
+
// The 10-repo top-100 sweep on 2026-07-01 surfaced three sink families that
|
|
430
|
+
// share the same failure mode as cognium-dev#179's gates 1-4: the sink fires
|
|
431
|
+
// on the *library itself*, not on caller-controlled input reaching the
|
|
432
|
+
// library's public API. Each gate matches on the fully-qualified package
|
|
433
|
+
// path in the sink file — semver-stable and doesn't depend on repo name.
|
|
434
|
+
//
|
|
435
|
+
// Gate 5 (XPath): JsonPath ValueNodes.java (10 CRIT CWE-643) — the
|
|
436
|
+
// library's own predicate-node type
|
|
437
|
+
// Gate 6 (XXE): jsoup XML processing (5 CRIT CWE-611) — jsoup IS the
|
|
438
|
+
// parser being flagged
|
|
439
|
+
// Gate 7 (crypto): JJWT JcaTemplate.java + EcdhKeyAlgorithm.java (8 CRIT
|
|
440
|
+
// CWE-902 + CWE-310) — jjwt's JCA wrapper + ECDH-ES impl
|
|
441
|
+
/** Fully-qualified package paths for XPath / JsonPath-shaped libraries.
|
|
442
|
+
* Anchored on `/pkg/` (leading + trailing separator) so a class name like
|
|
443
|
+
* `MyJaxenParser.java` doesn't spuriously match. Case-insensitive because
|
|
444
|
+
* a few of these historically use mixed-case Maven `groupId`s. */
|
|
445
|
+
const XPATH_LIBRARY_PATH_RE = /(?:com\/jayway\/jsonpath|org\/jaxen|net\/sf\/saxon|org\/dom4j\/xpath)\//i;
|
|
446
|
+
/** Fully-qualified package paths for HTML / XML parser libraries whose own
|
|
447
|
+
* internal XML processing gets flagged CWE-611. The evidence-driven set:
|
|
448
|
+
* jsoup (5 CRIT in the 10-repo sweep) + adjacent HTML parser shapes. */
|
|
449
|
+
const XXE_PARSER_LIBRARY_PATH_RE = /(?:org\/jsoup|org\/htmlcleaner)\//i;
|
|
450
|
+
/** Sink types that gate 7 can suppress. `crypto_api` = high-level misuse
|
|
451
|
+
* (algorithm choice, mode, IV); `crypto` = lower-level primitive selection.
|
|
452
|
+
* Both fire on JJWT internals — the whole *point* of the library is to
|
|
453
|
+
* call `Cipher.getInstance(...)` / `KeyAgreement.getInstance(...)`. */
|
|
454
|
+
const CRYPTO_SUPPRESSIBLE_SINK_TYPES = new Set(['crypto_api', 'crypto']);
|
|
455
|
+
/** Fully-qualified package paths for crypto libraries whose own JCA-wrapping
|
|
456
|
+
* code gets flagged as unsafe crypto usage. */
|
|
457
|
+
const CRYPTO_LIBRARY_PATH_RE = /(?:io\/jsonwebtoken|com\/nimbusds\/jose|org\/bouncycastle|com\/google\/crypto\/tink)\//i;
|
|
458
|
+
/** JCA Service Provider Interface types. A class that extends/implements
|
|
459
|
+
* any of these IS a JCA SPI implementation — Cipher.getInstance / Mac.
|
|
460
|
+
* getInstance / etc. inside such a class are the intended implementation,
|
|
461
|
+
* not user-controlled crypto misuse. Backstop for crypto library code
|
|
462
|
+
* that isn't in the fully-qualified path set above. */
|
|
463
|
+
const JCA_SPI_TYPES = new Set([
|
|
464
|
+
'CipherSpi',
|
|
465
|
+
'MacSpi',
|
|
466
|
+
'MessageDigestSpi',
|
|
467
|
+
'KeyAgreementSpi',
|
|
468
|
+
'SignatureSpi',
|
|
469
|
+
'KeyFactorySpi',
|
|
470
|
+
'SecretKeyFactorySpi',
|
|
471
|
+
'KeyGeneratorSpi',
|
|
472
|
+
'KeyPairGeneratorSpi',
|
|
473
|
+
'AlgorithmParametersSpi',
|
|
474
|
+
'SecureRandomSpi',
|
|
475
|
+
]);
|
|
476
|
+
/**
|
|
477
|
+
* True when the sink is an `xpath_injection` inside a well-known XPath
|
|
478
|
+
* library package (JsonPath / Jaxen / Saxon / dom4j XPath). These libraries'
|
|
479
|
+
* own predicate-node / expression-node classes fire the xpath_injection
|
|
480
|
+
* rule because they syntactically wrap an XPath-shaped call — but they ARE
|
|
481
|
+
* the XPath engine, not user code reaching an unsafe evaluator.
|
|
482
|
+
*
|
|
483
|
+
* Confirmed evidence (cognium-ai#167): `json-path/JsonPath` — 10 CRIT
|
|
484
|
+
* findings in `ValueNodes.java:680,694`.
|
|
485
|
+
*/
|
|
486
|
+
export function isXPathLibraryInternal(sinkType, sinkFile) {
|
|
487
|
+
if (sinkType !== 'xpath_injection')
|
|
488
|
+
return false;
|
|
489
|
+
if (!sinkFile)
|
|
490
|
+
return false;
|
|
491
|
+
return XPATH_LIBRARY_PATH_RE.test(sinkFile);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* True when the sink is an `xxe` inside a well-known HTML/XML parser
|
|
495
|
+
* library (jsoup, htmlcleaner). These libraries' own XML processing paths
|
|
496
|
+
* fire the XXE rule because they syntactically call low-level XML APIs —
|
|
497
|
+
* but they ARE the parser, and their DTD/entity handling is a library
|
|
498
|
+
* configuration surface exposed to callers.
|
|
499
|
+
*
|
|
500
|
+
* Confirmed evidence (cognium-ai#167): `jhy/jsoup` — 5 CRIT CWE-611 in
|
|
501
|
+
* jsoup's own XML processing paths.
|
|
502
|
+
*
|
|
503
|
+
* Note: complements cognium-dev#166 (DocumentBuilderFactory FEATURE_
|
|
504
|
+
* SECURE_PROCESSING recognition). #166 covers DBF; this gate covers
|
|
505
|
+
* parser libraries that don't use DBF.
|
|
506
|
+
*/
|
|
507
|
+
export function isXxeOnParserLibrary(sinkType, sinkFile) {
|
|
508
|
+
if (sinkType !== 'xxe')
|
|
509
|
+
return false;
|
|
510
|
+
if (!sinkFile)
|
|
511
|
+
return false;
|
|
512
|
+
return XXE_PARSER_LIBRARY_PATH_RE.test(sinkFile);
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* True when the sink is a `crypto_api` / `crypto` inside a well-known
|
|
516
|
+
* crypto library (JJWT, Nimbus JOSE, BouncyCastle, Tink) OR inside a
|
|
517
|
+
* class that extends/implements a JCA SPI type (`CipherSpi`, `MacSpi`,
|
|
518
|
+
* etc.). Crypto misuse rules fire on `Cipher.getInstance(...)` /
|
|
519
|
+
* `KeyAgreement.getInstance(...)` / algorithm-string sinks — but a JWT
|
|
520
|
+
* or JOSE library's whole purpose IS to wrap those calls, so the sink
|
|
521
|
+
* is the intended implementation, not caller-controlled misuse.
|
|
522
|
+
*
|
|
523
|
+
* Confirmed evidence (cognium-ai#167): `jwtk/jjwt` — 5× CWE-902 in
|
|
524
|
+
* `JcaTemplate.java:67`, 3× CWE-310 in `EcdhKeyAlgorithm.java:188`.
|
|
525
|
+
*
|
|
526
|
+
* Two-layer detection:
|
|
527
|
+
* 1. Fully-qualified package path match (fast; covers the 4 known
|
|
528
|
+
* library packages in `CRYPTO_LIBRARY_PATH_RE`).
|
|
529
|
+
* 2. JCA SPI subclass check via `types.implements[]` (backstop; catches
|
|
530
|
+
* third-party JCA providers not in the path set).
|
|
531
|
+
*/
|
|
532
|
+
export function isCryptoLibraryInternal(sinkType, sinkFile, types, sinkLine) {
|
|
533
|
+
if (!sinkType || !CRYPTO_SUPPRESSIBLE_SINK_TYPES.has(sinkType))
|
|
534
|
+
return false;
|
|
535
|
+
// Layer 1: file-path heuristic.
|
|
536
|
+
if (sinkFile && CRYPTO_LIBRARY_PATH_RE.test(sinkFile))
|
|
537
|
+
return true;
|
|
538
|
+
// Layer 2: JCA SPI subclass check. Only fires when types + sinkLine are
|
|
539
|
+
// available (post-#111 callers). Missing bounds → skip → preserve recall.
|
|
540
|
+
if (!types || types.length === 0)
|
|
541
|
+
return false;
|
|
542
|
+
if (sinkLine == null || !Number.isFinite(sinkLine))
|
|
543
|
+
return false;
|
|
544
|
+
for (const t of types) {
|
|
545
|
+
if (t.kind !== 'class')
|
|
546
|
+
continue;
|
|
547
|
+
if (sinkLine < t.start_line || sinkLine > t.end_line)
|
|
548
|
+
continue;
|
|
549
|
+
for (const impl of t.implements) {
|
|
550
|
+
// `implements` carries simple names from circle-ir; tolerate the
|
|
551
|
+
// generic-parameter form (e.g. `CipherSpi<Foo>` — hypothetical but
|
|
552
|
+
// matches the #111 pattern).
|
|
553
|
+
const simple = impl.replace(/<.*$/, '').trim();
|
|
554
|
+
if (JCA_SPI_TYPES.has(simple))
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
// ---------------------------------------------------------------------------
|
|
309
561
|
// Class-aware MyBatis Interceptor suppression (#111)
|
|
310
562
|
// ---------------------------------------------------------------------------
|
|
311
563
|
/**
|
|
@@ -367,6 +619,104 @@ export function isInsideMybatisInterceptor(types, sinkLine, sinkType) {
|
|
|
367
619
|
return false;
|
|
368
620
|
}
|
|
369
621
|
// ---------------------------------------------------------------------------
|
|
622
|
+
// cognium-ai#172 — XSS FP: response.setContentType("application/json") set
|
|
623
|
+
// earlier in the same method as the writer sink
|
|
624
|
+
// ---------------------------------------------------------------------------
|
|
625
|
+
/**
|
|
626
|
+
* XSS sink types that can be suppressed by an in-scope
|
|
627
|
+
* `setContentType("application/json*")` — see `hasJsonContentTypeInScope`.
|
|
628
|
+
*
|
|
629
|
+
* Kept explicit rather than a broad `startsWith('xss')` so a future
|
|
630
|
+
* `xss_stored` (persisted-payload) sink type won't be inadvertently
|
|
631
|
+
* suppressed by a header set immediately before the write (persisted
|
|
632
|
+
* flows can still be exploitable when re-served without the same header).
|
|
633
|
+
*/
|
|
634
|
+
const JSON_CT_SUPPRESSIBLE_SINK_TYPES = new Set([
|
|
635
|
+
'xss',
|
|
636
|
+
'reflected_xss',
|
|
637
|
+
'dom_xss',
|
|
638
|
+
]);
|
|
639
|
+
/**
|
|
640
|
+
* Regex for the servlet `HttpServletResponse.setContentType("application/json…")`
|
|
641
|
+
* pattern. Match is line-oriented and case-insensitive on the method name +
|
|
642
|
+
* MIME type so `.setContentType("Application/JSON")` still hits.
|
|
643
|
+
*
|
|
644
|
+
* Anchoring:
|
|
645
|
+
* - `setContentType` — method name, dotted or bare (matches
|
|
646
|
+
* `response.setContentType(...)` and `resp.setContentType(...)`)
|
|
647
|
+
* - opening quote → `application/json` — the MIME literal must actually
|
|
648
|
+
* start the string so `"text/html; application/json-hint"` (contrived
|
|
649
|
+
* but possible) doesn't false-positive
|
|
650
|
+
* - `application/json-patch+json` / `application/jsonrequest` etc. are
|
|
651
|
+
* NOT accepted — the `\b` anchor after `json` requires a delimiter
|
|
652
|
+
* (`"`, `;`, whitespace, `+`) that isn't `-` or letters, so `jsonp` /
|
|
653
|
+
* `json-patch` still trigger a browser HTML sniff → keep as XSS.
|
|
654
|
+
*/
|
|
655
|
+
const SET_CONTENT_TYPE_JSON_RE = /setContentType\s*\(\s*["'`]application\/json\b(?![a-z\-])/i;
|
|
656
|
+
/**
|
|
657
|
+
* True if a `setContentType("application/json…")` call appears earlier in
|
|
658
|
+
* the same enclosing method as the sink. Suppresses XSS FPs on servlet
|
|
659
|
+
* `response.getWriter().println(...)` (and equivalent writer sinks) when
|
|
660
|
+
* the response Content-Type is already committed to JSON — modern browsers
|
|
661
|
+
* refuse to interpret an `application/json` body as HTML, so a reflected
|
|
662
|
+
* value in the JSON body can't fire an XSS payload.
|
|
663
|
+
*
|
|
664
|
+
* Confirmed example (cognium-ai#172): calcite-avatica `AvaticaJsonHandler`
|
|
665
|
+
* sets `application/json;charset=utf-8` at line 98 and writes at line 153,
|
|
666
|
+
* flagged as high-severity XSS pre-#172.
|
|
667
|
+
*
|
|
668
|
+
* Bounds are conservative:
|
|
669
|
+
* - Only fires when the sink line is inside a known method (`types` +
|
|
670
|
+
* `methods` + line range all present). Missing bounds → return false
|
|
671
|
+
* → treat as unsuppressed (preserve recall).
|
|
672
|
+
* - Only scans lines strictly BEFORE the sink line, inclusive of the
|
|
673
|
+
* method's opening line — a `setContentType` call AFTER the sink can't
|
|
674
|
+
* protect against the reflected value already having been written.
|
|
675
|
+
* - No cross-method / cross-file inference. If the caller sets JSON on
|
|
676
|
+
* the response and delegates to a helper that writes, the helper
|
|
677
|
+
* method still emits XSS (recall over precision for indirect flows).
|
|
678
|
+
* - Only matches `application/json` MIME literals — NOT `application/
|
|
679
|
+
* json-patch+json`, `application/jsonrequest`, or JSONP (`text/
|
|
680
|
+
* javascript` + a `?callback=` query). See the regex anchor.
|
|
681
|
+
*/
|
|
682
|
+
export function hasJsonContentTypeInScope(sourceCode, types, sinkLine) {
|
|
683
|
+
if (!sourceCode || !types || types.length === 0)
|
|
684
|
+
return false;
|
|
685
|
+
if (sinkLine == null || !Number.isFinite(sinkLine) || sinkLine < 1)
|
|
686
|
+
return false;
|
|
687
|
+
// Locate the enclosing method. Uses the same inclusive-1-indexed bounds
|
|
688
|
+
// as source-classifier.ts::findEnclosing so the two stay consistent.
|
|
689
|
+
let methodStartLine;
|
|
690
|
+
for (const t of types) {
|
|
691
|
+
if (sinkLine < t.start_line || sinkLine > t.end_line)
|
|
692
|
+
continue;
|
|
693
|
+
for (const m of t.methods ?? []) {
|
|
694
|
+
if (sinkLine >= m.start_line && sinkLine <= m.end_line) {
|
|
695
|
+
methodStartLine = m.start_line;
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
if (methodStartLine !== undefined)
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
if (methodStartLine === undefined)
|
|
703
|
+
return false;
|
|
704
|
+
// Scan `[methodStart, sinkLine)` for the setContentType call. `split('\n')`
|
|
705
|
+
// yields a 0-indexed array; lines are 1-indexed in the schema, so line N
|
|
706
|
+
// is at index N-1.
|
|
707
|
+
const lines = sourceCode.split('\n');
|
|
708
|
+
const startIdx = Math.max(0, methodStartLine - 1);
|
|
709
|
+
const endIdx = Math.min(lines.length, sinkLine - 1); // exclusive of sink line
|
|
710
|
+
for (let i = startIdx; i < endIdx; i++) {
|
|
711
|
+
const line = lines[i];
|
|
712
|
+
if (!line)
|
|
713
|
+
continue;
|
|
714
|
+
if (SET_CONTENT_TYPE_JSON_RE.test(line))
|
|
715
|
+
return true;
|
|
716
|
+
}
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
// ---------------------------------------------------------------------------
|
|
370
720
|
// Combined predicate
|
|
371
721
|
// ---------------------------------------------------------------------------
|
|
372
722
|
/**
|
|
@@ -377,25 +727,56 @@ export function isInsideMybatisInterceptor(types, sinkLine, sinkType) {
|
|
|
377
727
|
* it short-circuits the whole table on the bulk-FP case from #94.
|
|
378
728
|
*
|
|
379
729
|
* Backwards-compat: callers passing just `(code, type)` still get
|
|
380
|
-
* the previous behavior — the
|
|
381
|
-
*
|
|
730
|
+
* the previous behavior — the newer `sinkFile`/`types`/`sinkLine`/
|
|
731
|
+
* `sourceCode` args are all optional and gate the individual checks
|
|
732
|
+
* that need them. Callers that omit them get the pre-#172 behavior on
|
|
733
|
+
* that filter (returns false → not suppressed).
|
|
382
734
|
*/
|
|
383
|
-
export function isSuppressedSinkShape(sinkCode, sinkType, sinkFile, types, sinkLine
|
|
735
|
+
export function isSuppressedSinkShape(sinkCode, sinkType, sinkFile, types, sinkLine,
|
|
736
|
+
// cognium-ai#172: full file contents for the JSON-content-type XSS scan.
|
|
737
|
+
// Optional so legacy callers (older tests, runReport invoked without a
|
|
738
|
+
// pattern-match result) get pre-#172 behavior.
|
|
739
|
+
sourceCode) {
|
|
384
740
|
if (isPhantomLineSink(sinkCode))
|
|
385
741
|
return true;
|
|
386
742
|
if (isNosqlOnBrowserFile(sinkType, sinkFile))
|
|
387
743
|
return true;
|
|
744
|
+
// cognium-ai#186: browser-side `.query()` mis-classified as SQL
|
|
745
|
+
// (chrome.tabs.query, navigator.permissions.query, DOM querySelector*)
|
|
746
|
+
// — cheap file-ext + regex, ordered before the more expensive
|
|
747
|
+
// isKnownNonSink pattern table.
|
|
748
|
+
if (isBrowserQueryApi(sinkCode, sinkType, sinkFile))
|
|
749
|
+
return true;
|
|
750
|
+
// cognium-ai#167 gates 5, 6, 7 — library-internal FPs for XPath /
|
|
751
|
+
// XXE / crypto. Each is a fully-qualified-package match on the sink
|
|
752
|
+
// file (semver-stable, doesn't depend on repo name). Cheap regex, no
|
|
753
|
+
// TypeScript source read required; ordered before isKnownNonSink so
|
|
754
|
+
// the more expensive pattern table isn't reached for these buckets.
|
|
755
|
+
if (isXPathLibraryInternal(sinkType, sinkFile))
|
|
756
|
+
return true;
|
|
757
|
+
if (isXxeOnParserLibrary(sinkType, sinkFile))
|
|
758
|
+
return true;
|
|
759
|
+
if (isCryptoLibraryInternal(sinkType, sinkFile, types, sinkLine))
|
|
760
|
+
return true;
|
|
388
761
|
if (isRequireOrImportSink(sinkCode))
|
|
389
762
|
return true;
|
|
390
763
|
if (isKnownNonSink(sinkCode, sinkType))
|
|
391
764
|
return true;
|
|
392
|
-
// #111: class-aware MyBatis Interceptor suppression. Last
|
|
393
|
-
// needs `types` + `sinkLine`, both of which
|
|
394
|
-
// legacy code paths (older test callers, runReport
|
|
395
|
-
// pattern-match result). When omitted the predicate
|
|
396
|
-
// and behavior is unchanged.
|
|
765
|
+
// #111: class-aware MyBatis Interceptor suppression. Last of the
|
|
766
|
+
// pre-#172 checks because it needs `types` + `sinkLine`, both of which
|
|
767
|
+
// may be unavailable on legacy code paths (older test callers, runReport
|
|
768
|
+
// invoked without a pattern-match result). When omitted the predicate
|
|
769
|
+
// returns false and behavior is unchanged.
|
|
397
770
|
if (isInsideMybatisInterceptor(types, sinkLine, sinkType))
|
|
398
771
|
return true;
|
|
772
|
+
// cognium-ai#172: XSS on servlet writer sink with `application/json`
|
|
773
|
+
// Content-Type committed earlier in the same method. Guarded by
|
|
774
|
+
// sink-type check so non-XSS findings never pay the source scan cost.
|
|
775
|
+
if (sinkType &&
|
|
776
|
+
JSON_CT_SUPPRESSIBLE_SINK_TYPES.has(sinkType) &&
|
|
777
|
+
hasJsonContentTypeInScope(sourceCode, types, sinkLine)) {
|
|
778
|
+
return true;
|
|
779
|
+
}
|
|
399
780
|
return false;
|
|
400
781
|
}
|
|
401
782
|
//# sourceMappingURL=sink-filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink-filters.js","sourceRoot":"","sources":["../../src/security-scan/sink-filters.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sink-filters.js","sourceRoot":"","sources":["../../src/security-scan/sink-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,6EAA6E;AAC7E,uEAAuE;AACvE,kEAAkE;AAClE,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,UAAU,iBAAiB,CAAC,IAA+B;IAC/D,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,yDAAyD;IACzD,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,+CAA+C;IAC/C,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,sDAAsD;IACtD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,oBAAoB,GACxB,mEAAmE,CAAC;AAEtE,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAkED;;;;GAIG;AACH,MAAM,oBAAoB,GAAG;IAC3B,eAAe;IACf,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,KAAK;IACL,gBAAgB;IAChB,iBAAiB;IACjB,MAAM;IACN,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;CACZ,CAAC;AAEX,MAAM,iBAAiB,GAAqB;IAC1C,uBAAuB;IACvB,EAAE,OAAO,EAAE,8BAA8B,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IACnF,EAAE,OAAO,EAAE,wCAAwC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IAE7F,mEAAmE;IACnE,EAAE,OAAO,EAAE,iCAAiC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,KAAK,EAAE;IACzF,EAAE,OAAO,EAAE,2CAA2C,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,KAAK,EAAE;IACnG,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,KAAK,EAAE;IACpG,8DAA8D;IAC9D,sEAAsE;IACtE,4DAA4D;IAC5D,mEAAmE;IACnE,EAAE,OAAO,EAAE,+DAA+D,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,KAAK,EAAE;IAEvH,4DAA4D;IAC5D,+DAA+D;IAC/D,sEAAsE;IACtE,4DAA4D;IAC5D,gEAAgE;IAChE,2CAA2C;IAC3C,oEAAoE;IACpE,yDAAyD;IACzD,qDAAqD;IACrD;QACE,OAAO,EAAE,+FAA+F;QACxG,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,KAAK;KACX;IAED,sDAAsD;IACtD,mEAAmE;IACnE,sEAAsE;IACtE,EAAE,OAAO,EAAE,qDAAqD,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE;IAC3G,2EAA2E;IAC3E,uDAAuD;IACvD,EAAE,OAAO,EAAE,kDAAkD,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE;IACxG,qCAAqC;IACrC,EAAE,OAAO,EAAE,oDAAoD,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE;IAC1G,0DAA0D;IAC1D,EAAE,OAAO,EAAE,6CAA6C,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE;IACnG,4CAA4C;IAC5C,EAAE,OAAO,EAAE,uDAAuD,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE;IAE7G,8DAA8D;IAC9D,oEAAoE;IACpE,EAAE,OAAO,EAAE,uCAAuC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IAC5F,8DAA8D;IAC9D,sEAAsE;IACtE,kDAAkD;IAClD,EAAE,OAAO,EAAE,uDAAuD,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IAC5G,8EAA8E;IAC9E,EAAE,OAAO,EAAE,qDAAqD,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IAC1G,6DAA6D;IAC7D,sEAAsE;IACtE,2CAA2C;IAC3C,EAAE,OAAO,EAAE,gCAAgC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE;IAErF,4DAA4D;IAC5D,+CAA+C;IAC/C,kDAAkD;IAClD,6DAA6D;IAC7D,iEAAiE;IACjE,qEAAqE;IACrE,iEAAiE;IACjE,oEAAoE;IACpE,gEAAgE;IAChE,kEAAkE;IAClE,uCAAuC;IACvC,EAAE;IACF,qBAAqB;IACrB,+CAA+C;IAC/C,mEAAmE;IACnE,8DAA8D;IAC9D,qEAAqE;IACrE,+DAA+D;IAC/D,gEAAgE;IAChE,yDAAyD;IACzD,EAAE;IACF,kEAAkE;IAClE,iEAAiE;IACjE,mCAAmC;IAEnC,4DAA4D;IAC5D;QACE,OAAO,EACL,iJAAiJ;QACnJ,QAAQ,EAAE,oBAAoB;QAC9B,GAAG,EAAE,MAAM;KACZ;IACD,gCAAgC;IAChC;QACE,OAAO,EACL,iKAAiK;QACnK,QAAQ,EAAE,oBAAoB;QAC9B,GAAG,EAAE,MAAM;KACZ;IACD,0EAA0E;IAC1E;QACE,OAAO,EACL,kIAAkI;QACpI,QAAQ,EAAE,oBAAoB;QAC9B,GAAG,EAAE,MAAM;KACZ;IACD,gCAAgC;IAChC;QACE,OAAO,EACL,wIAAwI;QAC1I,QAAQ,EAAE,oBAAoB;QAC9B,GAAG,EAAE,MAAM;KACZ;IAED,yEAAyE;IACzE,oEAAoE;IACpE,kEAAkE;IAClE,iEAAiE;IACjE,qEAAqE;IACrE,mEAAmE;IACnE,iCAAiC;IACjC,EAAE;IACF,8DAA8D;IAC9D,sEAAsE;IACtE,gEAAgE;IAChE,wEAAwE;IACxE,mEAAmE;IACnE,qEAAqE;IACrE,6DAA6D;IAC7D,4DAA4D;IAC5D,4DAA4D;IAC5D,kEAAkE;IAClE,wBAAwB;IACxB,EAAE;IACF,gEAAgE;IAChE,kEAAkE;IAClE,2DAA2D;IAC3D,oEAAoE;IACpE,sEAAsE;IACtE,gEAAgE;IAChE,mDAAmD;IACnD,EAAE;IACF,oEAAoE;IACpE,qCAAqC;IAErC,qDAAqD;IACrD;QACE,OAAO,EACL,sHAAsH;QACxH,QAAQ,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;QAC7C,GAAG,EAAE,WAAW;KACjB;IACD,qEAAqE;IACrE;QACE,OAAO,EAAE,4DAA4D;QACrE,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,WAAW;KACjB;IACD,6DAA6D;IAC7D,iEAAiE;IACjE,+DAA+D;IAC/D,iEAAiE;IACjE,oEAAoE;IACpE;QACE,OAAO,EACL,+KAA+K;QACjL,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,WAAW;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAA+B,EAC/B,QAAmC;IAEnC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3C,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/B,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAC5B,OAAO,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,yEAAyE;AACzE,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAElF;;;;;;;;;;;;;;GAcG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,IAA+B;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAmC,EACnC,QAAmC;IAEnC,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,qCAAqC,GAAG,IAAI,GAAG,CAAC;IACpD,eAAe;IACf,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,gBAAgB,GACpB,6LAA6L,CAAC;AAEhM,MAAM,wBAAwB,GAC5B,kDAAkD,CAAC;AAErD,MAAM,qBAAqB,GACzB,+FAA+F,CAAC;AAElG;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmC,EACnC,QAAmC,EACnC,QAAmC;IAEnC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,qCAAqC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,sEAAsE;IACtE,sEAAsE;IACtE,sEAAsE;IACtE,sEAAsE;IACtE,kEAAkE;IAClE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,EAAE;AACF,sEAAsE;AACtE,uDAAuD;AACvD,0EAA0E;AAC1E,0CAA0C;AAC1C,2EAA2E;AAC3E,4EAA4E;AAE5E;;;mEAGmE;AACnE,MAAM,qBAAqB,GACzB,0EAA0E,CAAC;AAE7E;;yEAEyE;AACzE,MAAM,0BAA0B,GAAG,oCAAoC,CAAC;AAExE;;;wEAGwE;AACxE,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEzE;gDACgD;AAChD,MAAM,sBAAsB,GAC1B,yFAAyF,CAAC;AAE5F;;;;wDAIwD;AACxD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,WAAW;IACX,QAAQ;IACR,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,wBAAwB;IACxB,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAmC,EACnC,QAAmC;IAEnC,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAmC,EACnC,QAAmC;IAEnC,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAmC,EACnC,QAAmC,EACnC,KAAkD,EAClD,QAAmC;IAEnC,IAAI,CAAC,QAAQ,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,gCAAgC;IAChC,IAAI,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QACjC,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC/D,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAChC,iEAAiE;YACjE,mEAAmE;YACnE,6BAA6B;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IAC7C,mBAAmB;IACnB,aAAa;IACb,UAAU;IACV,mBAAmB;IACnB,kBAAkB;IAClB,wEAAwE;IACxE,qEAAqE;IACrE,qCAAqC;CACtC,CAAC,CAAC;AAEH,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC;IAC9C,eAAe;IACf,gBAAgB;IAChB,mBAAmB;CACpB,CAAC,CAAC;AA4BH,MAAM,UAAU,0BAA0B,CACxC,KAAkD,EAClD,QAAmC,EACnC,QAAmC;IAEnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC,QAAQ,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QACjC,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC/D,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAChC,iEAAiE;YACjE,6DAA6D;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,8BAA8B,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,gDAAgD;AAChD,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC;IAC9C,KAAK;IACL,eAAe;IACf,SAAS;CACV,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,wBAAwB,GAC5B,4DAA4D,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAqC,EACrC,KAAkD,EAClD,QAAmC;IAEnC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjF,wEAAwE;IACxE,qEAAqE;IACrE,IAAI,eAAmC,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC/D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAChC,IAAI,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACvD,eAAe,GAAG,CAAC,CAAC,UAAU,CAAC;gBAC/B,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,eAAe,KAAK,SAAS;YAAE,MAAM;IAC3C,CAAC;IACD,IAAI,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEhD,4EAA4E;IAC5E,yEAAyE;IACzE,mBAAmB;IACnB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB;IAC9E,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAmC,EACnC,QAAmC,EACnC,QAAoC,EACpC,KAAuC,EACvC,QAAwB;AACxB,yEAAyE;AACzE,uEAAuE;AACvE,+CAA+C;AAC/C,UAA0B;IAE1B,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,gEAAgE;IAChE,uEAAuE;IACvE,8DAA8D;IAC9D,gCAAgC;IAChC,IAAI,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,kEAAkE;IAClE,oEAAoE;IACpE,qEAAqE;IACrE,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,IAAI,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,qBAAqB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,iEAAiE;IACjE,uEAAuE;IACvE,yEAAyE;IACzE,sEAAsE;IACtE,2CAA2C;IAC3C,IAAI,0BAA0B,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,qEAAqE;IACrE,gEAAgE;IAChE,sEAAsE;IACtE,IACE,QAAQ;QACR,+BAA+B,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7C,yBAAyB,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,EACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-validation.d.ts","sourceRoot":"","sources":["../../../src/trust/passes/input-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"input-validation.d.ts","sourceRoot":"","sources":["../../../src/trust/passes/input-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAC;AAOrB,yEAAyE;AACzE,QAAA,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,CAW7B,CAAC;AAEH,8DAA8D;AAC9D,QAAA,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAE9B,CAAC;AACH,QAAA,MAAM,UAAU,EAAE,GAAG,CAAC,MAAM,CAE1B,CAAC;AAMH,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC9B;AAgBD,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,CAAC,CA4G1B;AAGD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Falls back gracefully (score 100 + info) when no CircleIR data is available.
|
|
11
11
|
*/
|
|
12
|
+
import { isBrowserQueryApi } from '../../security-scan/sink-filters.js';
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
13
14
|
// Constants
|
|
14
15
|
// ---------------------------------------------------------------------------
|
|
@@ -67,9 +68,29 @@ export async function inputValidationPass(projectPath, options = {}) {
|
|
|
67
68
|
let sanitizedFlows = 0;
|
|
68
69
|
for (const ir of options.circleIRResults) {
|
|
69
70
|
const file = ir.meta?.file ?? 'unknown';
|
|
71
|
+
// cognium-ai#186: build a line -> sink.code lookup so we can gate flows
|
|
72
|
+
// through `isBrowserQueryApi`. Same file resolves to the same sink line
|
|
73
|
+
// regardless of which source flowed into it, so a Map keyed on sink_line
|
|
74
|
+
// is enough. Missing sinks (line absent from the map) fall through to
|
|
75
|
+
// pre-#186 behavior.
|
|
76
|
+
const sinksByLine = new Map();
|
|
77
|
+
for (const sink of ir.taint?.sinks ?? []) {
|
|
78
|
+
if (typeof sink.line === 'number' && typeof sink.code === 'string') {
|
|
79
|
+
sinksByLine.set(sink.line, sink.code);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
70
82
|
for (const flow of ir.taint?.flows ?? []) {
|
|
71
83
|
if (!INPUT_SOURCES.has(flow.source_type))
|
|
72
84
|
continue;
|
|
85
|
+
// cognium-ai#186: browser `.query()` / `querySelector*` on renderer
|
|
86
|
+
// file types (`.ts` / `.js` / `.html` / `.vue` / …) — Chrome extension
|
|
87
|
+
// APIs and Web APIs share the `.query()` method name with SQL drivers.
|
|
88
|
+
// Drop the flow entirely (not counted in totalFlows) so the coverage
|
|
89
|
+
// score isn't dragged down by a non-vulnerability. Guarded on the
|
|
90
|
+
// presence of sink.code — without it the filter is a no-op.
|
|
91
|
+
const sinkCode = sinksByLine.get(flow.sink_line);
|
|
92
|
+
if (isBrowserQueryApi(sinkCode, flow.sink_type, file))
|
|
93
|
+
continue;
|
|
73
94
|
totalFlows++;
|
|
74
95
|
if (flow.sanitized) {
|
|
75
96
|
sanitizedFlows++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-validation.js","sourceRoot":"","sources":["../../../src/trust/passes/input-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"input-validation.js","sourceRoot":"","sources":["../../../src/trust/passes/input-validation.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.34.0",
|
|
4
4
|
"description": "LLM-enhanced SAST analysis built on circle-ir",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"@ax-llm/ax": "^20.0.0",
|
|
98
98
|
"@cognium/project-profile-detect": "^1.1.0",
|
|
99
99
|
"@mastra/core": "^1.18.0",
|
|
100
|
-
"circle-ir": "3.
|
|
100
|
+
"circle-ir": "3.150.0",
|
|
101
101
|
"minimatch": "^10.2.5",
|
|
102
102
|
"p-queue": "^9.1.0"
|
|
103
103
|
},
|