@hoanghainh/komagu 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -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/operate/ai/client.py +22 -9
- package/operate/ai/runner.py +4 -2
- package/operate/cli/__init__.py +1 -1
- package/operate/cli/commands/scan.py +8 -1
- package/operate/tests/test_ai_reasoning_effort.py +65 -0
- package/operate/tests/test_ai_route_inventory.py +53 -0
- package/package.json +1 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"batch_id": "verified-6",
|
|
3
|
+
"verifications": [
|
|
4
|
+
{
|
|
5
|
+
"finding_id": "BOLA-R-0046-1",
|
|
6
|
+
"verdict": "confirmed",
|
|
7
|
+
"reason_code": "traced",
|
|
8
|
+
"severity": "high",
|
|
9
|
+
"confidence": "high",
|
|
10
|
+
"checked": [
|
|
11
|
+
"php-codeigniter/application/controllers/Invoice.php lines 20-23"
|
|
12
|
+
],
|
|
13
|
+
"control_found": null,
|
|
14
|
+
"notes": "The code explicitly retrieves $id from POST input and uses it directly in an UPDATE query without any ownership verification against the session user. The class extends MY_Controller but no constructor logic or helper is shown that would enforce this check.",
|
|
15
|
+
"consensus": {
|
|
16
|
+
"score": 0.95,
|
|
17
|
+
"agreement_level": "unanimous",
|
|
18
|
+
"voted_models": [
|
|
19
|
+
"gemini-2.0-pro",
|
|
20
|
+
"claude-3-7"
|
|
21
|
+
],
|
|
22
|
+
"rationale": "Direct usage of user-supplied ID in write operation without ownership binding."
|
|
23
|
+
},
|
|
24
|
+
"attack_vector": {
|
|
25
|
+
"method": "POST",
|
|
26
|
+
"path": "/invoice/update",
|
|
27
|
+
"target_param": "invoice_id"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"finding_id": "BOLA-R-0047-1",
|
|
32
|
+
"verdict": "confirmed",
|
|
33
|
+
"reason_code": "traced",
|
|
34
|
+
"severity": "high",
|
|
35
|
+
"confidence": "high",
|
|
36
|
+
"checked": [
|
|
37
|
+
"php-laravel/app/Http/Controllers/AccountController.php lines 11-13"
|
|
38
|
+
],
|
|
39
|
+
"control_found": null,
|
|
40
|
+
"notes": "The `register` method creates a new User directly from `$request->all()`. There is no check to ensure the authenticated user (if any) is authorized to create accounts, nor is there an ownership check on the created object. The code relies entirely on the framework's default behavior which allows creation if not explicitly restricted.",
|
|
41
|
+
"consensus": {
|
|
42
|
+
"score": 0.95,
|
|
43
|
+
"agreement_level": "unanimous",
|
|
44
|
+
"voted_models": [
|
|
45
|
+
"gemini-2.0-pro",
|
|
46
|
+
"claude-3-7"
|
|
47
|
+
],
|
|
48
|
+
"rationale": "Direct instantiation of User model from request data without authorization check."
|
|
49
|
+
},
|
|
50
|
+
"attack_vector": {
|
|
51
|
+
"method": "POST",
|
|
52
|
+
"path": "/account/register",
|
|
53
|
+
"target_param": "request"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"finding_id": "BOLA-R-0048-1",
|
|
58
|
+
"verdict": "confirmed",
|
|
59
|
+
"reason_code": "traced",
|
|
60
|
+
"severity": "high",
|
|
61
|
+
"confidence": "high",
|
|
62
|
+
"checked": [
|
|
63
|
+
"php-laravel/app/Http/Controllers/AccountController.php lines 16-18"
|
|
64
|
+
],
|
|
65
|
+
"control_found": null,
|
|
66
|
+
"notes": "The `post` method creates a new Post directly from `$request->all()`. No ownership check or role-based access control is visible in the provided snippet. Any authenticated user could theoretically create posts.",
|
|
67
|
+
"consensus": {
|
|
68
|
+
"score": 0.95,
|
|
69
|
+
"agreement_level": "unanimous",
|
|
70
|
+
"voted_models": [
|
|
71
|
+
"gemini-2.0-pro",
|
|
72
|
+
"claude-3-7"
|
|
73
|
+
],
|
|
74
|
+
"rationale": "Direct instantiation of Post model from request data without authorization check."
|
|
75
|
+
},
|
|
76
|
+
"attack_vector": {
|
|
77
|
+
"method": "POST",
|
|
78
|
+
"path": "/account/post",
|
|
79
|
+
"target_param": "request"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"finding_id": "BOLA-R-0049-1",
|
|
84
|
+
"verdict": "confirmed",
|
|
85
|
+
"reason_code": "traced",
|
|
86
|
+
"severity": "high",
|
|
87
|
+
"confidence": "high",
|
|
88
|
+
"checked": [
|
|
89
|
+
"php-laravel/app/Http/Controllers/AccountController.php lines 21-23"
|
|
90
|
+
],
|
|
91
|
+
"control_found": null,
|
|
92
|
+
"notes": "The `team` method creates a new Team directly from `$request->all()`. No ownership check or role-based access control is visible in the provided snippet. Any authenticated user could theoretically create teams.",
|
|
93
|
+
"consensus": {
|
|
94
|
+
"score": 0.95,
|
|
95
|
+
"agreement_level": "unanimous",
|
|
96
|
+
"voted_models": [
|
|
97
|
+
"gemini-2.0-pro",
|
|
98
|
+
"claude-3-7"
|
|
99
|
+
],
|
|
100
|
+
"rationale": "Direct instantiation of Team model from request data without authorization check."
|
|
101
|
+
},
|
|
102
|
+
"attack_vector": {
|
|
103
|
+
"method": "POST",
|
|
104
|
+
"path": "/account/team",
|
|
105
|
+
"target_param": "request"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"finding_id": "BOLA-R-0050-1",
|
|
110
|
+
"verdict": "confirmed",
|
|
111
|
+
"reason_code": "traced",
|
|
112
|
+
"severity": "high",
|
|
113
|
+
"confidence": "high",
|
|
114
|
+
"checked": [
|
|
115
|
+
"php-laravel/app/Http/Controllers/AccountController.php lines 26-30"
|
|
116
|
+
],
|
|
117
|
+
"control_found": null,
|
|
118
|
+
"notes": "The `rename` method retrieves a user via `$request->user()` (which assumes the request contains valid auth headers) and then updates that specific user object using `$request->only(['name'])`. While it targets a specific user, there is no check to ensure the *current* authenticated user has permission to rename *that specific* user. An attacker could potentially manipulate the request to target another user if the `user()` method resolves based on a parameter or if the logic allows cross-user updates.",
|
|
119
|
+
"consensus": {
|
|
120
|
+
"score": 0.95,
|
|
121
|
+
"agreement_level": "unanimous",
|
|
122
|
+
"voted_models": [
|
|
123
|
+
"gemini-2.0-pro",
|
|
124
|
+
"claude-3-7"
|
|
125
|
+
],
|
|
126
|
+
"rationale": "Update operation on a user object retrieved from request without verifying the current session user's authority to modify that specific target."
|
|
127
|
+
},
|
|
128
|
+
"attack_vector": {
|
|
129
|
+
"method": "POST",
|
|
130
|
+
"path": "/account/rename",
|
|
131
|
+
"target_param": "request"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"batch_id": "verified-7",
|
|
3
|
+
"verifications": [
|
|
4
|
+
{
|
|
5
|
+
"finding_id": "BOLA-R-0051-1",
|
|
6
|
+
"verdict": "rejected",
|
|
7
|
+
"reason_code": "evidence_mismatch",
|
|
8
|
+
"confidence": "high",
|
|
9
|
+
"checked": [
|
|
10
|
+
"php-laravel/app/Http/Controllers/AccountController.php lines 33-37"
|
|
11
|
+
],
|
|
12
|
+
"control_found": null,
|
|
13
|
+
"notes": "The finding references a file path 'php-laravel/app/Http/Controllers/AccountController.php'. However, the Auth Model explicitly states that the repository contains a 'polyglot legacy architecture' with Primary Web Layers of Classic ASP and Plain PHP. It notes: 'No ORM (Hibernate/JPA/Entity Framework) is detected in the primary security paths.' Laravel uses an ORM (Eloquent). The code context provided shows generic PHP syntax (`$request->user()`, `$user->fill()`), but the finding claims it is a Laravel application. Since the stack profile confirms no Laravel framework exists and the evidence points to Plain PHP, this finding relies on non-existent or misidentified code structure. The specific file path does not exist in the confirmed repository context.",
|
|
14
|
+
"suggested_subtype": "missing_ownership_check",
|
|
15
|
+
"suggested_cwe": [
|
|
16
|
+
"CWE-284"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"finding_id": "BOLA-R-0043-verdict",
|
|
21
|
+
"verdict": "confirmed",
|
|
22
|
+
"reason_code": "traced",
|
|
23
|
+
"confidence": "high",
|
|
24
|
+
"checked": [
|
|
25
|
+
"perl-cgi/cgi-bin/order.cgi lines 1-20"
|
|
26
|
+
],
|
|
27
|
+
"control_found": null,
|
|
28
|
+
"notes": "The code shows a Perl CGI script. Line 9 retrieves the user ID from the session (`$uid = $session->param('user_id');`). However, line 13 executes a query using `$id` (from request param) without binding it to `$uid`. While line 16 shows a prepared statement with binding (`? AND ?`), this is executed in a separate statement ($sth2) after the vulnerable one ($sth). The script proceeds to execute $sth regardless of whether $sth2 succeeds or fails. There is no `die`, `return`, or conditional check preventing execution of line 13 if line 16 fails. An attacker can manipulate `$id` in the first query to access another user's order before the ownership check on line 16 runs.",
|
|
29
|
+
"attack_vector": {
|
|
30
|
+
"method": "GET",
|
|
31
|
+
"path": "/perl-cgi/cgi-bin/order.cgi",
|
|
32
|
+
"target_param": "id"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"finding_id": "BOLA-R-0057-1",
|
|
37
|
+
"verdict": "confirmed",
|
|
38
|
+
"reason_code": "traced",
|
|
39
|
+
"confidence": "high",
|
|
40
|
+
"checked": [
|
|
41
|
+
"php-plain/admin.php lines 7-8",
|
|
42
|
+
"php-plain/inc/auth.php"
|
|
43
|
+
],
|
|
44
|
+
"control_found": null,
|
|
45
|
+
"notes": "The code in `admin.php` retrieves `$uid` from the GET parameter and uses it directly in a SQL query without checking if it matches the session user. The included `auth.php` only performs a login check (`if (empty($_SESSION['user_id']))`). It does not enforce ownership of the resource being accessed. This is a classic BOLA vulnerability where any authenticated user can view another user's profile by changing the `uid` parameter.",
|
|
46
|
+
"attack_vector": {
|
|
47
|
+
"method": "GET",
|
|
48
|
+
"path": "/php-plain/admin.php?action=view&uid=<user_id>",
|
|
49
|
+
"target_param": "uid"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"finding_id": "BOLA-R-0058-1",
|
|
54
|
+
"verdict": "confirmed",
|
|
55
|
+
"reason_code": "traced",
|
|
56
|
+
"confidence": "high",
|
|
57
|
+
"checked": [
|
|
58
|
+
"php-plain/admin.php lines 11-12",
|
|
59
|
+
"php-plain/inc/auth.php"
|
|
60
|
+
],
|
|
61
|
+
"control_found": null,
|
|
62
|
+
"notes": "Similar to finding BOLA-R-0057-1. The code retrieves `$id` from POST and executes a DELETE query without verifying ownership. The `auth.php` include only ensures the user is logged in, not that they own the target resource. An attacker can delete any user's account by manipulating the `id` parameter.",
|
|
63
|
+
"attack_vector": {
|
|
64
|
+
"method": "POST",
|
|
65
|
+
"path": "/php-plain/admin.php?action=delete&id=<user_id>",
|
|
66
|
+
"target_param": "id"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"finding_id": "BOLA-R-0061-1",
|
|
71
|
+
"verdict": "confirmed",
|
|
72
|
+
"reason_code": "traced",
|
|
73
|
+
"confidence": "high",
|
|
74
|
+
"checked": [
|
|
75
|
+
"php-plain/order_detail.php lines 5-8",
|
|
76
|
+
"php-plain/inc/auth.php"
|
|
77
|
+
],
|
|
78
|
+
"control_found": null,
|
|
79
|
+
"notes": "The code retrieves `$id` from GET and queries the `orders` table without filtering by the session user's ID. The included `auth.php` only checks for login status. There is no ownership verification before outputting the order details (address, items). This allows any authenticated user to read another user's order.",
|
|
80
|
+
"attack_vector": {
|
|
81
|
+
"method": "GET",
|
|
82
|
+
"path": "/php-plain/order_detail.php?id=<order_id>",
|
|
83
|
+
"target_param": "id"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"batch_id": "verified-8",
|
|
3
|
+
"verifications": [
|
|
4
|
+
{
|
|
5
|
+
"finding_id": "BOLA-R-0069-1",
|
|
6
|
+
"verdict": "confirmed",
|
|
7
|
+
"reason_code": "traced",
|
|
8
|
+
"severity": "high",
|
|
9
|
+
"confidence": "high",
|
|
10
|
+
"checked": [
|
|
11
|
+
"python-flask/app.py lines 8-13"
|
|
12
|
+
],
|
|
13
|
+
"control_found": null,
|
|
14
|
+
"notes": "The endpoint `/orders/<int:order_id>` is protected by `@login_required` but the query `SELECT * FROM orders WHERE id = %s` uses the raw `order_id` parameter without verifying ownership against `current_user.id`. Unlike the `/orders/mine/` route, this path lacks an explicit ownership check.",
|
|
15
|
+
"consensus": {
|
|
16
|
+
"score": 0.95,
|
|
17
|
+
"agreement_level": "unanimous",
|
|
18
|
+
"voted_models": [
|
|
19
|
+
"gemini-2.0-pro",
|
|
20
|
+
"claude-3-7"
|
|
21
|
+
],
|
|
22
|
+
"rationale": "Direct lookup by request id without tenant or user context binding."
|
|
23
|
+
},
|
|
24
|
+
"attack_vector": {
|
|
25
|
+
"method": "GET",
|
|
26
|
+
"path": "/orders/<int:order_id>",
|
|
27
|
+
"target_param": "order_id"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"finding_id": "BOLA-R-0071-1",
|
|
32
|
+
"verdict": "confirmed",
|
|
33
|
+
"reason_code": "traced",
|
|
34
|
+
"severity": "high",
|
|
35
|
+
"confidence": "high",
|
|
36
|
+
"checked": [
|
|
37
|
+
"python-flask/app.py lines 24-30"
|
|
38
|
+
],
|
|
39
|
+
"control_found": null,
|
|
40
|
+
"notes": "The `/search` endpoint is protected by `@login_required`, but the query filters only by name (`WHERE name LIKE '%{q}%'`) and ignores ownership. An attacker can search for products owned by another user.",
|
|
41
|
+
"consensus": {
|
|
42
|
+
"score": 0.95,
|
|
43
|
+
"agreement_level": "unanimous",
|
|
44
|
+
"voted_models": [
|
|
45
|
+
"gemini-2.0-pro",
|
|
46
|
+
"claude-3-7"
|
|
47
|
+
],
|
|
48
|
+
"rationale": "Search query lacks ownership scoping."
|
|
49
|
+
},
|
|
50
|
+
"attack_vector": {
|
|
51
|
+
"method": "GET|POST",
|
|
52
|
+
"path": "/search",
|
|
53
|
+
"target_param": "q"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"finding_id": "BOLA-R-0067-verdict",
|
|
58
|
+
"verdict": "rejected",
|
|
59
|
+
"reason_code": "control_found",
|
|
60
|
+
"severity": null,
|
|
61
|
+
"confidence": "high",
|
|
62
|
+
"checked": [
|
|
63
|
+
"php-plain/admin/promote.php lines 5-8"
|
|
64
|
+
],
|
|
65
|
+
"control_found": {
|
|
66
|
+
"file": "php-plain/admin/promote.php",
|
|
67
|
+
"line": 5,
|
|
68
|
+
"code": "if ($_POST['is_admin'] == '1') {"
|
|
69
|
+
},
|
|
70
|
+
"notes": "The code explicitly checks `$_POST['is_admin']`. If this flag is present and set to '1', the user is granted admin privileges. While this relies on a specific POST parameter, it acts as an explicit authorization gate for the privilege escalation action described in the finding title (promoting to admin). The auditor's verdict was likely based on the lack of ownership check for the `uid`, but the finding implies a general vulnerability which is mitigated by this specific role-based control."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"finding_id": "BOLA-R-0072-1",
|
|
74
|
+
"verdict": "confirmed",
|
|
75
|
+
"reason_code": "traced",
|
|
76
|
+
"severity": "high",
|
|
77
|
+
"confidence": "high",
|
|
78
|
+
"checked": [
|
|
79
|
+
"python-flask/profile.py lines 8-13"
|
|
80
|
+
],
|
|
81
|
+
"control_found": null,
|
|
82
|
+
"notes": "The `/users` POST endpoint creates a new user object directly from `request.json` (`User(**request.json)`) without verifying ownership or restricting fields. Any authenticated user can create accounts.",
|
|
83
|
+
"consensus": {
|
|
84
|
+
"score": 0.95,
|
|
85
|
+
"agreement_level": "unanimous",
|
|
86
|
+
"voted_models": [
|
|
87
|
+
"gemini-2.0-pro",
|
|
88
|
+
"claude-3-7"
|
|
89
|
+
],
|
|
90
|
+
"rationale": "Mass assignment / IDOR on creation without ownership verification."
|
|
91
|
+
},
|
|
92
|
+
"attack_vector": {
|
|
93
|
+
"method": "POST",
|
|
94
|
+
"path": "/users",
|
|
95
|
+
"target_param": "id"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"finding_id": "BOLA-R-0073-1",
|
|
100
|
+
"verdict": "confirmed",
|
|
101
|
+
"reason_code": "traced",
|
|
102
|
+
"severity": "high",
|
|
103
|
+
"confidence": "high",
|
|
104
|
+
"checked": [
|
|
105
|
+
"python-flask/profile.py lines 16-21"
|
|
106
|
+
],
|
|
107
|
+
"control_found": null,
|
|
108
|
+
"notes": "The `/users/<int:uid>/name` endpoint fetches a user by ID (`User.query.get(uid)`) and updates the name without checking if `uid` belongs to the current user. This allows any authenticated user to modify another user's name.",
|
|
109
|
+
"consensus": {
|
|
110
|
+
"score": 0.95,
|
|
111
|
+
"agreement_level": "unanimous",
|
|
112
|
+
"voted_models": [
|
|
113
|
+
"gemini-2.0-pro",
|
|
114
|
+
"claude-3-7"
|
|
115
|
+
],
|
|
116
|
+
"rationale": "Direct modification of resource by ID without ownership check."
|
|
117
|
+
},
|
|
118
|
+
"attack_vector": {
|
|
119
|
+
"method": "POST",
|
|
120
|
+
"path": "/users/<int:uid>/name",
|
|
121
|
+
"target_param": "uid"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"batch_id": "verified-9",
|
|
3
|
+
"verifications": [
|
|
4
|
+
{
|
|
5
|
+
"finding_id": "BOLA-R-0074-1",
|
|
6
|
+
"verdict": "confirmed",
|
|
7
|
+
"reason_code": "traced",
|
|
8
|
+
"severity": "high",
|
|
9
|
+
"confidence": "high",
|
|
10
|
+
"checked": [
|
|
11
|
+
"python-flask/profile.py lines 24-30"
|
|
12
|
+
],
|
|
13
|
+
"control_found": null,
|
|
14
|
+
"notes": "The code explicitly fetches the user by ID from the URL path (`User.query.get(uid)`) and then iterates over `request.json.items()` to set attributes on that object without any prior check comparing `uid` to the current session user's ID. The `[Bind]` attribute or similar validation is absent in this specific snippet, allowing arbitrary field updates.",
|
|
15
|
+
"consensus": {
|
|
16
|
+
"score": 1.0,
|
|
17
|
+
"agreement_level": "unanimous",
|
|
18
|
+
"voted_models": [
|
|
19
|
+
"gemini-2.0-pro",
|
|
20
|
+
"claude-3-7"
|
|
21
|
+
],
|
|
22
|
+
"rationale": "Direct lookup by request id without tenant or user context binding."
|
|
23
|
+
},
|
|
24
|
+
"attack_vector": {
|
|
25
|
+
"method": "PATCH",
|
|
26
|
+
"path": "/users/<int:uid>",
|
|
27
|
+
"target_param": "uid"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"finding_id": "BOLA-R-0010-1",
|
|
32
|
+
"verdict": "confirmed",
|
|
33
|
+
"reason_code": "traced",
|
|
34
|
+
"severity": "high",
|
|
35
|
+
"confidence": "high",
|
|
36
|
+
"checked": [
|
|
37
|
+
"dotnet-legacy/Web/Controllers/CustomerController.cs lines 12-16"
|
|
38
|
+
],
|
|
39
|
+
"control_found": null,
|
|
40
|
+
"notes": "The controller method `Edit` accepts a `Customer` object bound directly from the request. The code sets the entity state to `Modified` and saves it without verifying if the `customer.Id` matches the ID of the currently authenticated user. While `[Authorize]` is present on the class, it only ensures authentication, not ownership verification.",
|
|
41
|
+
"consensus": {
|
|
42
|
+
"score": 1.0,
|
|
43
|
+
"agreement_level": "unanimous",
|
|
44
|
+
"voted_models": [
|
|
45
|
+
"gemini-2.0-pro",
|
|
46
|
+
"claude-3-7"
|
|
47
|
+
],
|
|
48
|
+
"rationale": "Model binding accepts attacker-controlled ID; no ownership check before save."
|
|
49
|
+
},
|
|
50
|
+
"attack_vector": {
|
|
51
|
+
"method": "POST",
|
|
52
|
+
"path": "/Customer/Edit",
|
|
53
|
+
"target_param": "customer.Id"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"finding_id": "BOLA-R-0011-1",
|
|
58
|
+
"verdict": "confirmed",
|
|
59
|
+
"reason_code": "traced",
|
|
60
|
+
"severity": "high",
|
|
61
|
+
"confidence": "high",
|
|
62
|
+
"checked": [
|
|
63
|
+
"dotnet-legacy/Web/Controllers/CustomerController.cs lines 20-23"
|
|
64
|
+
],
|
|
65
|
+
"control_found": null,
|
|
66
|
+
"notes": "The `EditName` method uses `[Bind(Include = \"Id,Name\")]`. This attribute allows the ID to be bound from the request. The code then calls `db.SaveChanges()` without checking if the bound `customer.Id` belongs to the current user. The allow-list restricts which fields are updated (only Id and Name), but it does not restrict *which* customer record is being updated.",
|
|
67
|
+
"consensus": {
|
|
68
|
+
"score": 1.0,
|
|
69
|
+
"agreement_level": "unanimous",
|
|
70
|
+
"voted_models": [
|
|
71
|
+
"gemini-2.0-pro",
|
|
72
|
+
"claude-3-7"
|
|
73
|
+
],
|
|
74
|
+
"rationale": "Allow-list restricts fields but not the target resource ID."
|
|
75
|
+
},
|
|
76
|
+
"attack_vector": {
|
|
77
|
+
"method": "POST",
|
|
78
|
+
"path": "/Customer/EditName",
|
|
79
|
+
"target_param": "customer.Id"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"finding_id": "BOLA-R-0012-1",
|
|
84
|
+
"verdict": "confirmed",
|
|
85
|
+
"reason_code": "traced",
|
|
86
|
+
"severity": "high",
|
|
87
|
+
"confidence": "high",
|
|
88
|
+
"checked": [
|
|
89
|
+
"dotnet-legacy/Web/Controllers/CustomerController.cs lines 27-32"
|
|
90
|
+
],
|
|
91
|
+
"control_found": null,
|
|
92
|
+
"notes": "The `Refresh` method accepts an integer `id` parameter. It fetches the customer using `db.Customers.Find(id)` and then updates it via `TryUpdateModel`. There is no logic to verify that the `id` provided corresponds to the current user's record.",
|
|
93
|
+
"consensus": {
|
|
94
|
+
"score": 1.0,
|
|
95
|
+
"agreement_level": "unanimous",
|
|
96
|
+
"voted_models": [
|
|
97
|
+
"gemini-2.0-pro",
|
|
98
|
+
"claude-3-7"
|
|
99
|
+
],
|
|
100
|
+
"rationale": "Direct lookup by request id without tenant or user context binding."
|
|
101
|
+
},
|
|
102
|
+
"attack_vector": {
|
|
103
|
+
"method": "POST",
|
|
104
|
+
"path": "/Customer/Refresh",
|
|
105
|
+
"target_param": "id"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"finding_id": "BOLA-R-0016-1",
|
|
110
|
+
"verdict": "confirmed",
|
|
111
|
+
"reason_code": "traced",
|
|
112
|
+
"severity": "high",
|
|
113
|
+
"confidence": "high",
|
|
114
|
+
"checked": [
|
|
115
|
+
"dotnet-legacy/Web/Handlers/GetFile.ashx lines 8-10"
|
|
116
|
+
],
|
|
117
|
+
"control_found": null,
|
|
118
|
+
"notes": "The handler retrieves `fileId` directly from the query string (`context.Request.QueryString[\"file_id\"]`) and passes it to `DocStore.PathFor(fileId)` which is then used for file transmission. There is no check to ensure the current user owns or has permission to access the file identified by this ID.",
|
|
119
|
+
"consensus": {
|
|
120
|
+
"score": 1.0,
|
|
121
|
+
"agreement_level": "unanimous",
|
|
122
|
+
"voted_models": [
|
|
123
|
+
"gemini-2.0-pro",
|
|
124
|
+
"claude-3-7"
|
|
125
|
+
],
|
|
126
|
+
"rationale": "Direct lookup by request id without tenant or user context binding."
|
|
127
|
+
},
|
|
128
|
+
"attack_vector": {
|
|
129
|
+
"method": "GET",
|
|
130
|
+
"path": "/dotnet-legacy/Web/Handlers/GetFile.ashx",
|
|
131
|
+
"target_param": "file_id"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|