@clear-capabilities/agentic-security-scanner 0.76.1 → 0.78.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.
Files changed (108) hide show
  1. package/bin/.agentic-security/findings.json +320 -9
  2. package/bin/.agentic-security/last-scan.json +320 -9
  3. package/bin/.agentic-security/last-scan.json.sig +1 -1
  4. package/bin/.agentic-security/scan-history.json +17 -377
  5. package/bin/.agentic-security/streak.json +11 -16
  6. package/bin/agentic-security.js +33 -2
  7. package/dist/178.index.js +1 -1
  8. package/dist/384.index.js +1 -1
  9. package/dist/637.index.js +1 -1
  10. package/dist/718.index.js +106 -0
  11. package/dist/824.index.js +126 -0
  12. package/dist/838.index.js +1 -1
  13. package/dist/agentic-security.mjs +32 -32
  14. package/dist/agentic-security.mjs.sha256 +1 -1
  15. package/package.json +7 -7
  16. package/src/.agentic-security/findings.json +5731 -3933
  17. package/src/.agentic-security/last-scan.json +5731 -3933
  18. package/src/.agentic-security/last-scan.json.sig +1 -1
  19. package/src/.agentic-security/scan-history.json +2533 -887
  20. package/src/.agentic-security/streak.json +11 -16
  21. package/src/dataflow/.agentic-security/findings.json +52 -24
  22. package/src/dataflow/.agentic-security/last-scan.json +52 -24
  23. package/src/dataflow/.agentic-security/last-scan.json.sig +1 -1
  24. package/src/dataflow/.agentic-security/scan-history.json +101 -134
  25. package/src/dataflow/.agentic-security/streak.json +8 -10
  26. package/src/dataflow/async-sequencing.js +16 -7
  27. package/src/dataflow/builtin-summaries.js +131 -0
  28. package/src/dataflow/catalog.js +107 -0
  29. package/src/dataflow/cross-repo.js +75 -1
  30. package/src/dataflow/engine.js +129 -0
  31. package/src/dataflow/implicit-flow.js +24 -6
  32. package/src/dataflow/stub-aware-filter.js +69 -11
  33. package/src/dataflow/summaries.js +28 -3
  34. package/src/engine-parallel.js +70 -0
  35. package/src/engine.js +165 -15
  36. package/src/ir/.agentic-security/findings.json +757 -16
  37. package/src/ir/.agentic-security/last-scan.json +757 -16
  38. package/src/ir/.agentic-security/last-scan.json.sig +1 -1
  39. package/src/ir/.agentic-security/scan-history.json +545 -138
  40. package/src/ir/.agentic-security/streak.json +11 -13
  41. package/src/ir/index.js +22 -1
  42. package/src/ir/parser-go.js +403 -0
  43. package/src/ir/parser-js.js +2 -0
  44. package/src/ir/parser-php.js +330 -0
  45. package/src/ir/parser-py.helper.py +137 -11
  46. package/src/ir/parser-rb.js +309 -0
  47. package/src/posture/.agentic-security/findings.json +407 -84
  48. package/src/posture/.agentic-security/last-scan.json +407 -84
  49. package/src/posture/.agentic-security/last-scan.json.sig +1 -1
  50. package/src/posture/.agentic-security/scan-history.json +16 -4923
  51. package/src/posture/.agentic-security/streak.json +10 -14
  52. package/src/posture/calibration.js +14 -0
  53. package/src/posture/triage.js +13 -0
  54. package/src/report/.agentic-security/findings.json +6 -5
  55. package/src/report/.agentic-security/last-scan.json +6 -5
  56. package/src/report/.agentic-security/last-scan.json.sig +1 -1
  57. package/src/report/.agentic-security/scan-history.json +3 -300
  58. package/src/report/.agentic-security/streak.json +7 -8
  59. package/src/report/index.js +23 -2
  60. package/src/sast/.agentic-security/findings.json +195 -56
  61. package/src/sast/.agentic-security/last-scan.json +195 -56
  62. package/src/sast/.agentic-security/last-scan.json.sig +1 -1
  63. package/src/sast/.agentic-security/scan-history.json +14 -394
  64. package/src/sast/.agentic-security/streak.json +10 -13
  65. package/src/sast/cache-poisoning.js +77 -0
  66. package/src/sast/comparison-safety.js +73 -0
  67. package/src/sast/db-taint.js +54 -0
  68. package/src/sast/graphql.js +127 -0
  69. package/src/sast/llm-stored-prompt.js +57 -0
  70. package/src/sast/mutation-xss.js +43 -0
  71. package/src/sast/nosql-injection.js +5 -0
  72. package/src/sast/null-byte-injection.js +76 -0
  73. package/src/sast/redos-nfa.js +338 -0
  74. package/src/sast/sensitive-data-logging.js +73 -0
  75. package/src/sast/weak-password-hash.js +77 -0
  76. package/src/sast/weak-randomness.js +100 -0
  77. package/src/sca/.agentic-security/findings.json +502 -11
  78. package/src/sca/.agentic-security/last-scan.json +502 -11
  79. package/src/sca/.agentic-security/last-scan.json.sig +1 -1
  80. package/src/sca/.agentic-security/scan-history.json +19 -1
  81. package/src/sca/.agentic-security/streak.json +6 -6
  82. package/src/sca/llm-function-extract.js +107 -0
  83. package/src/sca/vendor-detect.js +91 -0
  84. package/dist/218.index.js +0 -793
  85. package/dist/601.index.js +0 -1038
  86. package/dist/634.index.js +0 -1892
  87. package/src/integrations/.agentic-security/findings.json +0 -1504
  88. package/src/integrations/.agentic-security/last-scan.json +0 -1504
  89. package/src/integrations/.agentic-security/scan-history.json +0 -40
  90. package/src/integrations/.agentic-security/streak.json +0 -21
  91. package/src/llm-validator/.agentic-security/findings.json +0 -1891
  92. package/src/llm-validator/.agentic-security/last-scan.json +0 -1891
  93. package/src/llm-validator/.agentic-security/last-scan.json.sig +0 -1
  94. package/src/llm-validator/.agentic-security/scan-history.json +0 -168
  95. package/src/llm-validator/.agentic-security/streak.json +0 -20
  96. package/src/lsp/.agentic-security/findings.json +0 -28
  97. package/src/lsp/.agentic-security/last-scan.json +0 -28
  98. package/src/lsp/.agentic-security/scan-history.json +0 -79
  99. package/src/lsp/.agentic-security/streak.json +0 -22
  100. package/src/mcp/.agentic-security/findings.json +0 -8403
  101. package/src/mcp/.agentic-security/last-scan.json +0 -8403
  102. package/src/mcp/.agentic-security/last-scan.json.sig +0 -1
  103. package/src/mcp/.agentic-security/scan-history.json +0 -1182
  104. package/src/mcp/.agentic-security/streak.json +0 -22
  105. package/src/sast/bench-shape/.agentic-security/findings.json +0 -28
  106. package/src/sast/bench-shape/.agentic-security/last-scan.json +0 -28
  107. package/src/sast/bench-shape/.agentic-security/scan-history.json +0 -24
  108. package/src/sast/bench-shape/.agentic-security/streak.json +0 -22
@@ -1,9 +1,9 @@
1
1
  {
2
- "scanId": "e3eb4e8f-6086-4f67-abc4-9f0666ae3092",
3
- "startedAt": "2026-05-20T17:01:27.260Z",
4
- "durationMs": 291,
2
+ "scanId": "1a8e7623-7074-46ec-9fe6-a8a0d25ee3c6",
3
+ "startedAt": "2026-05-27T02:22:41.834Z",
4
+ "durationMs": 363,
5
5
  "scanned": {
6
- "files": 12,
6
+ "files": 15,
7
7
  "lines": 0
8
8
  },
9
9
  "findings": [
@@ -117,6 +117,7 @@
117
117
  "unvalidated": true,
118
118
  "cross_language": false,
119
119
  "family": "mass-assignment",
120
+ "parser": "STRUCTURAL",
120
121
  "_unsigned": false,
121
122
  "_passThroughSigning": false,
122
123
  "signatureStatus": "verified",
@@ -152,9 +153,493 @@
152
153
  "shell-execution"
153
154
  ],
154
155
  "cloneClusterId": "a0c829a31c63bf1a",
155
- "cloneClusterSize": 2,
156
+ "cloneClusterSize": 5,
157
+ "provenance": "human-likely",
158
+ "provenanceScore": 0.08,
159
+ "typeNarrowed": null,
160
+ "strideCategory": null,
161
+ "personaScores": {
162
+ "script-kiddie": {
163
+ "score": 0.65,
164
+ "tier": "high",
165
+ "factors": [
166
+ "sev:high"
167
+ ]
168
+ },
169
+ "opportunistic-criminal": {
170
+ "score": 0.85,
171
+ "tier": "critical",
172
+ "factors": [
173
+ "sev:high",
174
+ "bias:mass-assignment+0.20"
175
+ ]
176
+ },
177
+ "apt-nation-state": {
178
+ "score": 0.65,
179
+ "tier": "high",
180
+ "factors": [
181
+ "sev:high"
182
+ ]
183
+ },
184
+ "supply-chain-attacker": {
185
+ "score": 0.65,
186
+ "tier": "high",
187
+ "factors": [
188
+ "sev:high"
189
+ ]
190
+ },
191
+ "malicious-insider": {
192
+ "score": 1,
193
+ "tier": "critical",
194
+ "factors": [
195
+ "sev:high",
196
+ "bias:mass-assignment+0.25",
197
+ "authz-bypass-favored"
198
+ ]
199
+ }
200
+ },
201
+ "personaTopTwo": [
202
+ "malicious-insider",
203
+ "opportunistic-criminal"
204
+ ],
205
+ "personaMaxName": "malicious-insider",
206
+ "personaMaxScore": 1,
207
+ "reverseExposure": null,
208
+ "specMined": null,
209
+ "whyFired": {
210
+ "detector": "sast/mass-assignment",
211
+ "ruleId": "CWE-915",
212
+ "parser": "STRUCTURAL",
213
+ "evidence": {
214
+ "sinkSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
215
+ "sourceSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
216
+ "pathSteps": [],
217
+ "sanitizers": [],
218
+ "guards": []
219
+ },
220
+ "considered": {
221
+ "suppressionsApplied": [],
222
+ "suppressionsSkipped": [],
223
+ "reachabilityFilter": "unaffected",
224
+ "clusterCollapsed": false,
225
+ "typeNarrowed": false,
226
+ "crownJewelTier": "low-value",
227
+ "mitigationVerdict": "unreachable-in-prod"
228
+ },
229
+ "scanner": {
230
+ "rulesetVersion": null,
231
+ "packHash": null,
232
+ "modelId": null
233
+ }
234
+ },
235
+ "adversaryTranscript": null,
236
+ "predictedBountyUsd": {
237
+ "low": 50,
238
+ "likely": 200,
239
+ "high": 600,
240
+ "program": "web2"
241
+ },
242
+ "bountyConfidence": "medium",
243
+ "attackPlaybook": {
244
+ "cwe": "CWE-915",
245
+ "kind": "curl",
246
+ "title": "Mass assignment — privilege escalation probe",
247
+ "instruction": "Submit an extra field (role) on profile update; verify it sticks.",
248
+ "script": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test.\n# CWE-915 — Mass assignment\ncurl -s -i -X PATCH \"${TARGET_URL}/api/me\" \\\n -H \"Authorization: Bearer ${TEST_TOKEN}\" -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"x\",\"role\":\"admin\"}'\n# Confirmed when subsequent /api/me returns role=admin.",
249
+ "ethics": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test."
250
+ }
251
+ },
252
+ {
253
+ "id": "struct:parser-go.js:253:Mass_Assignment_(req.body_Direct_to_Model)",
254
+ "kind": "sast",
255
+ "severity": "high",
256
+ "vuln": "Mass Assignment (req.body Direct to Model)",
257
+ "cwe": "CWE-915",
258
+ "owaspLlm": null,
259
+ "stride": "Tampering",
260
+ "file": "parser-go.js",
261
+ "line": 253,
262
+ "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
263
+ "fix": null,
264
+ "reachable": false,
265
+ "triage": 39,
266
+ "dataClasses": [],
267
+ "chain": null,
268
+ "confidence": 0.314,
269
+ "toxicity": 35,
270
+ "toxicityFactors": [
271
+ "high-severity",
272
+ "http-facing"
273
+ ],
274
+ "toxicityLabel": "Medium",
275
+ "sources": null,
276
+ "epssScore": null,
277
+ "epssPercentile": null,
278
+ "epssCve": null,
279
+ "exploitedNow": false,
280
+ "tags": null,
281
+ "blastRadius": {
282
+ "scope": "all-users",
283
+ "dataAtRisk": [
284
+ "config"
285
+ ],
286
+ "userCount": 50,
287
+ "industry": "generic",
288
+ "jurisdictions": [],
289
+ "controlsApplied": [],
290
+ "dollarBest": 23250,
291
+ "dollarLikely": 136250,
292
+ "dollarWorst": 775000,
293
+ "dollarLow": 23250,
294
+ "dollarHigh": 775000,
295
+ "components": {
296
+ "incidentResponse": {
297
+ "low": 8000,
298
+ "likely": 50000,
299
+ "high": 250000
300
+ },
301
+ "legal": {
302
+ "low": 10000,
303
+ "likely": 75000,
304
+ "high": 500000
305
+ },
306
+ "crisisPR": {
307
+ "low": 0,
308
+ "likely": 0,
309
+ "high": 0
310
+ },
311
+ "notification": {
312
+ "low": 5000,
313
+ "likely": 10000,
314
+ "high": 15000
315
+ },
316
+ "creditMonitoring": {
317
+ "low": 0,
318
+ "likely": 0,
319
+ "high": 0
320
+ },
321
+ "regulatoryFines": {
322
+ "low": 0,
323
+ "likely": 0,
324
+ "high": 0
325
+ },
326
+ "directDamage": {
327
+ "low": 250,
328
+ "likely": 1250,
329
+ "high": 10000
330
+ },
331
+ "classAction": {
332
+ "low": 0,
333
+ "likely": 0,
334
+ "high": 0
335
+ },
336
+ "lostBusiness": {
337
+ "low": 0,
338
+ "likely": 0,
339
+ "high": 0
340
+ }
341
+ },
342
+ "dominantDriver": "legal counsel",
343
+ "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
344
+ "confidence": "low",
345
+ "narrative": "Mass Assignment (req.body Direct to Model) on `parser-go.js:253` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: GitHub mass-assignment 2012 → public ridicule + emergency rebuild."
346
+ },
347
+ "stableId": "a28da8de4671367b",
348
+ "confidenceTier": "low",
349
+ "exploitability": 0.45,
350
+ "exploitabilityTier": "medium",
351
+ "exploitabilityFactors": [
352
+ "sev:high",
353
+ "unreachable"
354
+ ],
355
+ "clusterSize": null,
356
+ "unreachable": false,
357
+ "validator_verdict": "unvalidated",
358
+ "llm_confidence": null,
359
+ "unvalidated": true,
360
+ "cross_language": false,
361
+ "family": "mass-assignment",
362
+ "parser": "STRUCTURAL",
363
+ "_unsigned": false,
364
+ "_passThroughSigning": false,
365
+ "signatureStatus": "verified",
366
+ "regression_test": null,
367
+ "poc": null,
368
+ "calibrated_confidence": null,
369
+ "calibrated_confidence_ci": null,
370
+ "calibrated_n": 5,
371
+ "calibration_reason": "insufficient-samples",
372
+ "verifier_verdict": "cannot-verify",
373
+ "verifier_reason": "no-poc-no-sanitizer-rule",
374
+ "verifier_runner": null,
375
+ "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-go.js:?. Severity: high. Review the remediation field for class-specific guidance.",
376
+ "mitigationVerdict": "unreachable-in-prod",
377
+ "mitigationsApplied": [],
378
+ "mitigatedByWaf": false,
379
+ "wafRuleId": null,
380
+ "mitigatedByAuth": false,
381
+ "authMechanism": null,
382
+ "mitigatedByNetwork": false,
383
+ "networkExposure": null,
384
+ "featureFlag": null,
385
+ "featureFlagState": null,
386
+ "featureFlagRollout": null,
387
+ "exposedInProd": false,
388
+ "unreachableInProd": true,
389
+ "coldPath": false,
390
+ "hotPath": false,
391
+ "prodRequestCount": null,
392
+ "crownJewelScore": 0.15,
393
+ "crownJewelTier": "low-value",
394
+ "crownJewelFactors": [
395
+ "shell-execution"
396
+ ],
397
+ "cloneClusterId": "a0c829a31c63bf1a",
398
+ "cloneClusterSize": 5,
399
+ "provenance": "human-likely",
400
+ "provenanceScore": 0,
401
+ "typeNarrowed": null,
402
+ "strideCategory": null,
403
+ "personaScores": {
404
+ "script-kiddie": {
405
+ "score": 0.65,
406
+ "tier": "high",
407
+ "factors": [
408
+ "sev:high"
409
+ ]
410
+ },
411
+ "opportunistic-criminal": {
412
+ "score": 0.85,
413
+ "tier": "critical",
414
+ "factors": [
415
+ "sev:high",
416
+ "bias:mass-assignment+0.20"
417
+ ]
418
+ },
419
+ "apt-nation-state": {
420
+ "score": 0.65,
421
+ "tier": "high",
422
+ "factors": [
423
+ "sev:high"
424
+ ]
425
+ },
426
+ "supply-chain-attacker": {
427
+ "score": 0.65,
428
+ "tier": "high",
429
+ "factors": [
430
+ "sev:high"
431
+ ]
432
+ },
433
+ "malicious-insider": {
434
+ "score": 1,
435
+ "tier": "critical",
436
+ "factors": [
437
+ "sev:high",
438
+ "bias:mass-assignment+0.25",
439
+ "authz-bypass-favored"
440
+ ]
441
+ }
442
+ },
443
+ "personaTopTwo": [
444
+ "malicious-insider",
445
+ "opportunistic-criminal"
446
+ ],
447
+ "personaMaxName": "malicious-insider",
448
+ "personaMaxScore": 1,
449
+ "reverseExposure": null,
450
+ "specMined": null,
451
+ "whyFired": {
452
+ "detector": "sast/mass-assignment",
453
+ "ruleId": "CWE-915",
454
+ "parser": "STRUCTURAL",
455
+ "evidence": {
456
+ "sinkSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
457
+ "sourceSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
458
+ "pathSteps": [],
459
+ "sanitizers": [],
460
+ "guards": []
461
+ },
462
+ "considered": {
463
+ "suppressionsApplied": [],
464
+ "suppressionsSkipped": [],
465
+ "reachabilityFilter": "unaffected",
466
+ "clusterCollapsed": false,
467
+ "typeNarrowed": false,
468
+ "crownJewelTier": "low-value",
469
+ "mitigationVerdict": "unreachable-in-prod"
470
+ },
471
+ "scanner": {
472
+ "rulesetVersion": null,
473
+ "packHash": null,
474
+ "modelId": null
475
+ }
476
+ },
477
+ "adversaryTranscript": null,
478
+ "predictedBountyUsd": {
479
+ "low": 50,
480
+ "likely": 200,
481
+ "high": 600,
482
+ "program": "web2"
483
+ },
484
+ "bountyConfidence": "medium",
485
+ "attackPlaybook": {
486
+ "cwe": "CWE-915",
487
+ "kind": "curl",
488
+ "title": "Mass assignment — privilege escalation probe",
489
+ "instruction": "Submit an extra field (role) on profile update; verify it sticks.",
490
+ "script": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test.\n# CWE-915 — Mass assignment\ncurl -s -i -X PATCH \"${TARGET_URL}/api/me\" \\\n -H \"Authorization: Bearer ${TEST_TOKEN}\" -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"x\",\"role\":\"admin\"}'\n# Confirmed when subsequent /api/me returns role=admin.",
491
+ "ethics": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test."
492
+ }
493
+ },
494
+ {
495
+ "id": "struct:parser-kt.js:207:Mass_Assignment_(req.body_Direct_to_Model)",
496
+ "kind": "sast",
497
+ "severity": "high",
498
+ "vuln": "Mass Assignment (req.body Direct to Model)",
499
+ "cwe": "CWE-915",
500
+ "owaspLlm": null,
501
+ "stride": "Tampering",
502
+ "file": "parser-kt.js",
503
+ "line": 207,
504
+ "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
505
+ "fix": null,
506
+ "reachable": false,
507
+ "triage": 39,
508
+ "dataClasses": [],
509
+ "chain": null,
510
+ "confidence": 0.314,
511
+ "toxicity": 35,
512
+ "toxicityFactors": [
513
+ "high-severity",
514
+ "http-facing"
515
+ ],
516
+ "toxicityLabel": "Medium",
517
+ "sources": null,
518
+ "epssScore": null,
519
+ "epssPercentile": null,
520
+ "epssCve": null,
521
+ "exploitedNow": false,
522
+ "tags": null,
523
+ "blastRadius": {
524
+ "scope": "all-users",
525
+ "dataAtRisk": [
526
+ "config"
527
+ ],
528
+ "userCount": 50,
529
+ "industry": "generic",
530
+ "jurisdictions": [],
531
+ "controlsApplied": [],
532
+ "dollarBest": 23250,
533
+ "dollarLikely": 136250,
534
+ "dollarWorst": 775000,
535
+ "dollarLow": 23250,
536
+ "dollarHigh": 775000,
537
+ "components": {
538
+ "incidentResponse": {
539
+ "low": 8000,
540
+ "likely": 50000,
541
+ "high": 250000
542
+ },
543
+ "legal": {
544
+ "low": 10000,
545
+ "likely": 75000,
546
+ "high": 500000
547
+ },
548
+ "crisisPR": {
549
+ "low": 0,
550
+ "likely": 0,
551
+ "high": 0
552
+ },
553
+ "notification": {
554
+ "low": 5000,
555
+ "likely": 10000,
556
+ "high": 15000
557
+ },
558
+ "creditMonitoring": {
559
+ "low": 0,
560
+ "likely": 0,
561
+ "high": 0
562
+ },
563
+ "regulatoryFines": {
564
+ "low": 0,
565
+ "likely": 0,
566
+ "high": 0
567
+ },
568
+ "directDamage": {
569
+ "low": 250,
570
+ "likely": 1250,
571
+ "high": 10000
572
+ },
573
+ "classAction": {
574
+ "low": 0,
575
+ "likely": 0,
576
+ "high": 0
577
+ },
578
+ "lostBusiness": {
579
+ "low": 0,
580
+ "likely": 0,
581
+ "high": 0
582
+ }
583
+ },
584
+ "dominantDriver": "legal counsel",
585
+ "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
586
+ "confidence": "low",
587
+ "narrative": "Mass Assignment (req.body Direct to Model) on `parser-kt.js:207` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: GitHub mass-assignment 2012 → public ridicule + emergency rebuild."
588
+ },
589
+ "stableId": "2fc3bac9558c1472",
590
+ "confidenceTier": "low",
591
+ "exploitability": 0.45,
592
+ "exploitabilityTier": "medium",
593
+ "exploitabilityFactors": [
594
+ "sev:high",
595
+ "unreachable"
596
+ ],
597
+ "clusterSize": null,
598
+ "unreachable": false,
599
+ "validator_verdict": "unvalidated",
600
+ "llm_confidence": null,
601
+ "unvalidated": true,
602
+ "cross_language": false,
603
+ "family": "mass-assignment",
604
+ "parser": "STRUCTURAL",
605
+ "_unsigned": false,
606
+ "_passThroughSigning": false,
607
+ "signatureStatus": "verified",
608
+ "regression_test": null,
609
+ "poc": null,
610
+ "calibrated_confidence": null,
611
+ "calibrated_confidence_ci": null,
612
+ "calibrated_n": 5,
613
+ "calibration_reason": "insufficient-samples",
614
+ "verifier_verdict": "cannot-verify",
615
+ "verifier_reason": "no-poc-no-sanitizer-rule",
616
+ "verifier_runner": null,
617
+ "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-kt.js:?. Severity: high. Review the remediation field for class-specific guidance.",
618
+ "mitigationVerdict": "unreachable-in-prod",
619
+ "mitigationsApplied": [],
620
+ "mitigatedByWaf": false,
621
+ "wafRuleId": null,
622
+ "mitigatedByAuth": false,
623
+ "authMechanism": null,
624
+ "mitigatedByNetwork": false,
625
+ "networkExposure": null,
626
+ "featureFlag": null,
627
+ "featureFlagState": null,
628
+ "featureFlagRollout": null,
629
+ "exposedInProd": false,
630
+ "unreachableInProd": true,
631
+ "coldPath": false,
632
+ "hotPath": false,
633
+ "prodRequestCount": null,
634
+ "crownJewelScore": 0.15,
635
+ "crownJewelTier": "low-value",
636
+ "crownJewelFactors": [
637
+ "shell-execution"
638
+ ],
639
+ "cloneClusterId": "a0c829a31c63bf1a",
640
+ "cloneClusterSize": 5,
156
641
  "provenance": "human-likely",
157
- "provenanceScore": 0.08,
642
+ "provenanceScore": 0,
158
643
  "typeNarrowed": null,
159
644
  "strideCategory": null,
160
645
  "personaScores": {
@@ -249,15 +734,15 @@
249
734
  }
250
735
  },
251
736
  {
252
- "id": "struct:parser-kt.js:207:Mass_Assignment_(req.body_Direct_to_Model)",
737
+ "id": "struct:parser-php.js:209:Mass_Assignment_(req.body_Direct_to_Model)",
253
738
  "kind": "sast",
254
739
  "severity": "high",
255
740
  "vuln": "Mass Assignment (req.body Direct to Model)",
256
741
  "cwe": "CWE-915",
257
742
  "owaspLlm": null,
258
743
  "stride": "Tampering",
259
- "file": "parser-kt.js",
260
- "line": 207,
744
+ "file": "parser-php.js",
745
+ "line": 209,
261
746
  "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
262
747
  "fix": null,
263
748
  "reachable": false,
@@ -341,9 +826,9 @@
341
826
  "dominantDriver": "legal counsel",
342
827
  "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
343
828
  "confidence": "low",
344
- "narrative": "Mass Assignment (req.body Direct to Model) on `parser-kt.js:207` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: GitHub mass-assignment 2012 → public ridicule + emergency rebuild."
829
+ "narrative": "Mass Assignment (req.body Direct to Model) on `parser-php.js:209` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: GitHub mass-assignment 2012 → public ridicule + emergency rebuild."
345
830
  },
346
- "stableId": "2fc3bac9558c1472",
831
+ "stableId": "b73364b3c23bcce8",
347
832
  "confidenceTier": "low",
348
833
  "exploitability": 0.45,
349
834
  "exploitabilityTier": "medium",
@@ -358,6 +843,7 @@
358
843
  "unvalidated": true,
359
844
  "cross_language": false,
360
845
  "family": "mass-assignment",
846
+ "parser": "STRUCTURAL",
361
847
  "_unsigned": false,
362
848
  "_passThroughSigning": false,
363
849
  "signatureStatus": "verified",
@@ -370,7 +856,7 @@
370
856
  "verifier_verdict": "cannot-verify",
371
857
  "verifier_reason": "no-poc-no-sanitizer-rule",
372
858
  "verifier_runner": null,
373
- "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-kt.js:?. Severity: high. Review the remediation field for class-specific guidance.",
859
+ "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-php.js:?. Severity: high. Review the remediation field for class-specific guidance.",
374
860
  "mitigationVerdict": "unreachable-in-prod",
375
861
  "mitigationsApplied": [],
376
862
  "mitigatedByWaf": false,
@@ -393,7 +879,249 @@
393
879
  "shell-execution"
394
880
  ],
395
881
  "cloneClusterId": "a0c829a31c63bf1a",
396
- "cloneClusterSize": 2,
882
+ "cloneClusterSize": 5,
883
+ "provenance": "human-likely",
884
+ "provenanceScore": 0,
885
+ "typeNarrowed": null,
886
+ "strideCategory": null,
887
+ "personaScores": {
888
+ "script-kiddie": {
889
+ "score": 0.65,
890
+ "tier": "high",
891
+ "factors": [
892
+ "sev:high"
893
+ ]
894
+ },
895
+ "opportunistic-criminal": {
896
+ "score": 0.85,
897
+ "tier": "critical",
898
+ "factors": [
899
+ "sev:high",
900
+ "bias:mass-assignment+0.20"
901
+ ]
902
+ },
903
+ "apt-nation-state": {
904
+ "score": 0.65,
905
+ "tier": "high",
906
+ "factors": [
907
+ "sev:high"
908
+ ]
909
+ },
910
+ "supply-chain-attacker": {
911
+ "score": 0.65,
912
+ "tier": "high",
913
+ "factors": [
914
+ "sev:high"
915
+ ]
916
+ },
917
+ "malicious-insider": {
918
+ "score": 1,
919
+ "tier": "critical",
920
+ "factors": [
921
+ "sev:high",
922
+ "bias:mass-assignment+0.25",
923
+ "authz-bypass-favored"
924
+ ]
925
+ }
926
+ },
927
+ "personaTopTwo": [
928
+ "malicious-insider",
929
+ "opportunistic-criminal"
930
+ ],
931
+ "personaMaxName": "malicious-insider",
932
+ "personaMaxScore": 1,
933
+ "reverseExposure": null,
934
+ "specMined": null,
935
+ "whyFired": {
936
+ "detector": "sast/mass-assignment",
937
+ "ruleId": "CWE-915",
938
+ "parser": "STRUCTURAL",
939
+ "evidence": {
940
+ "sinkSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
941
+ "sourceSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
942
+ "pathSteps": [],
943
+ "sanitizers": [],
944
+ "guards": []
945
+ },
946
+ "considered": {
947
+ "suppressionsApplied": [],
948
+ "suppressionsSkipped": [],
949
+ "reachabilityFilter": "unaffected",
950
+ "clusterCollapsed": false,
951
+ "typeNarrowed": false,
952
+ "crownJewelTier": "low-value",
953
+ "mitigationVerdict": "unreachable-in-prod"
954
+ },
955
+ "scanner": {
956
+ "rulesetVersion": null,
957
+ "packHash": null,
958
+ "modelId": null
959
+ }
960
+ },
961
+ "adversaryTranscript": null,
962
+ "predictedBountyUsd": {
963
+ "low": 50,
964
+ "likely": 200,
965
+ "high": 600,
966
+ "program": "web2"
967
+ },
968
+ "bountyConfidence": "medium",
969
+ "attackPlaybook": {
970
+ "cwe": "CWE-915",
971
+ "kind": "curl",
972
+ "title": "Mass assignment — privilege escalation probe",
973
+ "instruction": "Submit an extra field (role) on profile update; verify it sticks.",
974
+ "script": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test.\n# CWE-915 — Mass assignment\ncurl -s -i -X PATCH \"${TARGET_URL}/api/me\" \\\n -H \"Authorization: Bearer ${TEST_TOKEN}\" -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"x\",\"role\":\"admin\"}'\n# Confirmed when subsequent /api/me returns role=admin.",
975
+ "ethics": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test."
976
+ }
977
+ },
978
+ {
979
+ "id": "struct:parser-rb.js:201:Mass_Assignment_(req.body_Direct_to_Model)",
980
+ "kind": "sast",
981
+ "severity": "high",
982
+ "vuln": "Mass Assignment (req.body Direct to Model)",
983
+ "cwe": "CWE-915",
984
+ "owaspLlm": null,
985
+ "stride": "Tampering",
986
+ "file": "parser-rb.js",
987
+ "line": 201,
988
+ "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
989
+ "fix": null,
990
+ "reachable": false,
991
+ "triage": 39,
992
+ "dataClasses": [],
993
+ "chain": null,
994
+ "confidence": 0.314,
995
+ "toxicity": 35,
996
+ "toxicityFactors": [
997
+ "high-severity",
998
+ "http-facing"
999
+ ],
1000
+ "toxicityLabel": "Medium",
1001
+ "sources": null,
1002
+ "epssScore": null,
1003
+ "epssPercentile": null,
1004
+ "epssCve": null,
1005
+ "exploitedNow": false,
1006
+ "tags": null,
1007
+ "blastRadius": {
1008
+ "scope": "all-users",
1009
+ "dataAtRisk": [
1010
+ "config"
1011
+ ],
1012
+ "userCount": 50,
1013
+ "industry": "generic",
1014
+ "jurisdictions": [],
1015
+ "controlsApplied": [],
1016
+ "dollarBest": 23250,
1017
+ "dollarLikely": 136250,
1018
+ "dollarWorst": 775000,
1019
+ "dollarLow": 23250,
1020
+ "dollarHigh": 775000,
1021
+ "components": {
1022
+ "incidentResponse": {
1023
+ "low": 8000,
1024
+ "likely": 50000,
1025
+ "high": 250000
1026
+ },
1027
+ "legal": {
1028
+ "low": 10000,
1029
+ "likely": 75000,
1030
+ "high": 500000
1031
+ },
1032
+ "crisisPR": {
1033
+ "low": 0,
1034
+ "likely": 0,
1035
+ "high": 0
1036
+ },
1037
+ "notification": {
1038
+ "low": 5000,
1039
+ "likely": 10000,
1040
+ "high": 15000
1041
+ },
1042
+ "creditMonitoring": {
1043
+ "low": 0,
1044
+ "likely": 0,
1045
+ "high": 0
1046
+ },
1047
+ "regulatoryFines": {
1048
+ "low": 0,
1049
+ "likely": 0,
1050
+ "high": 0
1051
+ },
1052
+ "directDamage": {
1053
+ "low": 250,
1054
+ "likely": 1250,
1055
+ "high": 10000
1056
+ },
1057
+ "classAction": {
1058
+ "low": 0,
1059
+ "likely": 0,
1060
+ "high": 0
1061
+ },
1062
+ "lostBusiness": {
1063
+ "low": 0,
1064
+ "likely": 0,
1065
+ "high": 0
1066
+ }
1067
+ },
1068
+ "dominantDriver": "legal counsel",
1069
+ "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
1070
+ "confidence": "low",
1071
+ "narrative": "Mass Assignment (req.body Direct to Model) on `parser-rb.js:201` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: GitHub mass-assignment 2012 → public ridicule + emergency rebuild."
1072
+ },
1073
+ "stableId": "1889976dc0f1120c",
1074
+ "confidenceTier": "low",
1075
+ "exploitability": 0.45,
1076
+ "exploitabilityTier": "medium",
1077
+ "exploitabilityFactors": [
1078
+ "sev:high",
1079
+ "unreachable"
1080
+ ],
1081
+ "clusterSize": null,
1082
+ "unreachable": false,
1083
+ "validator_verdict": "unvalidated",
1084
+ "llm_confidence": null,
1085
+ "unvalidated": true,
1086
+ "cross_language": false,
1087
+ "family": "mass-assignment",
1088
+ "parser": "STRUCTURAL",
1089
+ "_unsigned": false,
1090
+ "_passThroughSigning": false,
1091
+ "signatureStatus": "verified",
1092
+ "regression_test": null,
1093
+ "poc": null,
1094
+ "calibrated_confidence": null,
1095
+ "calibrated_confidence_ci": null,
1096
+ "calibrated_n": 5,
1097
+ "calibration_reason": "insufficient-samples",
1098
+ "verifier_verdict": "cannot-verify",
1099
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1100
+ "verifier_runner": null,
1101
+ "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-rb.js:?. Severity: high. Review the remediation field for class-specific guidance.",
1102
+ "mitigationVerdict": "unreachable-in-prod",
1103
+ "mitigationsApplied": [],
1104
+ "mitigatedByWaf": false,
1105
+ "wafRuleId": null,
1106
+ "mitigatedByAuth": false,
1107
+ "authMechanism": null,
1108
+ "mitigatedByNetwork": false,
1109
+ "networkExposure": null,
1110
+ "featureFlag": null,
1111
+ "featureFlagState": null,
1112
+ "featureFlagRollout": null,
1113
+ "exposedInProd": false,
1114
+ "unreachableInProd": true,
1115
+ "coldPath": false,
1116
+ "hotPath": false,
1117
+ "prodRequestCount": null,
1118
+ "crownJewelScore": 0.15,
1119
+ "crownJewelTier": "low-value",
1120
+ "crownJewelFactors": [
1121
+ "shell-execution"
1122
+ ],
1123
+ "cloneClusterId": "a0c829a31c63bf1a",
1124
+ "cloneClusterSize": 5,
397
1125
  "provenance": "human-likely",
398
1126
  "provenanceScore": 0,
399
1127
  "typeNarrowed": null,
@@ -598,6 +1326,7 @@
598
1326
  "unvalidated": true,
599
1327
  "cross_language": false,
600
1328
  "family": "dos-sync-io",
1329
+ "parser": "STRUCTURAL",
601
1330
  "_unsigned": false,
602
1331
  "_passThroughSigning": false,
603
1332
  "signatureStatus": "verified",
@@ -828,6 +1557,7 @@
828
1557
  "unvalidated": true,
829
1558
  "cross_language": false,
830
1559
  "family": "dos-sync-io",
1560
+ "parser": "STRUCTURAL",
831
1561
  "_unsigned": false,
832
1562
  "_passThroughSigning": false,
833
1563
  "signatureStatus": "verified",
@@ -1058,6 +1788,7 @@
1058
1788
  "unvalidated": true,
1059
1789
  "cross_language": false,
1060
1790
  "family": "dos-sync-io",
1791
+ "parser": "STRUCTURAL",
1061
1792
  "_unsigned": false,
1062
1793
  "_passThroughSigning": false,
1063
1794
  "signatureStatus": "verified",
@@ -1288,6 +2019,7 @@
1288
2019
  "unvalidated": true,
1289
2020
  "cross_language": false,
1290
2021
  "family": "dos-sync-io",
2022
+ "parser": "STRUCTURAL",
1291
2023
  "_unsigned": false,
1292
2024
  "_passThroughSigning": false,
1293
2025
  "signatureStatus": "verified",
@@ -1518,6 +2250,7 @@
1518
2250
  "unvalidated": true,
1519
2251
  "cross_language": false,
1520
2252
  "family": "dos-sync-io",
2253
+ "parser": "STRUCTURAL",
1521
2254
  "_unsigned": false,
1522
2255
  "_passThroughSigning": false,
1523
2256
  "signatureStatus": "verified",
@@ -1748,6 +2481,7 @@
1748
2481
  "unvalidated": true,
1749
2482
  "cross_language": false,
1750
2483
  "family": "dos-sync-io",
2484
+ "parser": "STRUCTURAL",
1751
2485
  "_unsigned": false,
1752
2486
  "_passThroughSigning": false,
1753
2487
  "signatureStatus": "verified",
@@ -1978,6 +2712,7 @@
1978
2712
  "unvalidated": true,
1979
2713
  "cross_language": false,
1980
2714
  "family": "dos-sync-io",
2715
+ "parser": "STRUCTURAL",
1981
2716
  "_unsigned": false,
1982
2717
  "_passThroughSigning": false,
1983
2718
  "signatureStatus": "verified",
@@ -2208,6 +2943,7 @@
2208
2943
  "unvalidated": true,
2209
2944
  "cross_language": false,
2210
2945
  "family": "dos-sync-io",
2946
+ "parser": "STRUCTURAL",
2211
2947
  "_unsigned": false,
2212
2948
  "_passThroughSigning": false,
2213
2949
  "signatureStatus": "verified",
@@ -2439,6 +3175,7 @@
2439
3175
  "unvalidated": true,
2440
3176
  "cross_language": false,
2441
3177
  "family": "dos-sync-io",
3178
+ "parser": "STRUCTURAL",
2442
3179
  "_unsigned": false,
2443
3180
  "_passThroughSigning": false,
2444
3181
  "signatureStatus": "verified",
@@ -2672,6 +3409,7 @@
2672
3409
  "unvalidated": true,
2673
3410
  "cross_language": false,
2674
3411
  "family": "toctou-file-existence-permission-check-b",
3412
+ "parser": "TOCTOU",
2675
3413
  "_unsigned": false,
2676
3414
  "_passThroughSigning": false,
2677
3415
  "signatureStatus": "verified",
@@ -2867,7 +3605,9 @@
2867
3605
  "comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
2868
3606
  "confidence": "low",
2869
3607
  "narrative": "TOCTOU: existsSync followed by file op on `type-stubs.js:57` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
2870
- }
3608
+ },
3609
+ "parser": "LOGIC",
3610
+ "family": null
2871
3611
  }
2872
3612
  ],
2873
3613
  "bundles": [],
@@ -2891,7 +3631,7 @@
2891
3631
  "_v3": {
2892
3632
  "counterfactual": {
2893
3633
  "spofControls": [],
2894
- "controlsDetected": 240
3634
+ "controlsDetected": 307
2895
3635
  },
2896
3636
  "threatModel": {
2897
3637
  "summary": {
@@ -3032,5 +3772,6 @@
3032
3772
  "alarms": [],
3033
3773
  "note": "no-feedback-data"
3034
3774
  }
3035
- }
3775
+ },
3776
+ "annotatorErrors": []
3036
3777
  }