@hoanghainh/komagu 2.4.0 → 2.6.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 (247) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +202 -0
  3. package/README.md +1 -0
  4. package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
  5. package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
  6. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
  7. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
  8. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
  9. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
  10. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
  11. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
  12. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
  13. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
  14. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
  15. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
  16. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
  17. package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
  18. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
  19. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
  20. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
  21. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
  22. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
  23. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
  24. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
  25. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
  26. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
  27. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
  28. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
  29. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
  30. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
  31. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
  32. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
  33. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
  34. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
  35. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
  36. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
  37. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
  38. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
  39. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
  40. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
  41. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
  42. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
  43. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
  44. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
  45. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
  46. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
  47. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
  48. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
  49. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
  50. package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
  51. package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
  52. package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
  53. package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
  54. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
  55. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
  56. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
  57. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
  58. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
  59. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
  60. package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
  61. package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
  62. package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
  63. package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
  64. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
  65. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
  66. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
  67. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
  68. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
  69. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
  70. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
  71. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
  72. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
  73. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
  74. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
  75. package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
  76. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
  77. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
  78. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
  79. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
  80. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
  81. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
  82. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
  83. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
  84. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
  85. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
  86. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
  87. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
  88. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
  89. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
  90. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
  91. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
  92. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
  93. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
  94. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
  95. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
  96. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
  97. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
  98. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
  99. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
  100. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
  101. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
  102. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
  103. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
  104. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
  105. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
  106. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
  107. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
  108. package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
  109. package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
  110. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
  111. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
  112. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
  113. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
  114. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
  115. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
  116. package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
  117. package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
  118. package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
  119. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
  120. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
  121. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
  122. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
  123. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
  124. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
  125. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
  126. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
  127. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
  128. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
  129. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
  130. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
  131. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
  132. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
  133. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
  134. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
  135. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
  136. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
  137. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
  138. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
  139. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
  140. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
  141. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
  142. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
  143. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
  144. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
  145. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
  146. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
  147. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
  148. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
  149. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
  150. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
  151. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
  152. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
  153. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
  154. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
  155. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
  156. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
  157. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
  158. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
  159. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
  160. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
  161. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
  162. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
  163. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
  164. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
  165. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
  166. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
  167. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
  168. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
  169. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
  170. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
  171. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
  172. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
  173. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
  174. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
  175. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
  176. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
  177. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
  178. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
  179. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
  180. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
  181. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
  182. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
  183. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
  184. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
  185. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
  186. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
  187. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
  188. package/assess/lsa/scripts/detect_stack.py +13 -5
  189. package/assess/lsa/scripts/find_injection.py +35 -2
  190. package/assess/lsa/scripts/java_routes.py +323 -0
  191. package/assess/lsa/scripts/laravel_routes.py +102 -0
  192. package/assess/lsa/scripts/lsa_common.py +72 -2
  193. package/assess/lsa/scripts/map_routes.py +40 -161
  194. package/assess/lsa/scripts/merge_findings.py +2 -0
  195. package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
  196. package/assess/lsa/tests/test_eval_run_6.py +104 -0
  197. package/assess/lsa/tests/test_java_legacy_realistic.py +453 -0
  198. package/assess/lsa/tests/test_laravel_routes.py +95 -0
  199. package/contracts/schemas/persona-suite.schema.json +38 -2
  200. package/examples/member-portal/backend-dotnet/Dockerfile +2 -1
  201. package/examples/member-portal/backend-spring/Dockerfile +2 -0
  202. package/examples/member-portal/docker-compose.yml +1 -1
  203. package/examples/member-portal/frontend/Dockerfile +3 -2
  204. package/examples/member-portal/frontend/package-lock.json +24 -656
  205. package/examples/member-portal/frontend/package.json +1 -1
  206. package/operate/ai/client.py +22 -9
  207. package/operate/ai/runner.py +24 -4
  208. package/operate/cli/__init__.py +1 -1
  209. package/operate/cli/commands/fix.py +4 -0
  210. package/operate/cli/commands/leak_check.py +75 -0
  211. package/operate/cli/commands/protect.py +32 -3
  212. package/operate/cli/commands/scan.py +8 -1
  213. package/operate/cli/commands/test.py +131 -15
  214. package/operate/cli/main.py +5 -3
  215. package/operate/cross_user_tester/persona_matrix.py +118 -25
  216. package/operate/cross_user_tester/runner.py +190 -7
  217. package/operate/cross_user_tester/session_config.py +180 -0
  218. package/operate/cross_user_tester/session_http.py +288 -0
  219. package/operate/devsecops/leak_check.py +314 -0
  220. package/operate/remediator/runner.py +18 -1
  221. package/operate/remediator/strategies.py +2 -2
  222. package/operate/simulate/scenarios.py +2 -2
  223. package/operate/tests/mock_legacy_session_app.py +160 -0
  224. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  225. package/operate/tests/test_ai_route_inventory.py +53 -0
  226. package/operate/tests/test_cross_user_session.py +565 -0
  227. package/operate/tests/test_docker_packaging.py +3 -3
  228. package/operate/tests/test_headless_ai.py +6 -0
  229. package/operate/tests/test_leak_check.py +250 -0
  230. package/operate/tests/test_legacy_session_edge.py +192 -0
  231. package/operate/tests/test_pilot_safeguards.py +245 -0
  232. package/operate/tests/test_remediator_java_legacy.py +330 -0
  233. package/package.json +2 -1
  234. package/remediate/authz/patcher.py +120 -11
  235. package/remediate/authz/tests/test_bola_patcher.py +4 -1
  236. package/remediate/edge/coraza/Caddyfile +1 -1
  237. package/remediate/edge/coraza/Dockerfile +9 -0
  238. package/remediate/edge/coraza/rules/coraza-crs-custom.conf +12 -0
  239. package/remediate/edge/coraza/virtual_patcher.py +24 -0
  240. package/remediate/edge/docker-compose.yml +7 -2
  241. package/remediate/edge/kong/kong-legacy-session.yaml +51 -0
  242. package/remediate/edge/mock-backend/Dockerfile +2 -0
  243. package/remediate/edge/tests/test_edge_security.py +21 -1
  244. package/remediate/resilience/terraform/backup_worm.tf +39 -1
  245. package/remediate/resilience/terraform/main.tf +15 -3
  246. package/remediate/resilience/terraform/variables.tf +11 -0
  247. package/remediate/resilience/tests/test_resilience.py +16 -0
@@ -0,0 +1,306 @@
1
+ {
2
+ "batch_id": "privilege-002",
3
+ "findings": [
4
+ {
5
+ "finding_id": "MASS-M-0008-1",
6
+ "category": "mass_assignment",
7
+ "subtype": "whole_object_binding",
8
+ "title": "User registration binds the entire request body to the User model without field restrictions",
9
+ "route_id": null,
10
+ "candidate_id": "M-0008",
11
+ "location": {
12
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
13
+ "start_line": 13
14
+ },
15
+ "evidence": [
16
+ {
17
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
18
+ "line": 13,
19
+ "code": "return User::create($request->all());",
20
+ "why": "Binds all request fields to the User model. Model definition shows $guarded = [], meaning no fields are protected."
21
+ },
22
+ {
23
+ "file": "php-laravel/app/Models/User.php",
24
+ "line": 8,
25
+ "code": "protected $guarded = [];",
26
+ "why": "Model allows writing to all fields, including sensitive ones like role or owner_id."
27
+ }
28
+ ],
29
+ "impact": "An attacker can set any field (e.g., role='admin', owner_id=1) during registration.",
30
+ "severity": "critical",
31
+ "confidence": "high",
32
+ "cwe": [
33
+ "CWE-915"
34
+ ],
35
+ "owasp": [
36
+ "API3:2023",
37
+ "A01:2021"
38
+ ],
39
+ "recommendation": "Define a whitelist of allowed fields (e.g., $fillable = ['name', 'email']) in the User model.",
40
+ "status": "unverified"
41
+ },
42
+ {
43
+ "finding_id": "MASS-M-0009-1",
44
+ "category": "mass_assignment",
45
+ "subtype": "privileged_field_writable",
46
+ "title": "Team creation allows writing to the owner_id field via request body",
47
+ "route_id": null,
48
+ "candidate_id": "M-0009",
49
+ "location": {
50
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
51
+ "start_line": 23
52
+ },
53
+ "evidence": [
54
+ {
55
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
56
+ "line": 23,
57
+ "code": "return Team::create($request->all());",
58
+ "why": "Binds all request fields to the Team model. Model definition explicitly lists 'owner_id' as fillable."
59
+ },
60
+ {
61
+ "file": "php-laravel/app/Models/Team.php",
62
+ "line": 8,
63
+ "code": "protected $fillable = ['name', 'owner_id'];",
64
+ "why": "The owner_id field is explicitly allowed to be written from the request."
65
+ }
66
+ ],
67
+ "impact": "An attacker can set the owner_id of a new team to an arbitrary user ID, hijacking ownership.",
68
+ "severity": "critical",
69
+ "confidence": "high",
70
+ "cwe": [
71
+ "CWE-915",
72
+ "CWE-269"
73
+ ],
74
+ "owasp": [
75
+ "API3:2023",
76
+ "A01:2021"
77
+ ],
78
+ "recommendation": "Remove 'owner_id' from the $fillable array in the Team model and set it server-side based on the authenticated user.",
79
+ "status": "unverified"
80
+ },
81
+ {
82
+ "finding_id": "MASS-M-0013-1",
83
+ "category": "mass_assignment",
84
+ "subtype": "whole_object_binding",
85
+ "title": "User creation via extract() binds all POST parameters to the database insert",
86
+ "route_id": null,
87
+ "candidate_id": "M-0013",
88
+ "location": {
89
+ "file": "php-plain/register.php",
90
+ "start_line": 4
91
+ },
92
+ "evidence": [
93
+ {
94
+ "file": "php-plain/register.php",
95
+ "line": 4,
96
+ "why": "Location taken from the Tier 1 inventory"
97
+ }
98
+ ],
99
+ "impact": "An attacker can set the 'role' field in the POST body to escalate privileges (e.g., role='admin').",
100
+ "severity": "critical",
101
+ "confidence": "high",
102
+ "cwe": [
103
+ "CWE-915"
104
+ ],
105
+ "owasp": [
106
+ "API3:2023",
107
+ "A01:2021"
108
+ ],
109
+ "recommendation": "Do not use extract() on user input. Explicitly map only required fields (email, name) to the statement parameters.",
110
+ "status": "unverified"
111
+ },
112
+ {
113
+ "finding_id": "MASS-M-0014-1",
114
+ "category": "mass_assignment",
115
+ "subtype": "whole_object_binding",
116
+ "title": "User creation via **kwargs binds all JSON fields to the User model",
117
+ "route_id": null,
118
+ "candidate_id": "M-0014",
119
+ "location": {
120
+ "file": "python-flask/profile.py",
121
+ "start_line": 10
122
+ },
123
+ "evidence": [
124
+ {
125
+ "file": "python-flask/profile.py",
126
+ "line": 10,
127
+ "why": "Location taken from the Tier 1 inventory"
128
+ }
129
+ ],
130
+ "impact": "An attacker can set any field (e.g., role='admin', is_verified=True) during user creation.",
131
+ "severity": "critical",
132
+ "confidence": "high",
133
+ "cwe": [
134
+ "CWE-915"
135
+ ],
136
+ "owasp": [
137
+ "API3:2023",
138
+ "A01:2021"
139
+ ],
140
+ "recommendation": "Explicitly pass only allowed fields to the User constructor or use a DTO with validation.",
141
+ "status": "unverified"
142
+ },
143
+ {
144
+ "finding_id": "MASS-M-0015-1",
145
+ "category": "mass_assignment",
146
+ "subtype": "whole_object_binding",
147
+ "title": "User update via loop binds all JSON fields to the User model",
148
+ "route_id": null,
149
+ "candidate_id": "M-0015",
150
+ "location": {
151
+ "file": "python-flask/profile.py",
152
+ "start_line": 27
153
+ },
154
+ "evidence": [
155
+ {
156
+ "file": "python-flask/profile.py",
157
+ "line": 27,
158
+ "why": "Location taken from the Tier 1 inventory"
159
+ }
160
+ ],
161
+ "impact": "An attacker can modify any attribute of an existing user (e.g., role='admin', owner_id=1).",
162
+ "severity": "critical",
163
+ "confidence": "high",
164
+ "cwe": [
165
+ "CWE-915"
166
+ ],
167
+ "owasp": [
168
+ "API3:2023",
169
+ "A01:2021"
170
+ ],
171
+ "recommendation": "Restrict the loop to a whitelist of allowed fields (e.g., name, email) before updating.",
172
+ "status": "unverified"
173
+ },
174
+ {
175
+ "finding_id": "MASS-M-0006-verdict",
176
+ "category": "mass_assignment",
177
+ "subtype": "whole_object_binding",
178
+ "title": "Mass assignment at node-express/routes/profile.js:8 (from auditor verdict)",
179
+ "candidate_id": "M-0006",
180
+ "location": {
181
+ "file": "node-express/routes/profile.js",
182
+ "start_line": 8
183
+ },
184
+ "evidence": [
185
+ {
186
+ "file": "node-express/routes/profile.js",
187
+ "line": 8,
188
+ "why": "The auditor judged this candidate 'needs_review' but wrote no finding"
189
+ }
190
+ ],
191
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
192
+ "severity": "medium",
193
+ "confidence": "low",
194
+ "cwe": [
195
+ "CWE-915"
196
+ ],
197
+ "recommendation": "Bind only an explicit allow-list of fields; never bind role, owner or balance fields.",
198
+ "status": "unverified"
199
+ },
200
+ {
201
+ "finding_id": "MASS-M-0007-verdict",
202
+ "category": "mass_assignment",
203
+ "subtype": "whole_object_binding",
204
+ "title": "Mass assignment at node-express/routes/profile.js:16 (from auditor verdict)",
205
+ "candidate_id": "M-0007",
206
+ "location": {
207
+ "file": "node-express/routes/profile.js",
208
+ "start_line": 16
209
+ },
210
+ "evidence": [
211
+ {
212
+ "file": "node-express/routes/profile.js",
213
+ "line": 16,
214
+ "why": "The auditor judged this candidate 'needs_review' but wrote no finding"
215
+ }
216
+ ],
217
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
218
+ "severity": "medium",
219
+ "confidence": "low",
220
+ "cwe": [
221
+ "CWE-915"
222
+ ],
223
+ "recommendation": "Bind only an explicit allow-list of fields; never bind role, owner or balance fields.",
224
+ "status": "unverified"
225
+ },
226
+ {
227
+ "finding_id": "MASS-M-0010-verdict",
228
+ "category": "mass_assignment",
229
+ "subtype": "whole_object_binding",
230
+ "title": "Mass assignment at php-laravel/app/Http/Controllers/AccountController.php:36 (from auditor verdict)",
231
+ "candidate_id": "M-0010",
232
+ "location": {
233
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
234
+ "start_line": 36
235
+ },
236
+ "evidence": [
237
+ {
238
+ "file": "php-laravel/app/Http/Controllers/AccountController.php",
239
+ "line": 36,
240
+ "why": "The auditor judged this candidate 'needs_review' but wrote no finding"
241
+ }
242
+ ],
243
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
244
+ "severity": "medium",
245
+ "confidence": "low",
246
+ "cwe": [
247
+ "CWE-915"
248
+ ],
249
+ "recommendation": "Bind only an explicit allow-list of fields; never bind role, owner or balance fields.",
250
+ "status": "unverified"
251
+ }
252
+ ],
253
+ "privilege_route_verdicts": [],
254
+ "candidate_verdicts": [
255
+ {
256
+ "candidate_id": "M-0006",
257
+ "verdict": "needs_review",
258
+ "reason": "Model definition not found; cannot verify if sensitive fields like role or owner are writable."
259
+ },
260
+ {
261
+ "candidate_id": "M-0007",
262
+ "verdict": "needs_review",
263
+ "reason": "Model definition not found; cannot verify if sensitive fields like role or owner are writable."
264
+ },
265
+ {
266
+ "candidate_id": "M-0008",
267
+ "verdict": "vulnerable",
268
+ "finding_ids": [
269
+ "MASS-M-0008-1"
270
+ ]
271
+ },
272
+ {
273
+ "candidate_id": "M-0009",
274
+ "verdict": "vulnerable",
275
+ "finding_ids": [
276
+ "MASS-M-0009-1"
277
+ ]
278
+ },
279
+ {
280
+ "candidate_id": "M-0010",
281
+ "verdict": "needs_review",
282
+ "reason": "Model definition not found; cannot verify if sensitive fields like role or owner are writable."
283
+ },
284
+ {
285
+ "candidate_id": "M-0013",
286
+ "verdict": "vulnerable",
287
+ "finding_ids": [
288
+ "MASS-M-0013-1"
289
+ ]
290
+ },
291
+ {
292
+ "candidate_id": "M-0014",
293
+ "verdict": "vulnerable",
294
+ "finding_ids": [
295
+ "MASS-M-0014-1"
296
+ ]
297
+ },
298
+ {
299
+ "candidate_id": "M-0015",
300
+ "verdict": "vulnerable",
301
+ "finding_ids": [
302
+ "MASS-M-0015-1"
303
+ ]
304
+ }
305
+ ]
306
+ }
@@ -0,0 +1,137 @@
1
+ {
2
+ "batch_id": "verified-1",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BOLA-R-0002-1",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "high",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "classic-asp/shop/member.asp lines 6-7",
12
+ "inc/auth.asp logic"
13
+ ],
14
+ "control_found": null,
15
+ "notes": "The UPDATE query uses `member_id` directly from `Request.Form`. The included `auth.asp` only checks if a session exists (`Session(\"UserID\") = \"\"`), it does not verify that the current user owns the target record. No ownership check is present in the SQL construction.",
16
+ "consensus": {
17
+ "score": 0.95,
18
+ "agreement_level": "unanimous",
19
+ "voted_models": [
20
+ "gemini-2.0-pro",
21
+ "claude-3-7"
22
+ ],
23
+ "rationale": "Direct ID injection into UPDATE without ownership verification."
24
+ },
25
+ "attack_vector": {
26
+ "method": "POST",
27
+ "path": "/classic-asp/shop/member.asp?mode=edit",
28
+ "target_param": "member_id"
29
+ }
30
+ },
31
+ {
32
+ "finding_id": "BOLA-R-0003-1",
33
+ "verdict": "confirmed",
34
+ "reason_code": "traced",
35
+ "severity": "high",
36
+ "confidence": "high",
37
+ "checked": [
38
+ "classic-asp/shop/member.asp line 10",
39
+ "inc/auth.asp logic"
40
+ ],
41
+ "control_found": null,
42
+ "notes": "The DELETE query uses `member_id` directly from `Request.QueryString`. The included `auth.asp` only checks if a session exists. No ownership check is present in the SQL construction.",
43
+ "consensus": {
44
+ "score": 0.95,
45
+ "agreement_level": "unanimous",
46
+ "voted_models": [
47
+ "gemini-2.0-pro",
48
+ "claude-3-7"
49
+ ],
50
+ "rationale": "Direct ID injection into DELETE without ownership verification."
51
+ },
52
+ "attack_vector": {
53
+ "method": "GET",
54
+ "path": "/classic-asp/shop/member.asp?mode=delete&member_id=<id>",
55
+ "target_param": "member_id"
56
+ }
57
+ },
58
+ {
59
+ "finding_id": "BOLA-R-0005-1",
60
+ "verdict": "confirmed",
61
+ "reason_code": "traced",
62
+ "severity": "high",
63
+ "confidence": "high",
64
+ "checked": [
65
+ "OrderService.cfc lines 3-6"
66
+ ],
67
+ "control_found": null,
68
+ "notes": "The `getOrder` function accepts `orderId` as a string argument and uses it directly in the SQL query (`WHERE id = #arguments.orderId#`). There is no logic to retrieve the current user's ID or filter by ownership. The `access=\"remote\"` attribute confirms this is exposed.",
69
+ "consensus": {
70
+ "score": 0.95,
71
+ "agreement_level": "unanimous",
72
+ "voted_models": [
73
+ "gemini-2.0-pro",
74
+ "claude-3-7"
75
+ ],
76
+ "rationale": "Direct ID injection into SELECT without ownership verification."
77
+ },
78
+ "attack_vector": {
79
+ "method": "GET",
80
+ "path": "/coldfusion/app/OrderService.cfc?method=getOrder&orderId=<id>",
81
+ "target_param": "orderId"
82
+ }
83
+ },
84
+ {
85
+ "finding_id": "BOLA-R-0007-1",
86
+ "verdict": "confirmed",
87
+ "reason_code": "traced",
88
+ "severity": "high",
89
+ "confidence": "high",
90
+ "checked": [
91
+ "AdminController.cs lines 12-15"
92
+ ],
93
+ "control_found": null,
94
+ "notes": "The `DeleteUser` method has `[Authorize]` (ensuring the caller is authenticated) but lacks any role restriction like `[Authorize(Roles = \"Admin\")]`. It takes an integer `id` and deletes the user found by that ID without checking if the current user owns it or has admin privileges. A standard authenticated user could delete another user.",
95
+ "consensus": {
96
+ "score": 0.95,
97
+ "agreement_level": "unanimous",
98
+ "voted_models": [
99
+ "gemini-2.0-pro",
100
+ "claude-3-7"
101
+ ],
102
+ "rationale": "Authenticated but unprivileged user can delete any record via ID injection."
103
+ },
104
+ "attack_vector": {
105
+ "method": "POST",
106
+ "path": "/Admin/DeleteUser?id=<id>",
107
+ "target_param": "id"
108
+ }
109
+ },
110
+ {
111
+ "finding_id": "BOLA-R-0008-1",
112
+ "verdict": "confirmed",
113
+ "reason_code": "traced",
114
+ "severity": "high",
115
+ "confidence": "high",
116
+ "checked": [
117
+ "AdminController.cs lines 21-25"
118
+ ],
119
+ "control_found": null,
120
+ "notes": "The `ResetPassword` method has `[Authorize(Roles = \"Admin\")]`. While this restricts access to admins, it does not prevent an Admin from resetting *another* Admin's (or any other user's) password. The finding correctly identifies that ownership verification is missing. An attacker with Admin privileges can reset any user's password.",
121
+ "consensus": {
122
+ "score": 0.95,
123
+ "agreement_level": "unanimous",
124
+ "voted_models": [
125
+ "gemini-2.0-pro",
126
+ "claude-3-7"
127
+ ],
128
+ "rationale": "Role-based access control (RBAC) is present but insufficient for ownership protection; ID injection allows privilege escalation within the role."
129
+ },
130
+ "attack_vector": {
131
+ "method": "POST",
132
+ "path": "/Admin/ResetPassword?id=<id>",
133
+ "target_param": "id"
134
+ }
135
+ }
136
+ ]
137
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "batch_id": "verified-10",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BOLA-R-0029-1",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "high",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "ProfileServlet.java lines 10-16",
12
+ "BeanUtils.populate usage"
13
+ ],
14
+ "control_found": null,
15
+ "notes": "The code uses BeanUtils.populate which blindly maps all request parameters to the object fields. There is no visible ownership check (e.g., verifying `account.id` against session user) before any persistence logic in the provided snippet. The finding is valid.",
16
+ "consensus": {
17
+ "score": 0.95,
18
+ "agreement_level": "unanimous",
19
+ "voted_models": [
20
+ "gemini-2.0-pro",
21
+ "claude-3-7"
22
+ ],
23
+ "rationale": "Direct population of object from request without ID verification."
24
+ },
25
+ "attack_vector": {
26
+ "method": "POST",
27
+ "path": "/profile/update (inferred)",
28
+ "target_param": "id"
29
+ }
30
+ },
31
+ {
32
+ "finding_id": "BOLA-R-0039-1",
33
+ "verdict": "rejected",
34
+ "reason_code": "control_found",
35
+ "severity": null,
36
+ "confidence": "high",
37
+ "checked": [
38
+ "node-express/routes/profile.js line 8"
39
+ ],
40
+ "control_found": {
41
+ "file": "node-express/routes/profile.js",
42
+ "line": 8,
43
+ "code": "User.findByIdAndUpdate(req.user._id, req.body, ...)"
44
+ },
45
+ "notes": "The query explicitly uses `req.user._id` (server-side identity) as the lookup key. Even if an attacker sends a different ID in the body, it is ignored for the lookup. This prevents unauthorized access to other users' profiles."
46
+ },
47
+ {
48
+ "finding_id": "BOLA-R-0040-1",
49
+ "verdict": "rejected",
50
+ "reason_code": "control_found",
51
+ "severity": null,
52
+ "confidence": "high",
53
+ "checked": [
54
+ "node-express/routes/profile.js line 12"
55
+ ],
56
+ "control_found": {
57
+ "file": "node-express/routes/profile.js",
58
+ "line": 12,
59
+ "code": "User.findByIdAndUpdate(req.user._id, { name: req.body.name }, ...)"
60
+ },
61
+ "notes": "The query explicitly uses `req.user._id` as the lookup key. The ID from the request body is not used for resource identification, preventing IDOR."
62
+ },
63
+ {
64
+ "finding_id": "BOLA-R-0041-1",
65
+ "verdict": "confirmed",
66
+ "reason_code": "traced",
67
+ "severity": "high",
68
+ "confidence": "high",
69
+ "checked": [
70
+ "node-express/routes/profile.js lines 15-18"
71
+ ],
72
+ "control_found": null,
73
+ "notes": "The `/signup` route handler does not include the `ensureLoggedIn` middleware. While this is primarily an authentication bypass (CWE-306) rather than a BOLA, it confirms the finding that the endpoint accepts requests without verifying authentication status. The finding title mentions 'no_authentication', which aligns with the code.",
74
+ "consensus": {
75
+ "score": 0.95,
76
+ "agreement_level": "unanimous",
77
+ "voted_models": [
78
+ "gemini-2.0-pro",
79
+ "claude-3-7"
80
+ ],
81
+ "rationale": "Missing authentication middleware on signup endpoint."
82
+ },
83
+ "attack_vector": {
84
+ "method": "POST",
85
+ "path": "/signup",
86
+ "target_param": null
87
+ }
88
+ },
89
+ {
90
+ "finding_id": "BOLA-R-0042-1",
91
+ "verdict": "rejected",
92
+ "reason_code": "control_found",
93
+ "severity": null,
94
+ "confidence": "high",
95
+ "checked": [
96
+ "node-express/routes/profile.js line 21"
97
+ ],
98
+ "control_found": {
99
+ "file": "node-express/routes/profile.js",
100
+ "line": 21,
101
+ "code": "var prefs = Object.assign({}, req.user.prefs, { theme: req.body.theme });"
102
+ },
103
+ "notes": "The code constructs the response object using `req.user.prefs` (server-side identity). It does not use any ID from the request to fetch or modify data. The finding claims 'IDOR if ID is passed', but no ID parameter is used in the logic, making the claim false."
104
+ }
105
+ ]
106
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "batch_id": "verified-11",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BOLA-R-0063-1",
6
+ "verdict": "rejected",
7
+ "reason_code": "control_found",
8
+ "confidence": "high",
9
+ "checked": [
10
+ "php-plain/profile.php lines 5-11",
11
+ "php-plain/inc/auth.php"
12
+ ],
13
+ "control_found": {
14
+ "file": "php-plain/profile.php",
15
+ "line": 5,
16
+ "code": "$user = load_user($_SESSION['uid']);"
17
+ },
18
+ "notes": "The code explicitly loads the user object using `$_SESSION['uid']` (server-side identity) before modifying it. The subsequent loop modifies properties on this specific `$user` object instance. Since the object is fetched by the authenticated user's ID, the modification is scoped to that user. This is a safe pattern for self-modification.",
19
+ "suggested_subtype": null,
20
+ "suggested_cwe": null
21
+ },
22
+ {
23
+ "finding_id": "BOLA-R-0068-1",
24
+ "verdict": "rejected",
25
+ "reason_code": "control_found",
26
+ "confidence": "high",
27
+ "checked": [
28
+ "php-plain/admin/settings.php lines 5-10",
29
+ "php-plain/inc/auth.php"
30
+ ],
31
+ "control_found": {
32
+ "file": "php-plain/admin/settings.php",
33
+ "line": 5,
34
+ "code": "if ($_SESSION['role'] !== 'admin') { ... exit; }"
35
+ },
36
+ "notes": "The code explicitly checks if the session role is 'admin' and exits if it is not. This prevents non-admin users from accessing or modifying global settings. The control is visible in the provided context.",
37
+ "suggested_subtype": null,
38
+ "suggested_cwe": null
39
+ },
40
+ {
41
+ "finding_id": "BOLA-R-0060-1",
42
+ "verdict": "confirmed",
43
+ "reason_code": "traced",
44
+ "confidence": "high",
45
+ "checked": [
46
+ "php-plain/mongo_find.php lines 5-6",
47
+ "php-plain/inc/auth.php"
48
+ ],
49
+ "control_found": null,
50
+ "notes": "The code uses `$_GET['login']` and `$_GET['pass']` directly in the MongoDB query without verifying if the currently authenticated user owns the returned document. The auth check in `inc/auth.php` only ensures a user is logged in, not that they own the data being queried. This allows any authenticated user to look up another user's credentials.",
51
+ "suggested_subtype": null,
52
+ "suggested_cwe": null
53
+ },
54
+ {
55
+ "finding_id": "INJ-I-0001",
56
+ "verdict": "confirmed",
57
+ "reason_code": "traced",
58
+ "confidence": "high",
59
+ "checked": [
60
+ "classic-asp/shop/member.asp lines 6-8"
61
+ ],
62
+ "control_found": null,
63
+ "notes": "The code constructs an SQL query by concatenating `Request.Form(\"name\")` directly into the string. There is no parameter binding, integer casting, or allow-list validation visible in the provided context. This is a classic SQL Injection vector.",
64
+ "suggested_subtype": null,
65
+ "suggested_cwe": null
66
+ },
67
+ {
68
+ "finding_id": "INJ-I-0002",
69
+ "verdict": "confirmed",
70
+ "reason_code": "traced",
71
+ "confidence": "high",
72
+ "checked": [
73
+ "classic-asp/shop/member.asp lines 7-8"
74
+ ],
75
+ "control_found": null,
76
+ "notes": "The code constructs an SQL query by concatenating `Request.Form(\"member_id\")` directly into the string. There is no parameter binding or integer casting visible in the provided context. This is a classic SQL Injection vector.",
77
+ "suggested_subtype": null,
78
+ "suggested_cwe": null
79
+ }
80
+ ]
81
+ }