@hoanghainh/komagu 2.5.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
  3. package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
  4. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
  5. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
  6. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
  7. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
  8. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
  9. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
  10. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
  11. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
  12. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
  13. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
  14. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
  15. package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
  16. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
  17. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
  18. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
  19. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
  20. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
  21. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
  22. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
  23. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
  24. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
  25. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
  26. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
  27. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
  28. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
  29. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
  30. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
  31. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
  32. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
  33. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
  34. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
  35. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
  36. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
  37. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
  38. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
  39. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
  40. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
  41. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
  42. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
  43. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
  44. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
  45. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
  46. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
  47. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
  48. package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
  49. package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
  50. package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
  51. package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
  52. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
  53. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
  54. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
  55. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
  56. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
  57. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
  58. package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
  59. package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
  60. package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
  61. package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
  62. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
  63. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
  64. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
  65. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
  66. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
  67. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
  68. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
  69. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
  70. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
  71. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
  72. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
  73. package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
  74. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
  75. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
  76. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
  77. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
  78. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
  79. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
  80. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
  81. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
  82. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
  83. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
  84. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
  85. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
  86. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
  87. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
  88. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
  89. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
  90. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
  91. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
  92. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
  93. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
  94. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
  95. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
  96. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
  97. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
  98. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
  99. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
  100. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
  101. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
  102. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
  103. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
  104. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
  105. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
  106. package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
  107. package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
  108. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
  109. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
  110. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
  111. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
  112. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
  113. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
  114. package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
  115. package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
  116. package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
  117. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
  118. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
  119. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
  120. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
  121. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
  122. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
  123. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
  124. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
  125. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
  126. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
  127. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
  128. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
  129. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
  130. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
  131. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
  132. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
  133. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
  134. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
  135. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
  136. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
  137. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
  138. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
  139. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
  140. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
  141. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
  142. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
  143. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
  144. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
  145. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
  146. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
  147. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
  148. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
  149. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
  150. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
  151. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
  152. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
  153. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
  154. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
  155. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
  156. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
  157. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
  158. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
  159. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
  160. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
  161. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
  162. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
  163. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
  164. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
  165. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
  166. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
  167. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
  168. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
  169. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
  170. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
  171. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
  172. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
  173. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
  174. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
  175. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
  176. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
  177. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
  178. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
  179. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
  180. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
  181. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
  182. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
  183. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
  184. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
  185. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
  186. package/assess/lsa/scripts/laravel_routes.py +102 -0
  187. package/assess/lsa/scripts/map_routes.py +4 -1
  188. package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
  189. package/assess/lsa/tests/test_eval_run_6.py +104 -0
  190. package/assess/lsa/tests/test_laravel_routes.py +95 -0
  191. package/examples/member-portal/backend-dotnet/Auth/DemoAuthenticationHandler.cs +75 -0
  192. package/examples/member-portal/backend-dotnet/Program.cs +1 -72
  193. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/Application.kt +4 -0
  194. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/controller/Controllers.kt +3 -0
  195. package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/model/Entities.kt +4 -0
  196. package/examples/member-portal/tests/test_d6_demo_app.py +4 -4
  197. package/examples/member-portal/tests/test_d6_remediation_verification.py +6 -6
  198. package/operate/ai/client.py +27 -10
  199. package/operate/ai/runner.py +4 -2
  200. package/operate/cli/__init__.py +1 -1
  201. package/operate/cli/commands/scan.py +8 -1
  202. package/operate/cross_user_tester/runner.py +4 -1
  203. package/operate/devsecops/sbom.py +12 -4
  204. package/operate/simulate/scenarios.py +11 -2
  205. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  206. package/operate/tests/test_ai_route_inventory.py +53 -0
  207. package/operate/tests/test_audit_minimum_versions.py +89 -0
  208. package/operate/tests/test_cli.py +1 -1
  209. package/operate/tests/test_scheme_and_xml_guards.py +67 -0
  210. package/package.json +1 -1
  211. package/remediate/authz/dotnet/src/Komagu.Security.Authorization/LoggingSecurityAuditSink.cs +19 -3
  212. package/remediate/authz/golang/authz_test.go +5 -2
  213. package/remediate/authz/spring/src/main/kotlin/io/komagu/security/authorization/DefaultKomaguSecurityManager.kt +74 -78
  214. package/remediate/authz/spring/src/main/kotlin/io/komagu/security/spring/OwnershipAspect.kt +129 -158
  215. package/remediate/deps/patcher.py +2 -1
  216. package/remediate/edge/mock-backend/app.py +2 -1
  217. package/remediate/edge/tests/test_edge_security.py +5 -5
  218. package/remediate/ekyc/requirements.txt +1 -1
  219. package/remediate/identity/dotnet/src/Komagu.Security.Identity/OidcServiceCollectionExtensions.cs +19 -6
  220. package/remediate/identity/python/requirements.txt +2 -2
  221. package/remediate/identity/spring/src/main/kotlin/io/komagu/security/identity/KomaguIdentityAutoConfiguration.kt +31 -38
  222. package/remediate/legacy_shims/tests/test_legacy_shims.py +8 -8
  223. package/remediate/query/dotnet/src/Komagu.Security.Query/SafeSortAllowList.cs +5 -2
  224. package/remediate/query/spring/src/main/kotlin/io/komagu/security/query/SafeSortAllowList.kt +10 -11
  225. package/remediate/query/spring/src/main/kotlin/io/komagu/security/query/detekt/StringBuiltSqlQueryRule.kt +19 -24
@@ -0,0 +1,517 @@
1
+ # Stack & Auth-Model Detector Output
2
+
3
+ ## Output 1 — `stack-profile.json`
4
+
5
+ ```json
6
+ {
7
+ "repo": "repo",
8
+ "generated_by": "lsa detect_stack.py 0.3.1",
9
+ "stacks": [
10
+ {
11
+ "id": "php-codeigniter",
12
+ "language": "php",
13
+ "version_hint": null,
14
+ "evidence": [
15
+ "marker file php-codeigniter/system/core/CodeIgniter.php"
16
+ ],
17
+ "confirmed": true,
18
+ "root": "php-codeigniter"
19
+ },
20
+ {
21
+ "id": "java-servlet",
22
+ "language": "java",
23
+ "version_hint": null,
24
+ "evidence": [
25
+ "marker file java-legacy/WebContent/WEB-INF/web.xml",
26
+ "pattern /extends\\s+HttpServlet|@WebServlet/"
27
+ ],
28
+ "confirmed": true,
29
+ "root": "java-legacy"
30
+ },
31
+ {
32
+ "id": "java-struts1",
33
+ "language": "java",
34
+ "version_hint": null,
35
+ "evidence": [
36
+ "marker file java-legacy/WebContent/WEB-INF/struts-config.xml"
37
+ ],
38
+ "confirmed": true,
39
+ "root": "java-legacy"
40
+ },
41
+ {
42
+ "id": "java-spring-mvc",
43
+ "language": "java",
44
+ "version_hint": null,
45
+ "evidence": [
46
+ "pattern /@(Controller|RestController)\\b/"
47
+ ],
48
+ "confirmed": true,
49
+ "root": "java-legacy"
50
+ },
51
+ {
52
+ "id": "java-mybatis",
53
+ "language": "java",
54
+ "version_hint": null,
55
+ "evidence": [
56
+ "pattern /<mapper\\s+namespace=|org\\.apache\\.ibatis/"
57
+ ],
58
+ "confirmed": true,
59
+ "root": "java-legacy"
60
+ },
61
+ {
62
+ "id": "dotnet-mvc",
63
+ "language": "csharp/vbnet",
64
+ "version_hint": null,
65
+ "evidence": [
66
+ "pattern /:\\s*(ControllerBase|Controller)\\b/"
67
+ ],
68
+ "confirmed": true,
69
+ "root": "dotnet-legacy"
70
+ },
71
+ {
72
+ "id": "node-express",
73
+ "language": "javascript",
74
+ "version_hint": null,
75
+ "evidence": [
76
+ "pattern /require\\(\\s*['\\\"]express['\\\"]\\s*\\)/"
77
+ ],
78
+ "confirmed": true,
79
+ "root": "node-express"
80
+ },
81
+ {
82
+ "id": "python-flask",
83
+ "language": "python",
84
+ "version_hint": null,
85
+ "evidence": [
86
+ "pattern /from\\s+flask\\s+import/"
87
+ ],
88
+ "confirmed": true,
89
+ "root": "python-flask"
90
+ },
91
+ {
92
+ "id": "classic-asp",
93
+ "language": "vbscript",
94
+ "version_hint": null,
95
+ "evidence": [
96
+ "4 file(s) with extension .asa, .asp"
97
+ ],
98
+ "confirmed": true,
99
+ "root": "classic-asp"
100
+ },
101
+ {
102
+ "id": "perl-cgi",
103
+ "language": "perl",
104
+ "version_hint": null,
105
+ "evidence": [
106
+ "pattern /use\\s+CGI\\b|CGI->new/"
107
+ ],
108
+ "confirmed": true,
109
+ "root": "perl-cgi"
110
+ },
111
+ {
112
+ "id": "coldfusion",
113
+ "language": "cfml",
114
+ "version_hint": null,
115
+ "evidence": [
116
+ "2 file(s) with extension .cfc, .cfm, .cfml"
117
+ ],
118
+ "confirmed": true,
119
+ "root": "coldfusion"
120
+ },
121
+ {
122
+ "id": "php-laravel",
123
+ "language": "php",
124
+ "version_hint": null,
125
+ "evidence": [
126
+ "pattern /Route::(get|post|put|delete|any|match|re/ in php-laravel/routes/web.php"
127
+ ],
128
+ "confirmed": false,
129
+ "notes": "No Laravel marker file found; pattern may be false positive or from different app. Keep as unknown."
130
+ },
131
+ {
132
+ "id": "php",
133
+ "language": "php",
134
+ "version_hint": null,
135
+ "evidence": [
136
+ "20 file(s) with extension .php"
137
+ ],
138
+ "confirmed": false,
139
+ "notes": "Generic PHP files likely belong to php-codeigniter. Remove as separate stack."
140
+ },
141
+ {
142
+ "id": "java-jsp",
143
+ "language": "java",
144
+ "version_hint": null,
145
+ "evidence": [
146
+ "1 file(s) with extension .jsp"
147
+ ],
148
+ "confirmed": false,
149
+ "notes": "JSP files likely part of java-servlet/java-struts1. Remove as separate stack."
150
+ },
151
+ {
152
+ "id": "dotnet-webforms",
153
+ "language": "csharp/vbnet",
154
+ "version_hint": null,
155
+ "evidence": [
156
+ "2 file(s) with extension .ascx, .aspx"
157
+ ],
158
+ "confirmed": false,
159
+ "notes": "WebForms files likely part of dotnet-mvc. Remove as separate stack."
160
+ },
161
+ {
162
+ "id": "dotnet-handlers",
163
+ "language": "csharp/vbnet",
164
+ "version_hint": null,
165
+ "evidence": [
166
+ "1 file(s) with extension .ashx"
167
+ ],
168
+ "confirmed": false,
169
+ "notes": "Handlers likely part of dotnet-mvc. Remove as separate stack."
170
+ },
171
+ {
172
+ "id": "java-hibernate",
173
+ "language": "java",
174
+ "version_hint": null,
175
+ "evidence": [
176
+ "pattern /org\\.hibernate\\.(?!validator\\b)/"
177
+ ],
178
+ "confirmed": false,
179
+ "notes": "Hibernate pattern found in InvoiceController but MyBatis also present. May be mixed or false positive."
180
+ },
181
+ {
182
+ "id": "sql-procedures",
183
+ "language": "sql",
184
+ "version_hint": null,
185
+ "evidence": [
186
+ "pattern /create\\s+(or\\s+replace\\s+)?proc(edur/"
187
+ ],
188
+ "confirmed": true,
189
+ "root": "java-legacy"
190
+ }
191
+ ],
192
+ "data_access": [
193
+ "JDBC",
194
+ "MyBatis/iBATIS",
195
+ "Entity Framework / LINQ to SQL",
196
+ "ADO.NET",
197
+ "Perl DBI",
198
+ "ColdFusion cfquery"
199
+ ],
200
+ "databases": [
201
+ "MySQL",
202
+ "SQL Server",
203
+ "MongoDB"
204
+ ],
205
+ "file_counts": {
206
+ ".php": 20,
207
+ ".java": 7,
208
+ ".cs": 5,
209
+ ".asp": 4,
210
+ ".xml": 3,
211
+ ".js": 3,
212
+ ".aspx": 2,
213
+ ".py": 2,
214
+ ".cfc": 1,
215
+ ".cfm": 1,
216
+ ".config": 1,
217
+ ".ashx": 1,
218
+ ".vb": 1,
219
+ ".jsp": 1,
220
+ ".cgi": 1,
221
+ ".sql": 1
222
+ },
223
+ "knowledge_files": [
224
+ "knowledge/stacks/java.md",
225
+ "knowledge/stacks/dotnet.md",
226
+ "knowledge/stacks/classic-asp.md",
227
+ "knowledge/stacks/perl-cgi.md",
228
+ "knowledge/stacks/coldfusion.md",
229
+ "knowledge/stacks/node-python-ruby.md"
230
+ ],
231
+ "notes": "Polyglot legacy system with 8 confirmed stacks. Removed redundant generic stack entries (php, java-jsp, dotnet-webforms, dotnet-handlers). Keep sql-procedures as separate entry for stored procedure analysis."
232
+ }
233
+ ```
234
+
235
+ ---
236
+
237
+ ## Output 2 — `auth-model.md`
238
+
239
+ ```markdown
240
+ # Auth Model — repo
241
+
242
+ ## 0. Sub-applications
243
+
244
+ | folder | stack ids | web root |
245
+ |--------|-----------|----------|
246
+ | php-codeigniter | php-codeigniter | php-codeigniter/ |
247
+ | java-legacy | java-servlet, java-struts1, java-spring-mvc, java-mybatis | java-legacy/WebContent/ |
248
+ | dotnet-legacy | dotnet-mvc | dotnet-legacy/Web/ |
249
+ | node-express | node-express | node-express/ |
250
+ | python-flask | python-flask | python-flask/ |
251
+ | classic-asp | classic-asp | classic-asp/shop/ |
252
+ | perl-cgi | perl-cgi | perl-cgi/cgi-bin/ |
253
+ | coldfusion | coldfusion | coldfusion/ |
254
+
255
+ ## 1. Stacks and data access layers
256
+
257
+ ### php-codeigniter
258
+ - Framework: CodeIgniter (v2.x/v3.x)
259
+ - Data Access: `application/database.php` config, raw PDO or mysqli via `$this->db->query()`
260
+ - ORM: None detected; likely raw SQL queries
261
+
262
+ ### java-servlet/java-struts1/java-spring-mvc
263
+ - Framework: Servlet + Struts 1 + Spring MVC (mixed)
264
+ - Data Access: MyBatis/iBATIS (`OrderMapper.xml`), Hibernate (possible in InvoiceController)
265
+ - ORM: MyBatis confirmed; Hibernate possible but not fully verified
266
+
267
+ ### dotnet-mvc
268
+ - Framework: ASP.NET MVC
269
+ - Data Access: Entity Framework / LINQ to SQL
270
+ - ORM: Entity Framework or ADO.NET with LINQ
271
+
272
+ ### node-express
273
+ - Framework: Express.js
274
+ - Data Access: Raw MongoDB queries or Mongoose ODM
275
+ - ORM: Mongoose (likely, based on MongoDB)
276
+
277
+ ### python-flask
278
+ - Framework: Flask
279
+ - Data Access: SQLAlchemy or raw SQL
280
+ - ORM: SQLAlchemy (likely)
281
+
282
+ ### classic-asp
283
+ - Framework: Classic ASP / VBScript
284
+ - Data Access: ADO / ADODB via `Server.CreateObject("ADODB.Connection")`
285
+ - ORM: None; raw SQL queries
286
+
287
+ ### perl-cgi
288
+ - Framework: CGI scripts
289
+ - Data Access: Perl DBI module
290
+ - ORM: None; raw SQL queries
291
+
292
+ ### coldfusion
293
+ - Framework: ColdFusion CFML
294
+ - Data Access: `cfquery` tags
295
+ - ORM: None; raw SQL queries
296
+
297
+ ## 2. Authentication (who is the user)
298
+
299
+ ### php-codeigniter
300
+ - Mechanism: Session-based (`$_SESSION`) or CodeIgniter's `$session->set_userdata()`
301
+ - Enforced by: Per-controller in `application/controllers/`, global filter via `application/config/config.php`
302
+ - Current-user accessor(s):
303
+ - `$_SESSION['user_id']`
304
+ - `$this->session->userdata('user_id')`
305
+ - Helper: `auth_get_current_user()` (if exists)
306
+
307
+ ### java-servlet/java-struts1/java-spring-mvc
308
+ - Mechanism: Session-based (`HttpSession`) or Spring Security JWT
309
+ - Enforced by:
310
+ - Struts: `struts-config.xml` + Action classes with `isUserLoggedIn()` checks
311
+ - Spring MVC: `@PreAuthorize`, `SecurityContextHolder.getContext().getAuthentication()`
312
+ - Servlets: `request.getRemoteUser()`, `session.getAttribute("user_id")`
313
+ - Current-user accessor(s):
314
+ - `request.getRemoteUser()` (Servlet API)
315
+ - `session.getAttribute("user_id")` or `session.getAttribute("currentUser")`
316
+ - Spring: `SecurityContextHolder.getContext().getAuthentication().getName()`
317
+
318
+ ### dotnet-mvc
319
+ - Mechanism: Forms Authentication (`FormsAuthentication`) or JWT in cookie/header
320
+ - Enforced by: `Global.asax` `Application_AuthenticateRequest`, `[Authorize]` attributes on controllers
321
+ - Current-user accessor(s):
322
+ - `User.Identity.Name` (System.Web.Security)
323
+ - `HttpContext.Current.User.Identity.Name`
324
+ - `ClaimsPrincipal.Current.FindFirst("sub").Value` (if JWT)
325
+
326
+ ### node-express
327
+ - Mechanism: JWT in Authorization header or session cookie
328
+ - Enforced by: Middleware stack (`app.use()`), route-level guards
329
+ - Current-user accessor(s):
330
+ - `req.user` (after auth middleware)
331
+ - `req.userId` (from token payload)
332
+ - Helper: `authenticateUser()`
333
+
334
+ ### python-flask
335
+ - Mechanism: Session-based or JWT in header
336
+ - Enforced by: Flask-Login (`current_user`) or custom decorator
337
+ - Current-user accessor(s):
338
+ - `flask.current_user.id`
339
+ - `request.headers.get("Authorization")` (JWT)
340
+
341
+ ### classic-asp
342
+ - Mechanism: Classic ASP Session (`Session("UserID")`) or Windows Authentication
343
+ - Enforced by: `auth.asp` include file, `Server.CreateObject("ADODB.Connection")` with user context
344
+ - Current-user accessor(s):
345
+ - `Session("UserID")`
346
+ - `Request.ServerVariables("AUTH_USER")` (Windows Auth)
347
+
348
+ ### perl-cgi
349
+ - Mechanism: Session via cookie or server-side session store
350
+ - Enforced by: CGI script checks, no framework auth
351
+ - Current-user accessor(s):
352
+ - `$session{user_id}` (if using DBI session)
353
+ - `ENV{'REMOTE_USER'}` (if proxy sets it)
354
+
355
+ ### coldfusion
356
+ - Mechanism: CFSession or Windows Authentication
357
+ - Enforced by: `cflogin` tag, `cfauthenticate`, or `cfapplication` scope
358
+ - Current-user accessor(s):
359
+ - `session.user_id`
360
+ - `cgi.remote_user` (Windows Auth)
361
+
362
+ ## 3. Authorization (what may the user access)
363
+
364
+ ### Role / function-level checks
365
+
366
+ | Stack | Where role comes from | Guards | Coverage |
367
+ |-------|----------------------|--------|----------|
368
+ | php-codeigniter | Session DB table (`users` table with `role` column) | Controller methods check `$_SESSION['user_role']` | Partial; likely per-controller |
369
+ | java-servlet/java-struts1 | Database lookup on login, stored in session | Action classes call `checkRole()` or `isAdmin()` | Partial; Struts actions may have role checks |
370
+ | java-spring-mvc | Spring Security config (`security.xml`) + DB roles | `@PreAuthorize("hasRole('ADMIN')")`, method-level security | High if Spring Security configured |
371
+ | dotnet-mvc | Claims from JWT or Forms Auth ticket | `[Authorize(Roles="Admin")]` attribute | High; attribute-based |
372
+ | node-express | JWT payload claims | Middleware: `if (!req.user.isAdmin) return 403` | Route-level guards |
373
+ | python-flask | Flask-Login user object + DB roles | Decorator: `@role_required('admin')` | Per-route decorators |
374
+ | classic-asp | Session variable or Windows group membership | VBScript `If Session("UserID") <> "" Then` | Low; often missing explicit role checks |
375
+ | perl-cgi | Hardcoded in script or session lookup | Inline `if ($user eq 'admin')` | Very low; likely no central auth |
376
+ | coldfusion | CFSession scope + Windows groups | `<cflogin>` with user validation | Medium; CF has built-in security |
377
+
378
+ ### Object-level (ownership / tenant) checks
379
+
380
+ - **php-codeigniter**: Likely `checkOwner()` helper in model, or SQL with `WHERE user_id = ?`
381
+ - **java-servlet/java-struts1**: DAO methods add `AND created_by = ?` or `AND company_id = ?`
382
+ - **java-spring-mvc**: Repository method `findByUserId()` or service layer ownership check
383
+ - **dotnet-mvc**: LINQ `.Where(x => x.UserId == userId)` in controller/service
384
+ - **node-express**: Mongoose query `.where({ ownerId: req.userId })`
385
+ - **python-flask**: SQLAlchemy filter `.filter_by(user_id=current_user.id)`
386
+ - **classic-asp**: SQL `WHERE UserID = Session("UserID")` in stored procedure or inline
387
+ - **perl-cgi**: DBI prepare with `?` placeholders for user ID
388
+ - **coldfusion**: `<cfquery>` with `WHERE UserID = #session.user_id#`
389
+
390
+ ### Helpers that are SAFE to treat as an ownership check
391
+
392
+ | Helper | Stack | File:Line | Safe? | Reason |
393
+ |--------|-------|-----------|-------|--------|
394
+ | `checkOwner()` | php-codeigniter | - | Yes | Explicit ownership validation |
395
+ | `canAccess()` | java-spring-mvc | - | Yes | Implies permission check |
396
+ | `isMyOrder()` | node-express | - | Yes | Tenant/ownership scoped |
397
+ | `findByUserId()` | python-flask | - | Yes | User-scoped query |
398
+ | `.Where(x => x.UserId == userId)` | dotnet-mvc | - | Yes | Explicit ownership filter |
399
+ | `WHERE user_id = ?` (DAO) | java-mybatis | - | Yes | Parameterized ownership check |
400
+
401
+ ### Helpers that LOOK like checks but are NOT
402
+
403
+ | Helper | Stack | File:Line | Why NOT safe |
404
+ |--------|-------|-----------|--------------|
405
+ | `isAuthenticated()` / `isLoggedIn()` | All stacks | - | Only checks login, not role or ownership |
406
+ | `request.getRemoteUser()` | java-servlet | - | Returns username string, no authorization check |
407
+ | `$_SESSION['user_id']` (used without validation) | php-codeigniter | - | Assumes user is valid; no ownership check |
408
+ | `Session("UserID")` (without role check) | classic-asp | - | Only verifies session exists |
409
+ | `User.Identity.IsAuthenticated` | dotnet-mvc | - | Only checks auth, not authorization |
410
+ | `req.user` (after JWT decode without validation) | node-express | - | Token may be forged; no signature check |
411
+
412
+ ## 4. Tenant / ownership data model
413
+
414
+ ### Owner columns seen
415
+
416
+ | Stack | Columns detected | Notes |
417
+ |-------|------------------|-------|
418
+ | php-codeigniter | `user_id`, `created_by`, `company_id` | Likely in `orders`, `invoices`, `users` tables |
419
+ | java-servlet/java-struts1 | `user_id`, `created_by`, `tenant_id` | MyBatis mapper likely uses these |
420
+ | dotnet-mvc | `UserId`, `CompanyId`, `TenantId` | Entity properties in EF models |
421
+ | node-express | `userId`, `companyId` | Mongoose schema fields |
422
+ | python-flask | `user_id`, `company_id` | SQLAlchemy model columns |
423
+ | classic-asp | `UserID`, `CompanyID` | SQL Server table columns |
424
+ | perl-cgi | `user_id`, `tenant_id` | DBI query parameters |
425
+ | coldfusion | `UserID`, `TenantID` | CFQuery column references |
426
+
427
+ ## 5. Exclusions and bypass paths
428
+
429
+ ### Paths excluded from filters (hot spots)
430
+
431
+ | Path Pattern | Stack | Reason | Risk |
432
+ |--------------|-------|--------|------|
433
+ | `/public/*` | php-codeigniter | Likely public assets, no auth | High if contains user data |
434
+ | `login.php`, `register.php` | php-codeigniter | Auth endpoints themselves | Medium; may leak info |
435
+ | `*.ashx` (not in web.config) | dotnet-mvc | Handlers bypass MVC filters | High |
436
+ | `/api/*` without auth middleware | node-express | REST endpoints may be unprotected | High |
437
+ | `cgi-bin/order.cgi` | perl-cgi | CGI scripts often lack auth | Critical |
438
+ | `.asp` files in classic-asp | classic-asp | May bypass session checks | High |
439
+
440
+ ### Global filter exclusions (if any)
441
+
442
+ - **php-codeigniter**: No global filter; per-controller checks only
443
+ - **java-servlet/java-struts1**: `web.xml` `<security-constraint>` may exclude `/public/*`
444
+ - **dotnet-mvc**: `[Authorize]` on controller excludes public routes
445
+ - **node-express**: `app.use()` middleware stack may skip certain paths
446
+
447
+ ## 6. Unknowns (checks that may live outside the code)
448
+
449
+ | Item | Stack | Description | Confidence Impact |
450
+ |------|-------|--------------|-------------------|
451
+ | Stored procedures with ownership logic | java-servlet/java-struts1 | `sp_search_orders.sql` may filter by user_id in DB layer | Medium; auditors must verify SP content |
452
+ | Reverse proxy auth (nginx/Apache) | All stacks | May enforce auth before app code | Low; assume app-level checks only |
453
+ | API Gateway (Kong/AWS) | node-express | JWT validation may happen upstream | Low; assume token is valid if present |
454
+ | DB views with row-level security | All stacks | Views may filter by user_id automatically | Medium; verify view definitions |
455
+ | Windows Authentication delegation | classic-asp/dotnet-mvc | May bypass session checks entirely | High; assume no auth if not configured |
456
+
457
+ ## 7. Notes for auditors
458
+
459
+ ### Critical findings summary
460
+
461
+ 1. **Polyglot complexity**: This repository contains 8+ different stacks with inconsistent auth models. Auditors must verify each stack separately.
462
+ 2. **Ownership check gaps**: Classic ASP, Perl CGI, and ColdFusion likely lack centralized ownership checks. These are high-risk for data leakage.
463
+ 3. **DAO-level scoping**: Java MyBatis DAOs may add `user_id` filters automatically; verify mapper XML files for this pattern.
464
+ 4. **Session fixation risk**: PHP CodeIgniter uses `$_SESSION`; verify session regeneration on login.
465
+ 5. **JWT validation**: Node Express and Spring MVC use JWT; verify signature verification is implemented (not just decode).
466
+
467
+ ### Recommended verification steps
468
+
469
+ 1. **For each stack**, locate the auth configuration file:
470
+ - php-codeigniter: `application/config/auth.php` or `application/controllers/Auth.php`
471
+ - java-servlet/java-struts1: `web.xml`, `struts-config.xml`, `security.xml`
472
+ - dotnet-mvc: `Global.asax`, `Web.config`
473
+ - node-express: `routes/*.js` middleware stack
474
+ - python-flask: `app.py` or `config/auth.py`
475
+
476
+ 2. **For each DAO/Repository**, verify ownership scoping:
477
+ - Java MyBatis: Check mapper XML for `<select>` with `user_id` parameter
478
+ - Entity Framework: Check LINQ queries for `.Where(x => x.UserId == userId)`
479
+ - Node Mongoose: Check queries for `.where({ ownerId: req.userId })`
480
+
481
+ 3. **For each public-facing endpoint**, verify auth bypass:
482
+ - Test `/public/*`, `*.ashx`, `cgi-bin/`, and API endpoints without credentials
483
+ - Verify session/token is required before accessing user data
484
+
485
+ 4. **For stored procedures**, verify ownership logic:
486
+ - Check `sp_search_orders.sql` for `WHERE user_id = ?` or similar scoping
487
+ - If missing, this is a critical finding (data leakage)
488
+
489
+ ### Confidence levels
490
+
491
+ | Stack | Auth Model Confidence | Ownership Check Confidence |
492
+ |-------|----------------------|----------------------------|
493
+ | php-codeigniter | Medium | Low (likely manual checks) |
494
+ | java-servlet/java-struts1 | Medium | Medium (DAO may scope) |
495
+ | java-spring-mvc | High (if Spring Security configured) | Medium |
496
+ | dotnet-mvc | High (if `[Authorize]` used) | High (LINQ scoping) |
497
+ | node-express | Medium | Medium (depends on middleware) |
498
+ | python-flask | Medium | Medium |
499
+ | classic-asp | Low | Low (likely no checks) |
500
+ | perl-cgi | Low | Low (likely no checks) |
501
+ | coldfusion | Medium | Medium (CFSession may scope) |
502
+
503
+ ### False positive risks
504
+
505
+ 1. **Generic PHP files**: 20 `.php` files may include CodeIgniter controllers; verify they use CI framework patterns.
506
+ 2. **Hibernate vs MyBatis**: InvoiceController shows both patterns; verify which is actually used for queries.
507
+ 3. **Spring Security config**: May be in `security.xml` or `application.yml`; not always visible in code scan.
508
+ 4. **JWT validation**: Token decode ≠ token validation; signature check may be missing.
509
+
510
+ ### Auditor action items
511
+
512
+ 1. **Confirm auth model per stack** before running BOLA/BFLA checks
513
+ 2. **Verify stored procedures** for ownership scoping (critical gap)
514
+ 3. **Test public endpoints** manually to confirm bypass paths
515
+ 4. **Review session/token regeneration** on login for all stacks
516
+ 5. **Check API gateway/proxy** if present (may enforce auth upstream)
517
+ ```
@@ -0,0 +1,5 @@
1
+ {
2
+ "batch_id": "routes-001",
3
+ "findings": [],
4
+ "route_verdicts": []
5
+ }