@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,141 @@
1
+ {
2
+ "batch_id": "verified-17",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "INJ-I-0035",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "high",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "python-flask/app.py:8 route definition",
12
+ "python-flask/app.py:12 SQL execution"
13
+ ],
14
+ "control_found": null,
15
+ "notes": "The route uses `<int:order_id>` which is a type hint. In Flask, this does not enforce strict integer casting at runtime (it passes the string to the function). The code then directly interpolates `order_id` into a SQL string using `%s`. No explicit cast or parameterized query wrapper is visible in the provided context.",
16
+ "consensus": {
17
+ "score": 0.95,
18
+ "agreement_level": "unanimous",
19
+ "voted_models": [
20
+ "gemini-2.0-pro",
21
+ "claude-3-7"
22
+ ],
23
+ "rationale": "Type hints in Python are not runtime enforcement for SQL injection prevention; direct string formatting is used."
24
+ },
25
+ "attack_vector": {
26
+ "method": "GET",
27
+ "path": "/orders/{id}",
28
+ "target_param": "order_id"
29
+ }
30
+ },
31
+ {
32
+ "finding_id": "INJ-I-0036",
33
+ "verdict": "confirmed",
34
+ "reason_code": "traced",
35
+ "severity": "critical",
36
+ "confidence": "high",
37
+ "checked": [
38
+ "python-flask/app.py:27 input retrieval",
39
+ "python-flask/app.py:29 SQL execution"
40
+ ],
41
+ "control_found": null,
42
+ "notes": "User input `q` is retrieved via `request.args.get`. It is directly interpolated into an f-string SQL query without any sanitization, allow-listing, or parameterized binding. The `@login_required` decorator only ensures authentication, not authorization against injection.",
43
+ "consensus": {
44
+ "score": 0.95,
45
+ "agreement_level": "unanimous",
46
+ "voted_models": [
47
+ "gemini-2.0-pro",
48
+ "claude-3-7"
49
+ ],
50
+ "rationale": "Direct f-string interpolation of user input into SQL is a confirmed vulnerability."
51
+ },
52
+ "attack_vector": {
53
+ "method": "GET",
54
+ "path": "/search?q={payload}",
55
+ "target_param": "q"
56
+ }
57
+ },
58
+ {
59
+ "finding_id": "INJ-I-0037",
60
+ "verdict": "confirmed",
61
+ "reason_code": "traced",
62
+ "severity": "critical",
63
+ "confidence": "high",
64
+ "checked": [
65
+ "sql-procs/sp_search_orders.sql:1 procedure definition",
66
+ "sql-procs/sp_search_orders.sql:5 SQL construction"
67
+ ],
68
+ "control_found": null,
69
+ "notes": "The stored procedure accepts `@Sort` as a string parameter. Line 5 concatenates this directly into the dynamic SQL string before execution on line 6. There is no allow-list validation or casting visible in the provided context.",
70
+ "consensus": {
71
+ "score": 0.95,
72
+ "agreement_level": "unanimous",
73
+ "voted_models": [
74
+ "gemini-2.0-pro",
75
+ "claude-3-7"
76
+ ],
77
+ "rationale": "Dynamic SQL construction using user-supplied parameters without validation is a confirmed critical flaw."
78
+ },
79
+ "attack_vector": {
80
+ "method": "EXECUTE",
81
+ "path": "sp_search_orders",
82
+ "target_param": "@Sort"
83
+ }
84
+ },
85
+ {
86
+ "finding_id": "INJ-I-0038",
87
+ "verdict": "confirmed",
88
+ "reason_code": "traced",
89
+ "severity": "critical",
90
+ "confidence": "high",
91
+ "checked": [
92
+ "sql-procs/sp_search_orders.sql:1 procedure definition",
93
+ "sql-procs/sp_search_orders.sql:5 SQL construction"
94
+ ],
95
+ "control_found": null,
96
+ "notes": "The stored procedure accepts `@Customer` as a string parameter. Line 5 concatenates this directly into the dynamic SQL string (`WHERE Customer = ''' + @Customer + '''`). There is no allow-list validation or parameterized query usage visible in the provided context.",
97
+ "consensus": {
98
+ "score": 0.95,
99
+ "agreement_level": "unanimous",
100
+ "voted_models": [
101
+ "gemini-2.0-pro",
102
+ "claude-3-7"
103
+ ],
104
+ "rationale": "Dynamic SQL construction using user-supplied parameters without validation is a confirmed critical flaw."
105
+ },
106
+ "attack_vector": {
107
+ "method": "EXECUTE",
108
+ "path": "sp_search_orders",
109
+ "target_param": "@Customer"
110
+ }
111
+ },
112
+ {
113
+ "finding_id": "BFLA-R-0003-1",
114
+ "verdict": "confirmed",
115
+ "reason_code": "traced",
116
+ "severity": "critical",
117
+ "confidence": "high",
118
+ "checked": [
119
+ "classic-asp/shop/member.asp:2 include auth.asp",
120
+ "classic-asp/shop/inc/auth.asp:2 role check logic",
121
+ "classic-asp/shop/member.asp:10 delete execution"
122
+ ],
123
+ "control_found": null,
124
+ "notes": "The included `auth.asp` (line 2 of member.asp) only checks if `Session(\"UserID\")` is empty. It does not verify a specific role (e.g., Admin). The `delete` action on line 10 executes without any subsequent role verification. An authenticated non-admin user can trigger this.",
125
+ "consensus": {
126
+ "score": 0.95,
127
+ "agreement_level": "unanimous",
128
+ "voted_models": [
129
+ "gemini-2.0-pro",
130
+ "claude-3-7"
131
+ ],
132
+ "rationale": "Authentication check is present but insufficient for authorization (role-based) on a privileged action."
133
+ },
134
+ "attack_vector": {
135
+ "method": "GET",
136
+ "path": "/classic-asp/shop/member.asp?mode=delete&member_id={id}",
137
+ "target_param": "member_id"
138
+ }
139
+ }
140
+ ]
141
+ }
@@ -0,0 +1,135 @@
1
+ {
2
+ "batch_id": "verified-18",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BFLA-R-0009-1",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "critical",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "dotnet-legacy/Web/Controllers/AdminController.cs lines 32-34"
12
+ ],
13
+ "control_found": null,
14
+ "notes": "The code explicitly checks `Request.QueryString[\"isAdmin\"] == \"true\"` to determine role. No server-side verification of the user's actual role from an authenticated identity object is present in the provided context. The logic relies entirely on client input.",
15
+ "consensus": {
16
+ "score": 1.0,
17
+ "agreement_level": "unanimous",
18
+ "voted_models": [
19
+ "gemini-2.0-pro",
20
+ "claude-3-7"
21
+ ],
22
+ "rationale": "Direct reliance on request parameter for role determination without server-side validation."
23
+ },
24
+ "attack_vector": {
25
+ "method": "POST",
26
+ "path": "/Admin/Export",
27
+ "target_param": "isAdmin"
28
+ }
29
+ },
30
+ {
31
+ "finding_id": "BFLA-R-0023-1",
32
+ "verdict": "confirmed",
33
+ "reason_code": "traced",
34
+ "severity": "critical",
35
+ "confidence": "high",
36
+ "checked": [
37
+ "java-legacy/src/com/acme/web/AdminUserController.java lines 7, 13, 15"
38
+ ],
39
+ "control_found": null,
40
+ "notes": "The `delete` method lacks the `@PreAuthorize(\"hasRole('ADMIN')\")` annotation present on the adjacent `grant` method. The code executes `userDao.deleteById(id)` immediately without any role check. While a global filter might exist in the framework (Spring Security), it is not visible in the provided code context, and the specific absence of the annotation on this privileged action confirms the finding.",
41
+ "consensus": {
42
+ "score": 1.0,
43
+ "agreement_level": "unanimous",
44
+ "voted_models": [
45
+ "gemini-2.0-pro",
46
+ "claude-3-7"
47
+ ],
48
+ "rationale": "Privileged action lacks specific authorization annotation while a similar privileged action nearby has one."
49
+ },
50
+ "attack_vector": {
51
+ "method": "POST",
52
+ "path": "/admin/users/{id}/delete",
53
+ "target_param": "id"
54
+ }
55
+ },
56
+ {
57
+ "finding_id": "BFLA-R-0057-1",
58
+ "verdict": "confirmed",
59
+ "reason_code": "traced",
60
+ "severity": "critical",
61
+ "confidence": "high",
62
+ "checked": [
63
+ "php-plain/admin.php lines 2, 8"
64
+ ],
65
+ "control_found": null,
66
+ "notes": "The file includes `inc/auth.php` which only checks for login (`$_SESSION['user_id']`). The `view` action executes a query to fetch all users (`SELECT * FROM users`) without verifying if the current user is an admin. No role check logic is visible in the provided context.",
67
+ "consensus": {
68
+ "score": 1.0,
69
+ "agreement_level": "unanimous",
70
+ "voted_models": [
71
+ "gemini-2.0-pro",
72
+ "claude-3-7"
73
+ ],
74
+ "rationale": "Included auth file explicitly documented as login-only; no role check found in the action logic."
75
+ },
76
+ "attack_vector": {
77
+ "method": "GET|POST",
78
+ "path": "/php-plain/admin.php?action=view",
79
+ "target_param": "uid"
80
+ }
81
+ },
82
+ {
83
+ "finding_id": "BFLA-R-0058-1",
84
+ "verdict": "confirmed",
85
+ "reason_code": "traced",
86
+ "severity": "critical",
87
+ "confidence": "high",
88
+ "checked": [
89
+ "php-plain/admin.php lines 2, 12"
90
+ ],
91
+ "control_found": null,
92
+ "notes": "The file includes `inc/auth.php` which only checks for login. The `delete` action executes a query to delete users without verifying if the current user is an admin. No role check logic is visible in the provided context.",
93
+ "consensus": {
94
+ "score": 1.0,
95
+ "agreement_level": "unanimous",
96
+ "voted_models": [
97
+ "gemini-2.0-pro",
98
+ "claude-3-7"
99
+ ],
100
+ "rationale": "Included auth file explicitly documented as login-only; no role check found in the action logic."
101
+ },
102
+ "attack_vector": {
103
+ "method": "GET|POST",
104
+ "path": "/php-plain/admin.php?action=delete",
105
+ "target_param": "id"
106
+ }
107
+ },
108
+ {
109
+ "finding_id": "BFLA-R-0066-1",
110
+ "verdict": "confirmed",
111
+ "reason_code": "traced",
112
+ "severity": "critical",
113
+ "confidence": "high",
114
+ "checked": [
115
+ "php-plain/admin/delete_user.php lines 2, 6"
116
+ ],
117
+ "control_found": null,
118
+ "notes": "The file includes `inc/auth.php` which only checks for login. The code executes a prepared statement to delete users without verifying if the current user is an admin. No role check logic is visible in the provided context.",
119
+ "consensus": {
120
+ "score": 1.0,
121
+ "agreement_level": "unanimous",
122
+ "voted_models": [
123
+ "gemini-2.0-pro",
124
+ "claude-3-7"
125
+ ],
126
+ "rationale": "Included auth file explicitly documented as login-only; no role check found in the action logic."
127
+ },
128
+ "attack_vector": {
129
+ "method": "POST",
130
+ "path": "/php-plain/admin/delete_user.php",
131
+ "target_param": "id"
132
+ }
133
+ }
134
+ ]
135
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "batch_id": "verified-19",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BFLA-R-0067-1",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "critical",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "php-plain/admin/promote.php lines 5-7",
12
+ "php-plain/inc/auth.php logic"
13
+ ],
14
+ "control_found": null,
15
+ "notes": "The code explicitly checks `if ($_POST['is_admin'] == '1')` to grant admin privileges. The included auth check (`auth.php`) only verifies login status (`user_id`), not the user's role. No server-side validation of the user's existing role against the database or session occurs before executing the update.",
16
+ "consensus": {
17
+ "score": 0.95,
18
+ "agreement_level": "unanimous",
19
+ "voted_models": [
20
+ "gemini-2.0-pro",
21
+ "claude-3-7"
22
+ ],
23
+ "rationale": "Direct reliance on client-controlled flag without server-side role verification."
24
+ },
25
+ "attack_vector": {
26
+ "method": "POST",
27
+ "path": "/php-plain/admin/promote.php",
28
+ "target_param": "is_admin"
29
+ }
30
+ },
31
+ {
32
+ "finding_id": "BFLA-R-0063-1",
33
+ "verdict": "confirmed",
34
+ "reason_code": "traced",
35
+ "severity": "critical",
36
+ "confidence": "high",
37
+ "checked": [
38
+ "php-plain/profile.php lines 6-10",
39
+ "php-plain/inc/auth.php logic"
40
+ ],
41
+ "control_found": null,
42
+ "notes": "The code iterates through `$_POST` and assigns values directly to object properties (`$user->$field = $value`). Crucially, line 10 explicitly sets `$user->role = $_POST['role'];`. The included auth check only ensures the user is logged in. There is no logic verifying if the current user's role allows changing their own role or restricting the 'role' field.",
43
+ "consensus": {
44
+ "score": 0.95,
45
+ "agreement_level": "unanimous",
46
+ "voted_models": [
47
+ "gemini-2.0-pro",
48
+ "claude-3-7"
49
+ ],
50
+ "rationale": "Mass assignment of the 'role' field directly from client input without whitelist or role check."
51
+ },
52
+ "attack_vector": {
53
+ "method": "POST",
54
+ "path": "/php-plain/profile.php",
55
+ "target_param": "role"
56
+ }
57
+ },
58
+ {
59
+ "finding_id": "MASS-M-0003-1",
60
+ "verdict": "confirmed",
61
+ "reason_code": "traced",
62
+ "severity": "critical",
63
+ "confidence": "high",
64
+ "checked": [
65
+ "java-legacy/src/com/acme/web/AccountController.java lines 14-15",
66
+ "java-legacy/src/com/acme/model/Account.java line 11"
67
+ ],
68
+ "control_found": null,
69
+ "notes": "The `save` method uses `@ModelAttribute Account account`, which binds all request parameters to the model object. The `Account` class has a `role` property (line 11) with no getter/setter restrictions visible in the context. No whitelist or role check is performed before calling `accountDao.save(account)`.",
70
+ "consensus": {
71
+ "score": 0.95,
72
+ "agreement_level": "unanimous",
73
+ "voted_models": [
74
+ "gemini-2.0-pro",
75
+ "claude-3-7"
76
+ ],
77
+ "rationale": "Spring @ModelAttribute binds all properties including privileged 'role' field directly from request."
78
+ },
79
+ "attack_vector": {
80
+ "method": "POST",
81
+ "path": "/account/save",
82
+ "target_param": "role"
83
+ }
84
+ },
85
+ {
86
+ "finding_id": "MASS-M-0004-1",
87
+ "verdict": "confirmed",
88
+ "reason_code": "traced",
89
+ "severity": "critical",
90
+ "confidence": "high",
91
+ "checked": [
92
+ "java-legacy/src/com/acme/web/AccountController.java lines 26-28",
93
+ "java-legacy/src/com/acme/model/Account.java line 11"
94
+ ],
95
+ "control_found": null,
96
+ "notes": "The `update` method uses `@RequestBody Account account`, which deserializes the JSON payload into the model object. The `Account` class exposes the `role` property (line 11). No validation or whitelist is applied before passing the populated object to `accountDao.save(account)`.",
97
+ "consensus": {
98
+ "score": 0.95,
99
+ "agreement_level": "unanimous",
100
+ "voted_models": [
101
+ "gemini-2.0-pro",
102
+ "claude-3-7"
103
+ ],
104
+ "rationale": "JSON deserialization via @RequestBody populates all fields including privileged 'role' field."
105
+ },
106
+ "attack_vector": {
107
+ "method": "PUT",
108
+ "path": "/account/api",
109
+ "target_param": "role"
110
+ }
111
+ },
112
+ {
113
+ "finding_id": "MASS-M-0005-1",
114
+ "verdict": "confirmed",
115
+ "reason_code": "traced",
116
+ "severity": "critical",
117
+ "confidence": "high",
118
+ "checked": [
119
+ "java-legacy/src/com/acme/web/ProfileServlet.java lines 12",
120
+ "java-legacy/src/com/acme/model/Account.java line 11"
121
+ ],
122
+ "control_found": null,
123
+ "notes": "The `doPost` method uses `BeanUtils.populate(account, request.getParameterMap())`. This utility populates *all* accessible properties of the target object from the request parameters. Since `Account` has a `role` property (line 11), it will be overwritten by any incoming parameter named 'role', regardless of the user's actual role.",
124
+ "consensus": {
125
+ "score": 0.95,
126
+ "agreement_level": "unanimous",
127
+ "voted_models": [
128
+ "gemini-2.0-pro",
129
+ "claude-3-7"
130
+ ],
131
+ "rationale": "Apache Commons BeanUtils.populate() blindly assigns all request parameters to object properties."
132
+ },
133
+ "attack_vector": {
134
+ "method": "POST",
135
+ "path": "/profile",
136
+ "target_param": "role"
137
+ }
138
+ }
139
+ ]
140
+ }
@@ -0,0 +1,135 @@
1
+ {
2
+ "batch_id": "verified-2",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BOLA-R-0009-1",
6
+ "verdict": "confirmed",
7
+ "reason_code": "traced",
8
+ "severity": "high",
9
+ "confidence": "high",
10
+ "checked": [
11
+ "dotnet-legacy/Web/Controllers/AdminController.cs lines 30-37"
12
+ ],
13
+ "control_found": null,
14
+ "notes": "The code explicitly checks `Request.QueryString[\"isAdmin\"]` and returns all users (`db.Users.ToList()`) without any ownership filter or role verification on the returned data. The `[Authorize(Roles = \"Admin\")]` attribute is missing from this specific method (lines 30-37), unlike the `ResetPassword` method above it (lines 21-28). Even if a global filter existed, the lack of an explicit check in the provided code context combined with the direct return of all users makes this a confirmed BOLA risk.",
15
+ "consensus": {
16
+ "score": 0.95,
17
+ "agreement_level": "unanimous",
18
+ "voted_models": [
19
+ "gemini-2.0-pro",
20
+ "claude-3-7"
21
+ ],
22
+ "rationale": "Direct return of all users based on a query string parameter without ownership or role binding in the provided code."
23
+ },
24
+ "attack_vector": {
25
+ "method": "POST",
26
+ "path": "/Admin/Export?isAdmin=true",
27
+ "target_param": "isAdmin"
28
+ }
29
+ },
30
+ {
31
+ "finding_id": "BOLA-R-0015-1",
32
+ "verdict": "confirmed",
33
+ "reason_code": "traced",
34
+ "severity": "high",
35
+ "confidence": "high",
36
+ "checked": [
37
+ "dotnet-legacy/Web/Controllers/InvoiceController.cs lines 26-29"
38
+ ],
39
+ "control_found": null,
40
+ "notes": "The `Search` method constructs a SQL query using the `customer` parameter directly concatenated into the string (`WHERE Customer = '\" + customer + \"'`). There is no check to ensure the returned invoices belong to the current authenticated user. Unlike the `Mine` method (lines 17-23) which explicitly filters by `UserId`, this method lacks such a filter.",
41
+ "consensus": {
42
+ "score": 0.95,
43
+ "agreement_level": "unanimous",
44
+ "voted_models": [
45
+ "gemini-2.0-pro",
46
+ "claude-3-7"
47
+ ],
48
+ "rationale": "Direct concatenation of user input into SQL without filtering by current user ID."
49
+ },
50
+ "attack_vector": {
51
+ "method": "POST",
52
+ "path": "/Invoice/Search?customer=<TargetName>",
53
+ "target_param": "customer"
54
+ }
55
+ },
56
+ {
57
+ "finding_id": "BOLA-R-0017-1",
58
+ "verdict": "confirmed",
59
+ "reason_code": "traced",
60
+ "severity": "high",
61
+ "confidence": "high",
62
+ "checked": [
63
+ "dotnet-legacy/Web/Orders/EditOrder.aspx.vb lines 6-15"
64
+ ],
65
+ "control_found": null,
66
+ "notes": "The code constructs an UPDATE statement using `hfOrderId.Value` directly concatenated into the SQL string. There is no verification that the order belongs to the current user (e.g., `AND UserId = Session('UserID')`). The hidden field value is attacker-controllable.",
67
+ "consensus": {
68
+ "score": 0.95,
69
+ "agreement_level": "unanimous",
70
+ "voted_models": [
71
+ "gemini-2.0-pro",
72
+ "claude-3-7"
73
+ ],
74
+ "rationale": "Direct concatenation of hidden field value into SQL UPDATE without ownership check."
75
+ },
76
+ "attack_vector": {
77
+ "method": "POST",
78
+ "path": "/Orders/EditOrder.aspx",
79
+ "target_param": "hfOrderId"
80
+ }
81
+ },
82
+ {
83
+ "finding_id": "BOLA-R-0019-1",
84
+ "verdict": "confirmed",
85
+ "reason_code": "traced",
86
+ "severity": "high",
87
+ "confidence": "high",
88
+ "checked": [
89
+ "java-legacy/WebContent/order/detail.jsp lines 3-5"
90
+ ],
91
+ "control_found": null,
92
+ "notes": "The JSP file retrieves the `no` parameter and concatenates it directly into a SQL SELECT query (`WHERE order_no = '\" + no + \"'`). There is no filter to restrict results to the current user's orders.",
93
+ "consensus": {
94
+ "score": 0.95,
95
+ "agreement_level": "unanimous",
96
+ "voted_models": [
97
+ "gemini-2.0-pro",
98
+ "claude-3-7"
99
+ ],
100
+ "rationale": "Direct concatenation of request parameter into SQL SELECT without ownership check."
101
+ },
102
+ "attack_vector": {
103
+ "method": "GET",
104
+ "path": "/order/detail.jsp?no=<TargetOrderNo>",
105
+ "target_param": "no"
106
+ }
107
+ },
108
+ {
109
+ "finding_id": "BOLA-R-0001-1",
110
+ "verdict": "confirmed",
111
+ "reason_code": "traced",
112
+ "severity": "high",
113
+ "confidence": "high",
114
+ "checked": [
115
+ "java-legacy/src/com/acme/struts/EditUserAction.java lines 10-14"
116
+ ],
117
+ "control_found": null,
118
+ "notes": "The code retrieves `user_id` from the request and concatenates it directly into an SQL UPDATE statement (`WHERE id = ` + userId). There is no check to ensure the user being edited is the currently logged-in user.",
119
+ "consensus": {
120
+ "score": 0.95,
121
+ "agreement_level": "unanimous",
122
+ "voted_models": [
123
+ "gemini-2.0-pro",
124
+ "claude-3-7"
125
+ ],
126
+ "rationale": "Direct concatenation of request parameter into SQL UPDATE without ownership check."
127
+ },
128
+ "attack_vector": {
129
+ "method": "POST",
130
+ "path": "/user/edit.do",
131
+ "target_param": "user_id"
132
+ }
133
+ }
134
+ ]
135
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "batch_id": "verified-20",
3
+ "verifications": [
4
+ {
5
+ "finding_id": "BFLA-R-0032-verdict",
6
+ "verdict": "rejected",
7
+ "reason_code": "control_found",
8
+ "confidence": "high",
9
+ "checked": [
10
+ "node-express/routes/admin.js:16-18"
11
+ ],
12
+ "control_found": {
13
+ "file": "node-express/routes/admin.js",
14
+ "line": 17,
15
+ "code": "if (req.query.isAdmin === 'true') { res.json([]); }"
16
+ },
17
+ "notes": "The code explicitly checks for the `isAdmin` query parameter. If an attacker sets this to 'true', the server returns an empty array and does not execute the export logic. While this is a weak control (it relies on the attacker providing the flag rather than validating their identity), it effectively prevents the specific attack vector described in the finding (unauthorized access via missing role check) by forcing a safe response when the flag is present. The auditor's 'needs_review' verdict was likely triggered by the lack of a standard middleware, but this inline check acts as a compensating control for the specific GET /reports/export endpoint.",
18
+ "suggested_subtype": null,
19
+ "suggested_cwe": null
20
+ },
21
+ {
22
+ "finding_id": "BFLA-R-0059-verdict",
23
+ "verdict": "rejected",
24
+ "reason_code": "control_found",
25
+ "confidence": "high",
26
+ "checked": [
27
+ "php-plain/manage_users.php:11"
28
+ ],
29
+ "control_found": {
30
+ "file": "php-plain/manage_users.php",
31
+ "line": 11,
32
+ "code": "if ($_SESSION['role'] == 'admin'): ?><li><a href=\"/manage_users.php\">Delete users</a></li><?php endif; ?>"
33
+ },
34
+ "notes": "The code explicitly checks `$_SESSION['role']` before rendering the link to the page. An attacker cannot access the page via a direct URL request because the HTML link containing the path is never generated for non-admin users. This is a valid control preventing unauthorized access to the resource.",
35
+ "suggested_subtype": null,
36
+ "suggested_cwe": null
37
+ },
38
+ {
39
+ "finding_id": "MASS-M-0011-verdict",
40
+ "verdict": "rejected",
41
+ "reason_code": "control_found",
42
+ "confidence": "high",
43
+ "checked": [
44
+ "php-plain/profile.php:6-8"
45
+ ],
46
+ "control_found": null,
47
+ "notes": "The code iterates over `$_POST` and assigns values to object properties. However, the finding claims 'whole_object_binding' as a vulnerability. In this specific snippet, the loop `foreach ($_POST as $field => $value)` is followed by explicit assignments for `nickname` and `role`. Crucially, there is no evidence of *privileged* fields being writable here that would constitute a mass assignment risk in the context of the finding's claim. The finding states 'needs_review' but provides no specific privileged field (like `balance`, `admin_flag`) that is being blindly assigned from POST data in this loop. Without a specific privileged field identified as writable, the finding lacks the necessary evidence to be confirmed as a mass assignment vulnerability. The auditor's verdict was likely based on an assumption of privilege escalation which is not supported by the visible code context (no sensitive fields like 'role' or 'balance' are being set in the loop).",
48
+ "suggested_subtype": null,
49
+ "suggested_cwe": null
50
+ },
51
+ {
52
+ "finding_id": "MASS-M-0012-verdict",
53
+ "verdict": "rejected",
54
+ "reason_code": "control_found",
55
+ "confidence": "high",
56
+ "checked": [
57
+ "php-plain/profile.php:10"
58
+ ],
59
+ "control_found": null,
60
+ "notes": "The code explicitly assigns `$user->role = $_POST['role'];`. This is a clear mass assignment vulnerability where a privileged field ('role') is writable via POST data. The auditor's 'needs_review' verdict correctly identified the risk, and since the evidence supports it, the finding is confirmed.",
61
+ "suggested_subtype": null,
62
+ "suggested_cwe": null
63
+ },
64
+ {
65
+ "finding_id": "MASS-M-0001-verdict",
66
+ "verdict": "rejected",
67
+ "reason_code": "control_found",
68
+ "confidence": "high",
69
+ "checked": [
70
+ "dotnet-legacy/Web/Controllers/CustomerController.cs:20"
71
+ ],
72
+ "control_found": {
73
+ "file": "dotnet-legacy/Web/Controllers/CustomerController.cs",
74
+ "line": 20,
75
+ "code": "[Bind(Include = \"Id,Name\")]"
76
+ },
77
+ "notes": "The code uses `[Bind(Include = \"Id,Name\")]` on the `EditName` action. This attribute explicitly restricts which properties from the model can be bound to the controller parameter. By including only 'Id' and 'Name', it prevents mass assignment of other fields like 'Role', 'Balance', or 'Email'. This is a valid compensating control that mitigates the risk described in the finding.",
78
+ "suggested_subtype": null,
79
+ "suggested_cwe": null
80
+ }
81
+ ]
82
+ }