@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.
- package/CHANGELOG.md +30 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
- package/assess/lsa/scripts/laravel_routes.py +102 -0
- package/assess/lsa/scripts/map_routes.py +4 -1
- package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
- package/assess/lsa/tests/test_eval_run_6.py +104 -0
- package/assess/lsa/tests/test_laravel_routes.py +95 -0
- package/examples/member-portal/backend-dotnet/Auth/DemoAuthenticationHandler.cs +75 -0
- package/examples/member-portal/backend-dotnet/Program.cs +1 -72
- package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/Application.kt +4 -0
- package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/controller/Controllers.kt +3 -0
- package/examples/member-portal/backend-spring/src/main/kotlin/io/komagu/portal/model/Entities.kt +4 -0
- package/examples/member-portal/tests/test_d6_demo_app.py +4 -4
- package/examples/member-portal/tests/test_d6_remediation_verification.py +6 -6
- package/operate/ai/client.py +27 -10
- package/operate/ai/runner.py +4 -2
- package/operate/cli/__init__.py +1 -1
- package/operate/cli/commands/scan.py +8 -1
- package/operate/cross_user_tester/runner.py +4 -1
- package/operate/devsecops/sbom.py +12 -4
- package/operate/simulate/scenarios.py +11 -2
- package/operate/tests/test_ai_reasoning_effort.py +65 -0
- package/operate/tests/test_ai_route_inventory.py +53 -0
- package/operate/tests/test_audit_minimum_versions.py +89 -0
- package/operate/tests/test_cli.py +1 -1
- package/operate/tests/test_scheme_and_xml_guards.py +67 -0
- package/package.json +1 -1
- package/remediate/authz/dotnet/src/Komagu.Security.Authorization/LoggingSecurityAuditSink.cs +19 -3
- package/remediate/authz/golang/authz_test.go +5 -2
- package/remediate/authz/spring/src/main/kotlin/io/komagu/security/authorization/DefaultKomaguSecurityManager.kt +74 -78
- package/remediate/authz/spring/src/main/kotlin/io/komagu/security/spring/OwnershipAspect.kt +129 -158
- package/remediate/deps/patcher.py +2 -1
- package/remediate/edge/mock-backend/app.py +2 -1
- package/remediate/edge/tests/test_edge_security.py +5 -5
- package/remediate/ekyc/requirements.txt +1 -1
- package/remediate/identity/dotnet/src/Komagu.Security.Identity/OidcServiceCollectionExtensions.cs +19 -6
- package/remediate/identity/python/requirements.txt +2 -2
- package/remediate/identity/spring/src/main/kotlin/io/komagu/security/identity/KomaguIdentityAutoConfiguration.kt +31 -38
- package/remediate/legacy_shims/tests/test_legacy_shims.py +8 -8
- package/remediate/query/dotnet/src/Komagu.Security.Query/SafeSortAllowList.cs +5 -2
- package/remediate/query/spring/src/main/kotlin/io/komagu/security/query/SafeSortAllowList.kt +10 -11
- 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
|
+
```
|