@hoanghainh/komagu 2.5.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 (197) hide show
  1. package/CHANGELOG.md +17 -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/operate/ai/client.py +22 -9
  192. package/operate/ai/runner.py +4 -2
  193. package/operate/cli/__init__.py +1 -1
  194. package/operate/cli/commands/scan.py +8 -1
  195. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  196. package/operate/tests/test_ai_route_inventory.py +53 -0
  197. package/package.json +1 -1
@@ -0,0 +1,477 @@
1
+ {
2
+ "batch_id": "routes-004",
3
+ "findings": [
4
+ {
5
+ "finding_id": "BOLA-R-0057",
6
+ "category": "bola",
7
+ "subtype": "missing_ownership_check",
8
+ "title": "BOLA in GET|POST /php-plain/admin.php?action=view: missing owner verification",
9
+ "route_id": "R-0057",
10
+ "endpoint": {
11
+ "method": "GET|POST",
12
+ "path": "/php-plain/admin.php?action=view"
13
+ },
14
+ "location": {
15
+ "file": "php-plain/admin.php",
16
+ "start_line": 6
17
+ },
18
+ "evidence": [
19
+ {
20
+ "file": "php-plain/admin.php",
21
+ "start_line": 7,
22
+ "code": "$uid = (int)$_GET['uid'];\\n$r = mysql_query('SELECT * FROM users WHERE id = ' . $uid);",
23
+ "why": "ID comes from request; query selects user by id without checking current user ownership",
24
+ "line": 7
25
+ }
26
+ ],
27
+ "severity": "high",
28
+ "confidence": "high",
29
+ "cwe": [
30
+ "CWE-284",
31
+ "CWE-639"
32
+ ],
33
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the user record before allowing access or modification.",
34
+ "status": "unverified",
35
+ "attack_vector": {
36
+ "target_param": "uid"
37
+ }
38
+ },
39
+ {
40
+ "finding_id": "BOLA-R-0058",
41
+ "category": "bola",
42
+ "subtype": "missing_ownership_check",
43
+ "title": "BOLA in POST /php-plain/admin.php?action=delete: missing owner verification",
44
+ "route_id": "R-0058",
45
+ "endpoint": {
46
+ "method": "POST",
47
+ "path": "/php-plain/admin.php?action=delete"
48
+ },
49
+ "location": {
50
+ "file": "php-plain/admin.php",
51
+ "start_line": 10
52
+ },
53
+ "evidence": [
54
+ {
55
+ "file": "php-plain/admin.php",
56
+ "start_line": 11,
57
+ "code": "$id = $_POST['id'];\\nmysql_query('DELETE FROM users WHERE id = ' . $id);",
58
+ "why": "ID comes from request; delete query runs without checking current user ownership",
59
+ "line": 11
60
+ }
61
+ ],
62
+ "severity": "high",
63
+ "confidence": "high",
64
+ "cwe": [
65
+ "CWE-284",
66
+ "CWE-639"
67
+ ],
68
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the user record before allowing deletion.",
69
+ "status": "unverified",
70
+ "attack_vector": {
71
+ "target_param": "uid"
72
+ }
73
+ },
74
+ {
75
+ "finding_id": "BOLA-R-0066",
76
+ "category": "bola",
77
+ "subtype": "missing_ownership_check",
78
+ "title": "BOLA in POST /php-plain/admin/delete_user.php: missing owner verification",
79
+ "route_id": "R-0066",
80
+ "endpoint": {
81
+ "method": "POST",
82
+ "path": "/php-plain/admin/delete_user.php"
83
+ },
84
+ "location": {
85
+ "file": "php-plain/admin/delete_user.php",
86
+ "start_line": 5
87
+ },
88
+ "evidence": [
89
+ {
90
+ "file": "php-plain/admin/delete_user.php",
91
+ "start_line": 5,
92
+ "code": "$id = (int)$_POST['id'];\\n$stmt = $db->prepare('DELETE FROM users WHERE id = ?');\\n$stmt->execute(array($id));",
93
+ "why": "ID comes from request; delete query runs without checking current user ownership",
94
+ "line": 5
95
+ }
96
+ ],
97
+ "severity": "high",
98
+ "confidence": "high",
99
+ "cwe": [
100
+ "CWE-284",
101
+ "CWE-639"
102
+ ],
103
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the user record before allowing deletion.",
104
+ "status": "unverified",
105
+ "attack_vector": {
106
+ "target_param": "id"
107
+ }
108
+ },
109
+ {
110
+ "finding_id": "BOLA-R-0067",
111
+ "category": "bola",
112
+ "subtype": "missing_ownership_check",
113
+ "title": "BOLA in POST /php-plain/admin/promote.php: missing owner verification",
114
+ "route_id": "R-0067",
115
+ "endpoint": {
116
+ "method": "POST",
117
+ "path": "/php-plain/admin/promote.php"
118
+ },
119
+ "location": {
120
+ "file": "php-plain/admin/promote.php",
121
+ "start_line": 5
122
+ },
123
+ "evidence": [
124
+ {
125
+ "file": "php-plain/admin/promote.php",
126
+ "start_line": 5,
127
+ "code": "if ($_POST['is_admin'] == '1') {\\n $stmt = $db->prepare('UPDATE users SET role = 'admin' WHERE id = ?');\\n $stmt->execute(array((int)$_POST['uid']));\\n}",
128
+ "why": "ID comes from request; update query runs without checking current user ownership",
129
+ "line": 5
130
+ }
131
+ ],
132
+ "severity": "high",
133
+ "confidence": "high",
134
+ "cwe": [
135
+ "CWE-284",
136
+ "CWE-639"
137
+ ],
138
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the user record before allowing role changes.",
139
+ "status": "unverified",
140
+ "attack_vector": {
141
+ "target_param": "uid"
142
+ }
143
+ },
144
+ {
145
+ "finding_id": "BOLA-R-0059",
146
+ "category": "bola",
147
+ "subtype": "missing_ownership_check",
148
+ "title": "BOLA in POST /php-plain/manage_users.php: missing owner verification",
149
+ "route_id": "R-0059",
150
+ "endpoint": {
151
+ "method": "POST",
152
+ "path": "/php-plain/manage_users.php"
153
+ },
154
+ "location": {
155
+ "file": "php-plain/manage_users.php",
156
+ "start_line": 5
157
+ },
158
+ "evidence": [
159
+ {
160
+ "file": "php-plain/manage_users.php",
161
+ "start_line": 5,
162
+ "code": "$stmt = $db->prepare('DELETE FROM users WHERE id = ?');\\n$stmt->execute(array((int)$_POST['id']));",
163
+ "why": "ID comes from request; delete query runs without checking current user ownership",
164
+ "line": 5
165
+ }
166
+ ],
167
+ "severity": "high",
168
+ "confidence": "high",
169
+ "cwe": [
170
+ "CWE-284",
171
+ "CWE-639"
172
+ ],
173
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the user record before allowing deletion.",
174
+ "status": "unverified",
175
+ "attack_vector": {
176
+ "target_param": "id"
177
+ }
178
+ },
179
+ {
180
+ "finding_id": "BOLA-R-0061",
181
+ "category": "bola",
182
+ "subtype": "missing_ownership_check",
183
+ "title": "BOLA in GET /php-plain/order_detail.php: missing owner verification",
184
+ "route_id": "R-0061",
185
+ "endpoint": {
186
+ "method": "GET",
187
+ "path": "/php-plain/order_detail.php"
188
+ },
189
+ "location": {
190
+ "file": "php-plain/order_detail.php",
191
+ "start_line": 5
192
+ },
193
+ "evidence": [
194
+ {
195
+ "file": "php-plain/order_detail.php",
196
+ "start_line": 5,
197
+ "code": "$id = $_GET['id'];\\n$res = mysql_query('SELECT * FROM orders WHERE id = ' . $id);\\n$order = mysql_fetch_assoc($res);",
198
+ "why": "ID comes from request; query selects order by id without checking current user ownership",
199
+ "line": 5
200
+ }
201
+ ],
202
+ "severity": "high",
203
+ "confidence": "high",
204
+ "cwe": [
205
+ "CWE-284",
206
+ "CWE-639"
207
+ ],
208
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the order before allowing access.",
209
+ "status": "unverified",
210
+ "attack_vector": {
211
+ "target_param": "id"
212
+ }
213
+ },
214
+ {
215
+ "finding_id": "BOLA-R-0069",
216
+ "category": "bola",
217
+ "subtype": "missing_ownership_check",
218
+ "title": "BOLA in GET /orders/<int:order_id>: missing owner verification",
219
+ "route_id": "R-0069",
220
+ "endpoint": {
221
+ "method": "GET",
222
+ "path": "/orders/<int:order_id>"
223
+ },
224
+ "location": {
225
+ "file": "python-flask/app.py",
226
+ "start_line": 8
227
+ },
228
+ "evidence": [
229
+ {
230
+ "file": "python-flask/app.py",
231
+ "start_line": 8,
232
+ "code": "@app.route('/orders/<int:order_id>')\\n@login_required\\ndef order(order_id):\\n cur = db.conn().cursor()\\n cur.execute(\"SELECT * FROM orders WHERE id = %s\" % order_id)\\n return jsonify(cur.fetchone())",
233
+ "why": "ID comes from request; query selects order by id without checking current user ownership",
234
+ "line": 8
235
+ }
236
+ ],
237
+ "severity": "high",
238
+ "confidence": "high",
239
+ "cwe": [
240
+ "CWE-284",
241
+ "CWE-639"
242
+ ],
243
+ "recommendation": "Add an ownership check that ensures the current user is the owner of the order before allowing access.",
244
+ "status": "unverified",
245
+ "attack_vector": {
246
+ "target_param": "order_id"
247
+ }
248
+ },
249
+ {
250
+ "finding_id": "BOLA-R-0055-verdict",
251
+ "category": "bola",
252
+ "subtype": "missing_ownership_check",
253
+ "title": "Missing ownership check at php-laravel/routes/web.php:9 (from auditor verdict)",
254
+ "route_id": "R-0055",
255
+ "location": {
256
+ "file": "php-laravel/routes/web.php",
257
+ "start_line": 9
258
+ },
259
+ "evidence": [
260
+ {
261
+ "file": "php-laravel/routes/web.php",
262
+ "line": 9,
263
+ "why": "The auditor judged this route 'needs_review' but wrote no finding"
264
+ }
265
+ ],
266
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
267
+ "severity": "medium",
268
+ "confidence": "low",
269
+ "cwe": [
270
+ "CWE-284"
271
+ ],
272
+ "recommendation": "Bind the object lookup to the current user or tenant, or check ownership before using it.",
273
+ "status": "unverified",
274
+ "endpoint": {
275
+ "method": "POST",
276
+ "path": "/account/rename"
277
+ },
278
+ "attack_vector": {
279
+ "target_param": "id"
280
+ }
281
+ },
282
+ {
283
+ "finding_id": "BOLA-R-0056-verdict",
284
+ "category": "bola",
285
+ "subtype": "missing_ownership_check",
286
+ "title": "Missing ownership check at php-laravel/routes/web.php:10 (from auditor verdict)",
287
+ "route_id": "R-0056",
288
+ "location": {
289
+ "file": "php-laravel/routes/web.php",
290
+ "start_line": 10
291
+ },
292
+ "evidence": [
293
+ {
294
+ "file": "php-laravel/routes/web.php",
295
+ "line": 10,
296
+ "why": "The auditor judged this route 'needs_review' but wrote no finding"
297
+ }
298
+ ],
299
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
300
+ "severity": "medium",
301
+ "confidence": "low",
302
+ "cwe": [
303
+ "CWE-284"
304
+ ],
305
+ "recommendation": "Bind the object lookup to the current user or tenant, or check ownership before using it.",
306
+ "status": "unverified",
307
+ "endpoint": {
308
+ "method": "POST",
309
+ "path": "/account/profile"
310
+ },
311
+ "attack_vector": {
312
+ "target_param": "id"
313
+ }
314
+ },
315
+ {
316
+ "finding_id": "BOLA-R-0052-verdict",
317
+ "category": "bola",
318
+ "subtype": "missing_ownership_check",
319
+ "title": "Missing ownership check at php-laravel/routes/web.php:6 (from auditor verdict)",
320
+ "route_id": "R-0052",
321
+ "location": {
322
+ "file": "php-laravel/routes/web.php",
323
+ "start_line": 6
324
+ },
325
+ "evidence": [
326
+ {
327
+ "file": "php-laravel/routes/web.php",
328
+ "line": 6,
329
+ "why": "The auditor judged this route 'needs_review' but wrote no finding"
330
+ }
331
+ ],
332
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
333
+ "severity": "medium",
334
+ "confidence": "low",
335
+ "cwe": [
336
+ "CWE-284"
337
+ ],
338
+ "recommendation": "Bind the object lookup to the current user or tenant, or check ownership before using it.",
339
+ "status": "unverified",
340
+ "endpoint": {
341
+ "method": "POST",
342
+ "path": "/register"
343
+ },
344
+ "attack_vector": {
345
+ "target_param": "id"
346
+ }
347
+ },
348
+ {
349
+ "finding_id": "BOLA-R-0053-verdict",
350
+ "category": "bola",
351
+ "subtype": "missing_ownership_check",
352
+ "title": "Missing ownership check at php-laravel/routes/web.php:7 (from auditor verdict)",
353
+ "route_id": "R-0053",
354
+ "location": {
355
+ "file": "php-laravel/routes/web.php",
356
+ "start_line": 7
357
+ },
358
+ "evidence": [
359
+ {
360
+ "file": "php-laravel/routes/web.php",
361
+ "line": 7,
362
+ "why": "The auditor judged this route 'needs_review' but wrote no finding"
363
+ }
364
+ ],
365
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
366
+ "severity": "medium",
367
+ "confidence": "low",
368
+ "cwe": [
369
+ "CWE-284"
370
+ ],
371
+ "recommendation": "Bind the object lookup to the current user or tenant, or check ownership before using it.",
372
+ "status": "unverified",
373
+ "endpoint": {
374
+ "method": "POST",
375
+ "path": "/posts"
376
+ },
377
+ "attack_vector": {
378
+ "target_param": "id"
379
+ }
380
+ },
381
+ {
382
+ "finding_id": "BOLA-R-0054-verdict",
383
+ "category": "bola",
384
+ "subtype": "missing_ownership_check",
385
+ "title": "Missing ownership check at php-laravel/routes/web.php:8 (from auditor verdict)",
386
+ "route_id": "R-0054",
387
+ "location": {
388
+ "file": "php-laravel/routes/web.php",
389
+ "start_line": 8
390
+ },
391
+ "evidence": [
392
+ {
393
+ "file": "php-laravel/routes/web.php",
394
+ "line": 8,
395
+ "why": "The auditor judged this route 'needs_review' but wrote no finding"
396
+ }
397
+ ],
398
+ "impact": "Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.",
399
+ "severity": "medium",
400
+ "confidence": "low",
401
+ "cwe": [
402
+ "CWE-284"
403
+ ],
404
+ "recommendation": "Bind the object lookup to the current user or tenant, or check ownership before using it.",
405
+ "status": "unverified",
406
+ "endpoint": {
407
+ "method": "POST",
408
+ "path": "/teams"
409
+ },
410
+ "attack_vector": {
411
+ "target_param": "id"
412
+ }
413
+ }
414
+ ],
415
+ "route_verdicts": [
416
+ {
417
+ "route_id": "R-0055",
418
+ "verdict": "needs_review"
419
+ },
420
+ {
421
+ "route_id": "R-0056",
422
+ "verdict": "needs_review"
423
+ },
424
+ {
425
+ "route_id": "R-0052",
426
+ "verdict": "needs_review"
427
+ },
428
+ {
429
+ "route_id": "R-0053",
430
+ "verdict": "needs_review"
431
+ },
432
+ {
433
+ "route_id": "R-0054",
434
+ "verdict": "needs_review"
435
+ },
436
+ {
437
+ "route_id": "R-0057",
438
+ "verdict": "vulnerable"
439
+ },
440
+ {
441
+ "route_id": "R-0058",
442
+ "verdict": "vulnerable"
443
+ },
444
+ {
445
+ "route_id": "R-0066",
446
+ "verdict": "vulnerable"
447
+ },
448
+ {
449
+ "route_id": "R-0067",
450
+ "verdict": "vulnerable"
451
+ },
452
+ {
453
+ "route_id": "R-0059",
454
+ "verdict": "vulnerable"
455
+ },
456
+ {
457
+ "route_id": "R-0061",
458
+ "verdict": "vulnerable"
459
+ },
460
+ {
461
+ "route_id": "R-0062",
462
+ "verdict": "safe"
463
+ },
464
+ {
465
+ "route_id": "R-0069",
466
+ "verdict": "vulnerable"
467
+ },
468
+ {
469
+ "route_id": "R-0070",
470
+ "verdict": "safe"
471
+ },
472
+ {
473
+ "route_id": "R-0071",
474
+ "verdict": "safe"
475
+ }
476
+ ]
477
+ }