@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,2112 @@
1
+ # Security Audit Report — repo
2
+
3
+ > **Classification: CONFIDENTIAL.** AI-assisted static review. All findings require human review (record decisions in `review-log.md`, created from `templates/review-log.md`) before they are shared outside the team.
4
+
5
+ | Item | Value |
6
+ |---|---|
7
+ | Date | 2026-11-11 |
8
+ | Kit version | 0.3.1 |
9
+ | Scope | BOLA/IDOR; SQL/HQL/NoSQL queries built from input; BFLA (missing role checks); mass assignment |
10
+ | Stacks | php, php-codeigniter, php-laravel, java-servlet, java-jsp, java-struts1, java-spring-mvc, java-mybatis, java-hibernate, dotnet-webforms, dotnet-handlers, dotnet-mvc, classic-asp, perl-cgi, coldfusion, node-express, python-flask, sql-procedures |
11
+ | Endpoints inventoried | 74 (candidates: 74) |
12
+ | Endpoints audited for BOLA | 74 |
13
+ | Injection candidates reviewed | 38 |
14
+ | Privileged routes audited for BFLA | 0 |
15
+ | Mass assignment candidates reviewed | 15 |
16
+
17
+ ## 1. Executive summary
18
+
19
+ <!-- LLM: reporter agent writes max 8 bullets here -->
20
+
21
+ ## 2. Findings overview
22
+
23
+ | Severity | critical | high | medium | low | info |
24
+ |---|---|---|---|---|---|
25
+ | Count | 51 | 41 | 15 | 0 | 0 |
26
+
27
+ | Category | Count |
28
+ |---|---|
29
+ | bola | 45 |
30
+ | sql_injection | 32 |
31
+ | nosql_injection | 4 |
32
+ | bfla | 12 |
33
+ | mass_assignment | 14 |
34
+
35
+ Status: unverified=0, confirmed=41, likely=66, rejected=2, needs_review=0
36
+
37
+ ## Trend and time to fix
38
+
39
+ | Date | Open | New | Regressed | Fixed | Suppressed |
40
+ |---|---|---|---|---|---|
41
+ | 2026-11-11 | 107 | 107 | 0 | 0 | 0 |
42
+
43
+ No findings fixed yet.
44
+
45
+ ## Outlook & Debt Forecast
46
+
47
+ > **Note:** Reliable forecasting requires at least 6 scans spanning at least 28 days. Requires at least 6 snapshots over at least 28 days (current: 1 snapshots over 0 days).
48
+
49
+ ## 3. Findings
50
+
51
+ | ID | Sev | Conf | Status | Category | Endpoint | Location | Title |
52
+ |---|---|---|---|---|---|---|---|
53
+ | BFLA-R-0003-1 | critical | high | confirmed | bfla | | `classic-asp/shop/member.asp:10` | Unrestricted member deletion in classic‑asp shop |
54
+ | BFLA-R-0007-1 | critical | high | confirmed | bfla | | `dotnet-legacy/Web/Controllers/AdminController.cs:12` | Unrestricted user deletion in ASP.NET MVC Admin controller |
55
+ | BFLA-R-0009-1 | critical | high | confirmed | bfla | | `dotnet-legacy/Web/Controllers/AdminController.cs:30` | Export endpoint controlled by request parameter in ASP.NET MVC |
56
+ | BFLA-R-0023-1 | critical | medium | likely | bfla | | `java-legacy/src/com/acme/web/AdminUserController.java:13` | Unrestricted user deletion in Spring MVC Admin controller |
57
+ | BFLA-R-0030-1 | critical | medium | likely | bfla | | `node-express/routes/admin.js:8` | Unrestricted user deletion in Express route |
58
+ | BFLA-R-0032-1 | critical | medium | likely | bfla | | `node-express/routes/admin.js:16` | Export endpoint controlled by query param in Express |
59
+ | BFLA-R-0057-1 | critical | medium | likely | bfla | | `php-plain/admin.php:6` | Unrestricted user view in php‑plain admin.php |
60
+ | BFLA-R-0058-1 | critical | medium | likely | bfla | | `php-plain/admin.php:10` | Unrestricted user deletion in php‑plain admin.php |
61
+ | BFLA-R-0059-1 | critical | high | confirmed | bfla | | `php-plain/manage_users.php:6` | Unrestricted user deletion in php‑plain manage_users.php |
62
+ | BFLA-R-0063-1 | critical | high | confirmed | bfla | | `php-plain/profile.php:6` | Unrestricted role change in php‑plain profile.php |
63
+ | BFLA-R-0066-1 | critical | high | confirmed | bfla | | `php-plain/admin/delete_user.php:5` | Unrestricted user deletion in php‑plain delete_user.php |
64
+ | BFLA-R-0067-1 | critical | high | confirmed | bfla | | `php-plain/admin/promote.php:5` | User promotion controlled by request parameter in php‑plain |
65
+ | INJ-I-0001 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:6` | SQL Injection in classic-asp/shop/member.asp:6 |
66
+ | INJ-I-0002 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:7` | SQL Injection in classic-asp/shop/member.asp:7 |
67
+ | INJ-I-0003 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:10` | SQL Injection in classic-asp/shop/member.asp:10 |
68
+ | INJ-I-0004 | critical | medium | likely | sql_injection | | `classic-asp/shop/order.asp:6` | SQL Injection in classic-asp/shop/order.asp:6 |
69
+ | INJ-I-0006 | critical | high | confirmed | sql_injection | | `coldfusion/app/OrderService.cfc:5` | SQL Injection in coldfusion/app/OrderService.cfc:5 |
70
+ | INJ-I-0007 | critical | high | confirmed | sql_injection | | `coldfusion/app/order.cfm:3` | SQL Injection in coldfusion/app/order.cfm:3 |
71
+ | INJ-I-0008 | critical | medium | likely | sql_injection | | `dotnet-legacy/Web/Controllers/InvoiceController.cs:28` | SQL Injection in dotnet-legacy/Web/Controllers/InvoiceController.cs:28 |
72
+ | INJ-I-0009 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` | SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7 |
73
+ | INJ-I-0010 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8` | SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8 |
74
+ | INJ-I-0011 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13 |
75
+ | INJ-I-0012 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19 |
76
+ | INJ-I-0013 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20 |
77
+ | INJ-I-0014 | critical | high | confirmed | sql_injection | | `java-legacy/WebContent/order/detail.jsp:5` | SQL Injection in java-legacy/WebContent/order/detail.jsp:5 |
78
+ | INJ-I-0015 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/mapper/OrderMapper.xml:9` | SQL Injection in java-legacy/src/com/acme/mapper/OrderMapper.xml:9 |
79
+ | INJ-I-0016 | critical | high | confirmed | sql_injection | | `java-legacy/src/com/acme/struts/EditUserAction.java:13` | SQL Injection in java-legacy/src/com/acme/struts/EditUserAction.java:13 |
80
+ | INJ-I-0017 | critical | high | confirmed | sql_injection | | `java-legacy/src/com/acme/web/InvoiceController.java:29` | SQL Injection in java-legacy/src/com/acme/web/InvoiceController.java:29 |
81
+ | INJ-I-0018 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/web/OrderServlet.java:15` | SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:15 |
82
+ | INJ-I-0019 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/web/OrderServlet.java:17` | SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:17 |
83
+ | INJ-I-0020 | critical | high | confirmed | sql_injection | | `node-express/routes/orders.js:17` | SQL Injection in node-express/routes/orders.js:17 |
84
+ | INJ-I-0021 | critical | high | confirmed | sql_injection | | `node-express/routes/orders.js:29` | SQL Injection in node-express/routes/orders.js:29 |
85
+ | INJ-I-0022 | critical | high | confirmed | nosql_injection | | `node-express/routes/orders.js:21` | NoSQL Injection in node-express/routes/orders.js:21 |
86
+ | INJ-I-0023 | critical | high | confirmed | nosql_injection | | `node-express/routes/orders.js:25` | NoSQL Injection in node-express/routes/orders.js:25 |
87
+ | INJ-I-0024 | critical | high | confirmed | sql_injection | | `perl-cgi/cgi-bin/order.cgi:13` | SQL Injection in perl-cgi/cgi-bin/order.cgi:13 |
88
+ | INJ-I-0025 | critical | high | confirmed | sql_injection | | `perl-cgi/cgi-bin/order.cgi:19` | SQL Injection in perl-cgi/cgi-bin/order.cgi:19 |
89
+ | INJ-I-0026 | critical | medium | likely | sql_injection | | `php-codeigniter/application/controllers/Invoice.php:10` | SQL Injection in php-codeigniter/application/controllers/Invoice.php:10 |
90
+ | INJ-I-0027 | critical | high | confirmed | sql_injection | | `php-plain/admin.php:8` | SQL Injection in php-plain/admin.php:12 |
91
+ | INJ-I-0028 | critical | high | confirmed | sql_injection | | `php-plain/admin.php:12` | SQL Injection in php-plain/admin.php:12 |
92
+ | INJ-I-0029 | critical | high | confirmed | nosql_injection | | `php-plain/mongo_find.php:5` | NoSQL Injection in php-plain/mongo_find.php:6 |
93
+ | INJ-I-0030 | critical | high | confirmed | nosql_injection | | `php-plain/mongo_find.php:6` | NoSQL Injection in php-plain/mongo_find.php:6 |
94
+ | INJ-I-0031 | critical | high | confirmed | sql_injection | | `php-plain/order_detail.php:6` | SQL Injection in php-plain/order_detail.php:6 |
95
+ | INJ-I-0032 | critical | high | confirmed | sql_injection | | `php-plain/search.php:8` | SQL Injection in php-plain/search.php:8 |
96
+ | INJ-I-0033 | critical | high | confirmed | sql_injection | | `php-plain/search.php:9` | SQL Injection in php-plain/search.php:9 |
97
+ | INJ-I-0034 | critical | high | confirmed | sql_injection | | `php-plain/search.php:14` | SQL Injection in php-plain/search.php:14 |
98
+ | INJ-I-0036 | critical | high | confirmed | sql_injection | | `python-flask/app.py:29` | SQL Injection in python-flask/app.py:29 |
99
+ | INJ-I-0037 | critical | medium | likely | sql_injection | | `sql-procs/sp_search_orders.sql:5` | SQL Injection in sql-procs/sp_search_orders.sql:5 |
100
+ | INJ-I-0038 | critical | medium | likely | sql_injection | | `sql-procs/sp_search_orders.sql:6` | SQL Injection in sql-procs/sp_search_orders.sql:6 |
101
+ | MASS-M-0003-1 | critical | high | confirmed | mass_assignment | | `java-legacy/src/com/acme/web/AccountController.java:14` | Unrestricted binding of Account object in Spring MVC |
102
+ | MASS-M-0004-1 | critical | medium | likely | mass_assignment | | `java-legacy/src/com/acme/web/AccountController.java:27` | Unrestricted binding of Account object in Spring MVC |
103
+ | MASS-M-0005-1 | critical | medium | likely | mass_assignment | | `java-legacy/src/com/acme/web/ProfileServlet.java:12` | Unrestricted binding of Account object via BeanUtils in Java servlet |
104
+ | BOLA-R-0001 | high | medium | likely | bola | ANY /user/edit.do | `java-legacy/src/com/acme/struts/EditUserAction.java:10` | BOLA in POST /user/edit.do: missing owner verification |
105
+ | BOLA-R-0002 | high | medium | likely | bola | ANY /classic-asp/shop/member.asp?mode=edit | `classic-asp/shop/member.asp:6` | BOLA in GET /classic-asp/shop/member.asp?mode=edit: missing owner verification |
106
+ | BOLA-R-0003 | high | medium | likely | bola | ANY /classic-asp/shop/member.asp?mode=delete | `classic-asp/shop/member.asp:10` | BOLA in GET /classic-asp/shop/member.asp?mode=delete: missing owner verification |
107
+ | BOLA-R-0004 | high | medium | likely | bola | ANY /classic-asp/shop/order.asp | `classic-asp/shop/order.asp:5` | BOLA in GET /classic-asp/shop/order.asp: missing owner verification |
108
+ | BOLA-R-0005 | high | medium | likely | bola | ANY /coldfusion/app/OrderService.cfc?method=getOrder | `coldfusion/app/OrderService.cfc:4` | BOLA in GET /coldfusion/app/OrderService.cfc?method=getOrder: missing owner verification |
109
+ | BOLA-R-0006 | high | medium | likely | bola | ANY /coldfusion/app/order.cfm | `coldfusion/app/order.cfm:2` | BOLA in GET /coldfusion/app/order.cfm: missing owner verification |
110
+ | BOLA-R-0007 | high | medium | likely | bola | POST /Admin/DeleteUser | `dotnet-legacy/Web/Controllers/AdminController.cs:12` | BOLA in POST /Admin/DeleteUser: missing owner verification |
111
+ | BOLA-R-0009 | high | medium | likely | bola | POST /Admin/Export | `dotnet-legacy/Web/Controllers/AdminController.cs:32` | BOLA in GET /Admin/Export: missing owner verification |
112
+ | BOLA-R-0010 | high | medium | likely | bola | POST /Customer/Edit | `dotnet-legacy/Web/Controllers/CustomerController.cs:12` | BOLA in POST /Customer/Edit: missing owner verification |
113
+ | BOLA-R-0011 | high | medium | likely | bola | POST /Customer/EditName | `dotnet-legacy/Web/Controllers/CustomerController.cs:20` | BOLA in POST /Customer/EditName: missing owner verification |
114
+ | BOLA-R-0012 | high | medium | likely | bola | POST /Customer/Refresh | `dotnet-legacy/Web/Controllers/CustomerController.cs:27` | BOLA in POST /Customer/Refresh: missing owner verification |
115
+ | BOLA-R-0013 | high | medium | likely | bola | ANY /Invoice/Details | `dotnet-legacy/Web/Controllers/InvoiceController.cs:11` | BOLA in GET /Invoice/Details: missing owner verification |
116
+ | BOLA-R-0015 | high | medium | likely | bola | POST /Invoice/Search | `dotnet-legacy/Web/Controllers/InvoiceController.cs:26` | BOLA in POST /Invoice/Search: missing owner verification |
117
+ | BOLA-R-0016 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Handlers/GetFile.ashx | `dotnet-legacy/Web/Handlers/GetFile.ashx:8` | BOLA in ANY /dotnet-legacy/Web/Handlers/GetFile.ashx: missing owner verification |
118
+ | BOLA-R-0017 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Orders/EditOrder.aspx | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` | BOLA in POST /dotnet-legacy/Web/Orders/EditOrder.aspx: missing owner verification |
119
+ | BOLA-R-0018 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Orders/OrderDetail.aspx | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10` | BOLA in GET /dotnet-legacy/Web/Orders/OrderDetail.aspx: missing owner verification |
120
+ | BOLA-R-0019 | high | medium | likely | bola | ANY /java-legacy/WebContent/order/detail.jsp | `java-legacy/WebContent/order/detail.jsp:3` | BOLA in GET /java-legacy/WebContent/order/detail.jsp: missing owner verification |
121
+ | BOLA-R-0020 | high | medium | likely | bola | POST /account/save | `java-legacy/src/com/acme/web/AccountController.java:13` | BOLA in POST /account/save: missing owner verification |
122
+ | BOLA-R-0021 | high | medium | likely | bola | POST /account/rename | `java-legacy/src/com/acme/web/AccountController.java:19` | BOLA in POST /account/rename: missing owner verification |
123
+ | BOLA-R-0022 | high | medium | likely | bola | PUT /account/api | `java-legacy/src/com/acme/web/AccountController.java:25` | BOLA in PUT /account/api: missing owner verification |
124
+ | BOLA-R-0023 | high | medium | likely | bola | POST /admin/users/{id}/delete | `java-legacy/src/com/acme/web/AdminUserController.java:13` | BOLA in POST /admin/users/{id}/delete: missing owner verification |
125
+ | BOLA-R-0025 | high | medium | likely | bola | GET /invoices/{id} | `java-legacy/src/com/acme/web/InvoiceController.java:15` | BOLA in GET /invoices/{id}: missing owner verification |
126
+ | BOLA-R-0027 | high | medium | likely | bola | GET /invoices/search | `java-legacy/src/com/acme/web/InvoiceController.java:27` | BOLA in GET /invoices/search: missing owner verification |
127
+ | BOLA-R-0028 | high | medium | likely | bola | GET /order/view | `java-legacy/src/com/acme/web/OrderServlet.java:8` | BOLA in GET /order/view: missing owner verification |
128
+ | BOLA-R-0029 | high | medium | likely | bola | POST <see web.xml servlet-mapping> | `java-legacy/src/com/acme/web/ProfileServlet.java:9` | BOLA in POST /ProfileServlet: missing owner verification |
129
+ | BOLA-R-0030 | high | medium | likely | bola | POST /admin/users/:id/delete | `node-express/routes/admin.js:8` | BOLA in POST /admin/users/:id/delete: missing owner verification |
130
+ | BOLA-R-0033 | high | medium | likely | bola | GET /orders/:id | `node-express/routes/orders.js:8` | BOLA in GET /orders/:id: missing owner verification |
131
+ | BOLA-R-0043 | high | medium | likely | bola | ANY /perl-cgi/cgi-bin/order.cgi | `perl-cgi/cgi-bin/order.cgi:13` | BOLA in ANY /perl-cgi/cgi-bin/order.cgi: missing owner verification |
132
+ | BOLA-R-0044 | high | medium | likely | bola | ANY /invoice/view/{id} | `php-codeigniter/application/controllers/Invoice.php:10` | BOLA in ANY /invoice/view/{id}: missing owner verification |
133
+ | BOLA-R-0046 | high | medium | likely | bola | ANY /invoice/update | `php-codeigniter/application/controllers/Invoice.php:23` | BOLA in ANY /invoice/update: missing owner verification |
134
+ | BOLA-R-0057-1 | high | medium | likely | bola | GET /account/rename | `php-plain/admin.php:7` | BOLA in GET /account/rename: missing owner verification |
135
+ | BOLA-R-0057-2 | high | medium | likely | bola | POST /account/rename | `php-plain/admin.php:6` | BOLA in POST /account/rename: missing owner verification |
136
+ | BOLA-R-0058-1 | high | medium | likely | bola | POST /account/rename | `php-plain/admin.php:11` | BOLA in POST /account/rename: missing owner verification |
137
+ | BOLA-R-0059-1 | high | high | confirmed | bola | POST /php-plain/manage_users.php | `php-plain/manage_users.php:5` | BOLA in POST /php-plain/manage_users.php: missing owner verification |
138
+ | BOLA-R-0061-1 | high | high | confirmed | bola | GET /php-plain/order_detail.php | `php-plain/order_detail.php:5` | BOLA in GET /php-plain/order_detail.php: missing owner verification |
139
+ | BOLA-R-0066-1 | high | medium | likely | bola | POST /php-plain/admin/delete_user.php | `php-plain/admin/delete_user.php:5` | BOLA in POST /php-plain/admin/delete_user.php: missing owner verification |
140
+ | BOLA-R-0067-1 | high | medium | likely | bola | POST /php-plain/admin/promote.php | `php-plain/admin/promote.php:5` | BOLA in POST /php-plain/admin/promote.php: missing owner verification |
141
+ | BOLA-R-0069-1 | high | high | confirmed | bola | GET /orders/<int:order_id> | `python-flask/app.py:12` | BOLA in GET /orders/<int:order_id>: missing owner verification |
142
+ | BOLA-R-0073 | high | high | confirmed | bola | POST /users/<int:uid>/name | `python-flask/profile.py:16` | BOLA in POST /users/<int:uid>/name: missing owner verification |
143
+ | BOLA-R-0074 | high | high | confirmed | bola | PATCH /users/<int:uid> | `python-flask/profile.py:24` | BOLA in PATCH /users/<int:uid>: missing owner verification |
144
+ | MASS-M-0009-1 | high | high | confirmed | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:23` | Team owner_id is writable via mass assignment |
145
+ | BOLA-R-0052-verdict | medium | medium | likely | bola | POST /register | `php-laravel/routes/web.php:6` | Missing ownership check at php-laravel/routes/web.php:6 (from auditor verdict) |
146
+ | BOLA-R-0053-verdict | medium | medium | likely | bola | POST /posts | `php-laravel/routes/web.php:7` | Missing ownership check at php-laravel/routes/web.php:7 (from auditor verdict) |
147
+ | BOLA-R-0054-verdict | medium | medium | likely | bola | POST /teams | `php-laravel/routes/web.php:8` | Missing ownership check at php-laravel/routes/web.php:8 (from auditor verdict) |
148
+ | BOLA-R-0055-verdict | medium | medium | likely | bola | POST /account/rename | `php-laravel/routes/web.php:9` | Missing ownership check at php-laravel/routes/web.php:9 (from auditor verdict) |
149
+ | BOLA-R-0056-verdict | medium | medium | likely | bola | POST /account/profile | `php-laravel/routes/web.php:10` | Missing ownership check at php-laravel/routes/web.php:10 (from auditor verdict) |
150
+ | MASS-M-0001-verdict | medium | medium | likely | mass_assignment | | `dotnet-legacy/Web/Controllers/CustomerController.cs:12` | Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:12 (from auditor verdict) |
151
+ | MASS-M-0002-verdict | medium | medium | likely | mass_assignment | | `dotnet-legacy/Web/Controllers/CustomerController.cs:30` | Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:30 (from auditor verdict) |
152
+ | MASS-M-0006-1 | medium | high | confirmed | mass_assignment | | `node-express/routes/profile.js:8` | Unknown model fields in whole object binding |
153
+ | MASS-M-0007-1 | medium | high | confirmed | mass_assignment | | `node-express/routes/profile.js:16` | Unknown model fields in whole object binding |
154
+ | MASS-M-0008-1 | medium | medium | likely | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:13` | Unknown model fields in whole object binding |
155
+ | MASS-M-0010-1 | medium | medium | likely | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:36` | Unknown model fields in whole object binding |
156
+ | MASS-M-0011-verdict | medium | medium | likely | mass_assignment | | `php-plain/profile.php:6` | Mass assignment at php-plain/profile.php:6 (from auditor verdict) |
157
+ | MASS-M-0012-verdict | medium | medium | likely | mass_assignment | | `php-plain/profile.php:10` | Mass assignment at php-plain/profile.php:10 (from auditor verdict) |
158
+ | MASS-M-0014-1 | medium | medium | likely | mass_assignment | | `python-flask/profile.py:10` | Unknown model fields in whole object binding |
159
+ | MASS-M-0015-1 | medium | medium | likely | mass_assignment | | `python-flask/profile.py:27` | Unknown model fields in whole object binding |
160
+
161
+ ### BFLA-R-0003-1 — Unrestricted member deletion in classic‑asp shop
162
+
163
+ - **Severity / confidence:** critical / high
164
+ - **Status:** confirmed
165
+ - **Category:** bfla (missing_role_check) — CWE-285
166
+ - **Endpoint:** - -
167
+ - **Location:** `classic-asp/shop/member.asp:10`
168
+
169
+ **Impact.** Any logged‑in user can delete any member record
170
+
171
+ **Evidence.**
172
+
173
+ - `classic-asp/shop/member.asp:10` — DELETE statement executed without any role check
174
+
175
+ **Recommendation.** Add a server‑side admin role check before executing the DELETE
176
+
177
+ *Verifier:* confirmed — checked: classic-asp/shop/member.asp lines 1-11, classic-asp/shop/inc/auth.asp line 2. The code performs a DELETE without any role or ownership check. The included auth.asp only verifies that a user is logged in, not that they are an admin.
178
+
179
+ ### BFLA-R-0007-1 — Unrestricted user deletion in ASP.NET MVC Admin controller
180
+
181
+ - **Severity / confidence:** critical / high
182
+ - **Status:** confirmed
183
+ - **Category:** bfla (missing_role_check) — CWE-285
184
+ - **Endpoint:** - -
185
+ - **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:12`
186
+
187
+ **Impact.** Any authenticated user can delete any user account
188
+
189
+ **Evidence.**
190
+
191
+ - `dotnet-legacy/Web/Controllers/AdminController.cs:12` — db.Users.Remove executed without admin role check
192
+
193
+ **Recommendation.** Add [Authorize(Roles="Admin")] to DeleteUser action
194
+
195
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 6-18. DeleteUser action lacks an admin role guard; only the class-level [Authorize] ensures authentication.
196
+
197
+ ### BFLA-R-0009-1 — Export endpoint controlled by request parameter in ASP.NET MVC
198
+
199
+ - **Severity / confidence:** critical / high
200
+ - **Status:** confirmed
201
+ - **Category:** bfla (role_from_request) — CWE-269, CWE-285
202
+ - **Endpoint:** - -
203
+ - **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:30`
204
+
205
+ **Impact.** Any user can export all user data by setting isAdmin=true
206
+
207
+ **Evidence.**
208
+
209
+ - `dotnet-legacy/Web/Controllers/AdminController.cs:32` — uses Request.QueryString["isAdmin"] to grant access
210
+
211
+ **Recommendation.** Validate admin role from session before allowing export
212
+
213
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 30-36. Export action grants access based solely on a request query string parameter, with no server‑side role validation.
214
+
215
+ ### BFLA-R-0023-1 — Unrestricted user deletion in Spring MVC Admin controller
216
+
217
+ - **Severity / confidence:** critical / medium
218
+ - **Status:** likely
219
+ - **Category:** bfla (missing_role_check) — CWE-285
220
+ - **Endpoint:** - -
221
+ - **Location:** `java-legacy/src/com/acme/web/AdminUserController.java:13`
222
+
223
+ **Impact.** Any authenticated user can delete any user account
224
+
225
+ **Evidence.**
226
+
227
+ - `java-legacy/src/com/acme/web/AdminUserController.java:13` — delete method lacks @PreAuthorize
228
+
229
+ **Recommendation.** Add @PreAuthorize("hasRole('ADMIN')") to delete method
230
+
231
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AdminUserController.java, java-legacy/src/com/acme/web/AdminUserController.java lines 13-15, java-legacy/src/com/acme/web/AdminUserController.java lines 19-23. No @PreAuthorize or other role check is visible on the delete method. Global security configuration is not shown.
232
+
233
+ ### BFLA-R-0030-1 — Unrestricted user deletion in Express route
234
+
235
+ - **Severity / confidence:** critical / medium
236
+ - **Status:** likely
237
+ - **Category:** bfla (missing_role_check) — CWE-285
238
+ - **Endpoint:** - -
239
+ - **Location:** `node-express/routes/admin.js:8`
240
+
241
+ **Impact.** Any logged‑in user can delete any user account
242
+
243
+ **Evidence.**
244
+
245
+ - `node-express/routes/admin.js:8` — DELETE route without admin guard
246
+
247
+ **Recommendation.** Add requireAdmin middleware before delete handler
248
+
249
+ *Verifier:* likely — checked: node-express/routes/admin.js, node-express/routes/admin.js lines 8-9, node-express/routes/admin.js lines 5-6. The delete route only uses ensureLoggedIn; no admin guard is present in the visible code.
250
+
251
+ ### BFLA-R-0032-1 — Export endpoint controlled by query param in Express
252
+
253
+ - **Severity / confidence:** critical / medium
254
+ - **Status:** likely
255
+ - **Category:** bfla (role_from_request) — CWE-269, CWE-285
256
+ - **Endpoint:** - -
257
+ - **Location:** `node-express/routes/admin.js:16`
258
+
259
+ **Impact.** Any user can export all user data by setting isAdmin=true
260
+
261
+ **Evidence.**
262
+
263
+ - `node-express/routes/admin.js:17` — uses req.query.isAdmin to grant access
264
+
265
+ **Recommendation.** Validate admin role from session before allowing export
266
+
267
+ *Verifier:* likely — checked: node-express/routes/admin.js, node-express/routes/admin.js lines 16-18. Export endpoint checks only a query parameter; no role validation is visible.
268
+
269
+ ### BFLA-R-0057-1 — Unrestricted user view in php‑plain admin.php
270
+
271
+ - **Severity / confidence:** critical / medium
272
+ - **Status:** likely
273
+ - **Category:** bfla (missing_role_check) — CWE-285
274
+ - **Endpoint:** - -
275
+ - **Location:** `php-plain/admin.php:6`
276
+
277
+ **Impact.** Any logged‑in user can view any user record
278
+
279
+ **Evidence.**
280
+
281
+ - `php-plain/admin.php:6` — SELECT without role check
282
+
283
+ **Recommendation.** Add server‑side admin role check before executing SELECT
284
+
285
+ *Verifier:* likely — checked: php-plain/admin.php, php-plain/admin.php lines 6-9, php-plain/inc/auth.php. Only a login check is performed; no admin role check is present in the visible code.
286
+
287
+ ### BFLA-R-0058-1 — Unrestricted user deletion in php‑plain admin.php
288
+
289
+ - **Severity / confidence:** critical / medium
290
+ - **Status:** likely
291
+ - **Category:** bfla (missing_role_check) — CWE-285
292
+ - **Endpoint:** - -
293
+ - **Location:** `php-plain/admin.php:10`
294
+
295
+ **Impact.** Any logged‑in user can delete any user record
296
+
297
+ **Evidence.**
298
+
299
+ - `php-plain/admin.php:10` — DELETE without role check
300
+
301
+ **Recommendation.** Add server‑side admin role check before executing DELETE
302
+
303
+ *Verifier:* likely — checked: php-plain/admin.php, php-plain/admin.php lines 10-12, php-plain/inc/auth.php. The delete action lacks any admin role verification in the visible code.
304
+
305
+ ### BFLA-R-0059-1 — Unrestricted user deletion in php‑plain manage_users.php
306
+
307
+ - **Severity / confidence:** critical / high
308
+ - **Status:** confirmed
309
+ - **Category:** bfla (missing_role_check) — CWE-285
310
+ - **Endpoint:** - -
311
+ - **Location:** `php-plain/manage_users.php:6`
312
+
313
+ **Impact.** Any logged‑in user can delete any user record
314
+
315
+ **Evidence.**
316
+
317
+ - `php-plain/manage_users.php:6` — DELETE without server‑side role check
318
+
319
+ **Recommendation.** Add server‑side admin role check before executing DELETE
320
+
321
+ *Verifier:* confirmed — checked: php-plain/manage_users.php:1-8, php-plain/inc/auth.php:1-7. The POST handler deletes a user by id without any role or ownership guard.
322
+
323
+ ### BFLA-R-0063-1 — Unrestricted role change in php‑plain profile.php
324
+
325
+ - **Severity / confidence:** critical / high
326
+ - **Status:** confirmed
327
+ - **Category:** bfla (missing_role_check) — CWE-285
328
+ - **Endpoint:** - -
329
+ - **Location:** `php-plain/profile.php:6`
330
+
331
+ **Impact.** Any logged‑in user can change their own role to admin
332
+
333
+ **Evidence.**
334
+
335
+ - `php-plain/profile.php:10` — user->role set from $_POST['role'] without check
336
+
337
+ **Recommendation.** Validate role changes against allowed values and enforce admin check
338
+
339
+ *Verifier:* confirmed — checked: php-plain/profile.php:1-11, php-plain/inc/auth.php:1-7. The script assigns any POSTed field to the user object, including role, without checking the current user's privileges.
340
+
341
+ ### BFLA-R-0066-1 — Unrestricted user deletion in php‑plain delete_user.php
342
+
343
+ - **Severity / confidence:** critical / high
344
+ - **Status:** confirmed
345
+ - **Category:** bfla (missing_role_check) — CWE-285
346
+ - **Endpoint:** - -
347
+ - **Location:** `php-plain/admin/delete_user.php:5`
348
+
349
+ **Impact.** Any logged‑in user can delete any user record
350
+
351
+ **Evidence.**
352
+
353
+ - `php-plain/admin/delete_user.php:5` — DELETE without role check
354
+
355
+ **Recommendation.** Add server‑side admin role check before executing DELETE
356
+
357
+ *Verifier:* confirmed — checked: php-plain/admin/delete_user.php:1-8, php-plain/inc/auth.php:1-7. The file contains only a login check in auth.php and a DELETE statement that uses the supplied id. No role or ownership check is present.
358
+
359
+ ### BFLA-R-0067-1 — User promotion controlled by request parameter in php‑plain
360
+
361
+ - **Severity / confidence:** critical / high
362
+ - **Status:** confirmed
363
+ - **Category:** bfla (role_from_request) — CWE-269, CWE-285
364
+ - **Endpoint:** - -
365
+ - **Location:** `php-plain/admin/promote.php:5`
366
+
367
+ **Impact.** Any logged‑in user can promote themselves to admin
368
+
369
+ **Evidence.**
370
+
371
+ - `php-plain/admin/promote.php:5` — role assignment from $_POST['is_admin']
372
+
373
+ **Recommendation.** Validate admin role from session before allowing promotion
374
+
375
+ *Verifier:* confirmed — checked: php-plain/admin/promote.php:1-8, php-plain/inc/auth.php:1-7. The code updates the role based solely on a POST parameter. No role verification or ownership check is performed.
376
+
377
+ ### INJ-I-0001 — SQL Injection in classic-asp/shop/member.asp:6
378
+
379
+ - **Severity / confidence:** critical / medium
380
+ - **Status:** likely
381
+ - **Category:** sql_injection (string_concatenation) — CWE-89
382
+ - **Endpoint:** - -
383
+ - **Location:** `classic-asp/shop/member.asp:6`
384
+
385
+ **Evidence.**
386
+
387
+ - `classic-asp/shop/member.asp:6` — Unsanitized input concatenated into query
388
+ `sql = "UPDATE members SET name = '" & Replace(Request.Form("name"), "'", "''") & "'"`
389
+
390
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
391
+
392
+ *Verifier:* likely — checked: classic-asp/shop/member.asp lines 6-8, classic-asp/shop/inc/auth.asp lines 1-3. No ownership or role check is visible in the code context. The authentication include only verifies that a user is logged in, not that the user owns the member record.
393
+
394
+ ### INJ-I-0002 — SQL Injection in classic-asp/shop/member.asp:7
395
+
396
+ - **Severity / confidence:** critical / medium
397
+ - **Status:** likely
398
+ - **Category:** sql_injection (string_concatenation) — CWE-89
399
+ - **Endpoint:** - -
400
+ - **Location:** `classic-asp/shop/member.asp:7`
401
+
402
+ **Evidence.**
403
+
404
+ - `classic-asp/shop/member.asp:7` — Unsanitized input concatenated into query
405
+ `sql = sql & " WHERE member_id = " & Request.Form("member_id")`
406
+
407
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
408
+
409
+ *Verifier:* likely — checked: classic-asp/shop/member.asp lines 6-8, classic-asp/shop/inc/auth.asp lines 1-3. The query concatenates the member_id from the form with no ownership or role guard shown in the context.
410
+
411
+ ### INJ-I-0003 — SQL Injection in classic-asp/shop/member.asp:10
412
+
413
+ - **Severity / confidence:** critical / medium
414
+ - **Status:** likely
415
+ - **Category:** sql_injection (string_concatenation) — CWE-89
416
+ - **Endpoint:** - -
417
+ - **Location:** `classic-asp/shop/member.asp:10`
418
+
419
+ **Evidence.**
420
+
421
+ - `classic-asp/shop/member.asp:10` — Unsanitized input concatenated into query
422
+ `conn.Execute "DELETE FROM members WHERE member_id = " & Request.QueryString("member_id")`
423
+
424
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
425
+
426
+ *Verifier:* likely — checked: classic-asp/shop/member.asp lines 9-11, classic-asp/shop/inc/auth.asp lines 1-3. The DELETE statement uses a member_id from the query string with no visible ownership check.
427
+
428
+ ### INJ-I-0004 — SQL Injection in classic-asp/shop/order.asp:6
429
+
430
+ - **Severity / confidence:** critical / medium
431
+ - **Status:** likely
432
+ - **Category:** sql_injection (string_concatenation) — CWE-89
433
+ - **Endpoint:** - -
434
+ - **Location:** `classic-asp/shop/order.asp:6`
435
+
436
+ **Evidence.**
437
+
438
+ - `classic-asp/shop/order.asp:6` — Unsanitized input concatenated into query
439
+ `Set rs = conn.Execute("SELECT * FROM orders WHERE id = " & id)`
440
+
441
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
442
+
443
+ *Verifier:* likely — checked: classic-asp/shop/order.asp lines 5-7, classic-asp/shop/inc/auth.asp lines 1-3. The SELECT query uses an id from the request without casting or an ownership guard in the visible code.
444
+
445
+ ### INJ-I-0006 — SQL Injection in coldfusion/app/OrderService.cfc:5
446
+
447
+ - **Severity / confidence:** critical / high
448
+ - **Status:** confirmed
449
+ - **Category:** sql_injection (template_placeholder) — CWE-89
450
+ - **Endpoint:** - -
451
+ - **Location:** `coldfusion/app/OrderService.cfc:5`
452
+
453
+ **Evidence.**
454
+
455
+ - `coldfusion/app/OrderService.cfc:5` — Unsanitized input interpolated into query
456
+ `SELECT * FROM orders WHERE id = #arguments.orderId#`
457
+
458
+ **Recommendation.** Use cfqueryparam or parameterized queries; avoid unescaped interpolation
459
+
460
+ *Verifier:* confirmed — checked: coldfusion/app/OrderService.cfc:5. The query interpolates the unsanitized argument directly into the SQL string. No ownership or role check, no parameter binding, and no integer cast is present in the visible code.
461
+
462
+ ### INJ-I-0007 — SQL Injection in coldfusion/app/order.cfm:3
463
+
464
+ - **Severity / confidence:** critical / high
465
+ - **Status:** confirmed
466
+ - **Category:** sql_injection (template_placeholder) — CWE-89
467
+ - **Endpoint:** - -
468
+ - **Location:** `coldfusion/app/order.cfm:3`
469
+
470
+ **Evidence.**
471
+
472
+ - `coldfusion/app/order.cfm:3` — Unsanitized input interpolated into query
473
+ `SELECT * FROM orders WHERE id = #url.id#`
474
+
475
+ **Recommendation.** Use cfqueryparam or parameterized queries; avoid unescaped interpolation
476
+
477
+ *Verifier:* confirmed — checked: coldfusion/app/order.cfm:3. The first query uses the raw URL parameter in the WHERE clause. Although a second query later uses cfqueryparam and includes a user_id check, the vulnerable query is executed and its result is output, providing an injection vector.
478
+
479
+ ### INJ-I-0008 — SQL Injection in dotnet-legacy/Web/Controllers/InvoiceController.cs:28
480
+
481
+ - **Severity / confidence:** critical / medium
482
+ - **Status:** likely
483
+ - **Category:** sql_injection (string_concatenation) — CWE-89
484
+ - **Endpoint:** - -
485
+ - **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:28`
486
+
487
+ **Evidence.**
488
+
489
+ - `dotnet-legacy/Web/Controllers/InvoiceController.cs:28` — Unsanitized user input concatenated into query
490
+ `var list = db.Database.SqlQuery<Invoice>("SELECT * FROM Invoices WHERE Customer = '" + customer + "'").ToList();`
491
+
492
+ **Recommendation.** Use parameterized queries or escape the input before concatenation
493
+
494
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs:26-28. The code concatenates the user‑supplied customer string directly into the SQL query. No parameter binding, cast, or ownership/role check is visible in the provided context.
495
+
496
+ ### INJ-I-0009 — SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7
497
+
498
+ - **Severity / confidence:** critical / high
499
+ - **Status:** confirmed
500
+ - **Category:** sql_injection (string_concatenation) — CWE-89
501
+ - **Endpoint:** - -
502
+ - **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7`
503
+
504
+ **Evidence.**
505
+
506
+ - `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` — Unsanitized input concatenated into query
507
+ `Dim sql As String = "UPDATE Orders SET Note = '" & txtNote.Text & "'"`
508
+
509
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
510
+
511
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7, dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8. Both the Note and OrderId values are concatenated into the SQL string without any parameterization or ownership check. The subsequent safe query does not mitigate the earlier vulnerable execution.
512
+
513
+ ### INJ-I-0010 — SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8
514
+
515
+ - **Severity / confidence:** critical / high
516
+ - **Status:** confirmed
517
+ - **Category:** sql_injection (string_concatenation) — CWE-89
518
+ - **Endpoint:** - -
519
+ - **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8`
520
+
521
+ **Evidence.**
522
+
523
+ - `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8` — Unsanitized input concatenated into query
524
+ `sql &= " WHERE OrderId = " & hfOrderId.Value`
525
+
526
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
527
+
528
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8. The OrderId is concatenated directly into the SQL string. No ownership or role validation is present in the visible code.
529
+
530
+ ### INJ-I-0011 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13
531
+
532
+ - **Severity / confidence:** critical / high
533
+ - **Status:** confirmed
534
+ - **Category:** sql_injection (string_concatenation) — CWE-89
535
+ - **Endpoint:** - -
536
+ - **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13`
537
+
538
+ **Evidence.**
539
+
540
+ - `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13` — Unsanitized input concatenated into query
541
+ `var cmd = new SqlCommand("SELECT * FROM Orders WHERE OrderId = " + id, conn);`
542
+
543
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
544
+
545
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13. The id from the query string is concatenated into the SQL command without parameterization or ownership verification. The later safe query does not prevent the execution of the vulnerable statement.
546
+
547
+ ### INJ-I-0012 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19
548
+
549
+ - **Severity / confidence:** critical / high
550
+ - **Status:** confirmed
551
+ - **Category:** sql_injection (string_concatenation) — CWE-89
552
+ - **Endpoint:** - -
553
+ - **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19`
554
+
555
+ **Evidence.**
556
+
557
+ - `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19` — Unsanitized input concatenated into query
558
+ `string sql2 = string.Format("SELECT * FROM Logs WHERE Ref = '{0}'", Request["ref"]);`
559
+
560
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
561
+
562
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13-22. The query string is built by string.Format with user-supplied Request["ref"]. No parameter binding, no ownership or role check is visible in the code_context.
563
+
564
+ ### INJ-I-0013 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20
565
+
566
+ - **Severity / confidence:** critical / high
567
+ - **Status:** confirmed
568
+ - **Category:** sql_injection (string_concatenation) — CWE-89
569
+ - **Endpoint:** - -
570
+ - **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20`
571
+
572
+ **Evidence.**
573
+
574
+ - `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20` — Unsanitized input concatenated into query
575
+ `string sql3 = $"DELETE FROM Carts WHERE CartId = {Request.Form["cart"]}";`
576
+
577
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
578
+
579
+ *Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13-22. The DELETE statement concatenates Request.Form["cart"] directly into the SQL. No compensating control is present in the visible code.
580
+
581
+ ### INJ-I-0014 — SQL Injection in java-legacy/WebContent/order/detail.jsp:5
582
+
583
+ - **Severity / confidence:** critical / high
584
+ - **Status:** confirmed
585
+ - **Category:** sql_injection (string_concatenation) — CWE-89
586
+ - **Endpoint:** - -
587
+ - **Location:** `java-legacy/WebContent/order/detail.jsp:5`
588
+
589
+ **Evidence.**
590
+
591
+ - `java-legacy/WebContent/order/detail.jsp:5` — Unsanitized input concatenated into query
592
+ `ResultSet rs = c.createStatement().executeQuery("SELECT * FROM orders WHERE order_no = '" + no + "'");`
593
+
594
+ **Recommendation.** Use prepared statements with parameter binding; avoid string concatenation
595
+
596
+ *Verifier:* confirmed — checked: java-legacy/WebContent/order/detail.jsp:1-6. The query concatenates the request parameter "no" into the SQL string. No ownership or role check is shown.
597
+
598
+ ### INJ-I-0015 — SQL Injection in java-legacy/src/com/acme/mapper/OrderMapper.xml:9
599
+
600
+ - **Severity / confidence:** critical / medium
601
+ - **Status:** likely
602
+ - **Category:** sql_injection (dynamic_identifier) — CWE-89
603
+ - **Endpoint:** - -
604
+ - **Location:** `java-legacy/src/com/acme/mapper/OrderMapper.xml:9`
605
+
606
+ **Evidence.**
607
+
608
+ - `java-legacy/src/com/acme/mapper/OrderMapper.xml:9` — Dynamic identifier interpolated without sanitization
609
+ `ORDER BY ${orderBy}`
610
+
611
+ **Recommendation.** Validate the orderBy value against an allow‑list or use a parameterized query
612
+
613
+ *Verifier:* likely — checked: java-legacy/src/com/acme/mapper/OrderMapper.xml:9. The ORDER BY clause interpolates the ${orderBy} variable without any visible allow‑list or type enforcement in the snippet.
614
+
615
+ ### INJ-I-0016 — SQL Injection in java-legacy/src/com/acme/struts/EditUserAction.java:13
616
+
617
+ - **Severity / confidence:** critical / high
618
+ - **Status:** confirmed
619
+ - **Category:** sql_injection (string_concatenation) — CWE-89
620
+ - **Endpoint:** - -
621
+ - **Location:** `java-legacy/src/com/acme/struts/EditUserAction.java:13`
622
+
623
+ **Evidence.**
624
+
625
+ - `java-legacy/src/com/acme/struts/EditUserAction.java:13` — Unsanitized input concatenated into query
626
+ `PreparedStatement ps = conn.prepareStatement("UPDATE users SET email = '" + email + "' WHERE id = " + userId);`
627
+
628
+ **Recommendation.** Use parameterized queries; avoid string concatenation
629
+
630
+ *Verifier:* confirmed — checked: java-legacy/src/com/acme/struts/EditUserAction.java:10-15. The UPDATE statement concatenates the email and userId parameters directly. No parameter binding or ownership check is visible.
631
+
632
+ ### INJ-I-0017 — SQL Injection in java-legacy/src/com/acme/web/InvoiceController.java:29
633
+
634
+ - **Severity / confidence:** critical / high
635
+ - **Status:** confirmed
636
+ - **Category:** sql_injection (string_concatenation) — CWE-89
637
+ - **Endpoint:** - -
638
+ - **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:29`
639
+
640
+ **Evidence.**
641
+
642
+ - `java-legacy/src/com/acme/web/InvoiceController.java:29` — Unsanitized input concatenated into query
643
+ `model.addAttribute("list", session.createQuery("from Invoice i where i.customer = '" + customer + "'").list());`
644
+
645
+ **Recommendation.** Use parameterized queries or named parameters; avoid string concatenation
646
+
647
+ *Verifier:* confirmed — checked: java-legacy/src/com/acme/web/InvoiceController.java:27-31. The HQL query concatenates the customer request parameter. No ownership or role check is present in the code_context.
648
+
649
+ ### INJ-I-0018 — SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:15
650
+
651
+ - **Severity / confidence:** critical / medium
652
+ - **Status:** likely
653
+ - **Category:** sql_injection (string_concatenation) — CWE-89
654
+ - **Endpoint:** - -
655
+ - **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:15`
656
+
657
+ **Evidence.**
658
+
659
+ - `java-legacy/src/com/acme/web/OrderServlet.java:15` — Unsanitized request parameter concatenated into query
660
+ `ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
661
+ - `java-legacy/src/com/acme/web/OrderServlet.java:17` — Unsanitized request parameter used in dynamic SQL
662
+ `sb.append(" AND order_id = ").append(id);`
663
+
664
+ **Recommendation.** Use prepared statements or validate the id before use
665
+
666
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java:15-17. Both SQL statements build the query string by concatenating the request parameter `id` directly. No cast, parameter binding, or ownership check is shown.
667
+
668
+ ### INJ-I-0019 — SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:17
669
+
670
+ - **Severity / confidence:** critical / medium
671
+ - **Status:** likely
672
+ - **Category:** sql_injection (string_concatenation) — CWE-89
673
+ - **Endpoint:** - -
674
+ - **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:17`
675
+
676
+ **Evidence.**
677
+
678
+ - `java-legacy/src/com/acme/web/OrderServlet.java:15` — Unsanitized request parameter concatenated into query
679
+ `ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
680
+ - `java-legacy/src/com/acme/web/OrderServlet.java:17` — Unsanitized request parameter used in dynamic SQL
681
+ `sb.append(" AND order_id = ").append(id);`
682
+
683
+ **Recommendation.** Use prepared statements or validate the id before use
684
+
685
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java:15-17. Same code as INJ-I-0018; no visible mitigation.
686
+
687
+ ### INJ-I-0020 — SQL Injection in node-express/routes/orders.js:17
688
+
689
+ - **Severity / confidence:** critical / high
690
+ - **Status:** confirmed
691
+ - **Category:** sql_injection (string_concatenation) — CWE-89
692
+ - **Endpoint:** - -
693
+ - **Location:** `node-express/routes/orders.js:17`
694
+
695
+ **Evidence.**
696
+
697
+ - `node-express/routes/orders.js:17` — Unsanitized input concatenated into query
698
+ `db.query("SELECT * FROM reports WHERE month = '" + req.query.month + "'", function (e, rows) { res.json(rows); });`
699
+
700
+ **Recommendation.** Use parameterized queries or query builders; avoid string concatenation
701
+
702
+ *Verifier:* confirmed — checked: node-express/routes/orders.js:17. The query concatenates user input directly into the SQL string with no sanitization, casting, or parameter binding. No ownership or role check is present on this route.
703
+
704
+ ### INJ-I-0021 — SQL Injection in node-express/routes/orders.js:29
705
+
706
+ - **Severity / confidence:** critical / high
707
+ - **Status:** confirmed
708
+ - **Category:** sql_injection (string_concatenation) — CWE-89
709
+ - **Endpoint:** - -
710
+ - **Location:** `node-express/routes/orders.js:29`
711
+
712
+ **Evidence.**
713
+
714
+ - `node-express/routes/orders.js:29` — Unsanitized input concatenated into query
715
+ `db.query('SELECT COUNT(*) AS n FROM orders WHERE shop_id = ${req.query.shop}', function (e, r) { res.json(r); });`
716
+
717
+ **Recommendation.** Use parameterized queries or query builders; avoid string concatenation
718
+
719
+ *Verifier:* confirmed — checked: node-express/routes/orders.js:29. The query interpolates req.query.shop directly into the SQL string. No cast, binding, or authorization guard is visible.
720
+
721
+ ### INJ-I-0022 — NoSQL Injection in node-express/routes/orders.js:21
722
+
723
+ - **Severity / confidence:** critical / high
724
+ - **Status:** confirmed
725
+ - **Category:** nosql_injection (string_concatenation) — CWE-89
726
+ - **Endpoint:** - -
727
+ - **Location:** `node-express/routes/orders.js:21`
728
+
729
+ **Evidence.**
730
+
731
+ - `node-express/routes/orders.js:21` — Unsanitized request body used directly as query filter
732
+ `db.collection('users').findOne(req.body, function (e, u) { res.json(!!u); });`
733
+
734
+ **Recommendation.** Validate and sanitize query objects; avoid passing raw request bodies to database
735
+
736
+ *Verifier:* confirmed — checked: node-express/routes/orders.js:21. The request body is passed directly to findOne without validation or sanitization. No role or ownership check is present.
737
+
738
+ ### INJ-I-0023 — NoSQL Injection in node-express/routes/orders.js:25
739
+
740
+ - **Severity / confidence:** critical / high
741
+ - **Status:** confirmed
742
+ - **Category:** nosql_injection (string_concatenation) — CWE-89
743
+ - **Endpoint:** - -
744
+ - **Location:** `node-express/routes/orders.js:25`
745
+
746
+ **Evidence.**
747
+
748
+ - `node-express/routes/orders.js:25` — Unsanitized input concatenated into $where string
749
+ `db.collection('items').find({ $where: "this.name == '" + req.query.n + "'" }).toArray(function (e, r) { res.json(r); });`
750
+
751
+ **Recommendation.** Avoid $where with user input; use parameterized queries or safe query operators
752
+
753
+ *Verifier:* confirmed — checked: node-express/routes/orders.js:25. The $where string concatenates user input directly, enabling NoSQL injection. No validation or authorization guard is visible.
754
+
755
+ ### INJ-I-0024 — SQL Injection in perl-cgi/cgi-bin/order.cgi:13
756
+
757
+ - **Severity / confidence:** critical / high
758
+ - **Status:** confirmed
759
+ - **Category:** sql_injection (string_concatenation) — CWE-89
760
+ - **Endpoint:** - -
761
+ - **Location:** `perl-cgi/cgi-bin/order.cgi:13`
762
+
763
+ **Evidence.**
764
+
765
+ - `perl-cgi/cgi-bin/order.cgi:13` — Unsanitized input concatenated into query
766
+ `$dbh->prepare("SELECT * FROM orders WHERE id = $id");`
767
+
768
+ **Recommendation.** Use placeholders and bind parameters; avoid string interpolation
769
+
770
+ *Verifier:* confirmed — checked: perl-cgi/cgi-bin/order.cgi:13. The prepared statement interpolates $id directly into the SQL string. No parameter binding or sanitization is used. The later safe query does not mitigate this earlier vulnerability.
771
+
772
+ ### INJ-I-0025 — SQL Injection in perl-cgi/cgi-bin/order.cgi:19
773
+
774
+ - **Severity / confidence:** critical / high
775
+ - **Status:** confirmed
776
+ - **Category:** sql_injection (string_concatenation) — CWE-89
777
+ - **Endpoint:** - -
778
+ - **Location:** `perl-cgi/cgi-bin/order.cgi:19`
779
+
780
+ **Evidence.**
781
+
782
+ - `perl-cgi/cgi-bin/order.cgi:19` — Unsanitized input concatenated into query
783
+ `$dbh->do("DELETE FROM carts WHERE cart_id = " . $q->param('cart'));`
784
+
785
+ **Recommendation.** Use placeholders and bind parameters; avoid string concatenation
786
+
787
+ *Verifier:* confirmed — checked: perl-cgi/cgi-bin/order.cgi:13-19. The DELETE statement concatenates user input directly into the SQL string and no ownership or role check is present in the visible code.
788
+
789
+ ### INJ-I-0026 — SQL Injection in php-codeigniter/application/controllers/Invoice.php:10
790
+
791
+ - **Severity / confidence:** critical / medium
792
+ - **Status:** likely
793
+ - **Category:** sql_injection (string_concatenation) — CWE-89
794
+ - **Endpoint:** - -
795
+ - **Location:** `php-codeigniter/application/controllers/Invoice.php:10`
796
+
797
+ **Evidence.**
798
+
799
+ - `php-codeigniter/application/controllers/Invoice.php:10` — Unsanitized URL segment concatenated into query
800
+ `$q = $this->db->query("SELECT * FROM invoices WHERE id = $id");`
801
+
802
+ **Recommendation.** Use parameterized queries or escape the input before concatenation
803
+
804
+ *Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:10. The `view` method concatenates the `$id` variable directly into the query. No parameter binding, cast, or ownership check is present in the snippet.
805
+
806
+ ### INJ-I-0027 — SQL Injection in php-plain/admin.php:12
807
+
808
+ - **Severity / confidence:** critical / high
809
+ - **Status:** confirmed
810
+ - **Category:** sql_injection (string_concatenation) — CWE-89
811
+ - **Endpoint:** - -
812
+ - **Location:** `php-plain/admin.php:8`
813
+
814
+ **Evidence.**
815
+
816
+ - `php-plain/admin.php:12` — Unsanitized input concatenated into query
817
+ `mysql_query("DELETE FROM users WHERE id = $id");`
818
+
819
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
820
+
821
+ *Verifier:* confirmed — checked: php-plain/admin.php:10-12, php-plain/inc/auth.php:1-7, php-plain/inc/db.php:1-4. The DELETE query uses unsanitized POST data and the included auth file only verifies login, not ownership or role.
822
+
823
+ ### INJ-I-0028 — SQL Injection in php-plain/admin.php:12
824
+
825
+ - **Severity / confidence:** critical / high
826
+ - **Status:** confirmed
827
+ - **Category:** sql_injection (string_concatenation) — CWE-89
828
+ - **Endpoint:** - -
829
+ - **Location:** `php-plain/admin.php:12`
830
+
831
+ **Evidence.**
832
+
833
+ - `php-plain/admin.php:12` — Unsanitized input concatenated into query
834
+ `mysql_query("DELETE FROM users WHERE id = $id");`
835
+
836
+ **Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
837
+
838
+ *Verifier:* confirmed — checked: php-plain/admin.php:10-12, php-plain/inc/auth.php:1-7, php-plain/inc/db.php:1-4. Same as INJ-I-0027; no compensating control is visible.
839
+
840
+ ### INJ-I-0029 — NoSQL Injection in php-plain/mongo_find.php:6
841
+
842
+ - **Severity / confidence:** critical / high
843
+ - **Status:** confirmed
844
+ - **Category:** nosql_injection (string_concatenation) — CWE-89
845
+ - **Endpoint:** - -
846
+ - **Location:** `php-plain/mongo_find.php:5`
847
+
848
+ **Evidence.**
849
+
850
+ - `php-plain/mongo_find.php:6` — Unsanitized input concatenated into $where string
851
+ `$docs = $coll->find(array('$where' => "this.name == '" . $_GET['n'] . "'"));`
852
+
853
+ **Recommendation.** Avoid $where with user input; use safe query operators or parameterized queries
854
+
855
+ *Verifier:* confirmed — checked: php-plain/mongo_find.php:5-6, php-plain/inc/auth.php:1-7. The $where clause concatenates user input; no ownership or role check is present in the visible code.
856
+
857
+ ### INJ-I-0030 — NoSQL Injection in php-plain/mongo_find.php:6
858
+
859
+ - **Severity / confidence:** critical / high
860
+ - **Status:** confirmed
861
+ - **Category:** nosql_injection (string_concatenation) — CWE-89
862
+ - **Endpoint:** - -
863
+ - **Location:** `php-plain/mongo_find.php:6`
864
+
865
+ **Evidence.**
866
+
867
+ - `php-plain/mongo_find.php:6` — Unsanitized input concatenated into $where string
868
+ `$docs = $coll->find(array('$where' => "this.name == '" . $_GET['n'] . "'"));`
869
+
870
+ **Recommendation.** Avoid $where with user input; use safe query operators or parameterized queries
871
+
872
+ *Verifier:* confirmed — checked: php-plain/mongo_find.php:5-6, php-plain/inc/auth.php:1-7. Same as INJ-I-0029; no compensating control is visible.
873
+
874
+ ### INJ-I-0031 — SQL Injection in php-plain/order_detail.php:6
875
+
876
+ - **Severity / confidence:** critical / high
877
+ - **Status:** confirmed
878
+ - **Category:** sql_injection (string_concatenation) — CWE-89
879
+ - **Endpoint:** - -
880
+ - **Location:** `php-plain/order_detail.php:6`
881
+
882
+ **Evidence.**
883
+
884
+ - `php-plain/order_detail.php:5` — Unsanitized GET parameter
885
+ `$id = $_GET['id'];`
886
+ - `php-plain/order_detail.php:6` — Unsanitized input concatenated into query
887
+ `$res = mysql_query("SELECT * FROM orders WHERE id = " . $id);`
888
+
889
+ **Recommendation.** Use a prepared statement with bound parameters instead of string concatenation
890
+
891
+ *Verifier:* confirmed — checked: php-plain/order_detail.php:5-6, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The GET parameter is concatenated directly into a mysql_query without any sanitization, casting, or prepared statement. No ownership or role check is present.
892
+
893
+ ### INJ-I-0032 — SQL Injection in php-plain/search.php:8
894
+
895
+ - **Severity / confidence:** critical / high
896
+ - **Status:** confirmed
897
+ - **Category:** sql_injection (string_concatenation) — CWE-89
898
+ - **Endpoint:** - -
899
+ - **Location:** `php-plain/search.php:8`
900
+
901
+ **Evidence.**
902
+
903
+ - `php-plain/search.php:6` — Unsanitized GET parameter
904
+ `$sort = $_GET['sort'];`
905
+ - `php-plain/search.php:9` — Unsanitized input concatenated into ORDER BY clause
906
+ `$sql .= " ORDER BY " . $sort;`
907
+
908
+ **Recommendation.** Validate ORDER BY values against an allow‑list or use parameterized queries
909
+
910
+ *Verifier:* confirmed — checked: php-plain/search.php:6-9, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The ORDER BY clause is built from an unsanitized GET parameter with no allow‑list or integer cast. No ownership or role check is present.
911
+
912
+ ### INJ-I-0033 — SQL Injection in php-plain/search.php:9
913
+
914
+ - **Severity / confidence:** critical / high
915
+ - **Status:** confirmed
916
+ - **Category:** sql_injection (string_concatenation) — CWE-89
917
+ - **Endpoint:** - -
918
+ - **Location:** `php-plain/search.php:9`
919
+
920
+ **Evidence.**
921
+
922
+ - `php-plain/search.php:6` — Unsanitized GET parameter
923
+ `$sort = $_GET['sort'];`
924
+ - `php-plain/search.php:9` — Unsanitized input concatenated into ORDER BY clause
925
+ `$sql .= " ORDER BY " . $sort;`
926
+
927
+ **Recommendation.** Validate ORDER BY values against an allow‑list or use parameterized queries
928
+
929
+ *Verifier:* confirmed — checked: php-plain/search.php:6-9, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. Same as INJ-I-0032: unsanitized ORDER BY input with no guard.
930
+
931
+ ### INJ-I-0034 — SQL Injection in php-plain/search.php:14
932
+
933
+ - **Severity / confidence:** critical / high
934
+ - **Status:** confirmed
935
+ - **Category:** sql_injection (string_concatenation) — CWE-89
936
+ - **Endpoint:** - -
937
+ - **Location:** `php-plain/search.php:14`
938
+
939
+ **Evidence.**
940
+
941
+ - `php-plain/search.php:13` — Unsanitized GET parameter interpolated into query
942
+ `$q = <<<SQL
943
+ SELECT * FROM products
944
+ WHERE category = '{$_GET['cat']}'
945
+ SQL;`
946
+
947
+ **Recommendation.** Use parameterized queries or escape the input before interpolation
948
+
949
+ *Verifier:* confirmed — checked: php-plain/search.php:13-15, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The heredoc interpolates a GET parameter directly into the SQL string. No escaping or parameterization is used.
950
+
951
+ ### INJ-I-0036 — SQL Injection in python-flask/app.py:29
952
+
953
+ - **Severity / confidence:** critical / high
954
+ - **Status:** confirmed
955
+ - **Category:** sql_injection (string_interpolation) — CWE-89
956
+ - **Endpoint:** - -
957
+ - **Location:** `python-flask/app.py:29`
958
+
959
+ **Evidence.**
960
+
961
+ - `python-flask/app.py:29` — Unsanitized f-string interpolation into query
962
+ `cur.execute(f"SELECT * FROM products WHERE name LIKE '%{q}%'")`
963
+
964
+ **Recommendation.** Use a parameterized query instead of f-string interpolation
965
+
966
+ *Verifier:* confirmed — checked: python-flask/app.py:24-30, python-flask/app.py:10-20. The search route uses an f‑string to build a query with user input. No parameter binding or sanitization is performed, and no ownership check is present.
967
+
968
+ ### INJ-I-0037 — SQL Injection in sql-procs/sp_search_orders.sql:5
969
+
970
+ - **Severity / confidence:** critical / medium
971
+ - **Status:** likely
972
+ - **Category:** sql_injection (stored_procedure_dynamic_sql) — CWE-89
973
+ - **Endpoint:** - -
974
+ - **Location:** `sql-procs/sp_search_orders.sql:5`
975
+
976
+ **Evidence.**
977
+
978
+ - `sql-procs/sp_search_orders.sql:5` — Dynamic SQL built from user‑supplied parameters without sanitization
979
+ `SET @sql = 'SELECT * FROM Orders WHERE Customer = ''' + @Customer + ''' ORDER BY ' + @Sort`
980
+
981
+ **Recommendation.** Avoid dynamic SQL; use parameterized queries or validate the parameters
982
+
983
+ *Verifier:* likely — checked: sql-procs/sp_search_orders.sql line 5. The stored procedure builds dynamic SQL from @Customer and @Sort without any visible sanitization or allow‑list. No ownership or role check is present in the provided code.
984
+
985
+ ### INJ-I-0038 — SQL Injection in sql-procs/sp_search_orders.sql:6
986
+
987
+ - **Severity / confidence:** critical / medium
988
+ - **Status:** likely
989
+ - **Category:** sql_injection (stored_procedure_dynamic_sql) — CWE-89
990
+ - **Endpoint:** - -
991
+ - **Location:** `sql-procs/sp_search_orders.sql:6`
992
+
993
+ **Evidence.**
994
+
995
+ - `sql-procs/sp_search_orders.sql:6` — Execution of unsanitized dynamic SQL
996
+ `EXEC(@sql)`
997
+
998
+ **Recommendation.** Avoid dynamic SQL; use parameterized queries or validate the parameters
999
+
1000
+ *Verifier:* likely — checked: sql-procs/sp_search_orders.sql line 6. Execution of the unsanitized @sql string is shown, but no control is visible in the snippet.
1001
+
1002
+ ### MASS-M-0003-1 — Unrestricted binding of Account object in Spring MVC
1003
+
1004
+ - **Severity / confidence:** critical / high
1005
+ - **Status:** confirmed
1006
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1007
+ - **Endpoint:** - -
1008
+ - **Location:** `java-legacy/src/com/acme/web/AccountController.java:14`
1009
+
1010
+ **Impact.** role, balance
1011
+
1012
+ **Evidence.**
1013
+
1014
+ - `java-legacy/src/com/acme/web/AccountController.java:27` — accountDao.save(account) with whole object binding, no allowlist
1015
+
1016
+ **Recommendation.** Use a DTO or explicit property copying to prevent privileged field updates
1017
+
1018
+ *Verifier:* confirmed — checked: java-legacy/src/com/acme/web/AccountController.java:1-30. The controller accepts a full Account model from the request and persists it directly. No role check or property allow‑list is present.
1019
+
1020
+ ### MASS-M-0004-1 — Unrestricted binding of Account object in Spring MVC
1021
+
1022
+ - **Severity / confidence:** critical / medium
1023
+ - **Status:** likely
1024
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1025
+ - **Endpoint:** - -
1026
+ - **Location:** `java-legacy/src/com/acme/web/AccountController.java:27`
1027
+
1028
+ **Impact.** role, balance
1029
+
1030
+ **Evidence.**
1031
+
1032
+ - `java-legacy/src/com/acme/web/AccountController.java:27` — accountDao.save(account) with whole object binding, no allowlist
1033
+
1034
+ **Recommendation.** Use a DTO or explicit property copying to prevent privileged field updates
1035
+
1036
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java:13-15. The controller binds the entire Account object via @ModelAttribute and persists it without any visible ownership or role check, nor an allow‑list. No global filter or configuration is shown in the provided context.
1037
+
1038
+ ### MASS-M-0005-1 — Unrestricted binding of Account object via BeanUtils in Java servlet
1039
+
1040
+ - **Severity / confidence:** critical / medium
1041
+ - **Status:** likely
1042
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1043
+ - **Endpoint:** - -
1044
+ - **Location:** `java-legacy/src/com/acme/web/ProfileServlet.java:12`
1045
+
1046
+ **Impact.** role, balance
1047
+
1048
+ **Evidence.**
1049
+
1050
+ - `java-legacy/src/com/acme/web/ProfileServlet.java:12` — BeanUtils.populate(account, request.getParameterMap()) binds all request parameters
1051
+
1052
+ **Recommendation.** Use explicit property setting or an allowlist to prevent privileged field updates
1053
+
1054
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/ProfileServlet.java:10-13. BeanUtils.populate() binds all request parameters to the Account object with no visible filtering or ownership enforcement in the snippet.
1055
+
1056
+ ### BOLA-R-0001 — BOLA in POST /user/edit.do: missing owner verification
1057
+
1058
+ - **Severity / confidence:** high / medium
1059
+ - **Status:** likely
1060
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1061
+ - **Endpoint:** ANY /user/edit.do
1062
+ - **Location:** `java-legacy/src/com/acme/struts/EditUserAction.java:10`
1063
+
1064
+ **Evidence.**
1065
+
1066
+ - `java-legacy/src/com/acme/struts/EditUserAction.java:10` — The user_id comes from the request and is used directly in the UPDATE without verifying that the target user belongs to the current session user.
1067
+ `String userId = request.getParameter("user_id");
1068
+ String email = request.getParameter("email");
1069
+ Connection conn = DataSourceHolder.get().getConnection();
1070
+ PreparedStatement ps = conn.prepareStatement("UPDATE users SET email = '" + email + "' WHERE id = " + userId);
1071
+ ps.executeUpdate();`
1072
+
1073
+ **Recommendation.** Add an ownership check that ensures the user_id belongs to the current session user before performing the UPDATE.
1074
+
1075
+ *Verifier:* likely — checked: java-legacy/src/com/acme/struts/EditUserAction.java lines 10-14. The user_id from the request is used directly in an UPDATE statement without any ownership verification or parameter binding.
1076
+
1077
+ ### BOLA-R-0002 — BOLA in GET /classic-asp/shop/member.asp?mode=edit: missing owner verification
1078
+
1079
+ - **Severity / confidence:** high / medium
1080
+ - **Status:** likely
1081
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1082
+ - **Endpoint:** ANY /classic-asp/shop/member.asp?mode=edit
1083
+ - **Location:** `classic-asp/shop/member.asp:6`
1084
+
1085
+ **Evidence.**
1086
+
1087
+ - `classic-asp/shop/member.asp:6` — member_id comes from the request form and is used directly in the UPDATE without checking that the member belongs to the current session user.
1088
+ `sql = "UPDATE members SET name = '" & Replace(Request.Form("name"), "'", "''") & "'"
1089
+ sql = sql & " WHERE member_id = " & Request.Form("member_id")`
1090
+
1091
+ **Recommendation.** Add an ownership check that ensures the member_id belongs to the current user before performing the UPDATE.
1092
+
1093
+ *Verifier:* likely — checked: classic-asp/shop/member.asp:6-8, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The UPDATE statement uses Request.Form("member_id") directly without any ownership check or parameter binding. No role or ownership helper is invoked in the visible code.
1094
+
1095
+ ### BOLA-R-0003 — BOLA in GET /classic-asp/shop/member.asp?mode=delete: missing owner verification
1096
+
1097
+ - **Severity / confidence:** high / medium
1098
+ - **Status:** likely
1099
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1100
+ - **Endpoint:** ANY /classic-asp/shop/member.asp?mode=delete
1101
+ - **Location:** `classic-asp/shop/member.asp:10`
1102
+
1103
+ **Evidence.**
1104
+
1105
+ - `classic-asp/shop/member.asp:10` — member_id comes from the query string and is used directly in the DELETE without verifying ownership.
1106
+ `conn.Execute "DELETE FROM members WHERE member_id = " & Request.QueryString("member_id")`
1107
+
1108
+ **Recommendation.** Add an ownership check that ensures the member_id belongs to the current user before performing the DELETE.
1109
+
1110
+ *Verifier:* likely — checked: classic-asp/shop/member.asp:9-11, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The DELETE statement concatenates Request.QueryString("member_id") directly. No ownership verification is present in the shown code.
1111
+
1112
+ ### BOLA-R-0004 — BOLA in GET /classic-asp/shop/order.asp: missing owner verification
1113
+
1114
+ - **Severity / confidence:** high / medium
1115
+ - **Status:** likely
1116
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1117
+ - **Endpoint:** ANY /classic-asp/shop/order.asp
1118
+ - **Location:** `classic-asp/shop/order.asp:5`
1119
+
1120
+ **Evidence.**
1121
+
1122
+ - `classic-asp/shop/order.asp:5` — The order id is taken from the request and the order is fetched without scoping to the current user.
1123
+ `id = Request("id")
1124
+ Set rs = conn.Execute("SELECT * FROM orders WHERE id = " & id)
1125
+ Response.Write Server.HTMLEncode(rs("address"))`
1126
+
1127
+ **Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
1128
+
1129
+ *Verifier:* likely — checked: classic-asp/shop/order.asp:5-7, classic-asp/shop/order.asp:12-13, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The first SELECT retrieves the order by id without scoping to the current user and its result is output. The later scoped query is not used for output.
1130
+
1131
+ ### BOLA-R-0005 — BOLA in GET /coldfusion/app/OrderService.cfc?method=getOrder: missing owner verification
1132
+
1133
+ - **Severity / confidence:** high / medium
1134
+ - **Status:** likely
1135
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1136
+ - **Endpoint:** ANY /coldfusion/app/OrderService.cfc?method=getOrder
1137
+ - **Location:** `coldfusion/app/OrderService.cfc:4`
1138
+
1139
+ **Evidence.**
1140
+
1141
+ - `coldfusion/app/OrderService.cfc:4` — The order id is taken from the request argument and the query is executed without scoping to the current user.
1142
+ `<cfquery name="q" datasource="shop">
1143
+ SELECT * FROM orders WHERE id = #arguments.orderId#
1144
+ </cfquery>`
1145
+
1146
+ **Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
1147
+
1148
+ *Verifier:* likely — checked: coldfusion/app/OrderService.cfc:4-6. The query interpolates #arguments.orderId# directly. No ownership check or parameter binding is visible.
1149
+
1150
+ ### BOLA-R-0006 — BOLA in GET /coldfusion/app/order.cfm: missing owner verification
1151
+
1152
+ - **Severity / confidence:** high / medium
1153
+ - **Status:** likely
1154
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1155
+ - **Endpoint:** ANY /coldfusion/app/order.cfm
1156
+ - **Location:** `coldfusion/app/order.cfm:2`
1157
+
1158
+ **Evidence.**
1159
+
1160
+ - `coldfusion/app/order.cfm:2` — The order id is taken from the URL and the query is executed without scoping to the current user.
1161
+ `<cfquery name="qOrder" datasource="shop">
1162
+ SELECT * FROM orders WHERE id = #url.id#
1163
+ </cfquery>`
1164
+
1165
+ **Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
1166
+
1167
+ *Verifier:* likely — checked: coldfusion/app/order.cfm:2-4, coldfusion/app/order.cfm:5-9. The unscoped query qOrder uses #url.id# and its result is displayed. The scoped query qMine is not used for output.
1168
+
1169
+ ### BOLA-R-0007 — BOLA in POST /Admin/DeleteUser: missing owner verification
1170
+
1171
+ - **Severity / confidence:** high / medium
1172
+ - **Status:** likely
1173
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1174
+ - **Endpoint:** POST /Admin/DeleteUser
1175
+ - **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:12`
1176
+
1177
+ **Evidence.**
1178
+
1179
+ - `dotnet-legacy/Web/Controllers/AdminController.cs:12` — Any authenticated user can delete any user because there is no ownership or role check.
1180
+ `public ActionResult DeleteUser(int id)
1181
+ {
1182
+ var u = db.Users.Find(id);
1183
+ db.Users.Remove(u);
1184
+ db.SaveChanges();
1185
+ return RedirectToAction("Index");
1186
+ }`
1187
+
1188
+ **Recommendation.** Restrict this action to administrators only or add an ownership check that ensures the target user is not the current user.
1189
+
1190
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 6-12. The controller is marked with [Authorize] but no role or ownership check is visible in the provided code. The absence of a role check is not confirmed, so the finding is likely.
1191
+
1192
+ ### BOLA-R-0009 — BOLA in GET /Admin/Export: missing owner verification
1193
+
1194
+ - **Severity / confidence:** high / medium
1195
+ - **Status:** likely
1196
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1197
+ - **Endpoint:** POST /Admin/Export
1198
+ - **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:32`
1199
+
1200
+ **Evidence.**
1201
+
1202
+ - `dotnet-legacy/Web/Controllers/AdminController.cs:32` — The endpoint is not protected by a role check; any authenticated user can retrieve all users by setting isAdmin=true.
1203
+ `if (Request.QueryString["isAdmin"] == "true")
1204
+ {
1205
+ return Json(db.Users.ToList(), JsonRequestBehavior.AllowGet);
1206
+ }`
1207
+
1208
+ **Recommendation.** Add an [Authorize(Roles="Admin")] attribute or remove the isAdmin query parameter and enforce role checks server‑side.
1209
+
1210
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 30-36. The Export action relies solely on a query‑string flag and lacks any role or ownership guard in the visible code.
1211
+
1212
+ ### BOLA-R-0010 — BOLA in POST /Customer/Edit: missing owner verification
1213
+
1214
+ - **Severity / confidence:** high / medium
1215
+ - **Status:** likely
1216
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1217
+ - **Endpoint:** POST /Customer/Edit
1218
+ - **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:12`
1219
+
1220
+ **Evidence.**
1221
+
1222
+ - `dotnet-legacy/Web/Controllers/CustomerController.cs:14` — Marks the supplied customer entity as modified without checking that the current user owns it
1223
+ `db.Entry(customer).State = System.Data.Entity.EntityState.Modified;`
1224
+
1225
+ **Recommendation.** Ensure the current user is the owner of the customer before applying changes
1226
+
1227
+ *Verifier:* likely — checked: Reviewed CustomerController.cs lines 11-16. No ownership check, cast, or allow‑list is visible in the method body.
1228
+
1229
+ ### BOLA-R-0011 — BOLA in POST /Customer/EditName: missing owner verification
1230
+
1231
+ - **Severity / confidence:** high / medium
1232
+ - **Status:** likely
1233
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1234
+ - **Endpoint:** POST /Customer/EditName
1235
+ - **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:20`
1236
+
1237
+ **Evidence.**
1238
+
1239
+ - `dotnet-legacy/Web/Controllers/CustomerController.cs:22` — Saves the customer entity without verifying that the current user owns it
1240
+ `db.SaveChanges();`
1241
+
1242
+ **Recommendation.** Add an ownership check before saving the customer entity
1243
+
1244
+ *Verifier:* likely — checked: Reviewed CustomerController.cs lines 20-23. The method only calls SaveChanges(); no ownership verification is shown.
1245
+
1246
+ ### BOLA-R-0012 — BOLA in POST /Customer/Refresh: missing owner verification
1247
+
1248
+ - **Severity / confidence:** high / medium
1249
+ - **Status:** likely
1250
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1251
+ - **Endpoint:** POST /Customer/Refresh
1252
+ - **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:27`
1253
+
1254
+ **Evidence.**
1255
+
1256
+ - `dotnet-legacy/Web/Controllers/CustomerController.cs:29` — Loads a customer by ID without checking that the current user owns it
1257
+ `var customer = db.Customers.Find(id);`
1258
+
1259
+ **Recommendation.** Verify ownership before updating the customer record
1260
+
1261
+ *Verifier:* likely — checked: Reviewed CustomerController.cs lines 27-32. Customer is loaded by id and updated without any ownership check in the visible code.
1262
+
1263
+ ### BOLA-R-0013 — BOLA in GET /Invoice/Details: missing owner verification
1264
+
1265
+ - **Severity / confidence:** high / medium
1266
+ - **Status:** likely
1267
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1268
+ - **Endpoint:** ANY /Invoice/Details
1269
+ - **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:11`
1270
+
1271
+ **Evidence.**
1272
+
1273
+ - `dotnet-legacy/Web/Controllers/InvoiceController.cs:11` — The invoice is fetched by id without scoping to the current user.
1274
+ `public ActionResult Details(int id)
1275
+ {
1276
+ var inv = db.Invoices.Find(id);
1277
+ return View(inv);
1278
+ }`
1279
+
1280
+ **Recommendation.** Add a WHERE clause that binds the invoice id to the current session user before returning data.
1281
+
1282
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs lines 11-15. Details retrieves an invoice by id without scoping to the current user; no ownership check is shown.
1283
+
1284
+ ### BOLA-R-0015 — BOLA in POST /Invoice/Search: missing owner verification
1285
+
1286
+ - **Severity / confidence:** high / medium
1287
+ - **Status:** likely
1288
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1289
+ - **Endpoint:** POST /Invoice/Search
1290
+ - **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:26`
1291
+
1292
+ **Evidence.**
1293
+
1294
+ - `dotnet-legacy/Web/Controllers/InvoiceController.cs:26` — The query is built from user input and returns all invoices for the given customer without scoping to the current user.
1295
+ `public ActionResult Search(string customer)
1296
+ {
1297
+ var list = db.Database.SqlQuery<Invoice>("SELECT * FROM Invoices WHERE Customer = '" + customer + "'").ToList();
1298
+ return View(list);
1299
+ }`
1300
+
1301
+ **Recommendation.** Add a WHERE clause that binds the customer to the current session user or use parameterized queries with ownership checks.
1302
+
1303
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs lines 26-30. The Search action builds a raw SQL query from user input and does not enforce ownership or parameter binding.
1304
+
1305
+ ### BOLA-R-0016 — BOLA in ANY /dotnet-legacy/Web/Handlers/GetFile.ashx: missing owner verification
1306
+
1307
+ - **Severity / confidence:** high / medium
1308
+ - **Status:** likely
1309
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1310
+ - **Endpoint:** ANY /dotnet-legacy/Web/Handlers/GetFile.ashx
1311
+ - **Location:** `dotnet-legacy/Web/Handlers/GetFile.ashx:8`
1312
+
1313
+ **Evidence.**
1314
+
1315
+ - `dotnet-legacy/Web/Handlers/GetFile.ashx:8` — Accepts a file identifier from the request without verifying that the current user owns the file
1316
+ `string fileId = context.Request.QueryString["file_id"];`
1317
+ - `dotnet-legacy/Web/Handlers/GetFile.ashx:10` — Serves the file directly after path resolution, allowing arbitrary file access
1318
+ `context.Response.TransmitFile(path);`
1319
+
1320
+ **Recommendation.** Add an ownership check to ensure the current user is authorized to download the requested file
1321
+
1322
+ *Verifier:* likely — checked: Reviewed GetFile.ashx lines 8-10. File ID is taken directly from the query string and used to transmit a file; no ownership guard is present.
1323
+
1324
+ ### BOLA-R-0017 — BOLA in POST /dotnet-legacy/Web/Orders/EditOrder.aspx: missing owner verification
1325
+
1326
+ - **Severity / confidence:** high / medium
1327
+ - **Status:** likely
1328
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1329
+ - **Endpoint:** ANY /dotnet-legacy/Web/Orders/EditOrder.aspx
1330
+ - **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7`
1331
+
1332
+ **Evidence.**
1333
+
1334
+ - `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` — The OrderId is taken from a hidden field and used directly in the UPDATE without verifying that the order belongs to the current user.
1335
+ `Dim sql As String = "UPDATE Orders SET Note = '" & txtNote.Text & "'"
1336
+ sql &= " WHERE OrderId = " & hfOrderId.Value
1337
+ Using conn As New SqlConnection(ConnStr)
1338
+ Dim cmd As New SqlCommand(sql, conn)
1339
+ conn.Open()
1340
+ cmd.ExecuteNonQuery()
1341
+ End Using`
1342
+
1343
+ **Recommendation.** Add an ownership check that ensures the OrderId belongs to the current session user before executing the UPDATE.
1344
+
1345
+ *Verifier:* likely — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb lines 7-13. The UPDATE statement uses a hidden field value directly; no ownership verification is visible.
1346
+
1347
+ ### BOLA-R-0018 — BOLA in GET /dotnet-legacy/Web/Orders/OrderDetail.aspx: missing owner verification
1348
+
1349
+ - **Severity / confidence:** high / medium
1350
+ - **Status:** likely
1351
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1352
+ - **Endpoint:** ANY /dotnet-legacy/Web/Orders/OrderDetail.aspx
1353
+ - **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10`
1354
+
1355
+ **Evidence.**
1356
+
1357
+ - `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10` — The first query fetches the order by id without scoping to the current user; the safe query is never used.
1358
+ `string id = Request.QueryString["id"];
1359
+ using (var conn = new SqlConnection(ConnStr))
1360
+ {
1361
+ var cmd = new SqlCommand("SELECT * FROM Orders WHERE OrderId = " + id, conn);
1362
+ conn.Open();
1363
+ var r = cmd.ExecuteReader();
1364
+ var safe = new SqlCommand("SELECT * FROM Orders WHERE OrderId = @id AND UserId = @uid", conn);`
1365
+
1366
+ **Recommendation.** Replace the first query with a query that includes a WHERE clause binding OrderId to the current session user.
1367
+
1368
+ *Verifier:* likely — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs lines 10-22. No ownership or role check is visible in the provided code. The first query uses the raw id from the query string without scoping to the current user, and the safe query is never executed.
1369
+
1370
+ ### BOLA-R-0019 — BOLA in GET /java-legacy/WebContent/order/detail.jsp: missing owner verification
1371
+
1372
+ - **Severity / confidence:** high / medium
1373
+ - **Status:** likely
1374
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1375
+ - **Endpoint:** ANY /java-legacy/WebContent/order/detail.jsp
1376
+ - **Location:** `java-legacy/WebContent/order/detail.jsp:3`
1377
+
1378
+ **Evidence.**
1379
+
1380
+ - `java-legacy/WebContent/order/detail.jsp:3` — The order number is taken from the request and used directly in the SELECT without scoping to the current user.
1381
+ `String no = request.getParameter("no");
1382
+ Connection c = (Connection) application.getAttribute("conn");
1383
+ ResultSet rs = c.createStatement().executeQuery("SELECT * FROM orders WHERE order_no = '" + no + "'");`
1384
+
1385
+ **Recommendation.** Add a WHERE clause that binds the order number to the current session user before returning data.
1386
+
1387
+ *Verifier:* likely — checked: java-legacy/WebContent/order/detail.jsp lines 1-6. The order number is concatenated directly into the SQL statement with no ownership check or parameter binding shown.
1388
+
1389
+ ### BOLA-R-0020 — BOLA in POST /account/save: missing owner verification
1390
+
1391
+ - **Severity / confidence:** high / medium
1392
+ - **Status:** likely
1393
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1394
+ - **Endpoint:** POST /account/save
1395
+ - **Location:** `java-legacy/src/com/acme/web/AccountController.java:13`
1396
+
1397
+ **Evidence.**
1398
+
1399
+ - `java-legacy/src/com/acme/web/AccountController.java:13` — The account ID comes from the request body and is persisted without checking that the current user owns the account.
1400
+ `accountDao.save(account);`
1401
+
1402
+ **Recommendation.** Add an ownership check that the current user owns the account before saving.
1403
+
1404
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 13-15. The account is saved without checking that the current session user owns the account; no ownership or role check is visible.
1405
+
1406
+ ### BOLA-R-0021 — BOLA in POST /account/rename: missing owner verification
1407
+
1408
+ - **Severity / confidence:** high / medium
1409
+ - **Status:** likely
1410
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1411
+ - **Endpoint:** POST /account/rename
1412
+ - **Location:** `java-legacy/src/com/acme/web/AccountController.java:19`
1413
+
1414
+ **Evidence.**
1415
+
1416
+ - `java-legacy/src/com/acme/web/AccountController.java:19` — The account ID is taken from the form and renamed without verifying ownership.
1417
+ `accountDao.rename(form.getId(), form.getName());`
1418
+
1419
+ **Recommendation.** Verify that the current user owns the account before performing the rename.
1420
+
1421
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 19-21. The rename operation uses the id from the form without verifying ownership or applying a role check.
1422
+
1423
+ ### BOLA-R-0022 — BOLA in PUT /account/api: missing owner verification
1424
+
1425
+ - **Severity / confidence:** high / medium
1426
+ - **Status:** likely
1427
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1428
+ - **Endpoint:** PUT /account/api
1429
+ - **Location:** `java-legacy/src/com/acme/web/AccountController.java:25`
1430
+
1431
+ **Evidence.**
1432
+
1433
+ - `java-legacy/src/com/acme/web/AccountController.java:25` — The account ID is supplied in the request body and persisted without checking that the current user owns it.
1434
+ `return accountDao.save(account);`
1435
+
1436
+ **Recommendation.** Add an ownership check before saving the account.
1437
+
1438
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 25-28. No ownership or role check is visible in the update method; the account is persisted directly from the request body.
1439
+
1440
+ ### BOLA-R-0023 — BOLA in POST /admin/users/{id}/delete: missing owner verification
1441
+
1442
+ - **Severity / confidence:** high / medium
1443
+ - **Status:** likely
1444
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1445
+ - **Endpoint:** POST /admin/users/{id}/delete
1446
+ - **Location:** `java-legacy/src/com/acme/web/AdminUserController.java:13`
1447
+
1448
+ **Evidence.**
1449
+
1450
+ - `java-legacy/src/com/acme/web/AdminUserController.java:13` — No role or ownership check; any authenticated user can delete any user.
1451
+ `userDao.deleteById(id);`
1452
+
1453
+ **Recommendation.** Require an admin role and verify that the target user is not the current user before deletion.
1454
+
1455
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/AdminUserController.java lines 13-15. The delete action lacks any @PreAuthorize or explicit ownership check; the only role guard appears on a different method.
1456
+
1457
+ ### BOLA-R-0025 — BOLA in GET /invoices/{id}: missing owner verification
1458
+
1459
+ - **Severity / confidence:** high / medium
1460
+ - **Status:** likely
1461
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1462
+ - **Endpoint:** GET /invoices/{id}
1463
+ - **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:15`
1464
+
1465
+ **Evidence.**
1466
+
1467
+ - `java-legacy/src/com/acme/web/InvoiceController.java:15` — The invoice ID is taken from the URL and the invoice is returned without checking that it belongs to the current user.
1468
+ `model.addAttribute("invoice", invoiceDao.findById(id));`
1469
+
1470
+ **Recommendation.** Add an ownership check that the invoice belongs to the current user before returning it.
1471
+
1472
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/InvoiceController.java lines 15-18. The invoice is retrieved by ID without verifying that it belongs to the current user.
1473
+
1474
+ ### BOLA-R-0027 — BOLA in GET /invoices/search: missing owner verification
1475
+
1476
+ - **Severity / confidence:** high / medium
1477
+ - **Status:** likely
1478
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1479
+ - **Endpoint:** GET /invoices/search
1480
+ - **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:27`
1481
+
1482
+ **Evidence.**
1483
+
1484
+ - `java-legacy/src/com/acme/web/InvoiceController.java:27` — The customer value is supplied by the user and the query returns invoices for any customer, exposing all invoices.
1485
+ `session.createQuery("from Invoice i where i.customer = '" + customer + "'").list();`
1486
+
1487
+ **Recommendation.** Restrict the query to invoices owned by the current user or validate the customer against the current user.
1488
+
1489
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/InvoiceController.java lines 27-30. The search query concatenates user input directly; no ownership filter or parameter binding is present.
1490
+
1491
+ ### BOLA-R-0028 — BOLA in GET /order/view: missing owner verification
1492
+
1493
+ - **Severity / confidence:** high / medium
1494
+ - **Status:** likely
1495
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1496
+ - **Endpoint:** GET /order/view
1497
+ - **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:8`
1498
+
1499
+ **Evidence.**
1500
+
1501
+ - `java-legacy/src/com/acme/web/OrderServlet.java:8` — The order ID comes from the request and the order is fetched without verifying that it belongs to the logged‑in user.
1502
+ `ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
1503
+
1504
+ **Recommendation.** Add an ownership check that the order belongs to the current user before returning it.
1505
+
1506
+ *Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java lines 11-15. The order is fetched by ID from the request without any check that the logged‑in user owns it.
1507
+
1508
+ ### BOLA-R-0029 — BOLA in POST /ProfileServlet: missing owner verification
1509
+
1510
+ - **Severity / confidence:** high / medium
1511
+ - **Status:** likely
1512
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1513
+ - **Endpoint:** POST <see web.xml servlet-mapping>
1514
+ - **Location:** `java-legacy/src/com/acme/web/ProfileServlet.java:9`
1515
+
1516
+ **Evidence.**
1517
+
1518
+ - `java-legacy/src/com/acme/web/ProfileServlet.java:12` — Populates an Account object from request parameters without checking that the current user owns the account
1519
+ `BeanUtils.populate(account, request.getParameterMap());`
1520
+
1521
+ **Recommendation.** Verify that the current user is authorized to modify the account before persisting changes
1522
+
1523
+ *Verifier:* likely — checked: Reviewed ProfileServlet.java lines 9-13. Account object is populated from request parameters without any ownership validation in the shown code.
1524
+
1525
+ ### BOLA-R-0030 — BOLA in POST /admin/users/:id/delete: missing owner verification
1526
+
1527
+ - **Severity / confidence:** high / medium
1528
+ - **Status:** likely
1529
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1530
+ - **Endpoint:** POST /admin/users/:id/delete
1531
+ - **Location:** `node-express/routes/admin.js:8`
1532
+
1533
+ **Evidence.**
1534
+
1535
+ - `node-express/routes/admin.js:8` — Only a logged‑in user is required; no role or ownership check, so any authenticated user can delete any user.
1536
+ `User.deleteOne({ _id: req.params.id }, function () { res.sendStatus(204); });`
1537
+
1538
+ **Recommendation.** Require an admin role and verify that the target user is not the current user before deletion.
1539
+
1540
+ *Verifier:* likely — checked: node-express/routes/admin.js:8-10. The route handler only checks that a user is logged in via `ensureLoggedIn`. No role check (`requireAdmin`) or ownership verification is present in the visible code. Therefore a compensating control is not observable.
1541
+
1542
+ ### BOLA-R-0033 — BOLA in GET /orders/:id: missing owner verification
1543
+
1544
+ - **Severity / confidence:** high / medium
1545
+ - **Status:** likely
1546
+ - **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
1547
+ - **Endpoint:** GET /orders/:id
1548
+ - **Location:** `node-express/routes/orders.js:8`
1549
+
1550
+ **Evidence.**
1551
+
1552
+ - `node-express/routes/orders.js:8` — The order ID comes from the request and is used without checking that the order belongs to the authenticated user.
1553
+ `Order.findById(req.params.id, function (err, order) { res.json(order); });`
1554
+
1555
+ **Recommendation.** Add an ownership check by filtering on the authenticated user’s ID or by loading the order and verifying its owner before returning it.
1556
+
1557
+ *Verifier:* likely — checked: node-express/routes/orders.js:8-10. The handler retrieves an order by ID without filtering on the authenticated user. No ownership check or role guard is visible in the provided snippet.
1558
+
1559
+ ### BOLA-R-0043 — BOLA in ANY /perl-cgi/cgi-bin/order.cgi: missing owner verification
1560
+
1561
+ - **Severity / confidence:** high / medium
1562
+ - **Status:** likely
1563
+ - **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
1564
+ - **Endpoint:** ANY /perl-cgi/cgi-bin/order.cgi
1565
+ - **Location:** `perl-cgi/cgi-bin/order.cgi:13`
1566
+
1567
+ **Evidence.**
1568
+
1569
+ - `perl-cgi/cgi-bin/order.cgi:13` — The order ID is taken directly from the request and the query does not constrain the result to the authenticated user.
1570
+ `$sth = $dbh->prepare("SELECT * FROM orders WHERE id = $id");`
1571
+
1572
+ **Recommendation.** Modify the query to include a user_id filter or verify the owner after fetching the record.
1573
+
1574
+ *Verifier:* likely — checked: perl-cgi/cgi-bin/order.cgi:13-15. The first prepared statement selects `orders` solely by `id` and is executed immediately. Although a second query later includes `user_id`, the initial query is still vulnerable. No ownership guard is present in the shown code.
1575
+
1576
+ ### BOLA-R-0044 — BOLA in ANY /invoice/view/{id}: missing owner verification
1577
+
1578
+ - **Severity / confidence:** high / medium
1579
+ - **Status:** likely
1580
+ - **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
1581
+ - **Endpoint:** ANY /invoice/view/{id}
1582
+ - **Location:** `php-codeigniter/application/controllers/Invoice.php:10`
1583
+
1584
+ **Evidence.**
1585
+
1586
+ - `php-codeigniter/application/controllers/Invoice.php:10` — The invoice ID is taken from the request and the query does not restrict to the authenticated user’s invoices.
1587
+ `$q = $this->db->query("SELECT * FROM invoices WHERE id = $id");`
1588
+
1589
+ **Recommendation.** Add a WHERE clause that includes the current user’s ID or load the invoice and compare its owner before returning it.
1590
+
1591
+ *Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:10-12. The `view` method runs a raw query against `invoices` using the supplied `id` without scoping to the current user. No ownership check is visible.
1592
+
1593
+ ### BOLA-R-0046 — BOLA in ANY /invoice/update: missing owner verification
1594
+
1595
+ - **Severity / confidence:** high / medium
1596
+ - **Status:** likely
1597
+ - **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
1598
+ - **Endpoint:** ANY /invoice/update
1599
+ - **Location:** `php-codeigniter/application/controllers/Invoice.php:23`
1600
+
1601
+ **Evidence.**
1602
+
1603
+ - `php-codeigniter/application/controllers/Invoice.php:23` — The invoice ID is taken from the request and the update statement does not verify that the invoice belongs to the authenticated user.
1604
+ `$this->db->query("UPDATE invoices SET note = ? WHERE id = ?", array($note, $id));`
1605
+
1606
+ **Recommendation.** Include the authenticated user’s ID in the WHERE clause or verify ownership before performing the update.
1607
+
1608
+ *Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:23-24. The `update` method updates an invoice by `id` without verifying that the invoice belongs to the authenticated user. No ownership guard is present in the snippet.
1609
+
1610
+ ### BOLA-R-0057-1 — BOLA in GET /account/rename: missing owner verification
1611
+
1612
+ - **Severity / confidence:** high / medium
1613
+ - **Status:** likely
1614
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1615
+ - **Endpoint:** GET /account/rename
1616
+ - **Location:** `php-plain/admin.php:7`
1617
+
1618
+ **Evidence.**
1619
+
1620
+ - `php-plain/admin.php:7` — Object ID comes from the request
1621
+ `$uid = (int)$_GET['uid'];`
1622
+ - `php-plain/admin.php:8` — Query does not restrict by current user
1623
+ `$r = mysql_query("SELECT * FROM users WHERE id = " . $uid);`
1624
+
1625
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership after fetching the record
1626
+
1627
+ *Verifier:* likely — checked: php-plain/admin.php lines 5-9, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The code shows a direct lookup of a user by id from the request with no ownership or role check. No global filter or other control is visible in the provided context.
1628
+
1629
+ ### BOLA-R-0057-2 — BOLA in POST /account/rename: missing owner verification
1630
+
1631
+ - **Severity / confidence:** high / medium
1632
+ - **Status:** likely
1633
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1634
+ - **Endpoint:** POST /account/rename
1635
+ - **Location:** `php-plain/admin.php:6`
1636
+
1637
+ **Evidence.**
1638
+
1639
+ - `php-plain/admin.php:11` — Object ID comes from the request
1640
+ `$id = $_POST['id'];`
1641
+ - `php-plain/admin.php:12` — Delete query does not restrict by current user
1642
+ `mysql_query("DELETE FROM users WHERE id = $id");`
1643
+
1644
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
1645
+
1646
+ *Verifier:* likely — checked: php-plain/admin.php lines 10-13, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The delete action uses the id from the request without any ownership or role verification. No compensating control is shown.
1647
+
1648
+ ### BOLA-R-0058-1 — BOLA in POST /account/rename: missing owner verification
1649
+
1650
+ - **Severity / confidence:** high / medium
1651
+ - **Status:** likely
1652
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1653
+ - **Endpoint:** POST /account/rename
1654
+ - **Location:** `php-plain/admin.php:11`
1655
+
1656
+ **Evidence.**
1657
+
1658
+ - `php-plain/admin.php:11` — Object ID comes from the request
1659
+ `$id = $_POST['id'];`
1660
+ - `php-plain/admin.php:12` — Delete query does not restrict by current user
1661
+ `mysql_query("DELETE FROM users WHERE id = $id");`
1662
+
1663
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
1664
+
1665
+ *Verifier:* likely — checked: php-plain/admin.php lines 10-13, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. Same as BOLA-R-0057-2: no ownership or role check is present in the visible code.
1666
+
1667
+ ### BOLA-R-0059-1 — BOLA in POST /php-plain/manage_users.php: missing owner verification
1668
+
1669
+ - **Severity / confidence:** high / high
1670
+ - **Status:** confirmed
1671
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1672
+ - **Endpoint:** POST /php-plain/manage_users.php
1673
+ - **Location:** `php-plain/manage_users.php:5`
1674
+
1675
+ **Evidence.**
1676
+
1677
+ - `php-plain/manage_users.php:5` — Object ID comes from the request
1678
+ `if ($_SERVER['REQUEST_METHOD'] === 'POST') {`
1679
+ - `php-plain/manage_users.php:6` — Query does not restrict by current user
1680
+ `$stmt = $db->prepare("DELETE FROM users WHERE id = ?");`
1681
+
1682
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
1683
+
1684
+ *Verifier:* confirmed — checked: php-plain/manage_users.php:5-8. The POST handler deletes a user by id without any role or ownership check. The only role check is in the HTML link, not in the request handling code.
1685
+
1686
+ ### BOLA-R-0061-1 — BOLA in GET /php-plain/order_detail.php: missing owner verification
1687
+
1688
+ - **Severity / confidence:** high / high
1689
+ - **Status:** confirmed
1690
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1691
+ - **Endpoint:** GET /php-plain/order_detail.php
1692
+ - **Location:** `php-plain/order_detail.php:5`
1693
+
1694
+ **Evidence.**
1695
+
1696
+ - `php-plain/order_detail.php:5` — Object ID comes from the request
1697
+ `$id = $_GET['id'];`
1698
+ - `php-plain/order_detail.php:6` — Query does not restrict by current user
1699
+ `$res = mysql_query("SELECT * FROM orders WHERE id = " . $id);`
1700
+
1701
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership after fetching the record
1702
+
1703
+ *Verifier:* confirmed — checked: php-plain/order_detail.php:5-6. The query selects an order by id without scoping to the current user and no ownership check is present.
1704
+
1705
+ ### BOLA-R-0066-1 — BOLA in POST /php-plain/admin/delete_user.php: missing owner verification
1706
+
1707
+ - **Severity / confidence:** high / medium
1708
+ - **Status:** likely
1709
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1710
+ - **Endpoint:** POST /php-plain/admin/delete_user.php
1711
+ - **Location:** `php-plain/admin/delete_user.php:5`
1712
+
1713
+ **Evidence.**
1714
+
1715
+ - `php-plain/admin/delete_user.php:5` — Object ID comes from the request
1716
+ `$id = (int)$_POST['id'];`
1717
+ - `php-plain/admin/delete_user.php:6` — Query does not restrict by current user
1718
+ `$stmt = $db->prepare("DELETE FROM users WHERE id = ?");`
1719
+
1720
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
1721
+
1722
+ *Verifier:* likely — checked: php-plain/admin/delete_user.php lines 5-7, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The delete query uses a bound parameter but does not restrict by the current user. No ownership or role check is visible.
1723
+
1724
+ ### BOLA-R-0067-1 — BOLA in POST /php-plain/admin/promote.php: missing owner verification
1725
+
1726
+ - **Severity / confidence:** high / medium
1727
+ - **Status:** likely
1728
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1729
+ - **Endpoint:** POST /php-plain/admin/promote.php
1730
+ - **Location:** `php-plain/admin/promote.php:5`
1731
+
1732
+ **Evidence.**
1733
+
1734
+ - `php-plain/admin/promote.php:5` — Object ID comes from the request
1735
+ `if ($_POST['is_admin'] == '1') {`
1736
+ - `php-plain/admin/promote.php:6` — Query does not restrict by current user
1737
+ `$stmt = $db->prepare("UPDATE users SET role = 'admin' WHERE id = ?");`
1738
+
1739
+ **Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before role change
1740
+
1741
+ *Verifier:* likely — checked: php-plain/admin/promote.php lines 5-7, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The promotion logic checks a request parameter but does not verify that the requester owns the target user or has an admin role. No compensating control is shown.
1742
+
1743
+ ### BOLA-R-0069-1 — BOLA in GET /orders/<int:order_id>: missing owner verification
1744
+
1745
+ - **Severity / confidence:** high / high
1746
+ - **Status:** confirmed
1747
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1748
+ - **Endpoint:** GET /orders/<int:order_id>
1749
+ - **Location:** `python-flask/app.py:12`
1750
+
1751
+ **Evidence.**
1752
+
1753
+ - `python-flask/app.py:12` — Query does not restrict by current user
1754
+ `cur.execute("SELECT * FROM orders WHERE id = %s" % order_id)`
1755
+
1756
+ **Recommendation.** Add a WHERE clause that binds the user ID to the current_user.id or verify ownership after fetching the record
1757
+
1758
+ *Verifier:* confirmed — checked: python-flask/app.py:8-13. The route '/orders/<int:order_id>' retrieves an order by id without filtering by user_id. The only ownership check is in the '/orders/mine/<int:order_id>' route.
1759
+
1760
+ ### BOLA-R-0073 — BOLA in POST /users/<int:uid>/name: missing owner verification
1761
+
1762
+ - **Severity / confidence:** high / high
1763
+ - **Status:** confirmed
1764
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1765
+ - **Endpoint:** POST /users/<int:uid>/name
1766
+ - **Location:** `python-flask/profile.py:16`
1767
+
1768
+ **Evidence.**
1769
+
1770
+ - `python-flask/profile.py:18` — Loads the target user by ID without checking that the current user owns the record
1771
+ `user = User.query.get(uid)`
1772
+
1773
+ **Recommendation.** Verify that the current user owns the user record before allowing a name change
1774
+
1775
+ *Verifier:* confirmed — checked: python-flask/profile.py lines 16-20. The function loads a User by uid and updates the name without any ownership check or role verification. No compensating control is present in the visible code.
1776
+
1777
+ ### BOLA-R-0074 — BOLA in PATCH /users/<int:uid>: missing owner verification
1778
+
1779
+ - **Severity / confidence:** high / high
1780
+ - **Status:** confirmed
1781
+ - **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
1782
+ - **Endpoint:** PATCH /users/<int:uid>
1783
+ - **Location:** `python-flask/profile.py:24`
1784
+
1785
+ **Evidence.**
1786
+
1787
+ - `python-flask/profile.py:26` — Loads the target user by ID without verifying ownership
1788
+ `user = User.query.get(uid)`
1789
+
1790
+ **Recommendation.** Add an ownership check before applying updates to the user record
1791
+
1792
+ *Verifier:* confirmed — checked: python-flask/profile.py lines 24-30. The function loads a User by uid and applies arbitrary updates without verifying that the current user owns the record. No compensating control is present in the visible code.
1793
+
1794
+ ### MASS-M-0009-1 — Team owner_id is writable via mass assignment
1795
+
1796
+ - **Severity / confidence:** high / high
1797
+ - **Status:** confirmed
1798
+ - **Category:** mass_assignment (privileged_field_writable) — CWE-915
1799
+ - **Endpoint:** - -
1800
+ - **Location:** `php-laravel/app/Http/Controllers/AccountController.php:23`
1801
+
1802
+ **Impact.** Any authenticated user can set the owner_id of a Team, effectively taking ownership of any team.
1803
+
1804
+ **Evidence.**
1805
+
1806
+ - `php-laravel/app/Http/Controllers/AccountController.php:23` — Whole object binding: Team::create($request->all());
1807
+ - `php-laravel/app/Models/Team.php:8` — fillable includes privileged field owner_id
1808
+
1809
+ **Recommendation.** Remove owner_id from $fillable or set it server‑side after validating ownership.
1810
+
1811
+ *Verifier:* confirmed — checked: php-laravel/app/Http/Controllers/AccountController.php: lines 21-24, php-laravel/app/Models/Team.php: line 8. Team::create($request->all()) uses the model’s $fillable which includes the privileged field owner_id, allowing an attacker to set ownership.
1812
+
1813
+ ### BOLA-R-0052-verdict — Missing ownership check at php-laravel/routes/web.php:6 (from auditor verdict)
1814
+
1815
+ - **Severity / confidence:** medium / medium
1816
+ - **Status:** likely
1817
+ - **Category:** bola (missing_ownership_check) — CWE-284
1818
+ - **Endpoint:** POST /register
1819
+ - **Location:** `php-laravel/routes/web.php:6`
1820
+
1821
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1822
+
1823
+ **Evidence.**
1824
+
1825
+ - `php-laravel/routes/web.php:6` — The auditor judged this route 'needs_review' but wrote no finding
1826
+
1827
+ **Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
1828
+
1829
+ *Verifier:* likely — checked: php-laravel/routes/web.php line 6. The route definition does not show any ownership or role check. No ownership verification is visible in the provided code context.
1830
+
1831
+ ### BOLA-R-0053-verdict — Missing ownership check at php-laravel/routes/web.php:7 (from auditor verdict)
1832
+
1833
+ - **Severity / confidence:** medium / medium
1834
+ - **Status:** likely
1835
+ - **Category:** bola (missing_ownership_check) — CWE-284
1836
+ - **Endpoint:** POST /posts
1837
+ - **Location:** `php-laravel/routes/web.php:7`
1838
+
1839
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1840
+
1841
+ **Evidence.**
1842
+
1843
+ - `php-laravel/routes/web.php:7` — The auditor judged this route 'needs_review' but wrote no finding
1844
+
1845
+ **Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
1846
+
1847
+ *Verifier:* likely — checked: php-laravel/routes/web.php line 7. The route definition does not contain any ownership or role check. No ownership verification is visible in the provided code context.
1848
+
1849
+ ### BOLA-R-0054-verdict — Missing ownership check at php-laravel/routes/web.php:8 (from auditor verdict)
1850
+
1851
+ - **Severity / confidence:** medium / medium
1852
+ - **Status:** likely
1853
+ - **Category:** bola (missing_ownership_check) — CWE-284
1854
+ - **Endpoint:** POST /teams
1855
+ - **Location:** `php-laravel/routes/web.php:8`
1856
+
1857
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1858
+
1859
+ **Evidence.**
1860
+
1861
+ - `php-laravel/routes/web.php:8` — The auditor judged this route 'needs_review' but wrote no finding
1862
+
1863
+ **Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
1864
+
1865
+ *Verifier:* likely — checked: php-laravel/routes/web.php line 8. The route definition does not contain any ownership or role check. No ownership verification is visible in the provided code context.
1866
+
1867
+ ### BOLA-R-0055-verdict — Missing ownership check at php-laravel/routes/web.php:9 (from auditor verdict)
1868
+
1869
+ - **Severity / confidence:** medium / medium
1870
+ - **Status:** likely
1871
+ - **Category:** bola (missing_ownership_check) — CWE-284
1872
+ - **Endpoint:** POST /account/rename
1873
+ - **Location:** `php-laravel/routes/web.php:9`
1874
+
1875
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1876
+
1877
+ **Evidence.**
1878
+
1879
+ - `php-laravel/routes/web.php:9` — The auditor judged this route 'needs_review' but wrote no finding
1880
+
1881
+ **Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
1882
+
1883
+ *Verifier:* likely — checked: php-laravel/routes/web.php:6-9. The route definition is shown, but the controller implementation is not visible in the provided context, so ownership checks cannot be confirmed or denied.
1884
+
1885
+ ### BOLA-R-0056-verdict — Missing ownership check at php-laravel/routes/web.php:10 (from auditor verdict)
1886
+
1887
+ - **Severity / confidence:** medium / medium
1888
+ - **Status:** likely
1889
+ - **Category:** bola (missing_ownership_check) — CWE-284
1890
+ - **Endpoint:** POST /account/profile
1891
+ - **Location:** `php-laravel/routes/web.php:10`
1892
+
1893
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1894
+
1895
+ **Evidence.**
1896
+
1897
+ - `php-laravel/routes/web.php:10` — The auditor judged this route 'needs_review' but wrote no finding
1898
+
1899
+ **Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
1900
+
1901
+ *Verifier:* likely — checked: php-laravel/routes/web.php:6-10. Only the route definition is visible; the controller logic that might enforce ownership is not shown.
1902
+
1903
+ ### MASS-M-0001-verdict — Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:12 (from auditor verdict)
1904
+
1905
+ - **Severity / confidence:** medium / medium
1906
+ - **Status:** likely
1907
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1908
+ - **Endpoint:** - -
1909
+ - **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:12`
1910
+
1911
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1912
+
1913
+ **Evidence.**
1914
+
1915
+ - `dotnet-legacy/Web/Controllers/CustomerController.cs:12` — The auditor judged this candidate 'needs_review' but wrote no finding
1916
+
1917
+ **Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
1918
+
1919
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/CustomerController.cs:12-15. The Edit action accepts a Customer model and marks it Modified without any [Bind] include or ownership check in the snippet. The [Authorize] attribute only ensures authentication, not ownership.
1920
+
1921
+ ### MASS-M-0002-verdict — Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:30 (from auditor verdict)
1922
+
1923
+ - **Severity / confidence:** medium / medium
1924
+ - **Status:** likely
1925
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1926
+ - **Endpoint:** - -
1927
+ - **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:30`
1928
+
1929
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
1930
+
1931
+ **Evidence.**
1932
+
1933
+ - `dotnet-legacy/Web/Controllers/CustomerController.cs:30` — The auditor judged this candidate 'needs_review' but wrote no finding
1934
+
1935
+ **Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
1936
+
1937
+ *Verifier:* likely — checked: dotnet-legacy/Web/Controllers/CustomerController.cs: lines 26-31. The code shows a mass assignment via TryUpdateModel(customer) but no ownership or role check, integer cast, or allow‑list is visible in the provided snippet.
1938
+
1939
+ ### MASS-M-0006-1 — Unknown model fields in whole object binding
1940
+
1941
+ - **Severity / confidence:** medium / high
1942
+ - **Status:** confirmed
1943
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1944
+ - **Endpoint:** - -
1945
+ - **Location:** `node-express/routes/profile.js:8`
1946
+
1947
+ **Impact.** Unable to determine if privileged fields are writable.
1948
+
1949
+ **Evidence.**
1950
+
1951
+ - `node-express/routes/profile.js:8` — Location taken from the Tier 1 inventory
1952
+
1953
+ **Recommendation.** Review the User model definition and ensure privileged fields are not mass‑assignable.
1954
+
1955
+ *Verifier:* confirmed — checked: node-express/routes/profile.js: lines 7-9. User.findByIdAndUpdate(req.user._id, req.body, ...) performs a whole‑object bind with no allow‑list or ownership check.
1956
+
1957
+ ### MASS-M-0007-1 — Unknown model fields in whole object binding
1958
+
1959
+ - **Severity / confidence:** medium / high
1960
+ - **Status:** confirmed
1961
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1962
+ - **Endpoint:** - -
1963
+ - **Location:** `node-express/routes/profile.js:16`
1964
+
1965
+ **Impact.** Unable to determine if privileged fields are writable.
1966
+
1967
+ **Evidence.**
1968
+
1969
+ - `node-express/routes/profile.js:16` — Location taken from the Tier 1 inventory
1970
+
1971
+ **Recommendation.** Review the User model definition and ensure privileged fields are not mass‑assignable.
1972
+
1973
+ *Verifier:* confirmed — checked: node-express/routes/profile.js: lines 16-17. new User(req.body) followed by user.save() allows all fields from the request to be persisted without filtering.
1974
+
1975
+ ### MASS-M-0008-1 — Unknown model fields in whole object binding
1976
+
1977
+ - **Severity / confidence:** medium / medium
1978
+ - **Status:** likely
1979
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1980
+ - **Endpoint:** - -
1981
+ - **Location:** `php-laravel/app/Http/Controllers/AccountController.php:13`
1982
+
1983
+ **Impact.** Unable to determine if privileged fields are writable due to missing field list.
1984
+
1985
+ **Evidence.**
1986
+
1987
+ - `php-laravel/app/Http/Controllers/AccountController.php:13` — Whole object binding: User::create($request->all());
1988
+
1989
+ **Recommendation.** Inspect the User model to confirm which fields are mass‑assignable and restrict privileged ones.
1990
+
1991
+ *Verifier:* likely — checked: php-laravel/app/Http/Controllers/AccountController.php: line 13. The User model definition is not shown; therefore it is unclear whether privileged fields are protected by $fillable/$guarded.
1992
+
1993
+ ### MASS-M-0010-1 — Unknown model fields in whole object binding
1994
+
1995
+ - **Severity / confidence:** medium / medium
1996
+ - **Status:** likely
1997
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
1998
+ - **Endpoint:** - -
1999
+ - **Location:** `php-laravel/app/Http/Controllers/AccountController.php:36`
2000
+
2001
+ **Impact.** Unable to determine if privileged fields are writable.
2002
+
2003
+ **Evidence.**
2004
+
2005
+ - `php-laravel/app/Http/Controllers/AccountController.php:23` — Whole object binding: Team::create($request->all());
2006
+
2007
+ **Recommendation.** Review the Team model definition and ensure privileged fields are not mass‑assignable.
2008
+
2009
+ *Verifier:* likely — checked: AccountController.php: lines 18-23 (team creation), AccountController.php: lines 36-37 (profile update). The controller performs whole‑object binding via $request->all() but the model’s $fillable/$guarded definition is not shown. No visible field whitelist or ownership check is present in the provided code.
2010
+
2011
+ ### MASS-M-0011-verdict — Mass assignment at php-plain/profile.php:6 (from auditor verdict)
2012
+
2013
+ - **Severity / confidence:** medium / medium
2014
+ - **Status:** likely
2015
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
2016
+ - **Endpoint:** - -
2017
+ - **Location:** `php-plain/profile.php:6`
2018
+
2019
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
2020
+
2021
+ **Evidence.**
2022
+
2023
+ - `php-plain/profile.php:6` — The auditor judged this candidate 'needs_review' but wrote no finding
2024
+
2025
+ **Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
2026
+
2027
+ *Verifier:* likely — checked: php-plain/profile.php:6-8. The code iterates over $_POST and assigns each field to the user object without any allow‑list or ownership check. The included auth.php only verifies login, not ownership.
2028
+
2029
+ ### MASS-M-0012-verdict — Mass assignment at php-plain/profile.php:10 (from auditor verdict)
2030
+
2031
+ - **Severity / confidence:** medium / medium
2032
+ - **Status:** likely
2033
+ - **Category:** mass_assignment (privileged_field_writable) — CWE-915
2034
+ - **Endpoint:** - -
2035
+ - **Location:** `php-plain/profile.php:10`
2036
+
2037
+ **Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
2038
+
2039
+ **Evidence.**
2040
+
2041
+ - `php-plain/profile.php:10` — The auditor judged this candidate 'needs_review' but wrote no finding
2042
+
2043
+ **Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
2044
+
2045
+ *Verifier:* likely — checked: php-plain/profile.php:10. The assignment of $_POST['role'] to $user->role occurs without any guard or allow‑list in the visible code.
2046
+
2047
+ ### MASS-M-0014-1 — Unknown model fields in whole object binding
2048
+
2049
+ - **Severity / confidence:** medium / medium
2050
+ - **Status:** likely
2051
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
2052
+ - **Endpoint:** - -
2053
+ - **Location:** `python-flask/profile.py:10`
2054
+
2055
+ **Impact.** Unable to determine if privileged fields are writable.
2056
+
2057
+ **Evidence.**
2058
+
2059
+ - `python-flask/profile.py:10` — Location taken from the Tier 1 inventory
2060
+
2061
+ **Recommendation.** Use a DTO or explicit field mapping to prevent mass assignment of privileged fields.
2062
+
2063
+ *Verifier:* likely — checked: profile.py: lines 8-12 (POST route creating User with **request.json). The constructor receives all JSON fields directly; no field filtering or guard is shown in the provided code.
2064
+
2065
+ ### MASS-M-0015-1 — Unknown model fields in whole object binding
2066
+
2067
+ - **Severity / confidence:** medium / medium
2068
+ - **Status:** likely
2069
+ - **Category:** mass_assignment (whole_object_binding) — CWE-915
2070
+ - **Endpoint:** - -
2071
+ - **Location:** `python-flask/profile.py:27`
2072
+
2073
+ **Impact.** Unable to determine if privileged fields are writable.
2074
+
2075
+ **Evidence.**
2076
+
2077
+ - `python-flask/profile.py:27` — Location taken from the Tier 1 inventory
2078
+
2079
+ **Recommendation.** Validate and whitelist request fields before setting attributes.
2080
+
2081
+ *Verifier:* likely — checked: profile.py: lines 24-29 (PATCH route with setattr loop). All JSON keys are set on the user object without any whitelist or guard. No compensating control is visible in the snippet.
2082
+
2083
+ ## 4. Systemic fixes
2084
+
2085
+ <!-- LLM: reporter agent writes max 5 systemic fixes here -->
2086
+
2087
+ ## 5. Coverage and limitations
2088
+
2089
+ - missing from inventory: 0
2090
+ - bola routes without verdict: 0
2091
+ - injection candidates without verdict: 0
2092
+ - bfla routes without verdict: 0
2093
+ - mass candidates without verdict: 0
2094
+ - findings without verification: 0
2095
+
2096
+ <!-- LLM: reporter agent lists limitations here -->
2097
+
2098
+ ## Appendix A — Findings rejected by the verifier
2099
+
2100
+ | ID | Location | Reason |
2101
+ |---|---|---|
2102
+ | INJ-I-0005 | `classic-asp/shop/order.asp:12` | The query includes an ownership check by binding the user_id to the session value and casts the sid to a long, preventing injection and ensuring the user can only access their own orders. |
2103
+ | MASS-M-0013-1 | `php-plain/register.php:4` | The code does not bind all POST values to a model; it explicitly inserts only email, name, and role columns. The evidence claiming whole‑object binding is incorrect. |
2104
+
2105
+ ## Appendix B — Method
2106
+
2107
+ 1. Deterministic pre-scan (stack detection, endpoint candidates, query-building candidates).
2108
+ 2. AI agents: auth-model extraction, route inventory, BOLA audit, injection audit.
2109
+ 3. Independent AI verifier tries to refute each finding.
2110
+ 4. Human review and sign-off (`review-log.md`).
2111
+
2112
+ This is not a penetration test. Absence of findings does not prove absence of vulnerabilities.