@clear-capabilities/agentic-security-scanner 0.74.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 (331) hide show
  1. package/CHANGELOG.md +1580 -0
  2. package/bin/.agentic-security/findings.json +1577 -0
  3. package/bin/.agentic-security/last-scan.json +1577 -0
  4. package/bin/.agentic-security/last-scan.json.sig +1 -0
  5. package/bin/.agentic-security/scan-history.json +465 -0
  6. package/bin/.agentic-security/streak.json +25 -0
  7. package/bin/agentic-security-audit.js +198 -0
  8. package/bin/agentic-security-consistency.js +80 -0
  9. package/bin/agentic-security-diff.js +136 -0
  10. package/bin/agentic-security-lsp.js +12 -0
  11. package/bin/agentic-security-mcp.js +40 -0
  12. package/bin/agentic-security-rule.js +153 -0
  13. package/bin/agentic-security.js +1683 -0
  14. package/dist/117.index.js +207 -0
  15. package/dist/178.index.js +250 -0
  16. package/dist/218.index.js +793 -0
  17. package/dist/227.index.js +192 -0
  18. package/dist/301.index.js +167 -0
  19. package/dist/384.index.js +18 -0
  20. package/dist/476.index.js +126 -0
  21. package/dist/513.index.js +373 -0
  22. package/dist/520.index.js +13 -0
  23. package/dist/601.index.js +1038 -0
  24. package/dist/634.index.js +1892 -0
  25. package/dist/637.index.js +216 -0
  26. package/dist/660.index.js +131 -0
  27. package/dist/675.index.js +451 -0
  28. package/dist/826.index.js +188 -0
  29. package/dist/830.index.js +133 -0
  30. package/dist/agentic-security.mjs +272 -0
  31. package/dist/agentic-security.mjs.sha256 +1 -0
  32. package/dist/calibration-seed.json +27 -0
  33. package/package.json +77 -0
  34. package/src/.agentic-security/findings.json +80844 -0
  35. package/src/.agentic-security/last-scan.json +80844 -0
  36. package/src/.agentic-security/last-scan.json.sig +1 -0
  37. package/src/.agentic-security/scan-history.json +8408 -0
  38. package/src/.agentic-security/streak.json +26 -0
  39. package/src/badge.js +188 -0
  40. package/src/compare.js +203 -0
  41. package/src/dataflow/.agentic-security/findings.json +3487 -0
  42. package/src/dataflow/.agentic-security/last-scan.json +3487 -0
  43. package/src/dataflow/.agentic-security/last-scan.json.sig +1 -0
  44. package/src/dataflow/.agentic-security/scan-history.json +735 -0
  45. package/src/dataflow/.agentic-security/streak.json +24 -0
  46. package/src/dataflow/CLAUDE.md +38 -0
  47. package/src/dataflow/access-paths.js +172 -0
  48. package/src/dataflow/async-sequencing.js +177 -0
  49. package/src/dataflow/backward.js +201 -0
  50. package/src/dataflow/catalog-expanded.js +485 -0
  51. package/src/dataflow/catalog.js +659 -0
  52. package/src/dataflow/cross-repo.js +219 -0
  53. package/src/dataflow/engine.js +588 -0
  54. package/src/dataflow/exception-flow.js +116 -0
  55. package/src/dataflow/exploit-prover.js +187 -0
  56. package/src/dataflow/higher-order.js +221 -0
  57. package/src/dataflow/ifds.js +347 -0
  58. package/src/dataflow/implicit-flow.js +129 -0
  59. package/src/dataflow/incremental.js +229 -0
  60. package/src/dataflow/index.js +181 -0
  61. package/src/dataflow/numeric-domain.js +192 -0
  62. package/src/dataflow/path-feasibility.js +114 -0
  63. package/src/dataflow/points-to.js +337 -0
  64. package/src/dataflow/polyglot.js +190 -0
  65. package/src/dataflow/proven-clean.js +159 -0
  66. package/src/dataflow/receiver-context.js +76 -0
  67. package/src/dataflow/sanitizer-proof.js +154 -0
  68. package/src/dataflow/soft-taint.js +140 -0
  69. package/src/dataflow/string-domain.js +234 -0
  70. package/src/dataflow/stub-aware-filter.js +100 -0
  71. package/src/dataflow/summaries.js +132 -0
  72. package/src/dataflow/symbolic-exec.js +238 -0
  73. package/src/dataflow/tabulation.js +135 -0
  74. package/src/engine.js +7763 -0
  75. package/src/history-scan.js +229 -0
  76. package/src/index.js +3 -0
  77. package/src/integrations/.agentic-security/findings.json +1504 -0
  78. package/src/integrations/.agentic-security/last-scan.json +1504 -0
  79. package/src/integrations/.agentic-security/scan-history.json +40 -0
  80. package/src/integrations/.agentic-security/streak.json +21 -0
  81. package/src/integrations/index.js +321 -0
  82. package/src/integrations/tickets.js +200 -0
  83. package/src/ir/.agentic-security/findings.json +3036 -0
  84. package/src/ir/.agentic-security/last-scan.json +3036 -0
  85. package/src/ir/.agentic-security/last-scan.json.sig +1 -0
  86. package/src/ir/.agentic-security/scan-history.json +364 -0
  87. package/src/ir/.agentic-security/streak.json +23 -0
  88. package/src/ir/CLAUDE.md +172 -0
  89. package/src/ir/callgraph.js +73 -0
  90. package/src/ir/class-hierarchy.js +195 -0
  91. package/src/ir/index.js +152 -0
  92. package/src/ir/parser-cs.js +260 -0
  93. package/src/ir/parser-java.js +286 -0
  94. package/src/ir/parser-js.js +413 -0
  95. package/src/ir/parser-kt.js +258 -0
  96. package/src/ir/parser-py-cst.js +136 -0
  97. package/src/ir/parser-py.helper.py +501 -0
  98. package/src/ir/parser-py.js +312 -0
  99. package/src/ir/ssa.js +315 -0
  100. package/src/ir/type-stubs.js +288 -0
  101. package/src/leaderboard.js +152 -0
  102. package/src/llm-validator/.agentic-security/findings.json +1891 -0
  103. package/src/llm-validator/.agentic-security/last-scan.json +1891 -0
  104. package/src/llm-validator/.agentic-security/last-scan.json.sig +1 -0
  105. package/src/llm-validator/.agentic-security/scan-history.json +168 -0
  106. package/src/llm-validator/.agentic-security/streak.json +20 -0
  107. package/src/llm-validator/consistency.js +141 -0
  108. package/src/llm-validator/index.js +437 -0
  109. package/src/lsp/.agentic-security/findings.json +28 -0
  110. package/src/lsp/.agentic-security/last-scan.json +28 -0
  111. package/src/lsp/.agentic-security/scan-history.json +79 -0
  112. package/src/lsp/.agentic-security/streak.json +22 -0
  113. package/src/lsp/server.js +275 -0
  114. package/src/mcp/.agentic-security/findings.json +8358 -0
  115. package/src/mcp/.agentic-security/last-scan.json +8358 -0
  116. package/src/mcp/.agentic-security/last-scan.json.sig +1 -0
  117. package/src/mcp/.agentic-security/scan-history.json +1125 -0
  118. package/src/mcp/.agentic-security/streak.json +22 -0
  119. package/src/mcp/CLAUDE.md +54 -0
  120. package/src/mcp/audit.js +136 -0
  121. package/src/mcp/redact.js +75 -0
  122. package/src/mcp/server.js +158 -0
  123. package/src/mcp/stdio.js +83 -0
  124. package/src/mcp/tools.js +940 -0
  125. package/src/mcp/validate.js +49 -0
  126. package/src/personality.js +164 -0
  127. package/src/poc-video.js +239 -0
  128. package/src/posture/.agentic-security/findings.json +51239 -0
  129. package/src/posture/.agentic-security/last-scan.json +51239 -0
  130. package/src/posture/.agentic-security/last-scan.json.sig +1 -0
  131. package/src/posture/.agentic-security/scan-history.json +5557 -0
  132. package/src/posture/.agentic-security/streak.json +24 -0
  133. package/src/posture/CLAUDE.md +42 -0
  134. package/src/posture/adversarial-self-test.js +114 -0
  135. package/src/posture/adversary-agent.js +204 -0
  136. package/src/posture/agents-memory.js +135 -0
  137. package/src/posture/ai-code-fingerprint.js +171 -0
  138. package/src/posture/aibom.js +284 -0
  139. package/src/posture/api-inventory.js +96 -0
  140. package/src/posture/attack-playbooks.js +305 -0
  141. package/src/posture/auditor-agent.js +115 -0
  142. package/src/posture/auth-posture-import.js +135 -0
  143. package/src/posture/baseline-compare.js +114 -0
  144. package/src/posture/blast-radius.js +836 -0
  145. package/src/posture/bounty-prediction.js +141 -0
  146. package/src/posture/business-logic.js +239 -0
  147. package/src/posture/calibration-drift.js +93 -0
  148. package/src/posture/calibration-seed.json +27 -0
  149. package/src/posture/calibration.js +204 -0
  150. package/src/posture/clustering.js +75 -0
  151. package/src/posture/concurrency-checker.js +265 -0
  152. package/src/posture/confidence.js +65 -0
  153. package/src/posture/container-runtime.js +149 -0
  154. package/src/posture/counterfactual.js +109 -0
  155. package/src/posture/cross-lang-graphql.js +165 -0
  156. package/src/posture/cross-lang-grpc.js +166 -0
  157. package/src/posture/cross-lang-meta.js +101 -0
  158. package/src/posture/cross-lang-openapi.js +187 -0
  159. package/src/posture/cross-lang-orm.js +153 -0
  160. package/src/posture/cross-lang-queues.js +210 -0
  161. package/src/posture/crown-jewels.js +110 -0
  162. package/src/posture/custom-rules.js +361 -0
  163. package/src/posture/cve-alert-daemon.js +433 -0
  164. package/src/posture/cve-lookup.js +129 -0
  165. package/src/posture/dead-code.js +430 -0
  166. package/src/posture/defender-agent.js +158 -0
  167. package/src/posture/deploy-platform.js +204 -0
  168. package/src/posture/detector-fuzz.js +61 -0
  169. package/src/posture/deterministic.js +99 -0
  170. package/src/posture/drift.js +165 -0
  171. package/src/posture/epss.js +156 -0
  172. package/src/posture/exploitability-probability.js +212 -0
  173. package/src/posture/exploitability.js +121 -0
  174. package/src/posture/feature-flags.js +110 -0
  175. package/src/posture/finding-defaults.js +132 -0
  176. package/src/posture/fix-history.js +411 -0
  177. package/src/posture/fix-plan.js +121 -0
  178. package/src/posture/fix-verify-loop.js +157 -0
  179. package/src/posture/fix-verify.js +130 -0
  180. package/src/posture/flow-narration.js +105 -0
  181. package/src/posture/grader-calibration.js +156 -0
  182. package/src/posture/harness-discovery.js +113 -0
  183. package/src/posture/holdout-eval.js +144 -0
  184. package/src/posture/iac-reachability.js +163 -0
  185. package/src/posture/iam-policy.js +128 -0
  186. package/src/posture/integrity.js +97 -0
  187. package/src/posture/learning.js +166 -0
  188. package/src/posture/license-policy.js +109 -0
  189. package/src/posture/llm-redteam-prompts.js +418 -0
  190. package/src/posture/llm-redteam.js +303 -0
  191. package/src/posture/material-change.js +163 -0
  192. package/src/posture/mitigation-composite.js +55 -0
  193. package/src/posture/mttr.js +91 -0
  194. package/src/posture/network-policy-import.js +126 -0
  195. package/src/posture/path-predicates.js +99 -0
  196. package/src/posture/persona-prioritization.js +153 -0
  197. package/src/posture/poc-cwe-map.js +51 -0
  198. package/src/posture/poc-generator.js +500 -0
  199. package/src/posture/policy-gate.js +174 -0
  200. package/src/posture/pre-incident-archaeology.js +110 -0
  201. package/src/posture/profile.js +93 -0
  202. package/src/posture/reachability-filter.js +42 -0
  203. package/src/posture/regression-test-gen.js +200 -0
  204. package/src/posture/reverse-blast-radius.js +110 -0
  205. package/src/posture/router.js +109 -0
  206. package/src/posture/rule-overrides.js +198 -0
  207. package/src/posture/rule-pack-signing.js +209 -0
  208. package/src/posture/rule-packs.js +143 -0
  209. package/src/posture/rule-synthesis.js +108 -0
  210. package/src/posture/ruleset-version.js +71 -0
  211. package/src/posture/sbom.js +129 -0
  212. package/src/posture/schema-aware-bridge.js +207 -0
  213. package/src/posture/security-trend.js +87 -0
  214. package/src/posture/semantic-clone.js +114 -0
  215. package/src/posture/specification-mining.js +170 -0
  216. package/src/posture/stable-id.js +75 -0
  217. package/src/posture/stack-playbook.js +229 -0
  218. package/src/posture/streak.js +249 -0
  219. package/src/posture/suppressions.js +135 -0
  220. package/src/posture/telemetry-ingest.js +112 -0
  221. package/src/posture/threat-model.js +145 -0
  222. package/src/posture/three-agent-pipeline.js +74 -0
  223. package/src/posture/triage.js +146 -0
  224. package/src/posture/trust-boundary-diagram.js +115 -0
  225. package/src/posture/type-narrowing.js +129 -0
  226. package/src/posture/validator-metrics.js +179 -0
  227. package/src/posture/verifier-ephemeral.js +118 -0
  228. package/src/posture/verifier-target.js +147 -0
  229. package/src/posture/verifier.js +257 -0
  230. package/src/posture/version.js +75 -0
  231. package/src/posture/waf-ingest.js +200 -0
  232. package/src/posture/why-fired.js +141 -0
  233. package/src/pr-comment.js +172 -0
  234. package/src/pr-delta.js +198 -0
  235. package/src/report/.agentic-security/findings.json +79 -0
  236. package/src/report/.agentic-security/last-scan.json +79 -0
  237. package/src/report/.agentic-security/last-scan.json.sig +1 -0
  238. package/src/report/.agentic-security/scan-history.json +332 -0
  239. package/src/report/.agentic-security/streak.json +23 -0
  240. package/src/report/index.js +1136 -0
  241. package/src/report/mascot.js +42 -0
  242. package/src/runScan.js +141 -0
  243. package/src/sast/.agentic-security/findings.json +5051 -0
  244. package/src/sast/.agentic-security/last-scan.json +5051 -0
  245. package/src/sast/.agentic-security/last-scan.json.sig +1 -0
  246. package/src/sast/.agentic-security/scan-history.json +788 -0
  247. package/src/sast/.agentic-security/streak.json +23 -0
  248. package/src/sast/CLAUDE.md +39 -0
  249. package/src/sast/_comment-strip.js +46 -0
  250. package/src/sast/agent-tool-escalation.js +131 -0
  251. package/src/sast/auth-provider.js +171 -0
  252. package/src/sast/authz.js +236 -0
  253. package/src/sast/bench-shape/.agentic-security/findings.json +28 -0
  254. package/src/sast/bench-shape/.agentic-security/last-scan.json +28 -0
  255. package/src/sast/bench-shape/.agentic-security/scan-history.json +24 -0
  256. package/src/sast/bench-shape/.agentic-security/streak.json +22 -0
  257. package/src/sast/bench-shape/index.js +62 -0
  258. package/src/sast/claude-hook-injection.js +199 -0
  259. package/src/sast/claude-md-prompt-injection.js +170 -0
  260. package/src/sast/claude-settings.js +165 -0
  261. package/src/sast/client-side.js +149 -0
  262. package/src/sast/cpp-bench-extras.js +122 -0
  263. package/src/sast/cpp-dataflow.js +430 -0
  264. package/src/sast/cpp.js +248 -0
  265. package/src/sast/csharp.js +152 -0
  266. package/src/sast/csrf.js +82 -0
  267. package/src/sast/dart-flutter.js +173 -0
  268. package/src/sast/db-rls.js +147 -0
  269. package/src/sast/db-taint.js +215 -0
  270. package/src/sast/defi-deep.js +242 -0
  271. package/src/sast/deserialization-gadgets.js +113 -0
  272. package/src/sast/django-hardening.js +230 -0
  273. package/src/sast/env-hygiene.js +125 -0
  274. package/src/sast/fastapi-hardening.js +145 -0
  275. package/src/sast/go-extended.js +84 -0
  276. package/src/sast/host-header.js +106 -0
  277. package/src/sast/index.js +17 -0
  278. package/src/sast/java-ast-folding.js +561 -0
  279. package/src/sast/java-bench-extras.js +708 -0
  280. package/src/sast/java-collection-passthrough.js +178 -0
  281. package/src/sast/java-constant-fold.js +244 -0
  282. package/src/sast/java-deserialization.js +125 -0
  283. package/src/sast/jndi.js +104 -0
  284. package/src/sast/juliet-shape.js +324 -0
  285. package/src/sast/jwt-exp.js +104 -0
  286. package/src/sast/kotlin.js +82 -0
  287. package/src/sast/laravel-hardening.js +198 -0
  288. package/src/sast/ldap-injection.js +100 -0
  289. package/src/sast/llm-owasp.js +465 -0
  290. package/src/sast/llm-stored-prompt.js +103 -0
  291. package/src/sast/llm-trading-agent.js +161 -0
  292. package/src/sast/llm.js +308 -0
  293. package/src/sast/logic.js +140 -0
  294. package/src/sast/mass-assignment.js +101 -0
  295. package/src/sast/mcp-audit.js +242 -0
  296. package/src/sast/mobile-manifest.js +195 -0
  297. package/src/sast/model-load.js +164 -0
  298. package/src/sast/mutation-xss.js +87 -0
  299. package/src/sast/nosql-injection.js +82 -0
  300. package/src/sast/open-redirect.js +119 -0
  301. package/src/sast/php.js +91 -0
  302. package/src/sast/pipeline.js +122 -0
  303. package/src/sast/primary-cwe-java.js +155 -0
  304. package/src/sast/prompt-firewall.js +151 -0
  305. package/src/sast/prompt-template.js +157 -0
  306. package/src/sast/prototype-pollution.js +112 -0
  307. package/src/sast/python-sinks.js +195 -0
  308. package/src/sast/quarkus-hardening.js +102 -0
  309. package/src/sast/rag-poisoning.js +118 -0
  310. package/src/sast/rate-limit.js +128 -0
  311. package/src/sast/response-splitting.js +138 -0
  312. package/src/sast/ruby.js +108 -0
  313. package/src/sast/rust.js +105 -0
  314. package/src/sast/solidity.js +167 -0
  315. package/src/sast/springboot-hardening.js +186 -0
  316. package/src/sast/ssrf-cloud-metadata.js +80 -0
  317. package/src/sast/ssti.js +116 -0
  318. package/src/sast/swift.js +162 -0
  319. package/src/sast/toctou.js +95 -0
  320. package/src/sast/webhook.js +101 -0
  321. package/src/sast/xpath-injection.js +51 -0
  322. package/src/sast/xxe.js +140 -0
  323. package/src/sast/zip-slip.js +200 -0
  324. package/src/sca/base-images.json +45 -0
  325. package/src/sca/container.js +107 -0
  326. package/src/sca/dep-confusion.js +134 -0
  327. package/src/sca/index.js +6 -0
  328. package/src/sca/popular-packages.json +41 -0
  329. package/src/sca/sarif-ingest.js +187 -0
  330. package/src/sca/vuln-function-hints.json +89 -0
  331. package/src/secrets/index.js +4 -0
@@ -0,0 +1,1891 @@
1
+ {
2
+ "scanId": "e4d8ca5c-18e9-436d-8778-68c3e6feb632",
3
+ "startedAt": "2026-05-20T12:29:43.643Z",
4
+ "durationMs": 133,
5
+ "scanned": {
6
+ "files": 2,
7
+ "lines": 0
8
+ },
9
+ "findings": [
10
+ {
11
+ "id": "prompt-tpl:index.js:57:Prompt_Template__user_input_interpolated_into_prompt_string_",
12
+ "kind": "sast",
13
+ "severity": "high",
14
+ "vuln": "Prompt Template: user input interpolated into prompt string without isolation",
15
+ "cwe": "CWE-1336",
16
+ "owaspLlm": null,
17
+ "stride": "Spoofing",
18
+ "file": "index.js",
19
+ "line": 57,
20
+ "snippet": "const PROMPT_TEMPLATE = `You are a senior application security engineer reviewing a candidate finding from a static analysis tool.",
21
+ "fix": {
22
+ "description": "Prefer the messages array form: `messages=[{\"role\":\"system\",\"content\":SYS},{\"role\":\"user\",\"content\":user_input}]`. Or wrap interpolations with isolation markers and instruct the model to treat content inside them as data only.",
23
+ "code": ""
24
+ },
25
+ "reachable": false,
26
+ "triage": 39,
27
+ "dataClasses": [],
28
+ "chain": null,
29
+ "confidence": 0.314,
30
+ "toxicity": 15,
31
+ "toxicityFactors": [
32
+ "high-severity"
33
+ ],
34
+ "toxicityLabel": "Low",
35
+ "sources": null,
36
+ "epssScore": null,
37
+ "epssPercentile": null,
38
+ "epssCve": null,
39
+ "exploitedNow": false,
40
+ "tags": null,
41
+ "blastRadius": {
42
+ "scope": "all-users",
43
+ "dataAtRisk": [
44
+ "config"
45
+ ],
46
+ "userCount": 50,
47
+ "industry": "generic",
48
+ "jurisdictions": [],
49
+ "controlsApplied": [],
50
+ "dollarBest": 23250,
51
+ "dollarLikely": 136250,
52
+ "dollarWorst": 775000,
53
+ "dollarLow": 23250,
54
+ "dollarHigh": 775000,
55
+ "components": {
56
+ "incidentResponse": {
57
+ "low": 8000,
58
+ "likely": 50000,
59
+ "high": 250000
60
+ },
61
+ "legal": {
62
+ "low": 10000,
63
+ "likely": 75000,
64
+ "high": 500000
65
+ },
66
+ "crisisPR": {
67
+ "low": 0,
68
+ "likely": 0,
69
+ "high": 0
70
+ },
71
+ "notification": {
72
+ "low": 5000,
73
+ "likely": 10000,
74
+ "high": 15000
75
+ },
76
+ "creditMonitoring": {
77
+ "low": 0,
78
+ "likely": 0,
79
+ "high": 0
80
+ },
81
+ "regulatoryFines": {
82
+ "low": 0,
83
+ "likely": 0,
84
+ "high": 0
85
+ },
86
+ "directDamage": {
87
+ "low": 250,
88
+ "likely": 1250,
89
+ "high": 10000
90
+ },
91
+ "classAction": {
92
+ "low": 0,
93
+ "likely": 0,
94
+ "high": 0
95
+ },
96
+ "lostBusiness": {
97
+ "low": 0,
98
+ "likely": 0,
99
+ "high": 0
100
+ }
101
+ },
102
+ "dominantDriver": "legal counsel",
103
+ "comparable": "Server-side template injection (Pug/Jinja2/Twig) → routine path to RCE",
104
+ "confidence": "low",
105
+ "narrative": "Prompt Template: user input interpolated into prompt string without isolation on `index.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: Server-side template injection (Pug/Jinja2/Twig) → routine path to RCE."
106
+ },
107
+ "stableId": "36003f350e48e148",
108
+ "confidenceTier": "low",
109
+ "exploitability": 0.45,
110
+ "exploitabilityTier": "medium",
111
+ "exploitabilityFactors": [
112
+ "sev:high",
113
+ "unreachable"
114
+ ],
115
+ "clusterSize": null,
116
+ "unreachable": false,
117
+ "validator_verdict": "unvalidated",
118
+ "llm_confidence": null,
119
+ "unvalidated": true,
120
+ "cross_language": false,
121
+ "family": "prompt-template-user-input-interpolated-",
122
+ "_unsigned": false,
123
+ "_passThroughSigning": false,
124
+ "signatureStatus": "verified",
125
+ "regression_test": null,
126
+ "poc": null,
127
+ "calibrated_confidence": null,
128
+ "calibrated_confidence_ci": null,
129
+ "calibrated_n": 0,
130
+ "calibration_reason": "no-history",
131
+ "verifier_verdict": "cannot-verify",
132
+ "verifier_reason": "no-poc-no-sanitizer-rule",
133
+ "verifier_runner": null,
134
+ "narration": "A finding of type \"Prompt Template: user input interpolated into prompt string without isolation\" at index.js:57. Severity: high. Review the remediation field for class-specific guidance.",
135
+ "mitigationVerdict": "unreachable-in-prod",
136
+ "mitigationsApplied": [],
137
+ "mitigatedByWaf": false,
138
+ "wafRuleId": null,
139
+ "mitigatedByAuth": false,
140
+ "authMechanism": null,
141
+ "mitigatedByNetwork": false,
142
+ "networkExposure": null,
143
+ "featureFlag": null,
144
+ "featureFlagState": null,
145
+ "featureFlagRollout": null,
146
+ "exposedInProd": false,
147
+ "unreachableInProd": true,
148
+ "coldPath": false,
149
+ "hotPath": false,
150
+ "prodRequestCount": null,
151
+ "crownJewelScore": 0.1,
152
+ "crownJewelTier": "low-value",
153
+ "crownJewelFactors": [
154
+ "reads-secret-env"
155
+ ],
156
+ "cloneClusterId": "fae27b06c71c94a9",
157
+ "cloneClusterSize": 1,
158
+ "provenance": "human-likely",
159
+ "provenanceScore": 0.18,
160
+ "typeNarrowed": null,
161
+ "strideCategory": null,
162
+ "personaScores": {
163
+ "script-kiddie": {
164
+ "score": 0.65,
165
+ "tier": "high",
166
+ "factors": [
167
+ "sev:high"
168
+ ]
169
+ },
170
+ "opportunistic-criminal": {
171
+ "score": 0.65,
172
+ "tier": "high",
173
+ "factors": [
174
+ "sev:high"
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": 0.65,
193
+ "tier": "high",
194
+ "factors": [
195
+ "sev:high"
196
+ ]
197
+ }
198
+ },
199
+ "personaTopTwo": [
200
+ "script-kiddie",
201
+ "opportunistic-criminal"
202
+ ],
203
+ "personaMaxName": "script-kiddie",
204
+ "personaMaxScore": 0.65,
205
+ "reverseExposure": null,
206
+ "specMined": null,
207
+ "whyFired": {
208
+ "detector": "sast/prompt-template-user-input-interpolated-",
209
+ "ruleId": "CWE-1336",
210
+ "parser": "pattern",
211
+ "evidence": {
212
+ "sinkSnippet": "const PROMPT_TEMPLATE = `You are a senior application security engineer reviewing a candidate finding from a static analysis tool.",
213
+ "sourceSnippet": null,
214
+ "pathSteps": [],
215
+ "sanitizers": [],
216
+ "guards": []
217
+ },
218
+ "considered": {
219
+ "suppressionsApplied": [],
220
+ "suppressionsSkipped": [],
221
+ "reachabilityFilter": "unaffected",
222
+ "clusterCollapsed": false,
223
+ "typeNarrowed": false,
224
+ "crownJewelTier": "low-value",
225
+ "mitigationVerdict": "unreachable-in-prod"
226
+ },
227
+ "scanner": {
228
+ "rulesetVersion": null,
229
+ "packHash": null,
230
+ "modelId": null
231
+ }
232
+ },
233
+ "adversaryTranscript": null,
234
+ "predictedBountyUsd": null,
235
+ "bountyConfidence": null,
236
+ "attackPlaybook": null
237
+ },
238
+ {
239
+ "id": "struct:consistency.js:66:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
240
+ "kind": "sast",
241
+ "severity": "medium",
242
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
243
+ "cwe": "CWE-400",
244
+ "owaspLlm": null,
245
+ "stride": "Denial of Service",
246
+ "file": "consistency.js",
247
+ "line": 66,
248
+ "snippet": "if (fs.existsSync(cacheDir)) {",
249
+ "fix": null,
250
+ "reachable": false,
251
+ "triage": 22,
252
+ "dataClasses": [],
253
+ "chain": null,
254
+ "confidence": 0.212,
255
+ "toxicity": 28,
256
+ "toxicityFactors": [
257
+ "http-facing"
258
+ ],
259
+ "toxicityLabel": "Medium",
260
+ "sources": null,
261
+ "epssScore": null,
262
+ "epssPercentile": null,
263
+ "epssCve": null,
264
+ "exploitedNow": false,
265
+ "tags": null,
266
+ "blastRadius": {
267
+ "scope": "all-users",
268
+ "dataAtRisk": [
269
+ "config"
270
+ ],
271
+ "userCount": 50,
272
+ "industry": "generic",
273
+ "jurisdictions": [],
274
+ "controlsApplied": [],
275
+ "dollarBest": 23250,
276
+ "dollarLikely": 136250,
277
+ "dollarWorst": 775000,
278
+ "dollarLow": 23250,
279
+ "dollarHigh": 775000,
280
+ "components": {
281
+ "incidentResponse": {
282
+ "low": 8000,
283
+ "likely": 50000,
284
+ "high": 250000
285
+ },
286
+ "legal": {
287
+ "low": 10000,
288
+ "likely": 75000,
289
+ "high": 500000
290
+ },
291
+ "crisisPR": {
292
+ "low": 0,
293
+ "likely": 0,
294
+ "high": 0
295
+ },
296
+ "notification": {
297
+ "low": 5000,
298
+ "likely": 10000,
299
+ "high": 15000
300
+ },
301
+ "creditMonitoring": {
302
+ "low": 0,
303
+ "likely": 0,
304
+ "high": 0
305
+ },
306
+ "regulatoryFines": {
307
+ "low": 0,
308
+ "likely": 0,
309
+ "high": 0
310
+ },
311
+ "directDamage": {
312
+ "low": 250,
313
+ "likely": 1250,
314
+ "high": 10000
315
+ },
316
+ "classAction": {
317
+ "low": 0,
318
+ "likely": 0,
319
+ "high": 0
320
+ },
321
+ "lostBusiness": {
322
+ "low": 0,
323
+ "likely": 0,
324
+ "high": 0
325
+ }
326
+ },
327
+ "dominantDriver": "legal counsel",
328
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
329
+ "confidence": "low",
330
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `consistency.js:66` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
331
+ },
332
+ "stableId": "cd1c964ce2e49d49",
333
+ "confidenceTier": "very-low",
334
+ "exploitability": 0.2,
335
+ "exploitabilityTier": "low",
336
+ "exploitabilityFactors": [
337
+ "sev:medium",
338
+ "unreachable"
339
+ ],
340
+ "clusterSize": null,
341
+ "unreachable": false,
342
+ "validator_verdict": "unvalidated",
343
+ "llm_confidence": null,
344
+ "unvalidated": true,
345
+ "cross_language": false,
346
+ "family": "dos-sync-io",
347
+ "_unsigned": false,
348
+ "_passThroughSigning": false,
349
+ "signatureStatus": "verified",
350
+ "regression_test": null,
351
+ "poc": null,
352
+ "calibrated_confidence": null,
353
+ "calibrated_confidence_ci": null,
354
+ "calibrated_n": 0,
355
+ "calibration_reason": "no-history",
356
+ "verifier_verdict": "cannot-verify",
357
+ "verifier_reason": "no-poc-no-sanitizer-rule",
358
+ "verifier_runner": null,
359
+ "narration": null,
360
+ "mitigationVerdict": "unreachable-in-prod",
361
+ "mitigationsApplied": [],
362
+ "mitigatedByWaf": false,
363
+ "wafRuleId": null,
364
+ "mitigatedByAuth": false,
365
+ "authMechanism": null,
366
+ "mitigatedByNetwork": false,
367
+ "networkExposure": null,
368
+ "featureFlag": null,
369
+ "featureFlagState": null,
370
+ "featureFlagRollout": null,
371
+ "exposedInProd": false,
372
+ "unreachableInProd": true,
373
+ "coldPath": false,
374
+ "hotPath": false,
375
+ "prodRequestCount": null,
376
+ "crownJewelScore": 0,
377
+ "crownJewelTier": "unknown",
378
+ "crownJewelFactors": [],
379
+ "cloneClusterId": "31e29761689a4980",
380
+ "cloneClusterSize": 1,
381
+ "provenance": "human-likely",
382
+ "provenanceScore": 0.22,
383
+ "typeNarrowed": null,
384
+ "strideCategory": "denialOfService",
385
+ "personaScores": {
386
+ "script-kiddie": {
387
+ "score": 0.4,
388
+ "tier": "medium",
389
+ "factors": [
390
+ "sev:medium"
391
+ ]
392
+ },
393
+ "opportunistic-criminal": {
394
+ "score": 0.4,
395
+ "tier": "medium",
396
+ "factors": [
397
+ "sev:medium"
398
+ ]
399
+ },
400
+ "apt-nation-state": {
401
+ "score": 0.4,
402
+ "tier": "medium",
403
+ "factors": [
404
+ "sev:medium"
405
+ ]
406
+ },
407
+ "supply-chain-attacker": {
408
+ "score": 0.4,
409
+ "tier": "medium",
410
+ "factors": [
411
+ "sev:medium"
412
+ ]
413
+ },
414
+ "malicious-insider": {
415
+ "score": 0.4,
416
+ "tier": "medium",
417
+ "factors": [
418
+ "sev:medium"
419
+ ]
420
+ }
421
+ },
422
+ "personaTopTwo": [
423
+ "script-kiddie",
424
+ "opportunistic-criminal"
425
+ ],
426
+ "personaMaxName": "script-kiddie",
427
+ "personaMaxScore": 0.4,
428
+ "reverseExposure": null,
429
+ "specMined": null,
430
+ "whyFired": {
431
+ "detector": "sast/dos-sync-io",
432
+ "ruleId": "CWE-400",
433
+ "parser": "STRUCTURAL",
434
+ "evidence": {
435
+ "sinkSnippet": "if (fs.existsSync(cacheDir)) {",
436
+ "sourceSnippet": "if (fs.existsSync(cacheDir)) {",
437
+ "pathSteps": [],
438
+ "sanitizers": [],
439
+ "guards": []
440
+ },
441
+ "considered": {
442
+ "suppressionsApplied": [],
443
+ "suppressionsSkipped": [],
444
+ "reachabilityFilter": "unaffected",
445
+ "clusterCollapsed": false,
446
+ "typeNarrowed": false,
447
+ "crownJewelTier": "unknown",
448
+ "mitigationVerdict": "unreachable-in-prod"
449
+ },
450
+ "scanner": {
451
+ "rulesetVersion": null,
452
+ "packHash": null,
453
+ "modelId": null
454
+ }
455
+ },
456
+ "adversaryTranscript": null,
457
+ "predictedBountyUsd": {
458
+ "low": 10,
459
+ "likely": 40,
460
+ "high": 120,
461
+ "program": "web2"
462
+ },
463
+ "bountyConfidence": "high",
464
+ "attackPlaybook": null
465
+ },
466
+ {
467
+ "id": "struct:consistency.js:67:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
468
+ "kind": "sast",
469
+ "severity": "medium",
470
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
471
+ "cwe": "CWE-400",
472
+ "owaspLlm": null,
473
+ "stride": "Denial of Service",
474
+ "file": "consistency.js",
475
+ "line": 67,
476
+ "snippet": "for (const e of fs.readdirSync(cacheDir)) fs.unlinkSync(path.join(cacheDir, e));",
477
+ "fix": null,
478
+ "reachable": false,
479
+ "triage": 22,
480
+ "dataClasses": [],
481
+ "chain": null,
482
+ "confidence": 0.212,
483
+ "toxicity": 28,
484
+ "toxicityFactors": [
485
+ "http-facing"
486
+ ],
487
+ "toxicityLabel": "Medium",
488
+ "sources": null,
489
+ "epssScore": null,
490
+ "epssPercentile": null,
491
+ "epssCve": null,
492
+ "exploitedNow": false,
493
+ "tags": null,
494
+ "blastRadius": {
495
+ "scope": "all-users",
496
+ "dataAtRisk": [
497
+ "config"
498
+ ],
499
+ "userCount": 50,
500
+ "industry": "generic",
501
+ "jurisdictions": [],
502
+ "controlsApplied": [],
503
+ "dollarBest": 23250,
504
+ "dollarLikely": 136250,
505
+ "dollarWorst": 775000,
506
+ "dollarLow": 23250,
507
+ "dollarHigh": 775000,
508
+ "components": {
509
+ "incidentResponse": {
510
+ "low": 8000,
511
+ "likely": 50000,
512
+ "high": 250000
513
+ },
514
+ "legal": {
515
+ "low": 10000,
516
+ "likely": 75000,
517
+ "high": 500000
518
+ },
519
+ "crisisPR": {
520
+ "low": 0,
521
+ "likely": 0,
522
+ "high": 0
523
+ },
524
+ "notification": {
525
+ "low": 5000,
526
+ "likely": 10000,
527
+ "high": 15000
528
+ },
529
+ "creditMonitoring": {
530
+ "low": 0,
531
+ "likely": 0,
532
+ "high": 0
533
+ },
534
+ "regulatoryFines": {
535
+ "low": 0,
536
+ "likely": 0,
537
+ "high": 0
538
+ },
539
+ "directDamage": {
540
+ "low": 250,
541
+ "likely": 1250,
542
+ "high": 10000
543
+ },
544
+ "classAction": {
545
+ "low": 0,
546
+ "likely": 0,
547
+ "high": 0
548
+ },
549
+ "lostBusiness": {
550
+ "low": 0,
551
+ "likely": 0,
552
+ "high": 0
553
+ }
554
+ },
555
+ "dominantDriver": "legal counsel",
556
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
557
+ "confidence": "low",
558
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `consistency.js:67` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
559
+ },
560
+ "stableId": "60e3b2db8a750099",
561
+ "confidenceTier": "very-low",
562
+ "exploitability": 0.2,
563
+ "exploitabilityTier": "low",
564
+ "exploitabilityFactors": [
565
+ "sev:medium",
566
+ "unreachable"
567
+ ],
568
+ "clusterSize": null,
569
+ "unreachable": false,
570
+ "validator_verdict": "unvalidated",
571
+ "llm_confidence": null,
572
+ "unvalidated": true,
573
+ "cross_language": false,
574
+ "family": "dos-sync-io",
575
+ "_unsigned": false,
576
+ "_passThroughSigning": false,
577
+ "signatureStatus": "verified",
578
+ "regression_test": null,
579
+ "poc": null,
580
+ "calibrated_confidence": null,
581
+ "calibrated_confidence_ci": null,
582
+ "calibrated_n": 0,
583
+ "calibration_reason": "no-history",
584
+ "verifier_verdict": "cannot-verify",
585
+ "verifier_reason": "no-poc-no-sanitizer-rule",
586
+ "verifier_runner": null,
587
+ "narration": null,
588
+ "mitigationVerdict": "unreachable-in-prod",
589
+ "mitigationsApplied": [],
590
+ "mitigatedByWaf": false,
591
+ "wafRuleId": null,
592
+ "mitigatedByAuth": false,
593
+ "authMechanism": null,
594
+ "mitigatedByNetwork": false,
595
+ "networkExposure": null,
596
+ "featureFlag": null,
597
+ "featureFlagState": null,
598
+ "featureFlagRollout": null,
599
+ "exposedInProd": false,
600
+ "unreachableInProd": true,
601
+ "coldPath": false,
602
+ "hotPath": false,
603
+ "prodRequestCount": null,
604
+ "crownJewelScore": 0,
605
+ "crownJewelTier": "unknown",
606
+ "crownJewelFactors": [],
607
+ "cloneClusterId": "88afe4820dcb8a38",
608
+ "cloneClusterSize": 1,
609
+ "provenance": "human-likely",
610
+ "provenanceScore": 0.22,
611
+ "typeNarrowed": null,
612
+ "strideCategory": "denialOfService",
613
+ "personaScores": {
614
+ "script-kiddie": {
615
+ "score": 0.4,
616
+ "tier": "medium",
617
+ "factors": [
618
+ "sev:medium"
619
+ ]
620
+ },
621
+ "opportunistic-criminal": {
622
+ "score": 0.4,
623
+ "tier": "medium",
624
+ "factors": [
625
+ "sev:medium"
626
+ ]
627
+ },
628
+ "apt-nation-state": {
629
+ "score": 0.4,
630
+ "tier": "medium",
631
+ "factors": [
632
+ "sev:medium"
633
+ ]
634
+ },
635
+ "supply-chain-attacker": {
636
+ "score": 0.4,
637
+ "tier": "medium",
638
+ "factors": [
639
+ "sev:medium"
640
+ ]
641
+ },
642
+ "malicious-insider": {
643
+ "score": 0.4,
644
+ "tier": "medium",
645
+ "factors": [
646
+ "sev:medium"
647
+ ]
648
+ }
649
+ },
650
+ "personaTopTwo": [
651
+ "script-kiddie",
652
+ "opportunistic-criminal"
653
+ ],
654
+ "personaMaxName": "script-kiddie",
655
+ "personaMaxScore": 0.4,
656
+ "reverseExposure": null,
657
+ "specMined": null,
658
+ "whyFired": {
659
+ "detector": "sast/dos-sync-io",
660
+ "ruleId": "CWE-400",
661
+ "parser": "STRUCTURAL",
662
+ "evidence": {
663
+ "sinkSnippet": "for (const e of fs.readdirSync(cacheDir)) fs.unlinkSync(path.join(cacheDir, e));",
664
+ "sourceSnippet": "for (const e of fs.readdirSync(cacheDir)) fs.unlinkSync(path.join(cacheDir, e));",
665
+ "pathSteps": [],
666
+ "sanitizers": [],
667
+ "guards": []
668
+ },
669
+ "considered": {
670
+ "suppressionsApplied": [],
671
+ "suppressionsSkipped": [],
672
+ "reachabilityFilter": "unaffected",
673
+ "clusterCollapsed": false,
674
+ "typeNarrowed": false,
675
+ "crownJewelTier": "unknown",
676
+ "mitigationVerdict": "unreachable-in-prod"
677
+ },
678
+ "scanner": {
679
+ "rulesetVersion": null,
680
+ "packHash": null,
681
+ "modelId": null
682
+ }
683
+ },
684
+ "adversaryTranscript": null,
685
+ "predictedBountyUsd": {
686
+ "low": 10,
687
+ "likely": 40,
688
+ "high": 120,
689
+ "program": "web2"
690
+ },
691
+ "bountyConfidence": "high",
692
+ "attackPlaybook": null
693
+ },
694
+ {
695
+ "id": "struct:index.js:116:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
696
+ "kind": "sast",
697
+ "severity": "medium",
698
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
699
+ "cwe": "CWE-400",
700
+ "owaspLlm": null,
701
+ "stride": "Denial of Service",
702
+ "file": "index.js",
703
+ "line": 116,
704
+ "snippet": "if (!fs.existsSync(fp)) return null;",
705
+ "fix": null,
706
+ "reachable": false,
707
+ "triage": 22,
708
+ "dataClasses": [],
709
+ "chain": null,
710
+ "confidence": 0.212,
711
+ "toxicity": 28,
712
+ "toxicityFactors": [
713
+ "http-facing"
714
+ ],
715
+ "toxicityLabel": "Medium",
716
+ "sources": null,
717
+ "epssScore": null,
718
+ "epssPercentile": null,
719
+ "epssCve": null,
720
+ "exploitedNow": false,
721
+ "tags": null,
722
+ "blastRadius": {
723
+ "scope": "all-users",
724
+ "dataAtRisk": [
725
+ "config"
726
+ ],
727
+ "userCount": 50,
728
+ "industry": "generic",
729
+ "jurisdictions": [],
730
+ "controlsApplied": [],
731
+ "dollarBest": 23250,
732
+ "dollarLikely": 136250,
733
+ "dollarWorst": 775000,
734
+ "dollarLow": 23250,
735
+ "dollarHigh": 775000,
736
+ "components": {
737
+ "incidentResponse": {
738
+ "low": 8000,
739
+ "likely": 50000,
740
+ "high": 250000
741
+ },
742
+ "legal": {
743
+ "low": 10000,
744
+ "likely": 75000,
745
+ "high": 500000
746
+ },
747
+ "crisisPR": {
748
+ "low": 0,
749
+ "likely": 0,
750
+ "high": 0
751
+ },
752
+ "notification": {
753
+ "low": 5000,
754
+ "likely": 10000,
755
+ "high": 15000
756
+ },
757
+ "creditMonitoring": {
758
+ "low": 0,
759
+ "likely": 0,
760
+ "high": 0
761
+ },
762
+ "regulatoryFines": {
763
+ "low": 0,
764
+ "likely": 0,
765
+ "high": 0
766
+ },
767
+ "directDamage": {
768
+ "low": 250,
769
+ "likely": 1250,
770
+ "high": 10000
771
+ },
772
+ "classAction": {
773
+ "low": 0,
774
+ "likely": 0,
775
+ "high": 0
776
+ },
777
+ "lostBusiness": {
778
+ "low": 0,
779
+ "likely": 0,
780
+ "high": 0
781
+ }
782
+ },
783
+ "dominantDriver": "legal counsel",
784
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
785
+ "confidence": "low",
786
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `index.js:116` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
787
+ },
788
+ "stableId": "91cf2e9bd1fe407b",
789
+ "confidenceTier": "very-low",
790
+ "exploitability": 0.2,
791
+ "exploitabilityTier": "low",
792
+ "exploitabilityFactors": [
793
+ "sev:medium",
794
+ "unreachable"
795
+ ],
796
+ "clusterSize": null,
797
+ "unreachable": false,
798
+ "validator_verdict": "unvalidated",
799
+ "llm_confidence": null,
800
+ "unvalidated": true,
801
+ "cross_language": false,
802
+ "family": "dos-sync-io",
803
+ "_unsigned": false,
804
+ "_passThroughSigning": false,
805
+ "signatureStatus": "verified",
806
+ "regression_test": null,
807
+ "poc": null,
808
+ "calibrated_confidence": null,
809
+ "calibrated_confidence_ci": null,
810
+ "calibrated_n": 0,
811
+ "calibration_reason": "no-history",
812
+ "verifier_verdict": "cannot-verify",
813
+ "verifier_reason": "no-poc-no-sanitizer-rule",
814
+ "verifier_runner": null,
815
+ "narration": null,
816
+ "mitigationVerdict": "unreachable-in-prod",
817
+ "mitigationsApplied": [],
818
+ "mitigatedByWaf": false,
819
+ "wafRuleId": null,
820
+ "mitigatedByAuth": false,
821
+ "authMechanism": null,
822
+ "mitigatedByNetwork": false,
823
+ "networkExposure": null,
824
+ "featureFlag": null,
825
+ "featureFlagState": null,
826
+ "featureFlagRollout": null,
827
+ "exposedInProd": false,
828
+ "unreachableInProd": true,
829
+ "coldPath": false,
830
+ "hotPath": false,
831
+ "prodRequestCount": null,
832
+ "crownJewelScore": 0.1,
833
+ "crownJewelTier": "low-value",
834
+ "crownJewelFactors": [
835
+ "reads-secret-env"
836
+ ],
837
+ "cloneClusterId": "66b8a8c25816e7f9",
838
+ "cloneClusterSize": 2,
839
+ "provenance": "human-likely",
840
+ "provenanceScore": 0.18,
841
+ "typeNarrowed": null,
842
+ "strideCategory": "denialOfService",
843
+ "personaScores": {
844
+ "script-kiddie": {
845
+ "score": 0.4,
846
+ "tier": "medium",
847
+ "factors": [
848
+ "sev:medium"
849
+ ]
850
+ },
851
+ "opportunistic-criminal": {
852
+ "score": 0.4,
853
+ "tier": "medium",
854
+ "factors": [
855
+ "sev:medium"
856
+ ]
857
+ },
858
+ "apt-nation-state": {
859
+ "score": 0.4,
860
+ "tier": "medium",
861
+ "factors": [
862
+ "sev:medium"
863
+ ]
864
+ },
865
+ "supply-chain-attacker": {
866
+ "score": 0.4,
867
+ "tier": "medium",
868
+ "factors": [
869
+ "sev:medium"
870
+ ]
871
+ },
872
+ "malicious-insider": {
873
+ "score": 0.4,
874
+ "tier": "medium",
875
+ "factors": [
876
+ "sev:medium"
877
+ ]
878
+ }
879
+ },
880
+ "personaTopTwo": [
881
+ "script-kiddie",
882
+ "opportunistic-criminal"
883
+ ],
884
+ "personaMaxName": "script-kiddie",
885
+ "personaMaxScore": 0.4,
886
+ "reverseExposure": null,
887
+ "specMined": null,
888
+ "whyFired": {
889
+ "detector": "sast/dos-sync-io",
890
+ "ruleId": "CWE-400",
891
+ "parser": "STRUCTURAL",
892
+ "evidence": {
893
+ "sinkSnippet": "if (!fs.existsSync(fp)) return null;",
894
+ "sourceSnippet": "if (!fs.existsSync(fp)) return null;",
895
+ "pathSteps": [],
896
+ "sanitizers": [],
897
+ "guards": []
898
+ },
899
+ "considered": {
900
+ "suppressionsApplied": [],
901
+ "suppressionsSkipped": [],
902
+ "reachabilityFilter": "unaffected",
903
+ "clusterCollapsed": false,
904
+ "typeNarrowed": false,
905
+ "crownJewelTier": "low-value",
906
+ "mitigationVerdict": "unreachable-in-prod"
907
+ },
908
+ "scanner": {
909
+ "rulesetVersion": null,
910
+ "packHash": null,
911
+ "modelId": null
912
+ }
913
+ },
914
+ "adversaryTranscript": null,
915
+ "predictedBountyUsd": {
916
+ "low": 10,
917
+ "likely": 40,
918
+ "high": 120,
919
+ "program": "web2"
920
+ },
921
+ "bountyConfidence": "high",
922
+ "attackPlaybook": null
923
+ },
924
+ {
925
+ "id": "struct:index.js:117:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
926
+ "kind": "sast",
927
+ "severity": "medium",
928
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
929
+ "cwe": "CWE-400",
930
+ "owaspLlm": null,
931
+ "stride": "Denial of Service",
932
+ "file": "index.js",
933
+ "line": 117,
934
+ "snippet": "try { return JSON.parse(fs.readFileSync(fp, 'utf8')); } catch { return null; }",
935
+ "fix": null,
936
+ "reachable": false,
937
+ "triage": 22,
938
+ "dataClasses": [],
939
+ "chain": null,
940
+ "confidence": 0.212,
941
+ "toxicity": 28,
942
+ "toxicityFactors": [
943
+ "http-facing"
944
+ ],
945
+ "toxicityLabel": "Medium",
946
+ "sources": null,
947
+ "epssScore": null,
948
+ "epssPercentile": null,
949
+ "epssCve": null,
950
+ "exploitedNow": false,
951
+ "tags": null,
952
+ "blastRadius": {
953
+ "scope": "all-users",
954
+ "dataAtRisk": [
955
+ "config"
956
+ ],
957
+ "userCount": 50,
958
+ "industry": "generic",
959
+ "jurisdictions": [],
960
+ "controlsApplied": [],
961
+ "dollarBest": 23250,
962
+ "dollarLikely": 136250,
963
+ "dollarWorst": 775000,
964
+ "dollarLow": 23250,
965
+ "dollarHigh": 775000,
966
+ "components": {
967
+ "incidentResponse": {
968
+ "low": 8000,
969
+ "likely": 50000,
970
+ "high": 250000
971
+ },
972
+ "legal": {
973
+ "low": 10000,
974
+ "likely": 75000,
975
+ "high": 500000
976
+ },
977
+ "crisisPR": {
978
+ "low": 0,
979
+ "likely": 0,
980
+ "high": 0
981
+ },
982
+ "notification": {
983
+ "low": 5000,
984
+ "likely": 10000,
985
+ "high": 15000
986
+ },
987
+ "creditMonitoring": {
988
+ "low": 0,
989
+ "likely": 0,
990
+ "high": 0
991
+ },
992
+ "regulatoryFines": {
993
+ "low": 0,
994
+ "likely": 0,
995
+ "high": 0
996
+ },
997
+ "directDamage": {
998
+ "low": 250,
999
+ "likely": 1250,
1000
+ "high": 10000
1001
+ },
1002
+ "classAction": {
1003
+ "low": 0,
1004
+ "likely": 0,
1005
+ "high": 0
1006
+ },
1007
+ "lostBusiness": {
1008
+ "low": 0,
1009
+ "likely": 0,
1010
+ "high": 0
1011
+ }
1012
+ },
1013
+ "dominantDriver": "legal counsel",
1014
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1015
+ "confidence": "low",
1016
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `index.js:117` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
1017
+ },
1018
+ "stableId": "b3bc63cb273757a2",
1019
+ "confidenceTier": "very-low",
1020
+ "exploitability": 0.2,
1021
+ "exploitabilityTier": "low",
1022
+ "exploitabilityFactors": [
1023
+ "sev:medium",
1024
+ "unreachable"
1025
+ ],
1026
+ "clusterSize": null,
1027
+ "unreachable": false,
1028
+ "validator_verdict": "unvalidated",
1029
+ "llm_confidence": null,
1030
+ "unvalidated": true,
1031
+ "cross_language": false,
1032
+ "family": "dos-sync-io",
1033
+ "_unsigned": false,
1034
+ "_passThroughSigning": false,
1035
+ "signatureStatus": "verified",
1036
+ "regression_test": null,
1037
+ "poc": null,
1038
+ "calibrated_confidence": null,
1039
+ "calibrated_confidence_ci": null,
1040
+ "calibrated_n": 0,
1041
+ "calibration_reason": "no-history",
1042
+ "verifier_verdict": "cannot-verify",
1043
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1044
+ "verifier_runner": null,
1045
+ "narration": null,
1046
+ "mitigationVerdict": "unreachable-in-prod",
1047
+ "mitigationsApplied": [],
1048
+ "mitigatedByWaf": false,
1049
+ "wafRuleId": null,
1050
+ "mitigatedByAuth": false,
1051
+ "authMechanism": null,
1052
+ "mitigatedByNetwork": false,
1053
+ "networkExposure": null,
1054
+ "featureFlag": null,
1055
+ "featureFlagState": null,
1056
+ "featureFlagRollout": null,
1057
+ "exposedInProd": false,
1058
+ "unreachableInProd": true,
1059
+ "coldPath": false,
1060
+ "hotPath": false,
1061
+ "prodRequestCount": null,
1062
+ "crownJewelScore": 0.1,
1063
+ "crownJewelTier": "low-value",
1064
+ "crownJewelFactors": [
1065
+ "reads-secret-env"
1066
+ ],
1067
+ "cloneClusterId": "29d998f79544cba7",
1068
+ "cloneClusterSize": 1,
1069
+ "provenance": "human-likely",
1070
+ "provenanceScore": 0.18,
1071
+ "typeNarrowed": null,
1072
+ "strideCategory": "denialOfService",
1073
+ "personaScores": {
1074
+ "script-kiddie": {
1075
+ "score": 0.4,
1076
+ "tier": "medium",
1077
+ "factors": [
1078
+ "sev:medium"
1079
+ ]
1080
+ },
1081
+ "opportunistic-criminal": {
1082
+ "score": 0.4,
1083
+ "tier": "medium",
1084
+ "factors": [
1085
+ "sev:medium"
1086
+ ]
1087
+ },
1088
+ "apt-nation-state": {
1089
+ "score": 0.4,
1090
+ "tier": "medium",
1091
+ "factors": [
1092
+ "sev:medium"
1093
+ ]
1094
+ },
1095
+ "supply-chain-attacker": {
1096
+ "score": 0.4,
1097
+ "tier": "medium",
1098
+ "factors": [
1099
+ "sev:medium"
1100
+ ]
1101
+ },
1102
+ "malicious-insider": {
1103
+ "score": 0.4,
1104
+ "tier": "medium",
1105
+ "factors": [
1106
+ "sev:medium"
1107
+ ]
1108
+ }
1109
+ },
1110
+ "personaTopTwo": [
1111
+ "script-kiddie",
1112
+ "opportunistic-criminal"
1113
+ ],
1114
+ "personaMaxName": "script-kiddie",
1115
+ "personaMaxScore": 0.4,
1116
+ "reverseExposure": null,
1117
+ "specMined": null,
1118
+ "whyFired": {
1119
+ "detector": "sast/dos-sync-io",
1120
+ "ruleId": "CWE-400",
1121
+ "parser": "STRUCTURAL",
1122
+ "evidence": {
1123
+ "sinkSnippet": "try { return JSON.parse(fs.readFileSync(fp, 'utf8')); } catch { return null; }",
1124
+ "sourceSnippet": "try { return JSON.parse(fs.readFileSync(fp, 'utf8')); } catch { return null; }",
1125
+ "pathSteps": [],
1126
+ "sanitizers": [],
1127
+ "guards": []
1128
+ },
1129
+ "considered": {
1130
+ "suppressionsApplied": [],
1131
+ "suppressionsSkipped": [],
1132
+ "reachabilityFilter": "unaffected",
1133
+ "clusterCollapsed": false,
1134
+ "typeNarrowed": false,
1135
+ "crownJewelTier": "low-value",
1136
+ "mitigationVerdict": "unreachable-in-prod"
1137
+ },
1138
+ "scanner": {
1139
+ "rulesetVersion": null,
1140
+ "packHash": null,
1141
+ "modelId": null
1142
+ }
1143
+ },
1144
+ "adversaryTranscript": null,
1145
+ "predictedBountyUsd": {
1146
+ "low": 10,
1147
+ "likely": 40,
1148
+ "high": 120,
1149
+ "program": "web2"
1150
+ },
1151
+ "bountyConfidence": "high",
1152
+ "attackPlaybook": null
1153
+ },
1154
+ {
1155
+ "id": "struct:index.js:123:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
1156
+ "kind": "sast",
1157
+ "severity": "medium",
1158
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1159
+ "cwe": "CWE-400",
1160
+ "owaspLlm": null,
1161
+ "stride": "Denial of Service",
1162
+ "file": "index.js",
1163
+ "line": 123,
1164
+ "snippet": "try { fs.writeFileSync(fp, JSON.stringify(value, null, 2)); } catch {}",
1165
+ "fix": null,
1166
+ "reachable": false,
1167
+ "triage": 22,
1168
+ "dataClasses": [],
1169
+ "chain": null,
1170
+ "confidence": 0.212,
1171
+ "toxicity": 28,
1172
+ "toxicityFactors": [
1173
+ "http-facing"
1174
+ ],
1175
+ "toxicityLabel": "Medium",
1176
+ "sources": null,
1177
+ "epssScore": null,
1178
+ "epssPercentile": null,
1179
+ "epssCve": null,
1180
+ "exploitedNow": false,
1181
+ "tags": null,
1182
+ "blastRadius": {
1183
+ "scope": "all-users",
1184
+ "dataAtRisk": [
1185
+ "config"
1186
+ ],
1187
+ "userCount": 50,
1188
+ "industry": "generic",
1189
+ "jurisdictions": [],
1190
+ "controlsApplied": [],
1191
+ "dollarBest": 23250,
1192
+ "dollarLikely": 136250,
1193
+ "dollarWorst": 775000,
1194
+ "dollarLow": 23250,
1195
+ "dollarHigh": 775000,
1196
+ "components": {
1197
+ "incidentResponse": {
1198
+ "low": 8000,
1199
+ "likely": 50000,
1200
+ "high": 250000
1201
+ },
1202
+ "legal": {
1203
+ "low": 10000,
1204
+ "likely": 75000,
1205
+ "high": 500000
1206
+ },
1207
+ "crisisPR": {
1208
+ "low": 0,
1209
+ "likely": 0,
1210
+ "high": 0
1211
+ },
1212
+ "notification": {
1213
+ "low": 5000,
1214
+ "likely": 10000,
1215
+ "high": 15000
1216
+ },
1217
+ "creditMonitoring": {
1218
+ "low": 0,
1219
+ "likely": 0,
1220
+ "high": 0
1221
+ },
1222
+ "regulatoryFines": {
1223
+ "low": 0,
1224
+ "likely": 0,
1225
+ "high": 0
1226
+ },
1227
+ "directDamage": {
1228
+ "low": 250,
1229
+ "likely": 1250,
1230
+ "high": 10000
1231
+ },
1232
+ "classAction": {
1233
+ "low": 0,
1234
+ "likely": 0,
1235
+ "high": 0
1236
+ },
1237
+ "lostBusiness": {
1238
+ "low": 0,
1239
+ "likely": 0,
1240
+ "high": 0
1241
+ }
1242
+ },
1243
+ "dominantDriver": "legal counsel",
1244
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1245
+ "confidence": "low",
1246
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `index.js:123` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
1247
+ },
1248
+ "stableId": "f1bcad60f84cd7d8",
1249
+ "confidenceTier": "very-low",
1250
+ "exploitability": 0.2,
1251
+ "exploitabilityTier": "low",
1252
+ "exploitabilityFactors": [
1253
+ "sev:medium",
1254
+ "unreachable"
1255
+ ],
1256
+ "clusterSize": null,
1257
+ "unreachable": false,
1258
+ "validator_verdict": "unvalidated",
1259
+ "llm_confidence": null,
1260
+ "unvalidated": true,
1261
+ "cross_language": false,
1262
+ "family": "dos-sync-io",
1263
+ "_unsigned": false,
1264
+ "_passThroughSigning": false,
1265
+ "signatureStatus": "verified",
1266
+ "regression_test": null,
1267
+ "poc": null,
1268
+ "calibrated_confidence": null,
1269
+ "calibrated_confidence_ci": null,
1270
+ "calibrated_n": 0,
1271
+ "calibration_reason": "no-history",
1272
+ "verifier_verdict": "cannot-verify",
1273
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1274
+ "verifier_runner": null,
1275
+ "narration": null,
1276
+ "mitigationVerdict": "unreachable-in-prod",
1277
+ "mitigationsApplied": [],
1278
+ "mitigatedByWaf": false,
1279
+ "wafRuleId": null,
1280
+ "mitigatedByAuth": false,
1281
+ "authMechanism": null,
1282
+ "mitigatedByNetwork": false,
1283
+ "networkExposure": null,
1284
+ "featureFlag": null,
1285
+ "featureFlagState": null,
1286
+ "featureFlagRollout": null,
1287
+ "exposedInProd": false,
1288
+ "unreachableInProd": true,
1289
+ "coldPath": false,
1290
+ "hotPath": false,
1291
+ "prodRequestCount": null,
1292
+ "crownJewelScore": 0.1,
1293
+ "crownJewelTier": "low-value",
1294
+ "crownJewelFactors": [
1295
+ "reads-secret-env"
1296
+ ],
1297
+ "cloneClusterId": "55a282f0f3dd72ac",
1298
+ "cloneClusterSize": 1,
1299
+ "provenance": "human-likely",
1300
+ "provenanceScore": 0.18,
1301
+ "typeNarrowed": null,
1302
+ "strideCategory": "denialOfService",
1303
+ "personaScores": {
1304
+ "script-kiddie": {
1305
+ "score": 0.4,
1306
+ "tier": "medium",
1307
+ "factors": [
1308
+ "sev:medium"
1309
+ ]
1310
+ },
1311
+ "opportunistic-criminal": {
1312
+ "score": 0.4,
1313
+ "tier": "medium",
1314
+ "factors": [
1315
+ "sev:medium"
1316
+ ]
1317
+ },
1318
+ "apt-nation-state": {
1319
+ "score": 0.4,
1320
+ "tier": "medium",
1321
+ "factors": [
1322
+ "sev:medium"
1323
+ ]
1324
+ },
1325
+ "supply-chain-attacker": {
1326
+ "score": 0.4,
1327
+ "tier": "medium",
1328
+ "factors": [
1329
+ "sev:medium"
1330
+ ]
1331
+ },
1332
+ "malicious-insider": {
1333
+ "score": 0.4,
1334
+ "tier": "medium",
1335
+ "factors": [
1336
+ "sev:medium"
1337
+ ]
1338
+ }
1339
+ },
1340
+ "personaTopTwo": [
1341
+ "script-kiddie",
1342
+ "opportunistic-criminal"
1343
+ ],
1344
+ "personaMaxName": "script-kiddie",
1345
+ "personaMaxScore": 0.4,
1346
+ "reverseExposure": null,
1347
+ "specMined": null,
1348
+ "whyFired": {
1349
+ "detector": "sast/dos-sync-io",
1350
+ "ruleId": "CWE-400",
1351
+ "parser": "STRUCTURAL",
1352
+ "evidence": {
1353
+ "sinkSnippet": "try { fs.writeFileSync(fp, JSON.stringify(value, null, 2)); } catch {}",
1354
+ "sourceSnippet": "try { fs.writeFileSync(fp, JSON.stringify(value, null, 2)); } catch {}",
1355
+ "pathSteps": [],
1356
+ "sanitizers": [],
1357
+ "guards": []
1358
+ },
1359
+ "considered": {
1360
+ "suppressionsApplied": [],
1361
+ "suppressionsSkipped": [],
1362
+ "reachabilityFilter": "unaffected",
1363
+ "clusterCollapsed": false,
1364
+ "typeNarrowed": false,
1365
+ "crownJewelTier": "low-value",
1366
+ "mitigationVerdict": "unreachable-in-prod"
1367
+ },
1368
+ "scanner": {
1369
+ "rulesetVersion": null,
1370
+ "packHash": null,
1371
+ "modelId": null
1372
+ }
1373
+ },
1374
+ "adversaryTranscript": null,
1375
+ "predictedBountyUsd": {
1376
+ "low": 10,
1377
+ "likely": 40,
1378
+ "high": 120,
1379
+ "program": "web2"
1380
+ },
1381
+ "bountyConfidence": "high",
1382
+ "attackPlaybook": null
1383
+ },
1384
+ {
1385
+ "id": "toctou-fs:index.js:116",
1386
+ "kind": "sast",
1387
+ "severity": "medium",
1388
+ "vuln": "TOCTOU: file existence/permission check before open",
1389
+ "cwe": "CWE-367",
1390
+ "owaspLlm": null,
1391
+ "stride": "Tampering",
1392
+ "file": "index.js",
1393
+ "line": 116,
1394
+ "snippet": "if (!fs.existsSync(fp)) return null;",
1395
+ "fix": null,
1396
+ "reachable": false,
1397
+ "triage": 22,
1398
+ "dataClasses": [],
1399
+ "chain": null,
1400
+ "confidence": 0.7,
1401
+ "toxicity": 8,
1402
+ "toxicityFactors": [],
1403
+ "toxicityLabel": "Low",
1404
+ "sources": null,
1405
+ "epssScore": null,
1406
+ "epssPercentile": null,
1407
+ "epssCve": null,
1408
+ "exploitedNow": false,
1409
+ "tags": null,
1410
+ "blastRadius": {
1411
+ "scope": "all-users",
1412
+ "dataAtRisk": [
1413
+ "config"
1414
+ ],
1415
+ "userCount": 50,
1416
+ "industry": "generic",
1417
+ "jurisdictions": [],
1418
+ "controlsApplied": [],
1419
+ "dollarBest": 23250,
1420
+ "dollarLikely": 136250,
1421
+ "dollarWorst": 775000,
1422
+ "dollarLow": 23250,
1423
+ "dollarHigh": 775000,
1424
+ "components": {
1425
+ "incidentResponse": {
1426
+ "low": 8000,
1427
+ "likely": 50000,
1428
+ "high": 250000
1429
+ },
1430
+ "legal": {
1431
+ "low": 10000,
1432
+ "likely": 75000,
1433
+ "high": 500000
1434
+ },
1435
+ "crisisPR": {
1436
+ "low": 0,
1437
+ "likely": 0,
1438
+ "high": 0
1439
+ },
1440
+ "notification": {
1441
+ "low": 5000,
1442
+ "likely": 10000,
1443
+ "high": 15000
1444
+ },
1445
+ "creditMonitoring": {
1446
+ "low": 0,
1447
+ "likely": 0,
1448
+ "high": 0
1449
+ },
1450
+ "regulatoryFines": {
1451
+ "low": 0,
1452
+ "likely": 0,
1453
+ "high": 0
1454
+ },
1455
+ "directDamage": {
1456
+ "low": 250,
1457
+ "likely": 1250,
1458
+ "high": 10000
1459
+ },
1460
+ "classAction": {
1461
+ "low": 0,
1462
+ "likely": 0,
1463
+ "high": 0
1464
+ },
1465
+ "lostBusiness": {
1466
+ "low": 0,
1467
+ "likely": 0,
1468
+ "high": 0
1469
+ }
1470
+ },
1471
+ "dominantDriver": "legal counsel",
1472
+ "comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
1473
+ "confidence": "low",
1474
+ "narrative": "TOCTOU: file existence/permission check before open on `index.js:116` 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."
1475
+ },
1476
+ "stableId": "e3ea9a39f5387898",
1477
+ "confidenceTier": "medium",
1478
+ "exploitability": 0.2,
1479
+ "exploitabilityTier": "low",
1480
+ "exploitabilityFactors": [
1481
+ "sev:medium",
1482
+ "unreachable"
1483
+ ],
1484
+ "clusterSize": null,
1485
+ "unreachable": false,
1486
+ "validator_verdict": "unvalidated",
1487
+ "llm_confidence": null,
1488
+ "unvalidated": true,
1489
+ "cross_language": false,
1490
+ "family": "toctou-file-existence-permission-check-b",
1491
+ "_unsigned": false,
1492
+ "_passThroughSigning": false,
1493
+ "signatureStatus": "verified",
1494
+ "regression_test": null,
1495
+ "poc": null,
1496
+ "calibrated_confidence": null,
1497
+ "calibrated_confidence_ci": null,
1498
+ "calibrated_n": 0,
1499
+ "calibration_reason": "no-history",
1500
+ "verifier_verdict": "cannot-verify",
1501
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1502
+ "verifier_runner": null,
1503
+ "narration": null,
1504
+ "mitigationVerdict": "unreachable-in-prod",
1505
+ "mitigationsApplied": [],
1506
+ "mitigatedByWaf": false,
1507
+ "wafRuleId": null,
1508
+ "mitigatedByAuth": false,
1509
+ "authMechanism": null,
1510
+ "mitigatedByNetwork": false,
1511
+ "networkExposure": null,
1512
+ "featureFlag": null,
1513
+ "featureFlagState": null,
1514
+ "featureFlagRollout": null,
1515
+ "exposedInProd": false,
1516
+ "unreachableInProd": true,
1517
+ "coldPath": false,
1518
+ "hotPath": false,
1519
+ "prodRequestCount": null,
1520
+ "crownJewelScore": 0.1,
1521
+ "crownJewelTier": "low-value",
1522
+ "crownJewelFactors": [
1523
+ "reads-secret-env"
1524
+ ],
1525
+ "cloneClusterId": "66b8a8c25816e7f9",
1526
+ "cloneClusterSize": 2,
1527
+ "provenance": "human-likely",
1528
+ "provenanceScore": 0.18,
1529
+ "typeNarrowed": null,
1530
+ "strideCategory": "tampering",
1531
+ "personaScores": {
1532
+ "script-kiddie": {
1533
+ "score": 0.4,
1534
+ "tier": "medium",
1535
+ "factors": [
1536
+ "sev:medium"
1537
+ ]
1538
+ },
1539
+ "opportunistic-criminal": {
1540
+ "score": 0.4,
1541
+ "tier": "medium",
1542
+ "factors": [
1543
+ "sev:medium"
1544
+ ]
1545
+ },
1546
+ "apt-nation-state": {
1547
+ "score": 0.4,
1548
+ "tier": "medium",
1549
+ "factors": [
1550
+ "sev:medium"
1551
+ ]
1552
+ },
1553
+ "supply-chain-attacker": {
1554
+ "score": 0.4,
1555
+ "tier": "medium",
1556
+ "factors": [
1557
+ "sev:medium"
1558
+ ]
1559
+ },
1560
+ "malicious-insider": {
1561
+ "score": 0.4,
1562
+ "tier": "medium",
1563
+ "factors": [
1564
+ "sev:medium"
1565
+ ]
1566
+ }
1567
+ },
1568
+ "personaTopTwo": [
1569
+ "script-kiddie",
1570
+ "opportunistic-criminal"
1571
+ ],
1572
+ "personaMaxName": "script-kiddie",
1573
+ "personaMaxScore": 0.4,
1574
+ "reverseExposure": null,
1575
+ "specMined": null,
1576
+ "whyFired": {
1577
+ "detector": "sast/toctou-file-existence-permission-check-b",
1578
+ "ruleId": "CWE-367",
1579
+ "parser": "TOCTOU",
1580
+ "evidence": {
1581
+ "sinkSnippet": "if (!fs.existsSync(fp)) return null;",
1582
+ "sourceSnippet": null,
1583
+ "pathSteps": [],
1584
+ "sanitizers": [],
1585
+ "guards": []
1586
+ },
1587
+ "considered": {
1588
+ "suppressionsApplied": [],
1589
+ "suppressionsSkipped": [],
1590
+ "reachabilityFilter": "unaffected",
1591
+ "clusterCollapsed": false,
1592
+ "typeNarrowed": false,
1593
+ "crownJewelTier": "low-value",
1594
+ "mitigationVerdict": "unreachable-in-prod"
1595
+ },
1596
+ "scanner": {
1597
+ "rulesetVersion": null,
1598
+ "packHash": null,
1599
+ "modelId": null
1600
+ }
1601
+ },
1602
+ "adversaryTranscript": null,
1603
+ "predictedBountyUsd": null,
1604
+ "bountyConfidence": null,
1605
+ "attackPlaybook": null
1606
+ },
1607
+ {
1608
+ "id": "b73122a9107687a2",
1609
+ "kind": "logic",
1610
+ "severity": "medium",
1611
+ "vuln": "Missing Timeout on Outbound HTTP Request (DoS)",
1612
+ "cwe": "CWE-400",
1613
+ "stride": "Denial of Service",
1614
+ "file": "index.js",
1615
+ "line": 185,
1616
+ "snippet": "const r = await fetch(endpoint, { method: 'POST', headers, body: JSON.stringify(body) });",
1617
+ "fix": {
1618
+ "description": "Set a timeout on all outbound requests to prevent event-loop starvation from stalled upstreams.",
1619
+ "code": "// fetch (Node 18+)\nconst resp = await fetch(url, { signal: AbortSignal.timeout(5000) });\n\n// axios\nawait axios.get(url, { timeout: 5000 });\n\n// node http\nconst req = http.get(url, cb);\nreq.setTimeout(5000, () => req.destroy());"
1620
+ },
1621
+ "blastRadius": {
1622
+ "scope": "all-users",
1623
+ "dataAtRisk": [
1624
+ "config"
1625
+ ],
1626
+ "userCount": 50,
1627
+ "industry": "generic",
1628
+ "jurisdictions": [],
1629
+ "controlsApplied": [],
1630
+ "dollarBest": 23250,
1631
+ "dollarLikely": 136250,
1632
+ "dollarWorst": 775000,
1633
+ "dollarLow": 23250,
1634
+ "dollarHigh": 775000,
1635
+ "components": {
1636
+ "incidentResponse": {
1637
+ "low": 8000,
1638
+ "likely": 50000,
1639
+ "high": 250000
1640
+ },
1641
+ "legal": {
1642
+ "low": 10000,
1643
+ "likely": 75000,
1644
+ "high": 500000
1645
+ },
1646
+ "crisisPR": {
1647
+ "low": 0,
1648
+ "likely": 0,
1649
+ "high": 0
1650
+ },
1651
+ "notification": {
1652
+ "low": 5000,
1653
+ "likely": 10000,
1654
+ "high": 15000
1655
+ },
1656
+ "creditMonitoring": {
1657
+ "low": 0,
1658
+ "likely": 0,
1659
+ "high": 0
1660
+ },
1661
+ "regulatoryFines": {
1662
+ "low": 0,
1663
+ "likely": 0,
1664
+ "high": 0
1665
+ },
1666
+ "directDamage": {
1667
+ "low": 250,
1668
+ "likely": 1250,
1669
+ "high": 10000
1670
+ },
1671
+ "classAction": {
1672
+ "low": 0,
1673
+ "likely": 0,
1674
+ "high": 0
1675
+ },
1676
+ "lostBusiness": {
1677
+ "low": 0,
1678
+ "likely": 0,
1679
+ "high": 0
1680
+ }
1681
+ },
1682
+ "dominantDriver": "legal counsel",
1683
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1684
+ "confidence": "low",
1685
+ "narrative": "Missing Timeout on Outbound HTTP Request (DoS) on `index.js:185` 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
1686
+ }
1687
+ },
1688
+ {
1689
+ "id": "logic:index.js:116:TOCTOU:_existsSync_followed_by_file_op",
1690
+ "kind": "logic",
1691
+ "severity": "medium",
1692
+ "vuln": "TOCTOU: existsSync followed by file op",
1693
+ "cwe": "CWE-367",
1694
+ "stride": "Tampering",
1695
+ "file": "index.js",
1696
+ "line": 116,
1697
+ "snippet": "if (!fs.existsSync(fp)) return null;",
1698
+ "fix": {
1699
+ "description": "Replace the check-then-act sequence with a single atomic operation (e.g., `fs.open` with appropriate flags). Between `existsSync` and the file op the file can be replaced by a symlink or removed.",
1700
+ "code": ""
1701
+ },
1702
+ "blastRadius": {
1703
+ "scope": "all-users",
1704
+ "dataAtRisk": [
1705
+ "config"
1706
+ ],
1707
+ "userCount": 50,
1708
+ "industry": "generic",
1709
+ "jurisdictions": [],
1710
+ "controlsApplied": [],
1711
+ "dollarBest": 23250,
1712
+ "dollarLikely": 136250,
1713
+ "dollarWorst": 775000,
1714
+ "dollarLow": 23250,
1715
+ "dollarHigh": 775000,
1716
+ "components": {
1717
+ "incidentResponse": {
1718
+ "low": 8000,
1719
+ "likely": 50000,
1720
+ "high": 250000
1721
+ },
1722
+ "legal": {
1723
+ "low": 10000,
1724
+ "likely": 75000,
1725
+ "high": 500000
1726
+ },
1727
+ "crisisPR": {
1728
+ "low": 0,
1729
+ "likely": 0,
1730
+ "high": 0
1731
+ },
1732
+ "notification": {
1733
+ "low": 5000,
1734
+ "likely": 10000,
1735
+ "high": 15000
1736
+ },
1737
+ "creditMonitoring": {
1738
+ "low": 0,
1739
+ "likely": 0,
1740
+ "high": 0
1741
+ },
1742
+ "regulatoryFines": {
1743
+ "low": 0,
1744
+ "likely": 0,
1745
+ "high": 0
1746
+ },
1747
+ "directDamage": {
1748
+ "low": 250,
1749
+ "likely": 1250,
1750
+ "high": 10000
1751
+ },
1752
+ "classAction": {
1753
+ "low": 0,
1754
+ "likely": 0,
1755
+ "high": 0
1756
+ },
1757
+ "lostBusiness": {
1758
+ "low": 0,
1759
+ "likely": 0,
1760
+ "high": 0
1761
+ }
1762
+ },
1763
+ "dominantDriver": "legal counsel",
1764
+ "comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
1765
+ "confidence": "low",
1766
+ "narrative": "TOCTOU: existsSync followed by file op on `index.js:116` 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."
1767
+ }
1768
+ }
1769
+ ],
1770
+ "bundles": [],
1771
+ "routes": [],
1772
+ "components": [],
1773
+ "suppressedCount": 2,
1774
+ "blastRadiusSignals": {
1775
+ "industry": "generic",
1776
+ "industryConfidence": "low",
1777
+ "jurisdictions": [],
1778
+ "controls": [],
1779
+ "estimatedUsers": 50,
1780
+ "revenueIndicator": "pre-revenue",
1781
+ "hasStripe": false,
1782
+ "hasAuth": false,
1783
+ "hasUserTable": false,
1784
+ "hasPII": false,
1785
+ "hasPHI": false,
1786
+ "hasS3": false
1787
+ },
1788
+ "_v3": {
1789
+ "counterfactual": {
1790
+ "spofControls": [],
1791
+ "controlsDetected": 28
1792
+ },
1793
+ "threatModel": {
1794
+ "summary": {
1795
+ "assetCount": 1,
1796
+ "boundaryCount": 0,
1797
+ "strideCounts": {
1798
+ "spoofing": 0,
1799
+ "tampering": 1,
1800
+ "repudiation": 0,
1801
+ "informationDisclosure": 0,
1802
+ "denialOfService": 5,
1803
+ "elevationOfPrivilege": 0
1804
+ }
1805
+ },
1806
+ "assets": [
1807
+ {
1808
+ "name": "AGENTIC_SECURITY_LLM_API_KEY",
1809
+ "file": "index.js",
1810
+ "line": 95,
1811
+ "category": "secret",
1812
+ "exposure": "internal"
1813
+ }
1814
+ ],
1815
+ "trustBoundaries": [],
1816
+ "stride": {
1817
+ "spoofing": [],
1818
+ "tampering": [
1819
+ {
1820
+ "vuln": "TOCTOU: file existence/permission check before open",
1821
+ "file": "index.js",
1822
+ "line": 116,
1823
+ "severity": "medium"
1824
+ }
1825
+ ],
1826
+ "repudiation": [],
1827
+ "informationDisclosure": [],
1828
+ "denialOfService": [
1829
+ {
1830
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1831
+ "file": "consistency.js",
1832
+ "severity": "medium"
1833
+ },
1834
+ {
1835
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1836
+ "file": "consistency.js",
1837
+ "severity": "medium"
1838
+ },
1839
+ {
1840
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1841
+ "file": "index.js",
1842
+ "severity": "medium"
1843
+ },
1844
+ {
1845
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1846
+ "file": "index.js",
1847
+ "severity": "medium"
1848
+ },
1849
+ {
1850
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1851
+ "file": "index.js",
1852
+ "severity": "medium"
1853
+ }
1854
+ ],
1855
+ "elevationOfPrivilege": []
1856
+ }
1857
+ },
1858
+ "trustBoundaryDiagram": {
1859
+ "mermaid": "flowchart LR\n INTERNET((Internet))\n APP[\"Application\"]\n asset_secret_AGENTIC_SECURITY_LLM_API_KEY[/\"secret: AGENTIC_SECURITY_LLM_API_KEY\"/]\n APP -->|asset| asset_secret_AGENTIC_SECURITY_LLM_API_KEY\n classDef sev_critical fill:#ffcccc,stroke:#a00,stroke-width:2px;\n classDef sev_high fill:#ffe0b2,stroke:#c60,stroke-width:2px;\n classDef sev_medium fill:#fff3cd,stroke:#a80;\n classDef sev_low fill:#e8eaf6,stroke:#557;",
1860
+ "nodes": [
1861
+ {
1862
+ "id": "INTERNET",
1863
+ "kind": "external",
1864
+ "label": "Internet"
1865
+ },
1866
+ {
1867
+ "id": "APP",
1868
+ "kind": "app",
1869
+ "label": "Application"
1870
+ },
1871
+ {
1872
+ "id": "asset_secret_AGENTIC_SECURITY_LLM_API_KEY",
1873
+ "kind": "asset",
1874
+ "label": "secret: AGENTIC_SECURITY_LLM_API_KEY"
1875
+ }
1876
+ ],
1877
+ "edges": [
1878
+ {
1879
+ "from": "APP",
1880
+ "to": "asset_secret_AGENTIC_SECURITY_LLM_API_KEY",
1881
+ "kind": "asset"
1882
+ }
1883
+ ],
1884
+ "decorations": []
1885
+ },
1886
+ "calibrationDrift": {
1887
+ "alarms": [],
1888
+ "note": "no-feedback-data"
1889
+ }
1890
+ }
1891
+ }