@hoanghainh/komagu 2.5.0 → 2.6.1

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 (225) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
  3. package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
  4. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
  5. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
  6. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
  7. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
  8. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
  9. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
  10. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
  11. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
  12. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
  13. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
  14. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
  15. package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
  16. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
  17. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
  18. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
  19. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
  20. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
  21. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
  22. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
  23. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
  24. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
  25. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
  26. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
  27. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
  28. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
  29. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
  30. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
  31. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
  32. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
  33. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
  34. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
  35. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
  36. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
  37. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
  38. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
  39. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
  40. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
  41. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
  42. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
  43. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
  44. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
  45. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
  46. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
  47. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
  48. package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
  49. package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
  50. package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
  51. package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
  52. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
  53. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
  54. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
  55. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
  56. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
  57. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
  58. package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
  59. package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
  60. package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
  61. package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
  62. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
  63. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
  64. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
  65. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
  66. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
  67. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
  68. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
  69. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
  70. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
  71. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
  72. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
  73. package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
  74. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
  75. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
  76. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
  77. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
  78. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
  79. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
  80. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
  81. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
  82. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
  83. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
  84. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
  85. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
  86. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
  87. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
  88. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
  89. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
  90. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
  91. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
  92. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
  93. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
  94. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
  95. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
  96. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
  97. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
  98. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
  99. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
  100. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
  101. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
  102. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
  103. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
  104. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
  105. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
  106. package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
  107. package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
  108. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
  109. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
  110. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
  111. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
  112. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
  113. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
  114. package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
  115. package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
  116. package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
  117. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
  118. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
  119. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
  120. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
  121. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
  122. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
  123. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
  124. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
  125. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
  126. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
  127. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
  128. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
  129. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
  130. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
  131. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
  132. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
  133. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
  134. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
  135. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
  136. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
  137. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
  138. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
  139. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
  140. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
  141. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
  142. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
  143. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
  144. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
  145. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
  146. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
  147. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
  148. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
  149. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
  150. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
  151. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
  152. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
  153. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
  154. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
  155. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
  156. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
  157. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
  158. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
  159. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
  160. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
  161. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
  162. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
  163. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
  164. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
  165. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
  166. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
  167. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
  168. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
  169. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
  170. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
  171. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
  172. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
  173. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
  174. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
  175. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
  176. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
  177. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
  178. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
  179. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
  180. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
  181. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
  182. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
  183. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
  184. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
  185. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
  186. package/assess/lsa/scripts/laravel_routes.py +102 -0
  187. package/assess/lsa/scripts/map_routes.py +4 -1
  188. package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
  189. package/assess/lsa/tests/test_eval_run_6.py +104 -0
  190. package/assess/lsa/tests/test_laravel_routes.py +95 -0
  191. package/examples/member-portal/backend-dotnet/Auth/DemoAuthenticationHandler.cs +75 -0
  192. package/examples/member-portal/backend-dotnet/Program.cs +1 -72
  193. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/Application.kt +4 -0
  194. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/controller/Controllers.kt +3 -0
  195. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/model/Entities.kt +4 -0
  196. package/examples/member-portal/tests/test_d6_demo_app.py +4 -4
  197. package/examples/member-portal/tests/test_d6_remediation_verification.py +6 -6
  198. package/operate/ai/client.py +27 -10
  199. package/operate/ai/runner.py +4 -2
  200. package/operate/cli/__init__.py +1 -1
  201. package/operate/cli/commands/scan.py +8 -1
  202. package/operate/cross_user_tester/runner.py +4 -1
  203. package/operate/devsecops/sbom.py +12 -4
  204. package/operate/simulate/scenarios.py +11 -2
  205. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  206. package/operate/tests/test_ai_route_inventory.py +53 -0
  207. package/operate/tests/test_audit_minimum_versions.py +89 -0
  208. package/operate/tests/test_cli.py +1 -1
  209. package/operate/tests/test_scheme_and_xml_guards.py +67 -0
  210. package/package.json +1 -1
  211. package/remediate/authz/dotnet/src/Komagu.Security.Authorization/LoggingSecurityAuditSink.cs +19 -3
  212. package/remediate/authz/golang/authz_test.go +5 -2
  213. package/remediate/authz/spring/src/main/kotlin/io/komagu/security/authorization/DefaultKomaguSecurityManager.kt +74 -78
  214. package/remediate/authz/spring/src/main/kotlin/io/komagu/security/spring/OwnershipAspect.kt +129 -158
  215. package/remediate/deps/patcher.py +2 -1
  216. package/remediate/edge/mock-backend/app.py +2 -1
  217. package/remediate/edge/tests/test_edge_security.py +5 -5
  218. package/remediate/ekyc/requirements.txt +1 -1
  219. package/remediate/identity/dotnet/src/Komagu.Security.Identity/OidcServiceCollectionExtensions.cs +19 -6
  220. package/remediate/identity/python/requirements.txt +2 -2
  221. package/remediate/identity/spring/src/main/kotlin/io/komagu/security/identity/KomaguIdentityAutoConfiguration.kt +31 -38
  222. package/remediate/legacy_shims/tests/test_legacy_shims.py +8 -8
  223. package/remediate/query/dotnet/src/Komagu.Security.Query/SafeSortAllowList.cs +5 -2
  224. package/remediate/query/spring/src/main/kotlin/io/komagu/security/query/SafeSortAllowList.kt +10 -11
  225. package/remediate/query/spring/src/main/kotlin/io/komagu/security/query/detekt/StringBuiltSqlQueryRule.kt +19 -24
@@ -0,0 +1,332 @@
1
+ {
2
+ "batch_id": "routes-002",
3
+ "findings": [
4
+ {
5
+ "finding_id": "BOLA-R-0020",
6
+ "category": "bola",
7
+ "subtype": "missing_ownership_check",
8
+ "title": "BOLA in POST /account/save: missing owner verification",
9
+ "route_id": "R-0020",
10
+ "endpoint": {
11
+ "method": "POST",
12
+ "path": "/account/save"
13
+ },
14
+ "location": {
15
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
16
+ "start_line": 13
17
+ },
18
+ "evidence": [
19
+ {
20
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
21
+ "start_line": 13,
22
+ "code": "accountDao.save(account);",
23
+ "why": "The account ID comes from the request body and is persisted without checking that the current user owns the account.",
24
+ "line": 13
25
+ }
26
+ ],
27
+ "severity": "high",
28
+ "confidence": "high",
29
+ "cwe": [
30
+ "CWE-284",
31
+ "CWE-639"
32
+ ],
33
+ "recommendation": "Add an ownership check that the current user owns the account before saving.",
34
+ "status": "unverified",
35
+ "attack_vector": {
36
+ "target_param": "id"
37
+ }
38
+ },
39
+ {
40
+ "finding_id": "BOLA-R-0021",
41
+ "category": "bola",
42
+ "subtype": "missing_ownership_check",
43
+ "title": "BOLA in POST /account/rename: missing owner verification",
44
+ "route_id": "R-0021",
45
+ "endpoint": {
46
+ "method": "POST",
47
+ "path": "/account/rename"
48
+ },
49
+ "location": {
50
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
51
+ "start_line": 19
52
+ },
53
+ "evidence": [
54
+ {
55
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
56
+ "start_line": 19,
57
+ "code": "accountDao.rename(form.getId(), form.getName());",
58
+ "why": "The account ID is taken from the form and renamed without verifying ownership.",
59
+ "line": 19
60
+ }
61
+ ],
62
+ "severity": "high",
63
+ "confidence": "high",
64
+ "cwe": [
65
+ "CWE-284",
66
+ "CWE-639"
67
+ ],
68
+ "recommendation": "Verify that the current user owns the account before performing the rename.",
69
+ "status": "unverified",
70
+ "attack_vector": {
71
+ "target_param": "id"
72
+ }
73
+ },
74
+ {
75
+ "finding_id": "BOLA-R-0022",
76
+ "category": "bola",
77
+ "subtype": "missing_ownership_check",
78
+ "title": "BOLA in PUT /account/api: missing owner verification",
79
+ "route_id": "R-0022",
80
+ "endpoint": {
81
+ "method": "PUT",
82
+ "path": "/account/api"
83
+ },
84
+ "location": {
85
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
86
+ "start_line": 25
87
+ },
88
+ "evidence": [
89
+ {
90
+ "file": "java-legacy/src/com/acme/web/AccountController.java",
91
+ "start_line": 25,
92
+ "code": "return accountDao.save(account);",
93
+ "why": "The account ID is supplied in the request body and persisted without checking that the current user owns it.",
94
+ "line": 25
95
+ }
96
+ ],
97
+ "severity": "high",
98
+ "confidence": "high",
99
+ "cwe": [
100
+ "CWE-284",
101
+ "CWE-639"
102
+ ],
103
+ "recommendation": "Add an ownership check before saving the account.",
104
+ "status": "unverified",
105
+ "attack_vector": {
106
+ "target_param": "id"
107
+ }
108
+ },
109
+ {
110
+ "finding_id": "BOLA-R-0023",
111
+ "category": "bola",
112
+ "subtype": "missing_ownership_check",
113
+ "title": "BOLA in POST /admin/users/{id}/delete: missing owner verification",
114
+ "route_id": "R-0023",
115
+ "endpoint": {
116
+ "method": "POST",
117
+ "path": "/admin/users/{id}/delete"
118
+ },
119
+ "location": {
120
+ "file": "java-legacy/src/com/acme/web/AdminUserController.java",
121
+ "start_line": 13
122
+ },
123
+ "evidence": [
124
+ {
125
+ "file": "java-legacy/src/com/acme/web/AdminUserController.java",
126
+ "start_line": 13,
127
+ "code": "userDao.deleteById(id);",
128
+ "why": "No role or ownership check; any authenticated user can delete any user.",
129
+ "line": 13
130
+ }
131
+ ],
132
+ "severity": "high",
133
+ "confidence": "high",
134
+ "cwe": [
135
+ "CWE-284",
136
+ "CWE-639"
137
+ ],
138
+ "recommendation": "Require an admin role and verify that the target user is not the current user before deletion.",
139
+ "status": "unverified",
140
+ "attack_vector": {
141
+ "target_param": "id"
142
+ }
143
+ },
144
+ {
145
+ "finding_id": "BOLA-R-0025",
146
+ "category": "bola",
147
+ "subtype": "missing_ownership_check",
148
+ "title": "BOLA in GET /invoices/{id}: missing owner verification",
149
+ "route_id": "R-0025",
150
+ "endpoint": {
151
+ "method": "GET",
152
+ "path": "/invoices/{id}"
153
+ },
154
+ "location": {
155
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
156
+ "start_line": 15
157
+ },
158
+ "evidence": [
159
+ {
160
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
161
+ "start_line": 15,
162
+ "code": "model.addAttribute(\"invoice\", invoiceDao.findById(id));",
163
+ "why": "The invoice ID is taken from the URL and the invoice is returned without checking that it belongs to the current user.",
164
+ "line": 15
165
+ }
166
+ ],
167
+ "severity": "high",
168
+ "confidence": "high",
169
+ "cwe": [
170
+ "CWE-284",
171
+ "CWE-639"
172
+ ],
173
+ "recommendation": "Add an ownership check that the invoice belongs to the current user before returning it.",
174
+ "status": "unverified",
175
+ "attack_vector": {
176
+ "target_param": "id"
177
+ }
178
+ },
179
+ {
180
+ "finding_id": "BOLA-R-0027",
181
+ "category": "bola",
182
+ "subtype": "missing_ownership_check",
183
+ "title": "BOLA in GET /invoices/search: missing owner verification",
184
+ "route_id": "R-0027",
185
+ "endpoint": {
186
+ "method": "GET",
187
+ "path": "/invoices/search"
188
+ },
189
+ "location": {
190
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
191
+ "start_line": 27
192
+ },
193
+ "evidence": [
194
+ {
195
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
196
+ "start_line": 27,
197
+ "code": "session.createQuery(\"from Invoice i where i.customer = '\" + customer + \"'\").list();",
198
+ "why": "The customer value is supplied by the user and the query returns invoices for any customer, exposing all invoices.",
199
+ "line": 27
200
+ }
201
+ ],
202
+ "severity": "high",
203
+ "confidence": "high",
204
+ "cwe": [
205
+ "CWE-284",
206
+ "CWE-639"
207
+ ],
208
+ "recommendation": "Restrict the query to invoices owned by the current user or validate the customer against the current user.",
209
+ "status": "unverified"
210
+ },
211
+ {
212
+ "finding_id": "BOLA-R-0028",
213
+ "category": "bola",
214
+ "subtype": "missing_ownership_check",
215
+ "title": "BOLA in GET /order/view: missing owner verification",
216
+ "route_id": "R-0028",
217
+ "endpoint": {
218
+ "method": "GET",
219
+ "path": "/order/view"
220
+ },
221
+ "location": {
222
+ "file": "java-legacy/src/com/acme/web/OrderServlet.java",
223
+ "start_line": 8
224
+ },
225
+ "evidence": [
226
+ {
227
+ "file": "java-legacy/src/com/acme/web/OrderServlet.java",
228
+ "start_line": 8,
229
+ "code": "ResultSet rs = stmt.executeQuery(\"SELECT * FROM orders WHERE id = '\" + id + \"'\");",
230
+ "why": "The order ID comes from the request and the order is fetched without verifying that it belongs to the logged\u2011in user.",
231
+ "line": 8
232
+ }
233
+ ],
234
+ "severity": "high",
235
+ "confidence": "high",
236
+ "cwe": [
237
+ "CWE-284",
238
+ "CWE-639"
239
+ ],
240
+ "recommendation": "Add an ownership check that the order belongs to the current user before returning it.",
241
+ "status": "unverified",
242
+ "attack_vector": {
243
+ "target_param": "orderId"
244
+ }
245
+ },
246
+ {
247
+ "finding_id": "BOLA-R-0030",
248
+ "category": "bola",
249
+ "subtype": "missing_ownership_check",
250
+ "title": "BOLA in POST /admin/users/:id/delete: missing owner verification",
251
+ "route_id": "R-0030",
252
+ "endpoint": {
253
+ "method": "POST",
254
+ "path": "/admin/users/:id/delete"
255
+ },
256
+ "location": {
257
+ "file": "node-express/routes/admin.js",
258
+ "start_line": 8
259
+ },
260
+ "evidence": [
261
+ {
262
+ "file": "node-express/routes/admin.js",
263
+ "start_line": 8,
264
+ "code": "User.deleteOne({ _id: req.params.id }, function () { res.sendStatus(204); });",
265
+ "why": "Only a logged\u2011in user is required; no role or ownership check, so any authenticated user can delete any user.",
266
+ "line": 8
267
+ }
268
+ ],
269
+ "severity": "high",
270
+ "confidence": "high",
271
+ "cwe": [
272
+ "CWE-284",
273
+ "CWE-639"
274
+ ],
275
+ "recommendation": "Require an admin role and verify that the target user is not the current user before deletion.",
276
+ "status": "unverified",
277
+ "attack_vector": {
278
+ "target_param": "id"
279
+ }
280
+ }
281
+ ],
282
+ "route_verdicts": [
283
+ {
284
+ "route_id": "R-0020",
285
+ "verdict": "vulnerable"
286
+ },
287
+ {
288
+ "route_id": "R-0021",
289
+ "verdict": "vulnerable"
290
+ },
291
+ {
292
+ "route_id": "R-0022",
293
+ "verdict": "vulnerable"
294
+ },
295
+ {
296
+ "route_id": "R-0023",
297
+ "verdict": "vulnerable"
298
+ },
299
+ {
300
+ "route_id": "R-0024",
301
+ "verdict": "safe"
302
+ },
303
+ {
304
+ "route_id": "R-0025",
305
+ "verdict": "vulnerable"
306
+ },
307
+ {
308
+ "route_id": "R-0026",
309
+ "verdict": "safe"
310
+ },
311
+ {
312
+ "route_id": "R-0027",
313
+ "verdict": "vulnerable"
314
+ },
315
+ {
316
+ "route_id": "R-0028",
317
+ "verdict": "vulnerable"
318
+ },
319
+ {
320
+ "route_id": "R-0030",
321
+ "verdict": "vulnerable"
322
+ },
323
+ {
324
+ "route_id": "R-0031",
325
+ "verdict": "safe"
326
+ },
327
+ {
328
+ "route_id": "R-0032",
329
+ "verdict": "safe"
330
+ }
331
+ ]
332
+ }
@@ -0,0 +1,218 @@
1
+ {
2
+ "batch_id": "routes-003",
3
+ "findings": [
4
+ {
5
+ "finding_id": "BOLA-R-0033",
6
+ "category": "bola",
7
+ "subtype": "missing_ownership_check",
8
+ "title": "BOLA in GET /orders/:id: missing owner verification",
9
+ "route_id": "R-0033",
10
+ "endpoint": {
11
+ "method": "GET",
12
+ "path": "/orders/:id"
13
+ },
14
+ "location": {
15
+ "file": "node-express/routes/orders.js",
16
+ "start_line": 8
17
+ },
18
+ "evidence": [
19
+ {
20
+ "file": "node-express/routes/orders.js",
21
+ "start_line": 8,
22
+ "code": "Order.findById(req.params.id, function (err, order) { res.json(order); });",
23
+ "why": "The order ID comes from the request and is used without checking that the order belongs to the authenticated user.",
24
+ "line": 8
25
+ }
26
+ ],
27
+ "severity": "high",
28
+ "confidence": "high",
29
+ "cwe": [
30
+ "CWE-639",
31
+ "CWE-284"
32
+ ],
33
+ "recommendation": "Add an ownership check by filtering on the authenticated user\u2019s ID or by loading the order and verifying its owner before returning it.",
34
+ "status": "unverified",
35
+ "attack_vector": {
36
+ "target_param": "id"
37
+ }
38
+ },
39
+ {
40
+ "finding_id": "BOLA-R-0043",
41
+ "category": "bola",
42
+ "subtype": "missing_ownership_check",
43
+ "title": "BOLA in ANY /perl-cgi/cgi-bin/order.cgi: missing owner verification",
44
+ "route_id": "R-0043",
45
+ "endpoint": {
46
+ "method": "ANY",
47
+ "path": "/perl-cgi/cgi-bin/order.cgi"
48
+ },
49
+ "location": {
50
+ "file": "perl-cgi/cgi-bin/order.cgi",
51
+ "start_line": 13
52
+ },
53
+ "evidence": [
54
+ {
55
+ "file": "perl-cgi/cgi-bin/order.cgi",
56
+ "start_line": 13,
57
+ "code": "$sth = $dbh->prepare(\"SELECT * FROM orders WHERE id = $id\");",
58
+ "why": "The order ID is taken directly from the request and the query does not constrain the result to the authenticated user.",
59
+ "line": 13
60
+ }
61
+ ],
62
+ "severity": "high",
63
+ "confidence": "high",
64
+ "cwe": [
65
+ "CWE-639",
66
+ "CWE-284"
67
+ ],
68
+ "recommendation": "Modify the query to include a user_id filter or verify the owner after fetching the record.",
69
+ "status": "unverified",
70
+ "attack_vector": {
71
+ "target_param": "user_id"
72
+ }
73
+ },
74
+ {
75
+ "finding_id": "BOLA-R-0044",
76
+ "category": "bola",
77
+ "subtype": "missing_ownership_check",
78
+ "title": "BOLA in ANY /invoice/view/{id}: missing owner verification",
79
+ "route_id": "R-0044",
80
+ "endpoint": {
81
+ "method": "ANY",
82
+ "path": "/invoice/view/{id}"
83
+ },
84
+ "location": {
85
+ "file": "php-codeigniter/application/controllers/Invoice.php",
86
+ "start_line": 10
87
+ },
88
+ "evidence": [
89
+ {
90
+ "file": "php-codeigniter/application/controllers/Invoice.php",
91
+ "start_line": 10,
92
+ "code": "$q = $this->db->query(\"SELECT * FROM invoices WHERE id = $id\");",
93
+ "why": "The invoice ID is taken from the request and the query does not restrict to the authenticated user\u2019s invoices.",
94
+ "line": 10
95
+ }
96
+ ],
97
+ "severity": "high",
98
+ "confidence": "high",
99
+ "cwe": [
100
+ "CWE-639",
101
+ "CWE-284"
102
+ ],
103
+ "recommendation": "Add a WHERE clause that includes the current user\u2019s ID or load the invoice and compare its owner before returning it.",
104
+ "status": "unverified",
105
+ "attack_vector": {
106
+ "target_param": "id"
107
+ }
108
+ },
109
+ {
110
+ "finding_id": "BOLA-R-0046",
111
+ "category": "bola",
112
+ "subtype": "missing_ownership_check",
113
+ "title": "BOLA in ANY /invoice/update: missing owner verification",
114
+ "route_id": "R-0046",
115
+ "endpoint": {
116
+ "method": "ANY",
117
+ "path": "/invoice/update"
118
+ },
119
+ "location": {
120
+ "file": "php-codeigniter/application/controllers/Invoice.php",
121
+ "start_line": 23
122
+ },
123
+ "evidence": [
124
+ {
125
+ "file": "php-codeigniter/application/controllers/Invoice.php",
126
+ "start_line": 23,
127
+ "code": "$this->db->query(\"UPDATE invoices SET note = ? WHERE id = ?\", array($note, $id));",
128
+ "why": "The invoice ID is taken from the request and the update statement does not verify that the invoice belongs to the authenticated user.",
129
+ "line": 23
130
+ }
131
+ ],
132
+ "severity": "high",
133
+ "confidence": "high",
134
+ "cwe": [
135
+ "CWE-639",
136
+ "CWE-284"
137
+ ],
138
+ "recommendation": "Include the authenticated user\u2019s ID in the WHERE clause or verify ownership before performing the update.",
139
+ "status": "unverified",
140
+ "attack_vector": {
141
+ "target_param": "invoice_id"
142
+ }
143
+ }
144
+ ],
145
+ "route_verdicts": [
146
+ {
147
+ "route_id": "R-0033",
148
+ "verdict": "vulnerable"
149
+ },
150
+ {
151
+ "route_id": "R-0034",
152
+ "verdict": "safe",
153
+ "reason": "Ownership check is performed via owner field in the query."
154
+ },
155
+ {
156
+ "route_id": "R-0035",
157
+ "verdict": "safe",
158
+ "reason": "No user\u2011specific data accessed."
159
+ },
160
+ {
161
+ "route_id": "R-0036",
162
+ "verdict": "safe",
163
+ "reason": "Login endpoint, no data access."
164
+ },
165
+ {
166
+ "route_id": "R-0037",
167
+ "verdict": "safe",
168
+ "reason": "Search endpoint, no user\u2011specific data accessed."
169
+ },
170
+ {
171
+ "route_id": "R-0038",
172
+ "verdict": "safe",
173
+ "reason": "Stats endpoint, no user\u2011specific data accessed."
174
+ },
175
+ {
176
+ "route_id": "R-0043",
177
+ "verdict": "vulnerable"
178
+ },
179
+ {
180
+ "route_id": "R-0044",
181
+ "verdict": "vulnerable"
182
+ },
183
+ {
184
+ "route_id": "R-0045",
185
+ "verdict": "safe",
186
+ "reason": "Ownership check is performed via user_id in the query."
187
+ },
188
+ {
189
+ "route_id": "R-0046",
190
+ "verdict": "vulnerable"
191
+ },
192
+ {
193
+ "route_id": "R-0047",
194
+ "verdict": "safe",
195
+ "reason": "No user\u2011specific data accessed by ID."
196
+ },
197
+ {
198
+ "route_id": "R-0048",
199
+ "verdict": "safe",
200
+ "reason": "No user\u2011specific data accessed by ID."
201
+ },
202
+ {
203
+ "route_id": "R-0049",
204
+ "verdict": "safe",
205
+ "reason": "No user\u2011specific data accessed by ID."
206
+ },
207
+ {
208
+ "route_id": "R-0050",
209
+ "verdict": "safe",
210
+ "reason": "No user\u2011specific data accessed by ID."
211
+ },
212
+ {
213
+ "route_id": "R-0051",
214
+ "verdict": "safe",
215
+ "reason": "No user\u2011specific data accessed by ID."
216
+ }
217
+ ]
218
+ }