@hoanghainh/komagu 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +202 -0
  3. package/README.md +1 -0
  4. package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
  5. package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
  6. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
  7. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
  8. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
  9. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
  10. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
  11. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
  12. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
  13. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
  14. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
  15. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
  16. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
  17. package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
  18. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
  19. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
  20. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
  21. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
  22. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
  23. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
  24. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
  25. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
  26. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
  27. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
  28. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
  29. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
  30. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
  31. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
  32. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
  33. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
  34. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
  35. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
  36. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
  37. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
  38. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
  39. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
  40. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
  41. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
  42. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
  43. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
  44. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
  45. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
  46. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
  47. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
  48. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
  49. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
  50. package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
  51. package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
  52. package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
  53. package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
  54. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
  55. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
  56. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
  57. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
  58. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
  59. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
  60. package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
  61. package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
  62. package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
  63. package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
  64. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
  65. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
  66. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
  67. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
  68. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
  69. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
  70. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
  71. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
  72. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
  73. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
  74. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
  75. package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
  76. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
  77. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
  78. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
  79. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
  80. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
  81. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
  82. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
  83. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
  84. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
  85. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
  86. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
  87. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
  88. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
  89. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
  90. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
  91. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
  92. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
  93. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
  94. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
  95. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
  96. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
  97. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
  98. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
  99. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
  100. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
  101. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
  102. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
  103. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
  104. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
  105. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
  106. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
  107. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
  108. package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
  109. package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
  110. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
  111. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
  112. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
  113. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
  114. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
  115. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
  116. package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
  117. package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
  118. package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
  119. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
  120. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
  121. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
  122. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
  123. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
  124. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
  125. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
  126. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
  127. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
  128. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
  129. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
  130. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
  131. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
  132. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
  133. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
  134. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
  135. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
  136. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
  137. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
  138. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
  139. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
  140. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
  141. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
  142. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
  143. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
  144. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
  145. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
  146. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
  147. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
  148. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
  149. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
  150. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
  151. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
  152. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
  153. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
  154. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
  155. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
  156. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
  157. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
  158. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
  159. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
  160. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
  161. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
  162. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
  163. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
  164. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
  165. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
  166. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
  167. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
  168. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
  169. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
  170. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
  171. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
  172. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
  173. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
  174. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
  175. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
  176. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
  177. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
  178. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
  179. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
  180. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
  181. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
  182. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
  183. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
  184. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
  185. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
  186. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
  187. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
  188. package/assess/lsa/scripts/detect_stack.py +13 -5
  189. package/assess/lsa/scripts/find_injection.py +35 -2
  190. package/assess/lsa/scripts/java_routes.py +323 -0
  191. package/assess/lsa/scripts/laravel_routes.py +102 -0
  192. package/assess/lsa/scripts/lsa_common.py +72 -2
  193. package/assess/lsa/scripts/map_routes.py +40 -161
  194. package/assess/lsa/scripts/merge_findings.py +2 -0
  195. package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
  196. package/assess/lsa/tests/test_eval_run_6.py +104 -0
  197. package/assess/lsa/tests/test_java_legacy_realistic.py +453 -0
  198. package/assess/lsa/tests/test_laravel_routes.py +95 -0
  199. package/contracts/schemas/persona-suite.schema.json +38 -2
  200. package/examples/member-portal/backend-dotnet/Dockerfile +2 -1
  201. package/examples/member-portal/backend-spring/Dockerfile +2 -0
  202. package/examples/member-portal/docker-compose.yml +1 -1
  203. package/examples/member-portal/frontend/Dockerfile +3 -2
  204. package/examples/member-portal/frontend/package-lock.json +24 -656
  205. package/examples/member-portal/frontend/package.json +1 -1
  206. package/operate/ai/client.py +22 -9
  207. package/operate/ai/runner.py +24 -4
  208. package/operate/cli/__init__.py +1 -1
  209. package/operate/cli/commands/fix.py +4 -0
  210. package/operate/cli/commands/leak_check.py +75 -0
  211. package/operate/cli/commands/protect.py +32 -3
  212. package/operate/cli/commands/scan.py +8 -1
  213. package/operate/cli/commands/test.py +131 -15
  214. package/operate/cli/main.py +5 -3
  215. package/operate/cross_user_tester/persona_matrix.py +118 -25
  216. package/operate/cross_user_tester/runner.py +190 -7
  217. package/operate/cross_user_tester/session_config.py +180 -0
  218. package/operate/cross_user_tester/session_http.py +288 -0
  219. package/operate/devsecops/leak_check.py +314 -0
  220. package/operate/remediator/runner.py +18 -1
  221. package/operate/remediator/strategies.py +2 -2
  222. package/operate/simulate/scenarios.py +2 -2
  223. package/operate/tests/mock_legacy_session_app.py +160 -0
  224. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  225. package/operate/tests/test_ai_route_inventory.py +53 -0
  226. package/operate/tests/test_cross_user_session.py +565 -0
  227. package/operate/tests/test_docker_packaging.py +3 -3
  228. package/operate/tests/test_headless_ai.py +6 -0
  229. package/operate/tests/test_leak_check.py +250 -0
  230. package/operate/tests/test_legacy_session_edge.py +192 -0
  231. package/operate/tests/test_pilot_safeguards.py +245 -0
  232. package/operate/tests/test_remediator_java_legacy.py +330 -0
  233. package/package.json +2 -1
  234. package/remediate/authz/patcher.py +120 -11
  235. package/remediate/authz/tests/test_bola_patcher.py +4 -1
  236. package/remediate/edge/coraza/Caddyfile +1 -1
  237. package/remediate/edge/coraza/Dockerfile +9 -0
  238. package/remediate/edge/coraza/rules/coraza-crs-custom.conf +12 -0
  239. package/remediate/edge/coraza/virtual_patcher.py +24 -0
  240. package/remediate/edge/docker-compose.yml +7 -2
  241. package/remediate/edge/kong/kong-legacy-session.yaml +51 -0
  242. package/remediate/edge/mock-backend/Dockerfile +2 -0
  243. package/remediate/edge/tests/test_edge_security.py +21 -1
  244. package/remediate/resilience/terraform/backup_worm.tf +39 -1
  245. package/remediate/resilience/terraform/main.tf +15 -3
  246. package/remediate/resilience/terraform/variables.tf +11 -0
  247. package/remediate/resilience/tests/test_resilience.py +16 -0
@@ -0,0 +1,391 @@
1
+ {
2
+ "batch_id": "injection-002",
3
+ "findings": [
4
+ {
5
+ "finding_id": "INJ-I-0031",
6
+ "category": "sql_injection",
7
+ "subtype": "string_concatenation",
8
+ "title": "SQL Injection in php-plain/order_detail.php:6 via GET parameter 'id'",
9
+ "candidate_id": "I-0031",
10
+ "location": {
11
+ "file": "php-plain/order_detail.php",
12
+ "start_line": 6
13
+ },
14
+ "evidence": [
15
+ {
16
+ "file": "php-plain/order_detail.php",
17
+ "line": 5,
18
+ "code": "$id = $_GET['id'];",
19
+ "why": "Source: User input from GET parameter"
20
+ },
21
+ {
22
+ "file": "php-plain/order_detail.php",
23
+ "line": 6,
24
+ "code": "$res = mysql_query(\"SELECT * FROM orders WHERE id = \" . $id);",
25
+ "why": "Sink: User input concatenated directly into SQL query without sanitization or binding"
26
+ }
27
+ ],
28
+ "data_flow": [
29
+ "$_GET['id'] (order_detail.php:5)",
30
+ "$id",
31
+ "mysql_query (order_detail.php:6)"
32
+ ],
33
+ "attack_scenario": "A crafted 'id' parameter can alter the WHERE clause logic, allowing access to other users' orders or bypassing intended filters.",
34
+ "impact": "Unauthorized data access; potential for reading, modifying, or deleting arbitrary data accessible by the database user.",
35
+ "severity": "critical",
36
+ "confidence": "high",
37
+ "cwe": [
38
+ "CWE-89"
39
+ ],
40
+ "owasp": [
41
+ "A03:2021"
42
+ ],
43
+ "recommendation": "Use parameterized queries (prepared statements) instead of string concatenation.",
44
+ "status": "unverified"
45
+ },
46
+ {
47
+ "finding_id": "INJ-I-0032",
48
+ "category": "sql_injection",
49
+ "subtype": "string_concatenation",
50
+ "title": "SQL Injection in php-plain/search.php:8 via GET parameter 'q'",
51
+ "candidate_id": "I-0032",
52
+ "location": {
53
+ "file": "php-plain/search.php",
54
+ "start_line": 8
55
+ },
56
+ "evidence": [
57
+ {
58
+ "file": "php-plain/search.php",
59
+ "line": 5,
60
+ "code": "$kw = addslashes($_GET['q']);",
61
+ "why": "Source: User input from GET parameter"
62
+ },
63
+ {
64
+ "file": "php-plain/search.php",
65
+ "line": 8,
66
+ "code": "$sql .= \" AND name LIKE '%\" . $kw . \"%'\";",
67
+ "why": "Sink: Input appended to SQL string. 'addslashes' is insufficient for SQL injection prevention in this context."
68
+ },
69
+ {
70
+ "file": "php-plain/search.php",
71
+ "line": 9,
72
+ "code": "$sql .= \" ORDER BY \" . $sort;",
73
+ "why": "Sink: Unsanitized 'sort' parameter concatenated into dynamic ORDER BY clause (High Risk)."
74
+ }
75
+ ],
76
+ "data_flow": [
77
+ "$_GET['q'] (search.php:5)",
78
+ "$kw",
79
+ "$sql (search.php:8)",
80
+ "mysql_query (search.php:11)"
81
+ ],
82
+ "attack_scenario": "A crafted 'q' parameter can break the LIKE clause or inject logic; a crafted 'sort' parameter can alter execution order or access columns.",
83
+ "impact": "Authentication bypass, data manipulation, or information disclosure depending on DB privileges.",
84
+ "severity": "critical",
85
+ "confidence": "high",
86
+ "cwe": [
87
+ "CWE-89"
88
+ ],
89
+ "owasp": [
90
+ "A03:2021"
91
+ ],
92
+ "recommendation": "Use parameterized queries for the search term and implement a strict allow-list validation for the 'sort' parameter.",
93
+ "status": "unverified"
94
+ },
95
+ {
96
+ "finding_id": "INJ-I-0033",
97
+ "category": "sql_injection",
98
+ "subtype": "string_concatenation",
99
+ "title": "SQL Injection in php-plain/search.php:9 via GET parameter 'sort'",
100
+ "candidate_id": "I-0033",
101
+ "location": {
102
+ "file": "php-plain/search.php",
103
+ "start_line": 9
104
+ },
105
+ "evidence": [
106
+ {
107
+ "file": "php-plain/search.php",
108
+ "line": 6,
109
+ "code": "$sort = $_GET['sort'];",
110
+ "why": "Source: User input from GET parameter"
111
+ },
112
+ {
113
+ "file": "php-plain/search.php",
114
+ "line": 9,
115
+ "code": "$sql .= \" ORDER BY \" . $sort;",
116
+ "why": "Sink: Unsanitized 'sort' variable concatenated into dynamic ORDER BY clause. No allow-list or binding."
117
+ }
118
+ ],
119
+ "data_flow": [
120
+ "$_GET['sort'] (search.php:6)",
121
+ "$sort",
122
+ "$sql (search.php:9)",
123
+ "mysql_query (search.php:11)"
124
+ ],
125
+ "attack_scenario": "An attacker can inject arbitrary SQL logic into the ORDER BY clause to manipulate query results or access data.",
126
+ "impact": "Data manipulation, information disclosure, or denial of service via complex queries.",
127
+ "severity": "critical",
128
+ "confidence": "high",
129
+ "cwe": [
130
+ "CWE-89"
131
+ ],
132
+ "owasp": [
133
+ "A03:2021"
134
+ ],
135
+ "recommendation": "Validate the 'sort' parameter against a strict allow-list of permitted column names before use.",
136
+ "status": "unverified"
137
+ },
138
+ {
139
+ "finding_id": "INJ-I-0034",
140
+ "category": "sql_injection",
141
+ "subtype": "string_interpolation",
142
+ "title": "SQL Injection in php-plain/search.php:14 via GET parameter 'cat'",
143
+ "candidate_id": "I-0034",
144
+ "location": {
145
+ "file": "php-plain/search.php",
146
+ "start_line": 14
147
+ },
148
+ "evidence": [
149
+ {
150
+ "file": "php-plain/search.php",
151
+ "line": 14,
152
+ "code": "WHERE category = '{$_GET['cat']}'",
153
+ "why": "Sink: User input interpolated directly into SQL string using heredoc syntax."
154
+ }
155
+ ],
156
+ "data_flow": [
157
+ "$_GET['cat'] (search.php:14)",
158
+ "$q",
159
+ "mysql_query (search.php:16)"
160
+ ],
161
+ "attack_scenario": "A crafted 'cat' parameter can alter the WHERE clause, bypassing category filters or injecting malicious SQL.",
162
+ "impact": "Unauthorized data access or modification based on database privileges.",
163
+ "severity": "critical",
164
+ "confidence": "high",
165
+ "cwe": [
166
+ "CWE-89"
167
+ ],
168
+ "owasp": [
169
+ "A03:2021"
170
+ ],
171
+ "recommendation": "Use parameterized queries or validate the 'cat' parameter against a strict allow-list of valid category values.",
172
+ "status": "unverified"
173
+ },
174
+ {
175
+ "finding_id": "INJ-I-0035",
176
+ "category": "sql_injection",
177
+ "subtype": "string_formatting",
178
+ "title": "SQL Injection in python-flask/app.py:12 via route parameter 'order_id'",
179
+ "candidate_id": "I-0035",
180
+ "location": {
181
+ "file": "python-flask/app.py",
182
+ "start_line": 12
183
+ },
184
+ "evidence": [
185
+ {
186
+ "file": "python-flask/app.py",
187
+ "line": 8,
188
+ "code": "@app.route('/orders/<int:order_id>')",
189
+ "why": "Source: Route parameter (though type hint suggests integer, Flask passes it as string to the function unless explicitly cast)."
190
+ },
191
+ {
192
+ "file": "python-flask/app.py",
193
+ "line": 12,
194
+ "code": "cur.execute(\"SELECT * FROM orders WHERE id = %s\" % order_id)",
195
+ "why": "Sink: Variable interpolated into SQL string using Python's % formatting. While <int> hints exist, the variable passed to execute is not guaranteed to be a safe integer if the route logic or framework version allows bypass."
196
+ }
197
+ ],
198
+ "data_flow": [
199
+ "order_id (app.py:8)",
200
+ "$order_id",
201
+ "cur.execute (app.py:12)"
202
+ ],
203
+ "attack_scenario": "If the type hint <int> is not enforced strictly at runtime or if the parameter is manipulated before reaching this line, it can inject SQL.",
204
+ "impact": "Data access manipulation or injection of malicious SQL logic.",
205
+ "severity": "high",
206
+ "confidence": "medium",
207
+ "cwe": [
208
+ "CWE-89"
209
+ ],
210
+ "owasp": [
211
+ "A03:2021"
212
+ ],
213
+ "recommendation": "Ensure the parameter is explicitly cast to an integer before use, or better yet, rely on the framework's prepared statement handling if possible.",
214
+ "status": "unverified"
215
+ },
216
+ {
217
+ "finding_id": "INJ-I-0036",
218
+ "category": "sql_injection",
219
+ "subtype": "string_interpolation",
220
+ "title": "SQL Injection in python-flask/app.py:29 via GET parameter 'q'",
221
+ "candidate_id": "I-0036",
222
+ "location": {
223
+ "file": "python-flask/app.py",
224
+ "start_line": 29
225
+ },
226
+ "evidence": [
227
+ {
228
+ "file": "python-flask/app.py",
229
+ "line": 27,
230
+ "code": "q = request.args.get('q', '')",
231
+ "why": "Source: User input from GET parameter"
232
+ },
233
+ {
234
+ "file": "python-flask/app.py",
235
+ "line": 29,
236
+ "code": "cur.execute(f\"SELECT * FROM products WHERE name LIKE '%{q}%'\")",
237
+ "why": "Sink: User input interpolated directly into SQL query using f-string."
238
+ }
239
+ ],
240
+ "data_flow": [
241
+ "request.args.get('q') (app.py:27)",
242
+ "$q",
243
+ "cur.execute (app.py:29)"
244
+ ],
245
+ "attack_scenario": "A crafted 'q' parameter can break the LIKE clause or inject SQL logic.",
246
+ "impact": "Data manipulation, information disclosure, or denial of service.",
247
+ "severity": "critical",
248
+ "confidence": "high",
249
+ "cwe": [
250
+ "CWE-89"
251
+ ],
252
+ "owasp": [
253
+ "A03:2021"
254
+ ],
255
+ "recommendation": "Use parameterized queries (e.g., `cur.execute('...', ('%{q}%',))`) instead of f-strings.",
256
+ "status": "unverified"
257
+ },
258
+ {
259
+ "finding_id": "INJ-I-0037",
260
+ "category": "sql_injection",
261
+ "subtype": "stored_procedure_dynamic_sql",
262
+ "title": "SQL Injection in sql-procs/sp_search_orders.sql:5 via parameter '@Sort'",
263
+ "candidate_id": "I-0037",
264
+ "location": {
265
+ "file": "sql-procs/sp_search_orders.sql",
266
+ "start_line": 5
267
+ },
268
+ "evidence": [
269
+ {
270
+ "file": "sql-procs/sp_search_orders.sql",
271
+ "line": 1,
272
+ "code": "CREATE PROCEDURE sp_search_orders @Customer NVARCHAR(100), @Sort NVARCHAR(50)",
273
+ "why": "Source: Stored procedure parameter"
274
+ },
275
+ {
276
+ "file": "sql-procs/sp_search_orders.sql",
277
+ "line": 5,
278
+ "code": "SET @sql = 'SELECT * FROM Orders WHERE Customer = ''' + @Customer + ''' ORDER BY ' + @Sort",
279
+ "why": "Sink: Parameter concatenated into dynamic SQL string."
280
+ },
281
+ {
282
+ "file": "sql-procs/sp_search_orders.sql",
283
+ "line": 6,
284
+ "code": "EXEC(@sql)",
285
+ "why": "Execution of the constructed dynamic SQL."
286
+ }
287
+ ],
288
+ "data_flow": [
289
+ "@Sort parameter (sp_search_orders.sql:1)",
290
+ "@Sort",
291
+ "@sql (sp_search_orders.sql:5)",
292
+ "EXEC (@sql) (sp_search_orders.sql:6)"
293
+ ],
294
+ "attack_scenario": "An attacker can pass a malicious string for '@Sort' to alter the query logic or access unauthorized columns.",
295
+ "impact": "Data manipulation, information disclosure, or denial of service.",
296
+ "severity": "critical",
297
+ "confidence": "high",
298
+ "cwe": [
299
+ "CWE-89"
300
+ ],
301
+ "owasp": [
302
+ "A03:2021"
303
+ ],
304
+ "recommendation": "Validate the '@Sort' parameter against a strict allow-list of permitted column names before constructing the SQL string.",
305
+ "status": "unverified"
306
+ },
307
+ {
308
+ "finding_id": "INJ-I-0038",
309
+ "category": "sql_injection",
310
+ "subtype": "stored_procedure_dynamic_sql",
311
+ "title": "SQL Injection in sql-procs/sp_search_orders.sql:6 via parameter '@Customer'",
312
+ "candidate_id": "I-0038",
313
+ "location": {
314
+ "file": "sql-procs/sp_search_orders.sql",
315
+ "start_line": 6
316
+ },
317
+ "evidence": [
318
+ {
319
+ "file": "sql-procs/sp_search_orders.sql",
320
+ "line": 1,
321
+ "code": "CREATE PROCEDURE sp_search_orders @Customer NVARCHAR(100), @Sort NVARCHAR(50)",
322
+ "why": "Source: Stored procedure parameter"
323
+ },
324
+ {
325
+ "file": "sql-procs/sp_search_orders.sql",
326
+ "line": 5,
327
+ "code": "SET @sql = 'SELECT * FROM Orders WHERE Customer = ''' + @Customer + ''' ORDER BY ' + @Sort",
328
+ "why": "Sink: Parameter concatenated into dynamic SQL string."
329
+ },
330
+ {
331
+ "file": "sql-procs/sp_search_orders.sql",
332
+ "line": 6,
333
+ "code": "EXEC(@sql)",
334
+ "why": "Execution of the constructed dynamic SQL."
335
+ }
336
+ ],
337
+ "data_flow": [
338
+ "@Customer parameter (sp_search_orders.sql:1)",
339
+ "@Customer",
340
+ "@sql (sp_search_orders.sql:5)",
341
+ "EXEC (@sql) (sp_search_orders.sql:6)"
342
+ ],
343
+ "attack_scenario": "An attacker can pass a malicious string for '@Customer' to alter the WHERE clause logic.",
344
+ "impact": "Data manipulation, information disclosure, or denial of service.",
345
+ "severity": "critical",
346
+ "confidence": "high",
347
+ "cwe": [
348
+ "CWE-89"
349
+ ],
350
+ "owasp": [
351
+ "A03:2021"
352
+ ],
353
+ "recommendation": "Validate the '@Customer' parameter against a strict allow-list of permitted values or use parameterized queries within the stored procedure.",
354
+ "status": "unverified"
355
+ }
356
+ ],
357
+ "candidate_verdicts": [
358
+ {
359
+ "candidate_id": "I-0031",
360
+ "verdict": "vulnerable"
361
+ },
362
+ {
363
+ "candidate_id": "I-0032",
364
+ "verdict": "vulnerable"
365
+ },
366
+ {
367
+ "candidate_id": "I-0033",
368
+ "verdict": "vulnerable"
369
+ },
370
+ {
371
+ "candidate_id": "I-0034",
372
+ "verdict": "vulnerable"
373
+ },
374
+ {
375
+ "candidate_id": "I-0035",
376
+ "verdict": "vulnerable"
377
+ },
378
+ {
379
+ "candidate_id": "I-0036",
380
+ "verdict": "vulnerable"
381
+ },
382
+ {
383
+ "candidate_id": "I-0037",
384
+ "verdict": "vulnerable"
385
+ },
386
+ {
387
+ "candidate_id": "I-0038",
388
+ "verdict": "vulnerable"
389
+ }
390
+ ]
391
+ }