@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,3036 @@
1
+ {
2
+ "scanId": "e3eb4e8f-6086-4f67-abc4-9f0666ae3092",
3
+ "startedAt": "2026-05-20T17:01:27.260Z",
4
+ "durationMs": 291,
5
+ "scanned": {
6
+ "files": 12,
7
+ "lines": 0
8
+ },
9
+ "findings": [
10
+ {
11
+ "id": "struct:parser-cs.js:208:Mass_Assignment_(req.body_Direct_to_Model)",
12
+ "kind": "sast",
13
+ "severity": "high",
14
+ "vuln": "Mass Assignment (req.body Direct to Model)",
15
+ "cwe": "CWE-915",
16
+ "owaspLlm": null,
17
+ "stride": "Tampering",
18
+ "file": "parser-cs.js",
19
+ "line": 208,
20
+ "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
21
+ "fix": null,
22
+ "reachable": false,
23
+ "triage": 39,
24
+ "dataClasses": [],
25
+ "chain": null,
26
+ "confidence": 0.314,
27
+ "toxicity": 35,
28
+ "toxicityFactors": [
29
+ "high-severity",
30
+ "http-facing"
31
+ ],
32
+ "toxicityLabel": "Medium",
33
+ "sources": null,
34
+ "epssScore": null,
35
+ "epssPercentile": null,
36
+ "epssCve": null,
37
+ "exploitedNow": false,
38
+ "tags": null,
39
+ "blastRadius": {
40
+ "scope": "all-users",
41
+ "dataAtRisk": [
42
+ "config"
43
+ ],
44
+ "userCount": 50,
45
+ "industry": "generic",
46
+ "jurisdictions": [],
47
+ "controlsApplied": [],
48
+ "dollarBest": 23250,
49
+ "dollarLikely": 136250,
50
+ "dollarWorst": 775000,
51
+ "dollarLow": 23250,
52
+ "dollarHigh": 775000,
53
+ "components": {
54
+ "incidentResponse": {
55
+ "low": 8000,
56
+ "likely": 50000,
57
+ "high": 250000
58
+ },
59
+ "legal": {
60
+ "low": 10000,
61
+ "likely": 75000,
62
+ "high": 500000
63
+ },
64
+ "crisisPR": {
65
+ "low": 0,
66
+ "likely": 0,
67
+ "high": 0
68
+ },
69
+ "notification": {
70
+ "low": 5000,
71
+ "likely": 10000,
72
+ "high": 15000
73
+ },
74
+ "creditMonitoring": {
75
+ "low": 0,
76
+ "likely": 0,
77
+ "high": 0
78
+ },
79
+ "regulatoryFines": {
80
+ "low": 0,
81
+ "likely": 0,
82
+ "high": 0
83
+ },
84
+ "directDamage": {
85
+ "low": 250,
86
+ "likely": 1250,
87
+ "high": 10000
88
+ },
89
+ "classAction": {
90
+ "low": 0,
91
+ "likely": 0,
92
+ "high": 0
93
+ },
94
+ "lostBusiness": {
95
+ "low": 0,
96
+ "likely": 0,
97
+ "high": 0
98
+ }
99
+ },
100
+ "dominantDriver": "legal counsel",
101
+ "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
102
+ "confidence": "low",
103
+ "narrative": "Mass Assignment (req.body Direct to Model) on `parser-cs.js:208` 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."
104
+ },
105
+ "stableId": "1881a55e55ca05ef",
106
+ "confidenceTier": "low",
107
+ "exploitability": 0.45,
108
+ "exploitabilityTier": "medium",
109
+ "exploitabilityFactors": [
110
+ "sev:high",
111
+ "unreachable"
112
+ ],
113
+ "clusterSize": null,
114
+ "unreachable": false,
115
+ "validator_verdict": "unvalidated",
116
+ "llm_confidence": null,
117
+ "unvalidated": true,
118
+ "cross_language": false,
119
+ "family": "mass-assignment",
120
+ "_unsigned": false,
121
+ "_passThroughSigning": false,
122
+ "signatureStatus": "verified",
123
+ "regression_test": null,
124
+ "poc": null,
125
+ "calibrated_confidence": null,
126
+ "calibrated_confidence_ci": null,
127
+ "calibrated_n": 5,
128
+ "calibration_reason": "insufficient-samples",
129
+ "verifier_verdict": "cannot-verify",
130
+ "verifier_reason": "no-poc-no-sanitizer-rule",
131
+ "verifier_runner": null,
132
+ "narration": "A finding of type \"Mass Assignment (req.body Direct to Model)\" at parser-cs.js:?. Severity: high. Review the remediation field for class-specific guidance.",
133
+ "mitigationVerdict": "unreachable-in-prod",
134
+ "mitigationsApplied": [],
135
+ "mitigatedByWaf": false,
136
+ "wafRuleId": null,
137
+ "mitigatedByAuth": false,
138
+ "authMechanism": null,
139
+ "mitigatedByNetwork": false,
140
+ "networkExposure": null,
141
+ "featureFlag": null,
142
+ "featureFlagState": null,
143
+ "featureFlagRollout": null,
144
+ "exposedInProd": false,
145
+ "unreachableInProd": true,
146
+ "coldPath": false,
147
+ "hotPath": false,
148
+ "prodRequestCount": null,
149
+ "crownJewelScore": 0.15,
150
+ "crownJewelTier": "low-value",
151
+ "crownJewelFactors": [
152
+ "shell-execution"
153
+ ],
154
+ "cloneClusterId": "a0c829a31c63bf1a",
155
+ "cloneClusterSize": 2,
156
+ "provenance": "human-likely",
157
+ "provenanceScore": 0.08,
158
+ "typeNarrowed": null,
159
+ "strideCategory": null,
160
+ "personaScores": {
161
+ "script-kiddie": {
162
+ "score": 0.65,
163
+ "tier": "high",
164
+ "factors": [
165
+ "sev:high"
166
+ ]
167
+ },
168
+ "opportunistic-criminal": {
169
+ "score": 0.85,
170
+ "tier": "critical",
171
+ "factors": [
172
+ "sev:high",
173
+ "bias:mass-assignment+0.20"
174
+ ]
175
+ },
176
+ "apt-nation-state": {
177
+ "score": 0.65,
178
+ "tier": "high",
179
+ "factors": [
180
+ "sev:high"
181
+ ]
182
+ },
183
+ "supply-chain-attacker": {
184
+ "score": 0.65,
185
+ "tier": "high",
186
+ "factors": [
187
+ "sev:high"
188
+ ]
189
+ },
190
+ "malicious-insider": {
191
+ "score": 1,
192
+ "tier": "critical",
193
+ "factors": [
194
+ "sev:high",
195
+ "bias:mass-assignment+0.25",
196
+ "authz-bypass-favored"
197
+ ]
198
+ }
199
+ },
200
+ "personaTopTwo": [
201
+ "malicious-insider",
202
+ "opportunistic-criminal"
203
+ ],
204
+ "personaMaxName": "malicious-insider",
205
+ "personaMaxScore": 1,
206
+ "reverseExposure": null,
207
+ "specMined": null,
208
+ "whyFired": {
209
+ "detector": "sast/mass-assignment",
210
+ "ruleId": "CWE-915",
211
+ "parser": "STRUCTURAL",
212
+ "evidence": {
213
+ "sinkSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
214
+ "sourceSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
215
+ "pathSteps": [],
216
+ "sanitizers": [],
217
+ "guards": []
218
+ },
219
+ "considered": {
220
+ "suppressionsApplied": [],
221
+ "suppressionsSkipped": [],
222
+ "reachabilityFilter": "unaffected",
223
+ "clusterCollapsed": false,
224
+ "typeNarrowed": false,
225
+ "crownJewelTier": "low-value",
226
+ "mitigationVerdict": "unreachable-in-prod"
227
+ },
228
+ "scanner": {
229
+ "rulesetVersion": null,
230
+ "packHash": null,
231
+ "modelId": null
232
+ }
233
+ },
234
+ "adversaryTranscript": null,
235
+ "predictedBountyUsd": {
236
+ "low": 50,
237
+ "likely": 200,
238
+ "high": 600,
239
+ "program": "web2"
240
+ },
241
+ "bountyConfidence": "medium",
242
+ "attackPlaybook": {
243
+ "cwe": "CWE-915",
244
+ "kind": "curl",
245
+ "title": "Mass assignment — privilege escalation probe",
246
+ "instruction": "Submit an extra field (role) on profile update; verify it sticks.",
247
+ "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.",
248
+ "ethics": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test."
249
+ }
250
+ },
251
+ {
252
+ "id": "struct:parser-kt.js:207:Mass_Assignment_(req.body_Direct_to_Model)",
253
+ "kind": "sast",
254
+ "severity": "high",
255
+ "vuln": "Mass Assignment (req.body Direct to Model)",
256
+ "cwe": "CWE-915",
257
+ "owaspLlm": null,
258
+ "stride": "Tampering",
259
+ "file": "parser-kt.js",
260
+ "line": 207,
261
+ "snippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
262
+ "fix": null,
263
+ "reachable": false,
264
+ "triage": 39,
265
+ "dataClasses": [],
266
+ "chain": null,
267
+ "confidence": 0.314,
268
+ "toxicity": 35,
269
+ "toxicityFactors": [
270
+ "high-severity",
271
+ "http-facing"
272
+ ],
273
+ "toxicityLabel": "Medium",
274
+ "sources": null,
275
+ "epssScore": null,
276
+ "epssPercentile": null,
277
+ "epssCve": null,
278
+ "exploitedNow": false,
279
+ "tags": null,
280
+ "blastRadius": {
281
+ "scope": "all-users",
282
+ "dataAtRisk": [
283
+ "config"
284
+ ],
285
+ "userCount": 50,
286
+ "industry": "generic",
287
+ "jurisdictions": [],
288
+ "controlsApplied": [],
289
+ "dollarBest": 23250,
290
+ "dollarLikely": 136250,
291
+ "dollarWorst": 775000,
292
+ "dollarLow": 23250,
293
+ "dollarHigh": 775000,
294
+ "components": {
295
+ "incidentResponse": {
296
+ "low": 8000,
297
+ "likely": 50000,
298
+ "high": 250000
299
+ },
300
+ "legal": {
301
+ "low": 10000,
302
+ "likely": 75000,
303
+ "high": 500000
304
+ },
305
+ "crisisPR": {
306
+ "low": 0,
307
+ "likely": 0,
308
+ "high": 0
309
+ },
310
+ "notification": {
311
+ "low": 5000,
312
+ "likely": 10000,
313
+ "high": 15000
314
+ },
315
+ "creditMonitoring": {
316
+ "low": 0,
317
+ "likely": 0,
318
+ "high": 0
319
+ },
320
+ "regulatoryFines": {
321
+ "low": 0,
322
+ "likely": 0,
323
+ "high": 0
324
+ },
325
+ "directDamage": {
326
+ "low": 250,
327
+ "likely": 1250,
328
+ "high": 10000
329
+ },
330
+ "classAction": {
331
+ "low": 0,
332
+ "likely": 0,
333
+ "high": 0
334
+ },
335
+ "lostBusiness": {
336
+ "low": 0,
337
+ "likely": 0,
338
+ "high": 0
339
+ }
340
+ },
341
+ "dominantDriver": "legal counsel",
342
+ "comparable": "GitHub mass-assignment 2012 → public ridicule + emergency rebuild",
343
+ "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."
345
+ },
346
+ "stableId": "2fc3bac9558c1472",
347
+ "confidenceTier": "low",
348
+ "exploitability": 0.45,
349
+ "exploitabilityTier": "medium",
350
+ "exploitabilityFactors": [
351
+ "sev:high",
352
+ "unreachable"
353
+ ],
354
+ "clusterSize": null,
355
+ "unreachable": false,
356
+ "validator_verdict": "unvalidated",
357
+ "llm_confidence": null,
358
+ "unvalidated": true,
359
+ "cross_language": false,
360
+ "family": "mass-assignment",
361
+ "_unsigned": false,
362
+ "_passThroughSigning": false,
363
+ "signatureStatus": "verified",
364
+ "regression_test": null,
365
+ "poc": null,
366
+ "calibrated_confidence": null,
367
+ "calibrated_confidence_ci": null,
368
+ "calibrated_n": 5,
369
+ "calibration_reason": "insufficient-samples",
370
+ "verifier_verdict": "cannot-verify",
371
+ "verifier_reason": "no-poc-no-sanitizer-rule",
372
+ "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.",
374
+ "mitigationVerdict": "unreachable-in-prod",
375
+ "mitigationsApplied": [],
376
+ "mitigatedByWaf": false,
377
+ "wafRuleId": null,
378
+ "mitigatedByAuth": false,
379
+ "authMechanism": null,
380
+ "mitigatedByNetwork": false,
381
+ "networkExposure": null,
382
+ "featureFlag": null,
383
+ "featureFlagState": null,
384
+ "featureFlagRollout": null,
385
+ "exposedInProd": false,
386
+ "unreachableInProd": true,
387
+ "coldPath": false,
388
+ "hotPath": false,
389
+ "prodRequestCount": null,
390
+ "crownJewelScore": 0.15,
391
+ "crownJewelTier": "low-value",
392
+ "crownJewelFactors": [
393
+ "shell-execution"
394
+ ],
395
+ "cloneClusterId": "a0c829a31c63bf1a",
396
+ "cloneClusterSize": 2,
397
+ "provenance": "human-likely",
398
+ "provenanceScore": 0,
399
+ "typeNarrowed": null,
400
+ "strideCategory": null,
401
+ "personaScores": {
402
+ "script-kiddie": {
403
+ "score": 0.65,
404
+ "tier": "high",
405
+ "factors": [
406
+ "sev:high"
407
+ ]
408
+ },
409
+ "opportunistic-criminal": {
410
+ "score": 0.85,
411
+ "tier": "critical",
412
+ "factors": [
413
+ "sev:high",
414
+ "bias:mass-assignment+0.20"
415
+ ]
416
+ },
417
+ "apt-nation-state": {
418
+ "score": 0.65,
419
+ "tier": "high",
420
+ "factors": [
421
+ "sev:high"
422
+ ]
423
+ },
424
+ "supply-chain-attacker": {
425
+ "score": 0.65,
426
+ "tier": "high",
427
+ "factors": [
428
+ "sev:high"
429
+ ]
430
+ },
431
+ "malicious-insider": {
432
+ "score": 1,
433
+ "tier": "critical",
434
+ "factors": [
435
+ "sev:high",
436
+ "bias:mass-assignment+0.25",
437
+ "authz-bypass-favored"
438
+ ]
439
+ }
440
+ },
441
+ "personaTopTwo": [
442
+ "malicious-insider",
443
+ "opportunistic-criminal"
444
+ ],
445
+ "personaMaxName": "malicious-insider",
446
+ "personaMaxScore": 1,
447
+ "reverseExposure": null,
448
+ "specMined": null,
449
+ "whyFired": {
450
+ "detector": "sast/mass-assignment",
451
+ "ruleId": "CWE-915",
452
+ "parser": "STRUCTURAL",
453
+ "evidence": {
454
+ "sinkSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
455
+ "sourceSnippet": "const sha = crypto.createHash('sha256').update(body).digest('hex').slice(0, 8);",
456
+ "pathSteps": [],
457
+ "sanitizers": [],
458
+ "guards": []
459
+ },
460
+ "considered": {
461
+ "suppressionsApplied": [],
462
+ "suppressionsSkipped": [],
463
+ "reachabilityFilter": "unaffected",
464
+ "clusterCollapsed": false,
465
+ "typeNarrowed": false,
466
+ "crownJewelTier": "low-value",
467
+ "mitigationVerdict": "unreachable-in-prod"
468
+ },
469
+ "scanner": {
470
+ "rulesetVersion": null,
471
+ "packHash": null,
472
+ "modelId": null
473
+ }
474
+ },
475
+ "adversaryTranscript": null,
476
+ "predictedBountyUsd": {
477
+ "low": 50,
478
+ "likely": 200,
479
+ "high": 600,
480
+ "program": "web2"
481
+ },
482
+ "bountyConfidence": "medium",
483
+ "attackPlaybook": {
484
+ "cwe": "CWE-915",
485
+ "kind": "curl",
486
+ "title": "Mass assignment — privilege escalation probe",
487
+ "instruction": "Submit an extra field (role) on profile update; verify it sticks.",
488
+ "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.",
489
+ "ethics": "# AUTHORIZED USE ONLY — run only against systems you own or have explicit permission to test."
490
+ }
491
+ },
492
+ {
493
+ "id": "struct:type-stubs.js:48:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
494
+ "kind": "sast",
495
+ "severity": "medium",
496
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
497
+ "cwe": "CWE-400",
498
+ "owaspLlm": null,
499
+ "stride": "Denial of Service",
500
+ "file": "type-stubs.js",
501
+ "line": 48,
502
+ "snippet": "try { inputs.push(p + ':' + fs.statSync(fp).mtimeMs); } catch {}",
503
+ "fix": null,
504
+ "reachable": false,
505
+ "triage": 22,
506
+ "dataClasses": [],
507
+ "chain": null,
508
+ "confidence": 0.212,
509
+ "toxicity": 28,
510
+ "toxicityFactors": [
511
+ "http-facing"
512
+ ],
513
+ "toxicityLabel": "Medium",
514
+ "sources": null,
515
+ "epssScore": null,
516
+ "epssPercentile": null,
517
+ "epssCve": null,
518
+ "exploitedNow": false,
519
+ "tags": null,
520
+ "blastRadius": {
521
+ "scope": "all-users",
522
+ "dataAtRisk": [
523
+ "config"
524
+ ],
525
+ "userCount": 50,
526
+ "industry": "generic",
527
+ "jurisdictions": [],
528
+ "controlsApplied": [],
529
+ "dollarBest": 23250,
530
+ "dollarLikely": 136250,
531
+ "dollarWorst": 775000,
532
+ "dollarLow": 23250,
533
+ "dollarHigh": 775000,
534
+ "components": {
535
+ "incidentResponse": {
536
+ "low": 8000,
537
+ "likely": 50000,
538
+ "high": 250000
539
+ },
540
+ "legal": {
541
+ "low": 10000,
542
+ "likely": 75000,
543
+ "high": 500000
544
+ },
545
+ "crisisPR": {
546
+ "low": 0,
547
+ "likely": 0,
548
+ "high": 0
549
+ },
550
+ "notification": {
551
+ "low": 5000,
552
+ "likely": 10000,
553
+ "high": 15000
554
+ },
555
+ "creditMonitoring": {
556
+ "low": 0,
557
+ "likely": 0,
558
+ "high": 0
559
+ },
560
+ "regulatoryFines": {
561
+ "low": 0,
562
+ "likely": 0,
563
+ "high": 0
564
+ },
565
+ "directDamage": {
566
+ "low": 250,
567
+ "likely": 1250,
568
+ "high": 10000
569
+ },
570
+ "classAction": {
571
+ "low": 0,
572
+ "likely": 0,
573
+ "high": 0
574
+ },
575
+ "lostBusiness": {
576
+ "low": 0,
577
+ "likely": 0,
578
+ "high": 0
579
+ }
580
+ },
581
+ "dominantDriver": "legal counsel",
582
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
583
+ "confidence": "low",
584
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:48` 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."
585
+ },
586
+ "stableId": "de7f5b06a0db0ac9",
587
+ "confidenceTier": "very-low",
588
+ "exploitability": 0.2,
589
+ "exploitabilityTier": "low",
590
+ "exploitabilityFactors": [
591
+ "sev:medium",
592
+ "unreachable"
593
+ ],
594
+ "clusterSize": null,
595
+ "unreachable": false,
596
+ "validator_verdict": "unvalidated",
597
+ "llm_confidence": null,
598
+ "unvalidated": true,
599
+ "cross_language": false,
600
+ "family": "dos-sync-io",
601
+ "_unsigned": false,
602
+ "_passThroughSigning": false,
603
+ "signatureStatus": "verified",
604
+ "regression_test": null,
605
+ "poc": null,
606
+ "calibrated_confidence": null,
607
+ "calibrated_confidence_ci": null,
608
+ "calibrated_n": 0,
609
+ "calibration_reason": "no-history",
610
+ "verifier_verdict": "cannot-verify",
611
+ "verifier_reason": "no-poc-no-sanitizer-rule",
612
+ "verifier_runner": null,
613
+ "narration": null,
614
+ "mitigationVerdict": "unreachable-in-prod",
615
+ "mitigationsApplied": [],
616
+ "mitigatedByWaf": false,
617
+ "wafRuleId": null,
618
+ "mitigatedByAuth": false,
619
+ "authMechanism": null,
620
+ "mitigatedByNetwork": false,
621
+ "networkExposure": null,
622
+ "featureFlag": null,
623
+ "featureFlagState": null,
624
+ "featureFlagRollout": null,
625
+ "exposedInProd": false,
626
+ "unreachableInProd": true,
627
+ "coldPath": false,
628
+ "hotPath": false,
629
+ "prodRequestCount": null,
630
+ "crownJewelScore": 0.15,
631
+ "crownJewelTier": "low-value",
632
+ "crownJewelFactors": [
633
+ "shell-execution"
634
+ ],
635
+ "cloneClusterId": "1ca765ccc2c8227c",
636
+ "cloneClusterSize": 2,
637
+ "provenance": "human-likely",
638
+ "provenanceScore": 0.12,
639
+ "typeNarrowed": null,
640
+ "strideCategory": "denialOfService",
641
+ "personaScores": {
642
+ "script-kiddie": {
643
+ "score": 0.4,
644
+ "tier": "medium",
645
+ "factors": [
646
+ "sev:medium"
647
+ ]
648
+ },
649
+ "opportunistic-criminal": {
650
+ "score": 0.4,
651
+ "tier": "medium",
652
+ "factors": [
653
+ "sev:medium"
654
+ ]
655
+ },
656
+ "apt-nation-state": {
657
+ "score": 0.4,
658
+ "tier": "medium",
659
+ "factors": [
660
+ "sev:medium"
661
+ ]
662
+ },
663
+ "supply-chain-attacker": {
664
+ "score": 0.4,
665
+ "tier": "medium",
666
+ "factors": [
667
+ "sev:medium"
668
+ ]
669
+ },
670
+ "malicious-insider": {
671
+ "score": 0.4,
672
+ "tier": "medium",
673
+ "factors": [
674
+ "sev:medium"
675
+ ]
676
+ }
677
+ },
678
+ "personaTopTwo": [
679
+ "script-kiddie",
680
+ "opportunistic-criminal"
681
+ ],
682
+ "personaMaxName": "script-kiddie",
683
+ "personaMaxScore": 0.4,
684
+ "reverseExposure": null,
685
+ "specMined": null,
686
+ "whyFired": {
687
+ "detector": "sast/dos-sync-io",
688
+ "ruleId": "CWE-400",
689
+ "parser": "STRUCTURAL",
690
+ "evidence": {
691
+ "sinkSnippet": "try { inputs.push(p + ':' + fs.statSync(fp).mtimeMs); } catch {}",
692
+ "sourceSnippet": "try { inputs.push(p + ':' + fs.statSync(fp).mtimeMs); } catch {}",
693
+ "pathSteps": [],
694
+ "sanitizers": [],
695
+ "guards": []
696
+ },
697
+ "considered": {
698
+ "suppressionsApplied": [],
699
+ "suppressionsSkipped": [],
700
+ "reachabilityFilter": "unaffected",
701
+ "clusterCollapsed": false,
702
+ "typeNarrowed": false,
703
+ "crownJewelTier": "low-value",
704
+ "mitigationVerdict": "unreachable-in-prod"
705
+ },
706
+ "scanner": {
707
+ "rulesetVersion": null,
708
+ "packHash": null,
709
+ "modelId": null
710
+ }
711
+ },
712
+ "adversaryTranscript": null,
713
+ "predictedBountyUsd": {
714
+ "low": 10,
715
+ "likely": 40,
716
+ "high": 120,
717
+ "program": "web2"
718
+ },
719
+ "bountyConfidence": "high",
720
+ "attackPlaybook": null
721
+ },
722
+ {
723
+ "id": "struct:type-stubs.js:57:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
724
+ "kind": "sast",
725
+ "severity": "medium",
726
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
727
+ "cwe": "CWE-400",
728
+ "owaspLlm": null,
729
+ "stride": "Denial of Service",
730
+ "file": "type-stubs.js",
731
+ "line": 57,
732
+ "snippet": "if (!fs.existsSync(fp)) return null;",
733
+ "fix": null,
734
+ "reachable": false,
735
+ "triage": 22,
736
+ "dataClasses": [],
737
+ "chain": null,
738
+ "confidence": 0.212,
739
+ "toxicity": 28,
740
+ "toxicityFactors": [
741
+ "http-facing"
742
+ ],
743
+ "toxicityLabel": "Medium",
744
+ "sources": null,
745
+ "epssScore": null,
746
+ "epssPercentile": null,
747
+ "epssCve": null,
748
+ "exploitedNow": false,
749
+ "tags": null,
750
+ "blastRadius": {
751
+ "scope": "all-users",
752
+ "dataAtRisk": [
753
+ "config"
754
+ ],
755
+ "userCount": 50,
756
+ "industry": "generic",
757
+ "jurisdictions": [],
758
+ "controlsApplied": [],
759
+ "dollarBest": 23250,
760
+ "dollarLikely": 136250,
761
+ "dollarWorst": 775000,
762
+ "dollarLow": 23250,
763
+ "dollarHigh": 775000,
764
+ "components": {
765
+ "incidentResponse": {
766
+ "low": 8000,
767
+ "likely": 50000,
768
+ "high": 250000
769
+ },
770
+ "legal": {
771
+ "low": 10000,
772
+ "likely": 75000,
773
+ "high": 500000
774
+ },
775
+ "crisisPR": {
776
+ "low": 0,
777
+ "likely": 0,
778
+ "high": 0
779
+ },
780
+ "notification": {
781
+ "low": 5000,
782
+ "likely": 10000,
783
+ "high": 15000
784
+ },
785
+ "creditMonitoring": {
786
+ "low": 0,
787
+ "likely": 0,
788
+ "high": 0
789
+ },
790
+ "regulatoryFines": {
791
+ "low": 0,
792
+ "likely": 0,
793
+ "high": 0
794
+ },
795
+ "directDamage": {
796
+ "low": 250,
797
+ "likely": 1250,
798
+ "high": 10000
799
+ },
800
+ "classAction": {
801
+ "low": 0,
802
+ "likely": 0,
803
+ "high": 0
804
+ },
805
+ "lostBusiness": {
806
+ "low": 0,
807
+ "likely": 0,
808
+ "high": 0
809
+ }
810
+ },
811
+ "dominantDriver": "legal counsel",
812
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
813
+ "confidence": "low",
814
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) 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: Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage."
815
+ },
816
+ "stableId": "256de17293c86e74",
817
+ "confidenceTier": "very-low",
818
+ "exploitability": 0.2,
819
+ "exploitabilityTier": "low",
820
+ "exploitabilityFactors": [
821
+ "sev:medium",
822
+ "unreachable"
823
+ ],
824
+ "clusterSize": null,
825
+ "unreachable": false,
826
+ "validator_verdict": "unvalidated",
827
+ "llm_confidence": null,
828
+ "unvalidated": true,
829
+ "cross_language": false,
830
+ "family": "dos-sync-io",
831
+ "_unsigned": false,
832
+ "_passThroughSigning": false,
833
+ "signatureStatus": "verified",
834
+ "regression_test": null,
835
+ "poc": null,
836
+ "calibrated_confidence": null,
837
+ "calibrated_confidence_ci": null,
838
+ "calibrated_n": 0,
839
+ "calibration_reason": "no-history",
840
+ "verifier_verdict": "cannot-verify",
841
+ "verifier_reason": "no-poc-no-sanitizer-rule",
842
+ "verifier_runner": null,
843
+ "narration": null,
844
+ "mitigationVerdict": "unreachable-in-prod",
845
+ "mitigationsApplied": [],
846
+ "mitigatedByWaf": false,
847
+ "wafRuleId": null,
848
+ "mitigatedByAuth": false,
849
+ "authMechanism": null,
850
+ "mitigatedByNetwork": false,
851
+ "networkExposure": null,
852
+ "featureFlag": null,
853
+ "featureFlagState": null,
854
+ "featureFlagRollout": null,
855
+ "exposedInProd": false,
856
+ "unreachableInProd": true,
857
+ "coldPath": false,
858
+ "hotPath": false,
859
+ "prodRequestCount": null,
860
+ "crownJewelScore": 0.15,
861
+ "crownJewelTier": "low-value",
862
+ "crownJewelFactors": [
863
+ "shell-execution"
864
+ ],
865
+ "cloneClusterId": "66b8a8c25816e7f9",
866
+ "cloneClusterSize": 2,
867
+ "provenance": "human-likely",
868
+ "provenanceScore": 0.12,
869
+ "typeNarrowed": null,
870
+ "strideCategory": "denialOfService",
871
+ "personaScores": {
872
+ "script-kiddie": {
873
+ "score": 0.4,
874
+ "tier": "medium",
875
+ "factors": [
876
+ "sev:medium"
877
+ ]
878
+ },
879
+ "opportunistic-criminal": {
880
+ "score": 0.4,
881
+ "tier": "medium",
882
+ "factors": [
883
+ "sev:medium"
884
+ ]
885
+ },
886
+ "apt-nation-state": {
887
+ "score": 0.4,
888
+ "tier": "medium",
889
+ "factors": [
890
+ "sev:medium"
891
+ ]
892
+ },
893
+ "supply-chain-attacker": {
894
+ "score": 0.4,
895
+ "tier": "medium",
896
+ "factors": [
897
+ "sev:medium"
898
+ ]
899
+ },
900
+ "malicious-insider": {
901
+ "score": 0.4,
902
+ "tier": "medium",
903
+ "factors": [
904
+ "sev:medium"
905
+ ]
906
+ }
907
+ },
908
+ "personaTopTwo": [
909
+ "script-kiddie",
910
+ "opportunistic-criminal"
911
+ ],
912
+ "personaMaxName": "script-kiddie",
913
+ "personaMaxScore": 0.4,
914
+ "reverseExposure": null,
915
+ "specMined": null,
916
+ "whyFired": {
917
+ "detector": "sast/dos-sync-io",
918
+ "ruleId": "CWE-400",
919
+ "parser": "STRUCTURAL",
920
+ "evidence": {
921
+ "sinkSnippet": "if (!fs.existsSync(fp)) return null;",
922
+ "sourceSnippet": "if (!fs.existsSync(fp)) return null;",
923
+ "pathSteps": [],
924
+ "sanitizers": [],
925
+ "guards": []
926
+ },
927
+ "considered": {
928
+ "suppressionsApplied": [],
929
+ "suppressionsSkipped": [],
930
+ "reachabilityFilter": "unaffected",
931
+ "clusterCollapsed": false,
932
+ "typeNarrowed": false,
933
+ "crownJewelTier": "low-value",
934
+ "mitigationVerdict": "unreachable-in-prod"
935
+ },
936
+ "scanner": {
937
+ "rulesetVersion": null,
938
+ "packHash": null,
939
+ "modelId": null
940
+ }
941
+ },
942
+ "adversaryTranscript": null,
943
+ "predictedBountyUsd": {
944
+ "low": 10,
945
+ "likely": 40,
946
+ "high": 120,
947
+ "program": "web2"
948
+ },
949
+ "bountyConfidence": "high",
950
+ "attackPlaybook": null
951
+ },
952
+ {
953
+ "id": "struct:type-stubs.js:58:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
954
+ "kind": "sast",
955
+ "severity": "medium",
956
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
957
+ "cwe": "CWE-400",
958
+ "owaspLlm": null,
959
+ "stride": "Denial of Service",
960
+ "file": "type-stubs.js",
961
+ "line": 58,
962
+ "snippet": "const obj = JSON.parse(fs.readFileSync(fp, 'utf8'));",
963
+ "fix": null,
964
+ "reachable": false,
965
+ "triage": 22,
966
+ "dataClasses": [],
967
+ "chain": null,
968
+ "confidence": 0.212,
969
+ "toxicity": 28,
970
+ "toxicityFactors": [
971
+ "http-facing"
972
+ ],
973
+ "toxicityLabel": "Medium",
974
+ "sources": null,
975
+ "epssScore": null,
976
+ "epssPercentile": null,
977
+ "epssCve": null,
978
+ "exploitedNow": false,
979
+ "tags": null,
980
+ "blastRadius": {
981
+ "scope": "all-users",
982
+ "dataAtRisk": [
983
+ "config"
984
+ ],
985
+ "userCount": 50,
986
+ "industry": "generic",
987
+ "jurisdictions": [],
988
+ "controlsApplied": [],
989
+ "dollarBest": 23250,
990
+ "dollarLikely": 136250,
991
+ "dollarWorst": 775000,
992
+ "dollarLow": 23250,
993
+ "dollarHigh": 775000,
994
+ "components": {
995
+ "incidentResponse": {
996
+ "low": 8000,
997
+ "likely": 50000,
998
+ "high": 250000
999
+ },
1000
+ "legal": {
1001
+ "low": 10000,
1002
+ "likely": 75000,
1003
+ "high": 500000
1004
+ },
1005
+ "crisisPR": {
1006
+ "low": 0,
1007
+ "likely": 0,
1008
+ "high": 0
1009
+ },
1010
+ "notification": {
1011
+ "low": 5000,
1012
+ "likely": 10000,
1013
+ "high": 15000
1014
+ },
1015
+ "creditMonitoring": {
1016
+ "low": 0,
1017
+ "likely": 0,
1018
+ "high": 0
1019
+ },
1020
+ "regulatoryFines": {
1021
+ "low": 0,
1022
+ "likely": 0,
1023
+ "high": 0
1024
+ },
1025
+ "directDamage": {
1026
+ "low": 250,
1027
+ "likely": 1250,
1028
+ "high": 10000
1029
+ },
1030
+ "classAction": {
1031
+ "low": 0,
1032
+ "likely": 0,
1033
+ "high": 0
1034
+ },
1035
+ "lostBusiness": {
1036
+ "low": 0,
1037
+ "likely": 0,
1038
+ "high": 0
1039
+ }
1040
+ },
1041
+ "dominantDriver": "legal counsel",
1042
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1043
+ "confidence": "low",
1044
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:58` 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."
1045
+ },
1046
+ "stableId": "4f8d060ad72a925a",
1047
+ "confidenceTier": "very-low",
1048
+ "exploitability": 0.2,
1049
+ "exploitabilityTier": "low",
1050
+ "exploitabilityFactors": [
1051
+ "sev:medium",
1052
+ "unreachable"
1053
+ ],
1054
+ "clusterSize": null,
1055
+ "unreachable": false,
1056
+ "validator_verdict": "unvalidated",
1057
+ "llm_confidence": null,
1058
+ "unvalidated": true,
1059
+ "cross_language": false,
1060
+ "family": "dos-sync-io",
1061
+ "_unsigned": false,
1062
+ "_passThroughSigning": false,
1063
+ "signatureStatus": "verified",
1064
+ "regression_test": null,
1065
+ "poc": null,
1066
+ "calibrated_confidence": null,
1067
+ "calibrated_confidence_ci": null,
1068
+ "calibrated_n": 0,
1069
+ "calibration_reason": "no-history",
1070
+ "verifier_verdict": "cannot-verify",
1071
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1072
+ "verifier_runner": null,
1073
+ "narration": null,
1074
+ "mitigationVerdict": "unreachable-in-prod",
1075
+ "mitigationsApplied": [],
1076
+ "mitigatedByWaf": false,
1077
+ "wafRuleId": null,
1078
+ "mitigatedByAuth": false,
1079
+ "authMechanism": null,
1080
+ "mitigatedByNetwork": false,
1081
+ "networkExposure": null,
1082
+ "featureFlag": null,
1083
+ "featureFlagState": null,
1084
+ "featureFlagRollout": null,
1085
+ "exposedInProd": false,
1086
+ "unreachableInProd": true,
1087
+ "coldPath": false,
1088
+ "hotPath": false,
1089
+ "prodRequestCount": null,
1090
+ "crownJewelScore": 0.15,
1091
+ "crownJewelTier": "low-value",
1092
+ "crownJewelFactors": [
1093
+ "shell-execution"
1094
+ ],
1095
+ "cloneClusterId": "8b60c3f57d48c622",
1096
+ "cloneClusterSize": 1,
1097
+ "provenance": "human-likely",
1098
+ "provenanceScore": 0.12,
1099
+ "typeNarrowed": null,
1100
+ "strideCategory": "denialOfService",
1101
+ "personaScores": {
1102
+ "script-kiddie": {
1103
+ "score": 0.4,
1104
+ "tier": "medium",
1105
+ "factors": [
1106
+ "sev:medium"
1107
+ ]
1108
+ },
1109
+ "opportunistic-criminal": {
1110
+ "score": 0.4,
1111
+ "tier": "medium",
1112
+ "factors": [
1113
+ "sev:medium"
1114
+ ]
1115
+ },
1116
+ "apt-nation-state": {
1117
+ "score": 0.4,
1118
+ "tier": "medium",
1119
+ "factors": [
1120
+ "sev:medium"
1121
+ ]
1122
+ },
1123
+ "supply-chain-attacker": {
1124
+ "score": 0.4,
1125
+ "tier": "medium",
1126
+ "factors": [
1127
+ "sev:medium"
1128
+ ]
1129
+ },
1130
+ "malicious-insider": {
1131
+ "score": 0.4,
1132
+ "tier": "medium",
1133
+ "factors": [
1134
+ "sev:medium"
1135
+ ]
1136
+ }
1137
+ },
1138
+ "personaTopTwo": [
1139
+ "script-kiddie",
1140
+ "opportunistic-criminal"
1141
+ ],
1142
+ "personaMaxName": "script-kiddie",
1143
+ "personaMaxScore": 0.4,
1144
+ "reverseExposure": null,
1145
+ "specMined": null,
1146
+ "whyFired": {
1147
+ "detector": "sast/dos-sync-io",
1148
+ "ruleId": "CWE-400",
1149
+ "parser": "STRUCTURAL",
1150
+ "evidence": {
1151
+ "sinkSnippet": "const obj = JSON.parse(fs.readFileSync(fp, 'utf8'));",
1152
+ "sourceSnippet": "const obj = JSON.parse(fs.readFileSync(fp, 'utf8'));",
1153
+ "pathSteps": [],
1154
+ "sanitizers": [],
1155
+ "guards": []
1156
+ },
1157
+ "considered": {
1158
+ "suppressionsApplied": [],
1159
+ "suppressionsSkipped": [],
1160
+ "reachabilityFilter": "unaffected",
1161
+ "clusterCollapsed": false,
1162
+ "typeNarrowed": false,
1163
+ "crownJewelTier": "low-value",
1164
+ "mitigationVerdict": "unreachable-in-prod"
1165
+ },
1166
+ "scanner": {
1167
+ "rulesetVersion": null,
1168
+ "packHash": null,
1169
+ "modelId": null
1170
+ }
1171
+ },
1172
+ "adversaryTranscript": null,
1173
+ "predictedBountyUsd": {
1174
+ "low": 10,
1175
+ "likely": 40,
1176
+ "high": 120,
1177
+ "program": "web2"
1178
+ },
1179
+ "bountyConfidence": "high",
1180
+ "attackPlaybook": null
1181
+ },
1182
+ {
1183
+ "id": "struct:type-stubs.js:79:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
1184
+ "kind": "sast",
1185
+ "severity": "medium",
1186
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1187
+ "cwe": "CWE-400",
1188
+ "owaspLlm": null,
1189
+ "stride": "Denial of Service",
1190
+ "file": "type-stubs.js",
1191
+ "line": 79,
1192
+ "snippet": "try { fs.writeFileSync(fp, JSON.stringify(obj)); } catch {}",
1193
+ "fix": null,
1194
+ "reachable": false,
1195
+ "triage": 22,
1196
+ "dataClasses": [],
1197
+ "chain": null,
1198
+ "confidence": 0.212,
1199
+ "toxicity": 28,
1200
+ "toxicityFactors": [
1201
+ "http-facing"
1202
+ ],
1203
+ "toxicityLabel": "Medium",
1204
+ "sources": null,
1205
+ "epssScore": null,
1206
+ "epssPercentile": null,
1207
+ "epssCve": null,
1208
+ "exploitedNow": false,
1209
+ "tags": null,
1210
+ "blastRadius": {
1211
+ "scope": "all-users",
1212
+ "dataAtRisk": [
1213
+ "config"
1214
+ ],
1215
+ "userCount": 50,
1216
+ "industry": "generic",
1217
+ "jurisdictions": [],
1218
+ "controlsApplied": [],
1219
+ "dollarBest": 23250,
1220
+ "dollarLikely": 136250,
1221
+ "dollarWorst": 775000,
1222
+ "dollarLow": 23250,
1223
+ "dollarHigh": 775000,
1224
+ "components": {
1225
+ "incidentResponse": {
1226
+ "low": 8000,
1227
+ "likely": 50000,
1228
+ "high": 250000
1229
+ },
1230
+ "legal": {
1231
+ "low": 10000,
1232
+ "likely": 75000,
1233
+ "high": 500000
1234
+ },
1235
+ "crisisPR": {
1236
+ "low": 0,
1237
+ "likely": 0,
1238
+ "high": 0
1239
+ },
1240
+ "notification": {
1241
+ "low": 5000,
1242
+ "likely": 10000,
1243
+ "high": 15000
1244
+ },
1245
+ "creditMonitoring": {
1246
+ "low": 0,
1247
+ "likely": 0,
1248
+ "high": 0
1249
+ },
1250
+ "regulatoryFines": {
1251
+ "low": 0,
1252
+ "likely": 0,
1253
+ "high": 0
1254
+ },
1255
+ "directDamage": {
1256
+ "low": 250,
1257
+ "likely": 1250,
1258
+ "high": 10000
1259
+ },
1260
+ "classAction": {
1261
+ "low": 0,
1262
+ "likely": 0,
1263
+ "high": 0
1264
+ },
1265
+ "lostBusiness": {
1266
+ "low": 0,
1267
+ "likely": 0,
1268
+ "high": 0
1269
+ }
1270
+ },
1271
+ "dominantDriver": "legal counsel",
1272
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1273
+ "confidence": "low",
1274
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:79` 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."
1275
+ },
1276
+ "stableId": "e7a40ff787e8c228",
1277
+ "confidenceTier": "very-low",
1278
+ "exploitability": 0.2,
1279
+ "exploitabilityTier": "low",
1280
+ "exploitabilityFactors": [
1281
+ "sev:medium",
1282
+ "unreachable"
1283
+ ],
1284
+ "clusterSize": null,
1285
+ "unreachable": false,
1286
+ "validator_verdict": "unvalidated",
1287
+ "llm_confidence": null,
1288
+ "unvalidated": true,
1289
+ "cross_language": false,
1290
+ "family": "dos-sync-io",
1291
+ "_unsigned": false,
1292
+ "_passThroughSigning": false,
1293
+ "signatureStatus": "verified",
1294
+ "regression_test": null,
1295
+ "poc": null,
1296
+ "calibrated_confidence": null,
1297
+ "calibrated_confidence_ci": null,
1298
+ "calibrated_n": 0,
1299
+ "calibration_reason": "no-history",
1300
+ "verifier_verdict": "cannot-verify",
1301
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1302
+ "verifier_runner": null,
1303
+ "narration": null,
1304
+ "mitigationVerdict": "unreachable-in-prod",
1305
+ "mitigationsApplied": [],
1306
+ "mitigatedByWaf": false,
1307
+ "wafRuleId": null,
1308
+ "mitigatedByAuth": false,
1309
+ "authMechanism": null,
1310
+ "mitigatedByNetwork": false,
1311
+ "networkExposure": null,
1312
+ "featureFlag": null,
1313
+ "featureFlagState": null,
1314
+ "featureFlagRollout": null,
1315
+ "exposedInProd": false,
1316
+ "unreachableInProd": true,
1317
+ "coldPath": false,
1318
+ "hotPath": false,
1319
+ "prodRequestCount": null,
1320
+ "crownJewelScore": 0.15,
1321
+ "crownJewelTier": "low-value",
1322
+ "crownJewelFactors": [
1323
+ "shell-execution"
1324
+ ],
1325
+ "cloneClusterId": "d2ce1948de2c53fb",
1326
+ "cloneClusterSize": 1,
1327
+ "provenance": "human-likely",
1328
+ "provenanceScore": 0.12,
1329
+ "typeNarrowed": null,
1330
+ "strideCategory": "denialOfService",
1331
+ "personaScores": {
1332
+ "script-kiddie": {
1333
+ "score": 0.4,
1334
+ "tier": "medium",
1335
+ "factors": [
1336
+ "sev:medium"
1337
+ ]
1338
+ },
1339
+ "opportunistic-criminal": {
1340
+ "score": 0.4,
1341
+ "tier": "medium",
1342
+ "factors": [
1343
+ "sev:medium"
1344
+ ]
1345
+ },
1346
+ "apt-nation-state": {
1347
+ "score": 0.4,
1348
+ "tier": "medium",
1349
+ "factors": [
1350
+ "sev:medium"
1351
+ ]
1352
+ },
1353
+ "supply-chain-attacker": {
1354
+ "score": 0.4,
1355
+ "tier": "medium",
1356
+ "factors": [
1357
+ "sev:medium"
1358
+ ]
1359
+ },
1360
+ "malicious-insider": {
1361
+ "score": 0.4,
1362
+ "tier": "medium",
1363
+ "factors": [
1364
+ "sev:medium"
1365
+ ]
1366
+ }
1367
+ },
1368
+ "personaTopTwo": [
1369
+ "script-kiddie",
1370
+ "opportunistic-criminal"
1371
+ ],
1372
+ "personaMaxName": "script-kiddie",
1373
+ "personaMaxScore": 0.4,
1374
+ "reverseExposure": null,
1375
+ "specMined": null,
1376
+ "whyFired": {
1377
+ "detector": "sast/dos-sync-io",
1378
+ "ruleId": "CWE-400",
1379
+ "parser": "STRUCTURAL",
1380
+ "evidence": {
1381
+ "sinkSnippet": "try { fs.writeFileSync(fp, JSON.stringify(obj)); } catch {}",
1382
+ "sourceSnippet": "try { fs.writeFileSync(fp, JSON.stringify(obj)); } catch {}",
1383
+ "pathSteps": [],
1384
+ "sanitizers": [],
1385
+ "guards": []
1386
+ },
1387
+ "considered": {
1388
+ "suppressionsApplied": [],
1389
+ "suppressionsSkipped": [],
1390
+ "reachabilityFilter": "unaffected",
1391
+ "clusterCollapsed": false,
1392
+ "typeNarrowed": false,
1393
+ "crownJewelTier": "low-value",
1394
+ "mitigationVerdict": "unreachable-in-prod"
1395
+ },
1396
+ "scanner": {
1397
+ "rulesetVersion": null,
1398
+ "packHash": null,
1399
+ "modelId": null
1400
+ }
1401
+ },
1402
+ "adversaryTranscript": null,
1403
+ "predictedBountyUsd": {
1404
+ "low": 10,
1405
+ "likely": 40,
1406
+ "high": 120,
1407
+ "program": "web2"
1408
+ },
1409
+ "bountyConfidence": "high",
1410
+ "attackPlaybook": null
1411
+ },
1412
+ {
1413
+ "id": "struct:type-stubs.js:190:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
1414
+ "kind": "sast",
1415
+ "severity": "medium",
1416
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1417
+ "cwe": "CWE-400",
1418
+ "owaspLlm": null,
1419
+ "stride": "Denial of Service",
1420
+ "file": "type-stubs.js",
1421
+ "line": 190,
1422
+ "snippet": "try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }",
1423
+ "fix": null,
1424
+ "reachable": false,
1425
+ "triage": 22,
1426
+ "dataClasses": [],
1427
+ "chain": null,
1428
+ "confidence": 0.212,
1429
+ "toxicity": 28,
1430
+ "toxicityFactors": [
1431
+ "http-facing"
1432
+ ],
1433
+ "toxicityLabel": "Medium",
1434
+ "sources": null,
1435
+ "epssScore": null,
1436
+ "epssPercentile": null,
1437
+ "epssCve": null,
1438
+ "exploitedNow": false,
1439
+ "tags": null,
1440
+ "blastRadius": {
1441
+ "scope": "all-users",
1442
+ "dataAtRisk": [
1443
+ "config"
1444
+ ],
1445
+ "userCount": 50,
1446
+ "industry": "generic",
1447
+ "jurisdictions": [],
1448
+ "controlsApplied": [],
1449
+ "dollarBest": 23250,
1450
+ "dollarLikely": 136250,
1451
+ "dollarWorst": 775000,
1452
+ "dollarLow": 23250,
1453
+ "dollarHigh": 775000,
1454
+ "components": {
1455
+ "incidentResponse": {
1456
+ "low": 8000,
1457
+ "likely": 50000,
1458
+ "high": 250000
1459
+ },
1460
+ "legal": {
1461
+ "low": 10000,
1462
+ "likely": 75000,
1463
+ "high": 500000
1464
+ },
1465
+ "crisisPR": {
1466
+ "low": 0,
1467
+ "likely": 0,
1468
+ "high": 0
1469
+ },
1470
+ "notification": {
1471
+ "low": 5000,
1472
+ "likely": 10000,
1473
+ "high": 15000
1474
+ },
1475
+ "creditMonitoring": {
1476
+ "low": 0,
1477
+ "likely": 0,
1478
+ "high": 0
1479
+ },
1480
+ "regulatoryFines": {
1481
+ "low": 0,
1482
+ "likely": 0,
1483
+ "high": 0
1484
+ },
1485
+ "directDamage": {
1486
+ "low": 250,
1487
+ "likely": 1250,
1488
+ "high": 10000
1489
+ },
1490
+ "classAction": {
1491
+ "low": 0,
1492
+ "likely": 0,
1493
+ "high": 0
1494
+ },
1495
+ "lostBusiness": {
1496
+ "low": 0,
1497
+ "likely": 0,
1498
+ "high": 0
1499
+ }
1500
+ },
1501
+ "dominantDriver": "legal counsel",
1502
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1503
+ "confidence": "low",
1504
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:190` 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."
1505
+ },
1506
+ "stableId": "db5b5598e24d7b37",
1507
+ "confidenceTier": "very-low",
1508
+ "exploitability": 0.2,
1509
+ "exploitabilityTier": "low",
1510
+ "exploitabilityFactors": [
1511
+ "sev:medium",
1512
+ "unreachable"
1513
+ ],
1514
+ "clusterSize": null,
1515
+ "unreachable": false,
1516
+ "validator_verdict": "unvalidated",
1517
+ "llm_confidence": null,
1518
+ "unvalidated": true,
1519
+ "cross_language": false,
1520
+ "family": "dos-sync-io",
1521
+ "_unsigned": false,
1522
+ "_passThroughSigning": false,
1523
+ "signatureStatus": "verified",
1524
+ "regression_test": null,
1525
+ "poc": null,
1526
+ "calibrated_confidence": null,
1527
+ "calibrated_confidence_ci": null,
1528
+ "calibrated_n": 0,
1529
+ "calibration_reason": "no-history",
1530
+ "verifier_verdict": "cannot-verify",
1531
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1532
+ "verifier_runner": null,
1533
+ "narration": null,
1534
+ "mitigationVerdict": "unreachable-in-prod",
1535
+ "mitigationsApplied": [],
1536
+ "mitigatedByWaf": false,
1537
+ "wafRuleId": null,
1538
+ "mitigatedByAuth": false,
1539
+ "authMechanism": null,
1540
+ "mitigatedByNetwork": false,
1541
+ "networkExposure": null,
1542
+ "featureFlag": null,
1543
+ "featureFlagState": null,
1544
+ "featureFlagRollout": null,
1545
+ "exposedInProd": false,
1546
+ "unreachableInProd": true,
1547
+ "coldPath": false,
1548
+ "hotPath": false,
1549
+ "prodRequestCount": null,
1550
+ "crownJewelScore": 0.15,
1551
+ "crownJewelTier": "low-value",
1552
+ "crownJewelFactors": [
1553
+ "shell-execution"
1554
+ ],
1555
+ "cloneClusterId": "b093e72efde4b555",
1556
+ "cloneClusterSize": 1,
1557
+ "provenance": "human-likely",
1558
+ "provenanceScore": 0.12,
1559
+ "typeNarrowed": null,
1560
+ "strideCategory": "denialOfService",
1561
+ "personaScores": {
1562
+ "script-kiddie": {
1563
+ "score": 0.4,
1564
+ "tier": "medium",
1565
+ "factors": [
1566
+ "sev:medium"
1567
+ ]
1568
+ },
1569
+ "opportunistic-criminal": {
1570
+ "score": 0.4,
1571
+ "tier": "medium",
1572
+ "factors": [
1573
+ "sev:medium"
1574
+ ]
1575
+ },
1576
+ "apt-nation-state": {
1577
+ "score": 0.4,
1578
+ "tier": "medium",
1579
+ "factors": [
1580
+ "sev:medium"
1581
+ ]
1582
+ },
1583
+ "supply-chain-attacker": {
1584
+ "score": 0.4,
1585
+ "tier": "medium",
1586
+ "factors": [
1587
+ "sev:medium"
1588
+ ]
1589
+ },
1590
+ "malicious-insider": {
1591
+ "score": 0.4,
1592
+ "tier": "medium",
1593
+ "factors": [
1594
+ "sev:medium"
1595
+ ]
1596
+ }
1597
+ },
1598
+ "personaTopTwo": [
1599
+ "script-kiddie",
1600
+ "opportunistic-criminal"
1601
+ ],
1602
+ "personaMaxName": "script-kiddie",
1603
+ "personaMaxScore": 0.4,
1604
+ "reverseExposure": null,
1605
+ "specMined": null,
1606
+ "whyFired": {
1607
+ "detector": "sast/dos-sync-io",
1608
+ "ruleId": "CWE-400",
1609
+ "parser": "STRUCTURAL",
1610
+ "evidence": {
1611
+ "sinkSnippet": "try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }",
1612
+ "sourceSnippet": "try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }",
1613
+ "pathSteps": [],
1614
+ "sanitizers": [],
1615
+ "guards": []
1616
+ },
1617
+ "considered": {
1618
+ "suppressionsApplied": [],
1619
+ "suppressionsSkipped": [],
1620
+ "reachabilityFilter": "unaffected",
1621
+ "clusterCollapsed": false,
1622
+ "typeNarrowed": false,
1623
+ "crownJewelTier": "low-value",
1624
+ "mitigationVerdict": "unreachable-in-prod"
1625
+ },
1626
+ "scanner": {
1627
+ "rulesetVersion": null,
1628
+ "packHash": null,
1629
+ "modelId": null
1630
+ }
1631
+ },
1632
+ "adversaryTranscript": null,
1633
+ "predictedBountyUsd": {
1634
+ "low": 10,
1635
+ "likely": 40,
1636
+ "high": 120,
1637
+ "program": "web2"
1638
+ },
1639
+ "bountyConfidence": "high",
1640
+ "attackPlaybook": null
1641
+ },
1642
+ {
1643
+ "id": "struct:type-stubs.js:198:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
1644
+ "kind": "sast",
1645
+ "severity": "medium",
1646
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1647
+ "cwe": "CWE-400",
1648
+ "owaspLlm": null,
1649
+ "stride": "Denial of Service",
1650
+ "file": "type-stubs.js",
1651
+ "line": 198,
1652
+ "snippet": "if (fs.existsSync(tdir)) walk(tdir, depth + 1);",
1653
+ "fix": null,
1654
+ "reachable": false,
1655
+ "triage": 22,
1656
+ "dataClasses": [],
1657
+ "chain": null,
1658
+ "confidence": 0.212,
1659
+ "toxicity": 28,
1660
+ "toxicityFactors": [
1661
+ "http-facing"
1662
+ ],
1663
+ "toxicityLabel": "Medium",
1664
+ "sources": null,
1665
+ "epssScore": null,
1666
+ "epssPercentile": null,
1667
+ "epssCve": null,
1668
+ "exploitedNow": false,
1669
+ "tags": null,
1670
+ "blastRadius": {
1671
+ "scope": "all-users",
1672
+ "dataAtRisk": [
1673
+ "config"
1674
+ ],
1675
+ "userCount": 50,
1676
+ "industry": "generic",
1677
+ "jurisdictions": [],
1678
+ "controlsApplied": [],
1679
+ "dollarBest": 23250,
1680
+ "dollarLikely": 136250,
1681
+ "dollarWorst": 775000,
1682
+ "dollarLow": 23250,
1683
+ "dollarHigh": 775000,
1684
+ "components": {
1685
+ "incidentResponse": {
1686
+ "low": 8000,
1687
+ "likely": 50000,
1688
+ "high": 250000
1689
+ },
1690
+ "legal": {
1691
+ "low": 10000,
1692
+ "likely": 75000,
1693
+ "high": 500000
1694
+ },
1695
+ "crisisPR": {
1696
+ "low": 0,
1697
+ "likely": 0,
1698
+ "high": 0
1699
+ },
1700
+ "notification": {
1701
+ "low": 5000,
1702
+ "likely": 10000,
1703
+ "high": 15000
1704
+ },
1705
+ "creditMonitoring": {
1706
+ "low": 0,
1707
+ "likely": 0,
1708
+ "high": 0
1709
+ },
1710
+ "regulatoryFines": {
1711
+ "low": 0,
1712
+ "likely": 0,
1713
+ "high": 0
1714
+ },
1715
+ "directDamage": {
1716
+ "low": 250,
1717
+ "likely": 1250,
1718
+ "high": 10000
1719
+ },
1720
+ "classAction": {
1721
+ "low": 0,
1722
+ "likely": 0,
1723
+ "high": 0
1724
+ },
1725
+ "lostBusiness": {
1726
+ "low": 0,
1727
+ "likely": 0,
1728
+ "high": 0
1729
+ }
1730
+ },
1731
+ "dominantDriver": "legal counsel",
1732
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1733
+ "confidence": "low",
1734
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:198` 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."
1735
+ },
1736
+ "stableId": "da0930b64e53120b",
1737
+ "confidenceTier": "very-low",
1738
+ "exploitability": 0.2,
1739
+ "exploitabilityTier": "low",
1740
+ "exploitabilityFactors": [
1741
+ "sev:medium",
1742
+ "unreachable"
1743
+ ],
1744
+ "clusterSize": null,
1745
+ "unreachable": false,
1746
+ "validator_verdict": "unvalidated",
1747
+ "llm_confidence": null,
1748
+ "unvalidated": true,
1749
+ "cross_language": false,
1750
+ "family": "dos-sync-io",
1751
+ "_unsigned": false,
1752
+ "_passThroughSigning": false,
1753
+ "signatureStatus": "verified",
1754
+ "regression_test": null,
1755
+ "poc": null,
1756
+ "calibrated_confidence": null,
1757
+ "calibrated_confidence_ci": null,
1758
+ "calibrated_n": 0,
1759
+ "calibration_reason": "no-history",
1760
+ "verifier_verdict": "cannot-verify",
1761
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1762
+ "verifier_runner": null,
1763
+ "narration": null,
1764
+ "mitigationVerdict": "unreachable-in-prod",
1765
+ "mitigationsApplied": [],
1766
+ "mitigatedByWaf": false,
1767
+ "wafRuleId": null,
1768
+ "mitigatedByAuth": false,
1769
+ "authMechanism": null,
1770
+ "mitigatedByNetwork": false,
1771
+ "networkExposure": null,
1772
+ "featureFlag": null,
1773
+ "featureFlagState": null,
1774
+ "featureFlagRollout": null,
1775
+ "exposedInProd": false,
1776
+ "unreachableInProd": true,
1777
+ "coldPath": false,
1778
+ "hotPath": false,
1779
+ "prodRequestCount": null,
1780
+ "crownJewelScore": 0.15,
1781
+ "crownJewelTier": "low-value",
1782
+ "crownJewelFactors": [
1783
+ "shell-execution"
1784
+ ],
1785
+ "cloneClusterId": "5e5357c1989b7538",
1786
+ "cloneClusterSize": 1,
1787
+ "provenance": "human-likely",
1788
+ "provenanceScore": 0.12,
1789
+ "typeNarrowed": null,
1790
+ "strideCategory": "denialOfService",
1791
+ "personaScores": {
1792
+ "script-kiddie": {
1793
+ "score": 0.4,
1794
+ "tier": "medium",
1795
+ "factors": [
1796
+ "sev:medium"
1797
+ ]
1798
+ },
1799
+ "opportunistic-criminal": {
1800
+ "score": 0.4,
1801
+ "tier": "medium",
1802
+ "factors": [
1803
+ "sev:medium"
1804
+ ]
1805
+ },
1806
+ "apt-nation-state": {
1807
+ "score": 0.4,
1808
+ "tier": "medium",
1809
+ "factors": [
1810
+ "sev:medium"
1811
+ ]
1812
+ },
1813
+ "supply-chain-attacker": {
1814
+ "score": 0.4,
1815
+ "tier": "medium",
1816
+ "factors": [
1817
+ "sev:medium"
1818
+ ]
1819
+ },
1820
+ "malicious-insider": {
1821
+ "score": 0.4,
1822
+ "tier": "medium",
1823
+ "factors": [
1824
+ "sev:medium"
1825
+ ]
1826
+ }
1827
+ },
1828
+ "personaTopTwo": [
1829
+ "script-kiddie",
1830
+ "opportunistic-criminal"
1831
+ ],
1832
+ "personaMaxName": "script-kiddie",
1833
+ "personaMaxScore": 0.4,
1834
+ "reverseExposure": null,
1835
+ "specMined": null,
1836
+ "whyFired": {
1837
+ "detector": "sast/dos-sync-io",
1838
+ "ruleId": "CWE-400",
1839
+ "parser": "STRUCTURAL",
1840
+ "evidence": {
1841
+ "sinkSnippet": "if (fs.existsSync(tdir)) walk(tdir, depth + 1);",
1842
+ "sourceSnippet": "if (fs.existsSync(tdir)) walk(tdir, depth + 1);",
1843
+ "pathSteps": [],
1844
+ "sanitizers": [],
1845
+ "guards": []
1846
+ },
1847
+ "considered": {
1848
+ "suppressionsApplied": [],
1849
+ "suppressionsSkipped": [],
1850
+ "reachabilityFilter": "unaffected",
1851
+ "clusterCollapsed": false,
1852
+ "typeNarrowed": false,
1853
+ "crownJewelTier": "low-value",
1854
+ "mitigationVerdict": "unreachable-in-prod"
1855
+ },
1856
+ "scanner": {
1857
+ "rulesetVersion": null,
1858
+ "packHash": null,
1859
+ "modelId": null
1860
+ }
1861
+ },
1862
+ "adversaryTranscript": null,
1863
+ "predictedBountyUsd": {
1864
+ "low": 10,
1865
+ "likely": 40,
1866
+ "high": 120,
1867
+ "program": "web2"
1868
+ },
1869
+ "bountyConfidence": "high",
1870
+ "attackPlaybook": null
1871
+ },
1872
+ {
1873
+ "id": "struct:type-stubs.js:216:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
1874
+ "kind": "sast",
1875
+ "severity": "medium",
1876
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
1877
+ "cwe": "CWE-400",
1878
+ "owaspLlm": null,
1879
+ "stride": "Denial of Service",
1880
+ "file": "type-stubs.js",
1881
+ "line": 216,
1882
+ "snippet": "const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));",
1883
+ "fix": null,
1884
+ "reachable": false,
1885
+ "triage": 22,
1886
+ "dataClasses": [],
1887
+ "chain": null,
1888
+ "confidence": 0.212,
1889
+ "toxicity": 28,
1890
+ "toxicityFactors": [
1891
+ "http-facing"
1892
+ ],
1893
+ "toxicityLabel": "Medium",
1894
+ "sources": null,
1895
+ "epssScore": null,
1896
+ "epssPercentile": null,
1897
+ "epssCve": null,
1898
+ "exploitedNow": false,
1899
+ "tags": null,
1900
+ "blastRadius": {
1901
+ "scope": "all-users",
1902
+ "dataAtRisk": [
1903
+ "config"
1904
+ ],
1905
+ "userCount": 50,
1906
+ "industry": "generic",
1907
+ "jurisdictions": [],
1908
+ "controlsApplied": [],
1909
+ "dollarBest": 23250,
1910
+ "dollarLikely": 136250,
1911
+ "dollarWorst": 775000,
1912
+ "dollarLow": 23250,
1913
+ "dollarHigh": 775000,
1914
+ "components": {
1915
+ "incidentResponse": {
1916
+ "low": 8000,
1917
+ "likely": 50000,
1918
+ "high": 250000
1919
+ },
1920
+ "legal": {
1921
+ "low": 10000,
1922
+ "likely": 75000,
1923
+ "high": 500000
1924
+ },
1925
+ "crisisPR": {
1926
+ "low": 0,
1927
+ "likely": 0,
1928
+ "high": 0
1929
+ },
1930
+ "notification": {
1931
+ "low": 5000,
1932
+ "likely": 10000,
1933
+ "high": 15000
1934
+ },
1935
+ "creditMonitoring": {
1936
+ "low": 0,
1937
+ "likely": 0,
1938
+ "high": 0
1939
+ },
1940
+ "regulatoryFines": {
1941
+ "low": 0,
1942
+ "likely": 0,
1943
+ "high": 0
1944
+ },
1945
+ "directDamage": {
1946
+ "low": 250,
1947
+ "likely": 1250,
1948
+ "high": 10000
1949
+ },
1950
+ "classAction": {
1951
+ "low": 0,
1952
+ "likely": 0,
1953
+ "high": 0
1954
+ },
1955
+ "lostBusiness": {
1956
+ "low": 0,
1957
+ "likely": 0,
1958
+ "high": 0
1959
+ }
1960
+ },
1961
+ "dominantDriver": "legal counsel",
1962
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
1963
+ "confidence": "low",
1964
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:216` 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."
1965
+ },
1966
+ "stableId": "9f54fa968991f0c8",
1967
+ "confidenceTier": "very-low",
1968
+ "exploitability": 0.2,
1969
+ "exploitabilityTier": "low",
1970
+ "exploitabilityFactors": [
1971
+ "sev:medium",
1972
+ "unreachable"
1973
+ ],
1974
+ "clusterSize": null,
1975
+ "unreachable": false,
1976
+ "validator_verdict": "unvalidated",
1977
+ "llm_confidence": null,
1978
+ "unvalidated": true,
1979
+ "cross_language": false,
1980
+ "family": "dos-sync-io",
1981
+ "_unsigned": false,
1982
+ "_passThroughSigning": false,
1983
+ "signatureStatus": "verified",
1984
+ "regression_test": null,
1985
+ "poc": null,
1986
+ "calibrated_confidence": null,
1987
+ "calibrated_confidence_ci": null,
1988
+ "calibrated_n": 0,
1989
+ "calibration_reason": "no-history",
1990
+ "verifier_verdict": "cannot-verify",
1991
+ "verifier_reason": "no-poc-no-sanitizer-rule",
1992
+ "verifier_runner": null,
1993
+ "narration": null,
1994
+ "mitigationVerdict": "unreachable-in-prod",
1995
+ "mitigationsApplied": [],
1996
+ "mitigatedByWaf": false,
1997
+ "wafRuleId": null,
1998
+ "mitigatedByAuth": false,
1999
+ "authMechanism": null,
2000
+ "mitigatedByNetwork": false,
2001
+ "networkExposure": null,
2002
+ "featureFlag": null,
2003
+ "featureFlagState": null,
2004
+ "featureFlagRollout": null,
2005
+ "exposedInProd": false,
2006
+ "unreachableInProd": true,
2007
+ "coldPath": false,
2008
+ "hotPath": false,
2009
+ "prodRequestCount": null,
2010
+ "crownJewelScore": 0.15,
2011
+ "crownJewelTier": "low-value",
2012
+ "crownJewelFactors": [
2013
+ "shell-execution"
2014
+ ],
2015
+ "cloneClusterId": "f686c808d16515e4",
2016
+ "cloneClusterSize": 1,
2017
+ "provenance": "human-likely",
2018
+ "provenanceScore": 0.12,
2019
+ "typeNarrowed": null,
2020
+ "strideCategory": "denialOfService",
2021
+ "personaScores": {
2022
+ "script-kiddie": {
2023
+ "score": 0.4,
2024
+ "tier": "medium",
2025
+ "factors": [
2026
+ "sev:medium"
2027
+ ]
2028
+ },
2029
+ "opportunistic-criminal": {
2030
+ "score": 0.4,
2031
+ "tier": "medium",
2032
+ "factors": [
2033
+ "sev:medium"
2034
+ ]
2035
+ },
2036
+ "apt-nation-state": {
2037
+ "score": 0.4,
2038
+ "tier": "medium",
2039
+ "factors": [
2040
+ "sev:medium"
2041
+ ]
2042
+ },
2043
+ "supply-chain-attacker": {
2044
+ "score": 0.4,
2045
+ "tier": "medium",
2046
+ "factors": [
2047
+ "sev:medium"
2048
+ ]
2049
+ },
2050
+ "malicious-insider": {
2051
+ "score": 0.4,
2052
+ "tier": "medium",
2053
+ "factors": [
2054
+ "sev:medium"
2055
+ ]
2056
+ }
2057
+ },
2058
+ "personaTopTwo": [
2059
+ "script-kiddie",
2060
+ "opportunistic-criminal"
2061
+ ],
2062
+ "personaMaxName": "script-kiddie",
2063
+ "personaMaxScore": 0.4,
2064
+ "reverseExposure": null,
2065
+ "specMined": null,
2066
+ "whyFired": {
2067
+ "detector": "sast/dos-sync-io",
2068
+ "ruleId": "CWE-400",
2069
+ "parser": "STRUCTURAL",
2070
+ "evidence": {
2071
+ "sinkSnippet": "const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));",
2072
+ "sourceSnippet": "const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));",
2073
+ "pathSteps": [],
2074
+ "sanitizers": [],
2075
+ "guards": []
2076
+ },
2077
+ "considered": {
2078
+ "suppressionsApplied": [],
2079
+ "suppressionsSkipped": [],
2080
+ "reachabilityFilter": "unaffected",
2081
+ "clusterCollapsed": false,
2082
+ "typeNarrowed": false,
2083
+ "crownJewelTier": "low-value",
2084
+ "mitigationVerdict": "unreachable-in-prod"
2085
+ },
2086
+ "scanner": {
2087
+ "rulesetVersion": null,
2088
+ "packHash": null,
2089
+ "modelId": null
2090
+ }
2091
+ },
2092
+ "adversaryTranscript": null,
2093
+ "predictedBountyUsd": {
2094
+ "low": 10,
2095
+ "likely": 40,
2096
+ "high": 120,
2097
+ "program": "web2"
2098
+ },
2099
+ "bountyConfidence": "high",
2100
+ "attackPlaybook": null
2101
+ },
2102
+ {
2103
+ "id": "struct:type-stubs.js:245:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
2104
+ "kind": "sast",
2105
+ "severity": "medium",
2106
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2107
+ "cwe": "CWE-400",
2108
+ "owaspLlm": null,
2109
+ "stride": "Denial of Service",
2110
+ "file": "type-stubs.js",
2111
+ "line": 245,
2112
+ "snippet": "try { body = fs.readFileSync(f.path, 'utf8'); } catch { continue; }",
2113
+ "fix": null,
2114
+ "reachable": false,
2115
+ "triage": 22,
2116
+ "dataClasses": [],
2117
+ "chain": null,
2118
+ "confidence": 0.212,
2119
+ "toxicity": 28,
2120
+ "toxicityFactors": [
2121
+ "http-facing"
2122
+ ],
2123
+ "toxicityLabel": "Medium",
2124
+ "sources": null,
2125
+ "epssScore": null,
2126
+ "epssPercentile": null,
2127
+ "epssCve": null,
2128
+ "exploitedNow": false,
2129
+ "tags": null,
2130
+ "blastRadius": {
2131
+ "scope": "all-users",
2132
+ "dataAtRisk": [
2133
+ "config"
2134
+ ],
2135
+ "userCount": 50,
2136
+ "industry": "generic",
2137
+ "jurisdictions": [],
2138
+ "controlsApplied": [],
2139
+ "dollarBest": 23250,
2140
+ "dollarLikely": 136250,
2141
+ "dollarWorst": 775000,
2142
+ "dollarLow": 23250,
2143
+ "dollarHigh": 775000,
2144
+ "components": {
2145
+ "incidentResponse": {
2146
+ "low": 8000,
2147
+ "likely": 50000,
2148
+ "high": 250000
2149
+ },
2150
+ "legal": {
2151
+ "low": 10000,
2152
+ "likely": 75000,
2153
+ "high": 500000
2154
+ },
2155
+ "crisisPR": {
2156
+ "low": 0,
2157
+ "likely": 0,
2158
+ "high": 0
2159
+ },
2160
+ "notification": {
2161
+ "low": 5000,
2162
+ "likely": 10000,
2163
+ "high": 15000
2164
+ },
2165
+ "creditMonitoring": {
2166
+ "low": 0,
2167
+ "likely": 0,
2168
+ "high": 0
2169
+ },
2170
+ "regulatoryFines": {
2171
+ "low": 0,
2172
+ "likely": 0,
2173
+ "high": 0
2174
+ },
2175
+ "directDamage": {
2176
+ "low": 250,
2177
+ "likely": 1250,
2178
+ "high": 10000
2179
+ },
2180
+ "classAction": {
2181
+ "low": 0,
2182
+ "likely": 0,
2183
+ "high": 0
2184
+ },
2185
+ "lostBusiness": {
2186
+ "low": 0,
2187
+ "likely": 0,
2188
+ "high": 0
2189
+ }
2190
+ },
2191
+ "dominantDriver": "legal counsel",
2192
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
2193
+ "confidence": "low",
2194
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `type-stubs.js:245` 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."
2195
+ },
2196
+ "stableId": "d7f878f4239f7f2f",
2197
+ "confidenceTier": "very-low",
2198
+ "exploitability": 0.2,
2199
+ "exploitabilityTier": "low",
2200
+ "exploitabilityFactors": [
2201
+ "sev:medium",
2202
+ "unreachable"
2203
+ ],
2204
+ "clusterSize": null,
2205
+ "unreachable": false,
2206
+ "validator_verdict": "unvalidated",
2207
+ "llm_confidence": null,
2208
+ "unvalidated": true,
2209
+ "cross_language": false,
2210
+ "family": "dos-sync-io",
2211
+ "_unsigned": false,
2212
+ "_passThroughSigning": false,
2213
+ "signatureStatus": "verified",
2214
+ "regression_test": null,
2215
+ "poc": null,
2216
+ "calibrated_confidence": null,
2217
+ "calibrated_confidence_ci": null,
2218
+ "calibrated_n": 0,
2219
+ "calibration_reason": "no-history",
2220
+ "verifier_verdict": "cannot-verify",
2221
+ "verifier_reason": "no-poc-no-sanitizer-rule",
2222
+ "verifier_runner": null,
2223
+ "narration": null,
2224
+ "mitigationVerdict": "unreachable-in-prod",
2225
+ "mitigationsApplied": [],
2226
+ "mitigatedByWaf": false,
2227
+ "wafRuleId": null,
2228
+ "mitigatedByAuth": false,
2229
+ "authMechanism": null,
2230
+ "mitigatedByNetwork": false,
2231
+ "networkExposure": null,
2232
+ "featureFlag": null,
2233
+ "featureFlagState": null,
2234
+ "featureFlagRollout": null,
2235
+ "exposedInProd": false,
2236
+ "unreachableInProd": true,
2237
+ "coldPath": false,
2238
+ "hotPath": false,
2239
+ "prodRequestCount": null,
2240
+ "crownJewelScore": 0.15,
2241
+ "crownJewelTier": "low-value",
2242
+ "crownJewelFactors": [
2243
+ "shell-execution"
2244
+ ],
2245
+ "cloneClusterId": "01bed4bbdd04761a",
2246
+ "cloneClusterSize": 1,
2247
+ "provenance": "human-likely",
2248
+ "provenanceScore": 0.12,
2249
+ "typeNarrowed": null,
2250
+ "strideCategory": "denialOfService",
2251
+ "personaScores": {
2252
+ "script-kiddie": {
2253
+ "score": 0.4,
2254
+ "tier": "medium",
2255
+ "factors": [
2256
+ "sev:medium"
2257
+ ]
2258
+ },
2259
+ "opportunistic-criminal": {
2260
+ "score": 0.4,
2261
+ "tier": "medium",
2262
+ "factors": [
2263
+ "sev:medium"
2264
+ ]
2265
+ },
2266
+ "apt-nation-state": {
2267
+ "score": 0.4,
2268
+ "tier": "medium",
2269
+ "factors": [
2270
+ "sev:medium"
2271
+ ]
2272
+ },
2273
+ "supply-chain-attacker": {
2274
+ "score": 0.4,
2275
+ "tier": "medium",
2276
+ "factors": [
2277
+ "sev:medium"
2278
+ ]
2279
+ },
2280
+ "malicious-insider": {
2281
+ "score": 0.4,
2282
+ "tier": "medium",
2283
+ "factors": [
2284
+ "sev:medium"
2285
+ ]
2286
+ }
2287
+ },
2288
+ "personaTopTwo": [
2289
+ "script-kiddie",
2290
+ "opportunistic-criminal"
2291
+ ],
2292
+ "personaMaxName": "script-kiddie",
2293
+ "personaMaxScore": 0.4,
2294
+ "reverseExposure": null,
2295
+ "specMined": null,
2296
+ "whyFired": {
2297
+ "detector": "sast/dos-sync-io",
2298
+ "ruleId": "CWE-400",
2299
+ "parser": "STRUCTURAL",
2300
+ "evidence": {
2301
+ "sinkSnippet": "try { body = fs.readFileSync(f.path, 'utf8'); } catch { continue; }",
2302
+ "sourceSnippet": "try { body = fs.readFileSync(f.path, 'utf8'); } catch { continue; }",
2303
+ "pathSteps": [],
2304
+ "sanitizers": [],
2305
+ "guards": []
2306
+ },
2307
+ "considered": {
2308
+ "suppressionsApplied": [],
2309
+ "suppressionsSkipped": [],
2310
+ "reachabilityFilter": "unaffected",
2311
+ "clusterCollapsed": false,
2312
+ "typeNarrowed": false,
2313
+ "crownJewelTier": "low-value",
2314
+ "mitigationVerdict": "unreachable-in-prod"
2315
+ },
2316
+ "scanner": {
2317
+ "rulesetVersion": null,
2318
+ "packHash": null,
2319
+ "modelId": null
2320
+ }
2321
+ },
2322
+ "adversaryTranscript": null,
2323
+ "predictedBountyUsd": {
2324
+ "low": 10,
2325
+ "likely": 40,
2326
+ "high": 120,
2327
+ "program": "web2"
2328
+ },
2329
+ "bountyConfidence": "high",
2330
+ "attackPlaybook": null
2331
+ },
2332
+ {
2333
+ "id": "struct:parser-py-cst.js:91:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
2334
+ "kind": "sast",
2335
+ "severity": "medium",
2336
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2337
+ "cwe": "CWE-400",
2338
+ "owaspLlm": null,
2339
+ "stride": "Denial of Service",
2340
+ "file": "parser-py-cst.js",
2341
+ "line": 91,
2342
+ "snippet": "if (!fs.existsSync(HELPER_PATH)) return null;",
2343
+ "fix": null,
2344
+ "reachable": false,
2345
+ "triage": 18,
2346
+ "dataClasses": [],
2347
+ "chain": null,
2348
+ "confidence": 0.161,
2349
+ "toxicity": 28,
2350
+ "toxicityFactors": [
2351
+ "http-facing"
2352
+ ],
2353
+ "toxicityLabel": "Medium",
2354
+ "sources": null,
2355
+ "epssScore": null,
2356
+ "epssPercentile": null,
2357
+ "epssCve": null,
2358
+ "exploitedNow": false,
2359
+ "tags": null,
2360
+ "blastRadius": {
2361
+ "scope": "all-users",
2362
+ "dataAtRisk": [
2363
+ "config"
2364
+ ],
2365
+ "userCount": 50,
2366
+ "industry": "generic",
2367
+ "jurisdictions": [],
2368
+ "controlsApplied": [],
2369
+ "dollarBest": 23250,
2370
+ "dollarLikely": 136250,
2371
+ "dollarWorst": 775000,
2372
+ "dollarLow": 23250,
2373
+ "dollarHigh": 775000,
2374
+ "components": {
2375
+ "incidentResponse": {
2376
+ "low": 8000,
2377
+ "likely": 50000,
2378
+ "high": 250000
2379
+ },
2380
+ "legal": {
2381
+ "low": 10000,
2382
+ "likely": 75000,
2383
+ "high": 500000
2384
+ },
2385
+ "crisisPR": {
2386
+ "low": 0,
2387
+ "likely": 0,
2388
+ "high": 0
2389
+ },
2390
+ "notification": {
2391
+ "low": 5000,
2392
+ "likely": 10000,
2393
+ "high": 15000
2394
+ },
2395
+ "creditMonitoring": {
2396
+ "low": 0,
2397
+ "likely": 0,
2398
+ "high": 0
2399
+ },
2400
+ "regulatoryFines": {
2401
+ "low": 0,
2402
+ "likely": 0,
2403
+ "high": 0
2404
+ },
2405
+ "directDamage": {
2406
+ "low": 250,
2407
+ "likely": 1250,
2408
+ "high": 10000
2409
+ },
2410
+ "classAction": {
2411
+ "low": 0,
2412
+ "likely": 0,
2413
+ "high": 0
2414
+ },
2415
+ "lostBusiness": {
2416
+ "low": 0,
2417
+ "likely": 0,
2418
+ "high": 0
2419
+ }
2420
+ },
2421
+ "dominantDriver": "legal counsel",
2422
+ "comparable": "Air Canada 2024 LLM chatbot DoS → court-ordered refunds + reputational damage",
2423
+ "confidence": "low",
2424
+ "narrative": "Synchronous Blocking I/O (DoS Risk in Server Context) on `parser-py-cst.js:91` 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."
2425
+ },
2426
+ "stableId": "ca57234f46aecc6a",
2427
+ "confidenceTier": "very-low",
2428
+ "exploitability": 0.05,
2429
+ "exploitabilityTier": "low",
2430
+ "exploitabilityFactors": [
2431
+ "sev:medium",
2432
+ "unreachable",
2433
+ "guards:1"
2434
+ ],
2435
+ "clusterSize": null,
2436
+ "unreachable": false,
2437
+ "validator_verdict": "unvalidated",
2438
+ "llm_confidence": null,
2439
+ "unvalidated": true,
2440
+ "cross_language": false,
2441
+ "family": "dos-sync-io",
2442
+ "_unsigned": false,
2443
+ "_passThroughSigning": false,
2444
+ "signatureStatus": "verified",
2445
+ "regression_test": null,
2446
+ "poc": null,
2447
+ "calibrated_confidence": null,
2448
+ "calibrated_confidence_ci": null,
2449
+ "calibrated_n": 0,
2450
+ "calibration_reason": "no-history",
2451
+ "verifier_verdict": "cannot-verify",
2452
+ "verifier_reason": "no-poc-no-sanitizer-rule",
2453
+ "verifier_runner": null,
2454
+ "narration": null,
2455
+ "mitigationVerdict": "unreachable-in-prod",
2456
+ "mitigationsApplied": [],
2457
+ "mitigatedByWaf": false,
2458
+ "wafRuleId": null,
2459
+ "mitigatedByAuth": false,
2460
+ "authMechanism": null,
2461
+ "mitigatedByNetwork": false,
2462
+ "networkExposure": null,
2463
+ "featureFlag": null,
2464
+ "featureFlagState": null,
2465
+ "featureFlagRollout": null,
2466
+ "exposedInProd": false,
2467
+ "unreachableInProd": true,
2468
+ "coldPath": false,
2469
+ "hotPath": false,
2470
+ "prodRequestCount": null,
2471
+ "crownJewelScore": 0.15,
2472
+ "crownJewelTier": "low-value",
2473
+ "crownJewelFactors": [
2474
+ "shell-execution"
2475
+ ],
2476
+ "cloneClusterId": "66b8a8c25816e7f9",
2477
+ "cloneClusterSize": 2,
2478
+ "provenance": "mixed",
2479
+ "provenanceScore": 0.4,
2480
+ "typeNarrowed": null,
2481
+ "strideCategory": "denialOfService",
2482
+ "personaScores": {
2483
+ "script-kiddie": {
2484
+ "score": 0.2,
2485
+ "tier": "low",
2486
+ "factors": [
2487
+ "sev:medium",
2488
+ "auth-gated:1"
2489
+ ]
2490
+ },
2491
+ "opportunistic-criminal": {
2492
+ "score": 0.4,
2493
+ "tier": "medium",
2494
+ "factors": [
2495
+ "sev:medium"
2496
+ ]
2497
+ },
2498
+ "apt-nation-state": {
2499
+ "score": 0.35,
2500
+ "tier": "medium",
2501
+ "factors": [
2502
+ "sev:medium",
2503
+ "minor-auth-cost"
2504
+ ]
2505
+ },
2506
+ "supply-chain-attacker": {
2507
+ "score": 0.4,
2508
+ "tier": "medium",
2509
+ "factors": [
2510
+ "sev:medium"
2511
+ ]
2512
+ },
2513
+ "malicious-insider": {
2514
+ "score": 0.3,
2515
+ "tier": "low",
2516
+ "factors": [
2517
+ "sev:medium",
2518
+ "insider-bypasses-edge"
2519
+ ]
2520
+ }
2521
+ },
2522
+ "personaTopTwo": [
2523
+ "opportunistic-criminal",
2524
+ "supply-chain-attacker"
2525
+ ],
2526
+ "personaMaxName": "opportunistic-criminal",
2527
+ "personaMaxScore": 0.4,
2528
+ "reverseExposure": null,
2529
+ "specMined": null,
2530
+ "whyFired": {
2531
+ "detector": "sast/dos-sync-io",
2532
+ "ruleId": "CWE-400",
2533
+ "parser": "STRUCTURAL",
2534
+ "evidence": {
2535
+ "sinkSnippet": "if (!fs.existsSync(HELPER_PATH)) return null;",
2536
+ "sourceSnippet": "if (!fs.existsSync(HELPER_PATH)) return null;",
2537
+ "pathSteps": [],
2538
+ "sanitizers": [],
2539
+ "guards": [
2540
+ "type-check"
2541
+ ]
2542
+ },
2543
+ "considered": {
2544
+ "suppressionsApplied": [],
2545
+ "suppressionsSkipped": [],
2546
+ "reachabilityFilter": "unaffected",
2547
+ "clusterCollapsed": false,
2548
+ "typeNarrowed": false,
2549
+ "crownJewelTier": "low-value",
2550
+ "mitigationVerdict": "unreachable-in-prod"
2551
+ },
2552
+ "scanner": {
2553
+ "rulesetVersion": null,
2554
+ "packHash": null,
2555
+ "modelId": null
2556
+ }
2557
+ },
2558
+ "adversaryTranscript": null,
2559
+ "predictedBountyUsd": {
2560
+ "low": 10,
2561
+ "likely": 40,
2562
+ "high": 120,
2563
+ "program": "web2"
2564
+ },
2565
+ "bountyConfidence": "high",
2566
+ "attackPlaybook": null
2567
+ },
2568
+ {
2569
+ "id": "toctou-fs:type-stubs.js:48",
2570
+ "kind": "sast",
2571
+ "severity": "medium",
2572
+ "vuln": "TOCTOU: file existence/permission check before open",
2573
+ "cwe": "CWE-367",
2574
+ "owaspLlm": null,
2575
+ "stride": "Tampering",
2576
+ "file": "type-stubs.js",
2577
+ "line": 48,
2578
+ "snippet": "try { inputs.push(p + ':' + fs.statSync(fp).mtimeMs); } catch {}",
2579
+ "fix": null,
2580
+ "reachable": false,
2581
+ "triage": 22,
2582
+ "dataClasses": [],
2583
+ "chain": null,
2584
+ "confidence": 0.7,
2585
+ "toxicity": 8,
2586
+ "toxicityFactors": [],
2587
+ "toxicityLabel": "Low",
2588
+ "sources": null,
2589
+ "epssScore": null,
2590
+ "epssPercentile": null,
2591
+ "epssCve": null,
2592
+ "exploitedNow": false,
2593
+ "tags": null,
2594
+ "blastRadius": {
2595
+ "scope": "all-users",
2596
+ "dataAtRisk": [
2597
+ "config"
2598
+ ],
2599
+ "userCount": 50,
2600
+ "industry": "generic",
2601
+ "jurisdictions": [],
2602
+ "controlsApplied": [],
2603
+ "dollarBest": 23250,
2604
+ "dollarLikely": 136250,
2605
+ "dollarWorst": 775000,
2606
+ "dollarLow": 23250,
2607
+ "dollarHigh": 775000,
2608
+ "components": {
2609
+ "incidentResponse": {
2610
+ "low": 8000,
2611
+ "likely": 50000,
2612
+ "high": 250000
2613
+ },
2614
+ "legal": {
2615
+ "low": 10000,
2616
+ "likely": 75000,
2617
+ "high": 500000
2618
+ },
2619
+ "crisisPR": {
2620
+ "low": 0,
2621
+ "likely": 0,
2622
+ "high": 0
2623
+ },
2624
+ "notification": {
2625
+ "low": 5000,
2626
+ "likely": 10000,
2627
+ "high": 15000
2628
+ },
2629
+ "creditMonitoring": {
2630
+ "low": 0,
2631
+ "likely": 0,
2632
+ "high": 0
2633
+ },
2634
+ "regulatoryFines": {
2635
+ "low": 0,
2636
+ "likely": 0,
2637
+ "high": 0
2638
+ },
2639
+ "directDamage": {
2640
+ "low": 250,
2641
+ "likely": 1250,
2642
+ "high": 10000
2643
+ },
2644
+ "classAction": {
2645
+ "low": 0,
2646
+ "likely": 0,
2647
+ "high": 0
2648
+ },
2649
+ "lostBusiness": {
2650
+ "low": 0,
2651
+ "likely": 0,
2652
+ "high": 0
2653
+ }
2654
+ },
2655
+ "dominantDriver": "legal counsel",
2656
+ "comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
2657
+ "confidence": "low",
2658
+ "narrative": "TOCTOU: file existence/permission check before open on `type-stubs.js:48` 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."
2659
+ },
2660
+ "stableId": "d72348aa62acffcb",
2661
+ "confidenceTier": "medium",
2662
+ "exploitability": 0.2,
2663
+ "exploitabilityTier": "low",
2664
+ "exploitabilityFactors": [
2665
+ "sev:medium",
2666
+ "unreachable"
2667
+ ],
2668
+ "clusterSize": null,
2669
+ "unreachable": false,
2670
+ "validator_verdict": "unvalidated",
2671
+ "llm_confidence": null,
2672
+ "unvalidated": true,
2673
+ "cross_language": false,
2674
+ "family": "toctou-file-existence-permission-check-b",
2675
+ "_unsigned": false,
2676
+ "_passThroughSigning": false,
2677
+ "signatureStatus": "verified",
2678
+ "regression_test": null,
2679
+ "poc": null,
2680
+ "calibrated_confidence": null,
2681
+ "calibrated_confidence_ci": null,
2682
+ "calibrated_n": 0,
2683
+ "calibration_reason": "no-history",
2684
+ "verifier_verdict": "cannot-verify",
2685
+ "verifier_reason": "no-poc-no-sanitizer-rule",
2686
+ "verifier_runner": null,
2687
+ "narration": null,
2688
+ "mitigationVerdict": "unreachable-in-prod",
2689
+ "mitigationsApplied": [],
2690
+ "mitigatedByWaf": false,
2691
+ "wafRuleId": null,
2692
+ "mitigatedByAuth": false,
2693
+ "authMechanism": null,
2694
+ "mitigatedByNetwork": false,
2695
+ "networkExposure": null,
2696
+ "featureFlag": null,
2697
+ "featureFlagState": null,
2698
+ "featureFlagRollout": null,
2699
+ "exposedInProd": false,
2700
+ "unreachableInProd": true,
2701
+ "coldPath": false,
2702
+ "hotPath": false,
2703
+ "prodRequestCount": null,
2704
+ "crownJewelScore": 0.15,
2705
+ "crownJewelTier": "low-value",
2706
+ "crownJewelFactors": [
2707
+ "shell-execution"
2708
+ ],
2709
+ "cloneClusterId": "1ca765ccc2c8227c",
2710
+ "cloneClusterSize": 2,
2711
+ "provenance": "human-likely",
2712
+ "provenanceScore": 0.12,
2713
+ "typeNarrowed": null,
2714
+ "strideCategory": "tampering",
2715
+ "personaScores": {
2716
+ "script-kiddie": {
2717
+ "score": 0.4,
2718
+ "tier": "medium",
2719
+ "factors": [
2720
+ "sev:medium"
2721
+ ]
2722
+ },
2723
+ "opportunistic-criminal": {
2724
+ "score": 0.4,
2725
+ "tier": "medium",
2726
+ "factors": [
2727
+ "sev:medium"
2728
+ ]
2729
+ },
2730
+ "apt-nation-state": {
2731
+ "score": 0.4,
2732
+ "tier": "medium",
2733
+ "factors": [
2734
+ "sev:medium"
2735
+ ]
2736
+ },
2737
+ "supply-chain-attacker": {
2738
+ "score": 0.4,
2739
+ "tier": "medium",
2740
+ "factors": [
2741
+ "sev:medium"
2742
+ ]
2743
+ },
2744
+ "malicious-insider": {
2745
+ "score": 0.4,
2746
+ "tier": "medium",
2747
+ "factors": [
2748
+ "sev:medium"
2749
+ ]
2750
+ }
2751
+ },
2752
+ "personaTopTwo": [
2753
+ "script-kiddie",
2754
+ "opportunistic-criminal"
2755
+ ],
2756
+ "personaMaxName": "script-kiddie",
2757
+ "personaMaxScore": 0.4,
2758
+ "reverseExposure": null,
2759
+ "specMined": null,
2760
+ "whyFired": {
2761
+ "detector": "sast/toctou-file-existence-permission-check-b",
2762
+ "ruleId": "CWE-367",
2763
+ "parser": "TOCTOU",
2764
+ "evidence": {
2765
+ "sinkSnippet": "try { inputs.push(p + ':' + fs.statSync(fp).mtimeMs); } catch {}",
2766
+ "sourceSnippet": null,
2767
+ "pathSteps": [],
2768
+ "sanitizers": [],
2769
+ "guards": []
2770
+ },
2771
+ "considered": {
2772
+ "suppressionsApplied": [],
2773
+ "suppressionsSkipped": [],
2774
+ "reachabilityFilter": "unaffected",
2775
+ "clusterCollapsed": false,
2776
+ "typeNarrowed": false,
2777
+ "crownJewelTier": "low-value",
2778
+ "mitigationVerdict": "unreachable-in-prod"
2779
+ },
2780
+ "scanner": {
2781
+ "rulesetVersion": null,
2782
+ "packHash": null,
2783
+ "modelId": null
2784
+ }
2785
+ },
2786
+ "adversaryTranscript": null,
2787
+ "predictedBountyUsd": null,
2788
+ "bountyConfidence": null,
2789
+ "attackPlaybook": null
2790
+ },
2791
+ {
2792
+ "id": "logic:type-stubs.js:57:TOCTOU:_existsSync_followed_by_file_op",
2793
+ "kind": "logic",
2794
+ "severity": "medium",
2795
+ "vuln": "TOCTOU: existsSync followed by file op",
2796
+ "cwe": "CWE-367",
2797
+ "stride": "Tampering",
2798
+ "file": "type-stubs.js",
2799
+ "line": 57,
2800
+ "snippet": "if (!fs.existsSync(fp)) return null;",
2801
+ "fix": {
2802
+ "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.",
2803
+ "code": ""
2804
+ },
2805
+ "blastRadius": {
2806
+ "scope": "all-users",
2807
+ "dataAtRisk": [
2808
+ "config"
2809
+ ],
2810
+ "userCount": 50,
2811
+ "industry": "generic",
2812
+ "jurisdictions": [],
2813
+ "controlsApplied": [],
2814
+ "dollarBest": 23250,
2815
+ "dollarLikely": 136250,
2816
+ "dollarWorst": 775000,
2817
+ "dollarLow": 23250,
2818
+ "dollarHigh": 775000,
2819
+ "components": {
2820
+ "incidentResponse": {
2821
+ "low": 8000,
2822
+ "likely": 50000,
2823
+ "high": 250000
2824
+ },
2825
+ "legal": {
2826
+ "low": 10000,
2827
+ "likely": 75000,
2828
+ "high": 500000
2829
+ },
2830
+ "crisisPR": {
2831
+ "low": 0,
2832
+ "likely": 0,
2833
+ "high": 0
2834
+ },
2835
+ "notification": {
2836
+ "low": 5000,
2837
+ "likely": 10000,
2838
+ "high": 15000
2839
+ },
2840
+ "creditMonitoring": {
2841
+ "low": 0,
2842
+ "likely": 0,
2843
+ "high": 0
2844
+ },
2845
+ "regulatoryFines": {
2846
+ "low": 0,
2847
+ "likely": 0,
2848
+ "high": 0
2849
+ },
2850
+ "directDamage": {
2851
+ "low": 250,
2852
+ "likely": 1250,
2853
+ "high": 10000
2854
+ },
2855
+ "classAction": {
2856
+ "low": 0,
2857
+ "likely": 0,
2858
+ "high": 0
2859
+ },
2860
+ "lostBusiness": {
2861
+ "low": 0,
2862
+ "likely": 0,
2863
+ "high": 0
2864
+ }
2865
+ },
2866
+ "dominantDriver": "legal counsel",
2867
+ "comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
2868
+ "confidence": "low",
2869
+ "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
+ }
2871
+ }
2872
+ ],
2873
+ "bundles": [],
2874
+ "routes": [],
2875
+ "components": [],
2876
+ "suppressedCount": 6,
2877
+ "blastRadiusSignals": {
2878
+ "industry": "generic",
2879
+ "industryConfidence": "low",
2880
+ "jurisdictions": [],
2881
+ "controls": [],
2882
+ "estimatedUsers": 50,
2883
+ "revenueIndicator": "pre-revenue",
2884
+ "hasStripe": false,
2885
+ "hasAuth": false,
2886
+ "hasUserTable": false,
2887
+ "hasPII": false,
2888
+ "hasPHI": false,
2889
+ "hasS3": false
2890
+ },
2891
+ "_v3": {
2892
+ "counterfactual": {
2893
+ "spofControls": [],
2894
+ "controlsDetected": 240
2895
+ },
2896
+ "threatModel": {
2897
+ "summary": {
2898
+ "assetCount": 0,
2899
+ "boundaryCount": 2,
2900
+ "strideCounts": {
2901
+ "spoofing": 0,
2902
+ "tampering": 1,
2903
+ "repudiation": 0,
2904
+ "informationDisclosure": 0,
2905
+ "denialOfService": 9,
2906
+ "elevationOfPrivilege": 0
2907
+ }
2908
+ },
2909
+ "assets": [],
2910
+ "trustBoundaries": [
2911
+ {
2912
+ "type": "db-edge",
2913
+ "file": "parser-py-cst.js",
2914
+ "line": 13,
2915
+ "label": null
2916
+ },
2917
+ {
2918
+ "type": "db-edge",
2919
+ "file": "parser-py.js",
2920
+ "line": 72,
2921
+ "label": null
2922
+ }
2923
+ ],
2924
+ "stride": {
2925
+ "spoofing": [],
2926
+ "tampering": [
2927
+ {
2928
+ "vuln": "TOCTOU: file existence/permission check before open",
2929
+ "file": "type-stubs.js",
2930
+ "line": 48,
2931
+ "severity": "medium"
2932
+ }
2933
+ ],
2934
+ "repudiation": [],
2935
+ "informationDisclosure": [],
2936
+ "denialOfService": [
2937
+ {
2938
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2939
+ "file": "type-stubs.js",
2940
+ "severity": "medium"
2941
+ },
2942
+ {
2943
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2944
+ "file": "type-stubs.js",
2945
+ "severity": "medium"
2946
+ },
2947
+ {
2948
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2949
+ "file": "type-stubs.js",
2950
+ "severity": "medium"
2951
+ },
2952
+ {
2953
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2954
+ "file": "type-stubs.js",
2955
+ "severity": "medium"
2956
+ },
2957
+ {
2958
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2959
+ "file": "type-stubs.js",
2960
+ "severity": "medium"
2961
+ },
2962
+ {
2963
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2964
+ "file": "type-stubs.js",
2965
+ "severity": "medium"
2966
+ },
2967
+ {
2968
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2969
+ "file": "type-stubs.js",
2970
+ "severity": "medium"
2971
+ },
2972
+ {
2973
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2974
+ "file": "type-stubs.js",
2975
+ "severity": "medium"
2976
+ },
2977
+ {
2978
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
2979
+ "file": "parser-py-cst.js",
2980
+ "severity": "medium"
2981
+ }
2982
+ ],
2983
+ "elevationOfPrivilege": []
2984
+ }
2985
+ },
2986
+ "trustBoundaryDiagram": {
2987
+ "mermaid": "flowchart LR\n INTERNET((Internet))\n APP[\"Application\"]\n db_parser_py_cst_js_13[(\"db@parser-py-cst.js:13\")]\n db_parser_py_js_72[(\"db@parser-py.js:72\")]\n APP -->|db| db_parser_py_cst_js_13\n APP -->|db| db_parser_py_js_72\n class db_parser_py_cst_js_13 sev_medium;\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;",
2988
+ "nodes": [
2989
+ {
2990
+ "id": "INTERNET",
2991
+ "kind": "external",
2992
+ "label": "Internet"
2993
+ },
2994
+ {
2995
+ "id": "APP",
2996
+ "kind": "app",
2997
+ "label": "Application"
2998
+ },
2999
+ {
3000
+ "kind": "db",
3001
+ "id": "db_parser_py_cst_js_13",
3002
+ "label": "db@parser-py-cst.js:13"
3003
+ },
3004
+ {
3005
+ "kind": "db",
3006
+ "id": "db_parser_py_js_72",
3007
+ "label": "db@parser-py.js:72"
3008
+ }
3009
+ ],
3010
+ "edges": [
3011
+ {
3012
+ "from": "APP",
3013
+ "to": "db_parser_py_cst_js_13",
3014
+ "kind": "db"
3015
+ },
3016
+ {
3017
+ "from": "APP",
3018
+ "to": "db_parser_py_js_72",
3019
+ "kind": "db"
3020
+ }
3021
+ ],
3022
+ "decorations": [
3023
+ {
3024
+ "nodeId": "db_parser_py_cst_js_13",
3025
+ "severity": "medium",
3026
+ "vuln": "Synchronous Blocking I/O (DoS Risk in Server Context)",
3027
+ "file": "parser-py-cst.js"
3028
+ }
3029
+ ]
3030
+ },
3031
+ "calibrationDrift": {
3032
+ "alarms": [],
3033
+ "note": "no-feedback-data"
3034
+ }
3035
+ }
3036
+ }