torusguard 1.3.5 → 1.3.6
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/.torusguard/.manifest.json +35 -35
- package/.torusguard/runs/report-latest.html +2685 -303
- package/.torusguard/runs/results-latest.sarif +20 -0
- package/.torusguard/runs/run-20260918-104221-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-104221-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-104221-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-104221-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-104236-audit/findings.json +2314 -0
- package/.torusguard/runs/run-20260918-104236-audit/findings.md +960 -0
- package/.torusguard/runs/run-20260918-104236-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-104236-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105723-audit/findings.json +2382 -0
- package/.torusguard/runs/run-20260918-105723-audit/findings.md +960 -0
- package/.torusguard/runs/run-20260918-105723-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105723-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105731-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-105731-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-105731-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105731-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105940-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-105940-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-105940-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105940-audit/summary.md +5 -0
- package/.torusguard/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
- package/.torusguard/scripts/apply_runner.py +11 -5
- package/.torusguard/scripts/audit_runner.py +222 -15
- package/.torusguard/scripts/harden_runner.py +3 -3
- package/.torusguard/scripts/html_reporter.py +2668 -648
- package/.torusguard/scripts/recheck_runner.py +3 -3
- package/.torusguard/scripts/recipes_runner.py +3 -3
- package/.torusguard/scripts/report_sync.py +370 -74
- package/.torusguard/scripts/sarif_exporter.py +48 -8
- package/.torusguard/scripts/stack_detect.py +44 -2
- package/.torusguard/scripts/term_ui.py +1 -1
- package/.torusguard/skills/torusguard/SKILL.md +75 -72
- package/.torusguard/skills/torusguard-apply/SKILL.md +84 -80
- package/.torusguard/skills/torusguard-audit/SKILL.md +87 -83
- package/.torusguard/skills/torusguard-authorize/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-full/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-harden/SKILL.md +98 -94
- package/.torusguard/skills/torusguard-init/SKILL.md +68 -64
- package/.torusguard/skills/torusguard-recheck/SKILL.md +81 -77
- package/.torusguard/skills/torusguard-report/SKILL.md +93 -72
- package/.torusguard/skills/torusguard-status/SKILL.md +62 -58
- package/.torusguard/skills/torusguard-verify/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-web-validate/SKILL.md +7 -2
- package/.torusguard/workflows/apply.md +1 -1
- package/.torusguard/workflows/audit.md +1 -1
- package/.torusguard/workflows/authorize.md +1 -1
- package/.torusguard/workflows/exploit-check.md +1 -1
- package/.torusguard/workflows/harden.md +1 -1
- package/.torusguard/workflows/init.md +1 -1
- package/.torusguard/workflows/memory.md +1 -1
- package/.torusguard/workflows/recheck.md +1 -1
- package/.torusguard/workflows/report.md +1 -1
- package/.torusguard/workflows/status.md +1 -1
- package/.torusguard/workflows/verify.md +1 -1
- package/.torusguard/workflows/web-validate.md +1 -1
- package/README.md +14 -8
- package/bin/torusguard.js +56 -20
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +1 -1
- package/skills/torusguard/bootstrap.py +7 -2
- package/skills/torusguard/payload/.manifest.json +35 -35
- package/skills/torusguard/payload/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/rules_sync.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/apply_runner.py +11 -5
- package/skills/torusguard/payload/scripts/audit_runner.py +222 -15
- package/skills/torusguard/payload/scripts/harden_runner.py +3 -3
- package/skills/torusguard/payload/scripts/html_reporter.py +2668 -648
- package/skills/torusguard/payload/scripts/recheck_runner.py +3 -3
- package/skills/torusguard/payload/scripts/recipes_runner.py +3 -3
- package/skills/torusguard/payload/scripts/report_sync.py +370 -74
- package/skills/torusguard/payload/scripts/sarif_exporter.py +48 -8
- package/skills/torusguard/payload/scripts/stack_detect.py +44 -2
- package/skills/torusguard/payload/scripts/term_ui.py +1 -1
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-apply/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-authorize/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-exploit-check/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-full/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-init/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-report/SKILL.md +40 -23
- package/skills/torusguard/payload/skills/torusguard-status/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-verify/SKILL.md +1 -1
- package/skills/torusguard/payload/skills/torusguard-web-validate/SKILL.md +1 -1
- package/skills/torusguard/payload/workflows/apply.md +1 -1
- package/skills/torusguard/payload/workflows/audit.md +1 -1
- package/skills/torusguard/payload/workflows/authorize.md +1 -1
- package/skills/torusguard/payload/workflows/exploit-check.md +1 -1
- package/skills/torusguard/payload/workflows/harden.md +1 -1
- package/skills/torusguard/payload/workflows/init.md +1 -1
- package/skills/torusguard/payload/workflows/memory.md +1 -1
- package/skills/torusguard/payload/workflows/recheck.md +1 -1
- package/skills/torusguard/payload/workflows/report.md +1 -1
- package/skills/torusguard/payload/workflows/status.md +1 -1
- package/skills/torusguard/payload/workflows/verify.md +1 -1
- package/skills/torusguard/payload/workflows/web-validate.md +1 -1
- package/skills/torusguard-apply/SKILL.md +1 -1
- package/skills/torusguard-audit/SKILL.md +1 -1
- package/skills/torusguard-authorize/SKILL.md +1 -1
- package/skills/torusguard-exploit-check/SKILL.md +1 -1
- package/skills/torusguard-full/SKILL.md +1 -1
- package/skills/torusguard-harden/SKILL.md +1 -1
- package/skills/torusguard-init/SKILL.md +1 -1
- package/skills/torusguard-recheck/SKILL.md +1 -1
- package/skills/torusguard-report/SKILL.md +40 -23
- package/skills/torusguard-status/SKILL.md +1 -1
- package/skills/torusguard-verify/SKILL.md +1 -1
- package/skills/torusguard-web-validate/SKILL.md +1 -1
|
@@ -0,0 +1,2314 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"finding_id": "TG-INPUT-002-f8cd11b9",
|
|
4
|
+
"rule_id": "TG-INPUT-002",
|
|
5
|
+
"title": "Raw SQL Concatenation",
|
|
6
|
+
"description": "Python f-string interpolation in raw SQL query",
|
|
7
|
+
"severity": "Critical",
|
|
8
|
+
"category": "injection",
|
|
9
|
+
"cluster": "cluster-injection",
|
|
10
|
+
"file_path": "harness/runner.py",
|
|
11
|
+
"line_number": 258,
|
|
12
|
+
"matched_text": "raw(f'SELECT * FROM users WHERE name = {",
|
|
13
|
+
"snippet": " framework_pattern=FrameworkPattern(\n framework=\"Django\",\n unsafe_snippet=\"User.objects.raw(f'SELECT * FROM users WHERE name = {name}')\",\n safe_snippet=\"User.objects.raw('SELECT * FROM users WHERE name = %s', [name])\",\n ),",
|
|
14
|
+
"is_test": false,
|
|
15
|
+
"rule_precision": 0.85,
|
|
16
|
+
"target": {
|
|
17
|
+
"file_path": "harness/runner.py",
|
|
18
|
+
"start_line": 258,
|
|
19
|
+
"end_line": 258
|
|
20
|
+
},
|
|
21
|
+
"confidence_score": 84,
|
|
22
|
+
"confidence_band": "High Confidence",
|
|
23
|
+
"confidence_factors": {
|
|
24
|
+
"evidence_quality": 29,
|
|
25
|
+
"reproduction_success": 0,
|
|
26
|
+
"independent_confirmations": 15,
|
|
27
|
+
"environmental_clarity": 15,
|
|
28
|
+
"manual_review_status": 0,
|
|
29
|
+
"memory_boost": 25,
|
|
30
|
+
"test_exemption": false,
|
|
31
|
+
"test_deduction": 0,
|
|
32
|
+
"total_score": 84,
|
|
33
|
+
"classification_band": "High Confidence"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"finding_id": "TG-SEC-001-593d6437",
|
|
38
|
+
"rule_id": "TG-SEC-001",
|
|
39
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
40
|
+
"description": "Hardcoded credential or API secret string",
|
|
41
|
+
"severity": "Critical",
|
|
42
|
+
"category": "secrets",
|
|
43
|
+
"cluster": "cluster-credentials-exposure",
|
|
44
|
+
"file_path": "harness/runner.py",
|
|
45
|
+
"line_number": 211,
|
|
46
|
+
"matched_text": "SECRET_KEY = 'super_secret_jwt_key'",
|
|
47
|
+
"snippet": " type=EvidenceType.SOURCE,\n location=\"server/auth.py:42\",\n raw_snippet=\"SECRET_KEY = 'super_secret_jwt_key'\",\n rationale=\"Hardcoded secret credential.\",\n confidence_level=ConfidenceBand.CONFIRMED,",
|
|
48
|
+
"is_test": false,
|
|
49
|
+
"rule_precision": 0.9,
|
|
50
|
+
"target": {
|
|
51
|
+
"file_path": "harness/runner.py",
|
|
52
|
+
"start_line": 211,
|
|
53
|
+
"end_line": 211
|
|
54
|
+
},
|
|
55
|
+
"confidence_score": 81,
|
|
56
|
+
"confidence_band": "High Confidence",
|
|
57
|
+
"confidence_factors": {
|
|
58
|
+
"evidence_quality": 31,
|
|
59
|
+
"reproduction_success": 0,
|
|
60
|
+
"independent_confirmations": 15,
|
|
61
|
+
"environmental_clarity": 15,
|
|
62
|
+
"manual_review_status": 0,
|
|
63
|
+
"memory_boost": 20,
|
|
64
|
+
"test_exemption": false,
|
|
65
|
+
"test_deduction": 0,
|
|
66
|
+
"total_score": 81,
|
|
67
|
+
"classification_band": "High Confidence"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"finding_id": "TG-SEC-001-e0a84cf3",
|
|
72
|
+
"rule_id": "TG-SEC-001",
|
|
73
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
74
|
+
"description": "Hardcoded credential or API secret string",
|
|
75
|
+
"severity": "Critical",
|
|
76
|
+
"category": "secrets",
|
|
77
|
+
"cluster": "cluster-credentials-exposure",
|
|
78
|
+
"file_path": "harness/runner.py",
|
|
79
|
+
"line_number": 221,
|
|
80
|
+
"matched_text": "API_KEY = 'sk_live_998877665544332211'",
|
|
81
|
+
"snippet": " def test_sensitive_data_masking(self):\n print(\"\\n6. Testing Sensitive Secret & Token Masking...\")\n sample_secret = \"API_KEY = 'sk_live_998877665544332211'\"\n masked = mask_sensitive_data(sample_secret)\n self.log_test(\"Stripe Secret Key Redaction\", \"sk_live_***REDACTED***\" in masked and \"998877665544332211\" not in masked)",
|
|
82
|
+
"is_test": false,
|
|
83
|
+
"rule_precision": 0.9,
|
|
84
|
+
"target": {
|
|
85
|
+
"file_path": "harness/runner.py",
|
|
86
|
+
"start_line": 221,
|
|
87
|
+
"end_line": 221
|
|
88
|
+
},
|
|
89
|
+
"confidence_score": 81,
|
|
90
|
+
"confidence_band": "High Confidence",
|
|
91
|
+
"confidence_factors": {
|
|
92
|
+
"evidence_quality": 31,
|
|
93
|
+
"reproduction_success": 0,
|
|
94
|
+
"independent_confirmations": 15,
|
|
95
|
+
"environmental_clarity": 15,
|
|
96
|
+
"manual_review_status": 0,
|
|
97
|
+
"memory_boost": 20,
|
|
98
|
+
"test_exemption": false,
|
|
99
|
+
"test_deduction": 0,
|
|
100
|
+
"total_score": 81,
|
|
101
|
+
"classification_band": "High Confidence"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"finding_id": "TG-SEC-001-88c9bb29",
|
|
106
|
+
"rule_id": "TG-SEC-001",
|
|
107
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
108
|
+
"description": "Hardcoded credential or API secret string",
|
|
109
|
+
"severity": "Critical",
|
|
110
|
+
"category": "secrets",
|
|
111
|
+
"cluster": "cluster-credentials-exposure",
|
|
112
|
+
"file_path": "harness/runner.py",
|
|
113
|
+
"line_number": 392,
|
|
114
|
+
"matched_text": "SECRET_KEY = 'sk_live_secret_key_12345'",
|
|
115
|
+
"snippet": " type=EvidenceType.SOURCE,\n location=\"settings.py:10\",\n raw_snippet=\"DEBUG = True\\nSECRET_KEY = 'sk_live_secret_key_12345'\",\n rationale=\"Production debug mode exposure and hardcoded secret.\",\n confidence_level=ConfidenceBand.CONFIRMED,",
|
|
116
|
+
"is_test": false,
|
|
117
|
+
"rule_precision": 0.9,
|
|
118
|
+
"target": {
|
|
119
|
+
"file_path": "harness/runner.py",
|
|
120
|
+
"start_line": 392,
|
|
121
|
+
"end_line": 392
|
|
122
|
+
},
|
|
123
|
+
"confidence_score": 81,
|
|
124
|
+
"confidence_band": "High Confidence",
|
|
125
|
+
"confidence_factors": {
|
|
126
|
+
"evidence_quality": 31,
|
|
127
|
+
"reproduction_success": 0,
|
|
128
|
+
"independent_confirmations": 15,
|
|
129
|
+
"environmental_clarity": 15,
|
|
130
|
+
"manual_review_status": 0,
|
|
131
|
+
"memory_boost": 20,
|
|
132
|
+
"test_exemption": false,
|
|
133
|
+
"test_deduction": 0,
|
|
134
|
+
"total_score": 81,
|
|
135
|
+
"classification_band": "High Confidence"
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"finding_id": "TG-SEC-001-c616aefd",
|
|
140
|
+
"rule_id": "TG-SEC-001",
|
|
141
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
142
|
+
"description": "Hardcoded credential or API secret string",
|
|
143
|
+
"severity": "Critical",
|
|
144
|
+
"category": "secrets",
|
|
145
|
+
"cluster": "cluster-credentials-exposure",
|
|
146
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
147
|
+
"line_number": 64,
|
|
148
|
+
"matched_text": "SECRET_KEY = \"sk_live_1234567890\"",
|
|
149
|
+
"snippet": " \"tiny-repo\": {\n \"vulnerable\": {\n \"app.py\": 'DEBUG = True\\nSECRET_KEY = \"sk_live_1234567890\"\\n\\ndef index():\\n return \"Welcome\"\\n'\n },\n \"hardened\": {",
|
|
150
|
+
"is_test": false,
|
|
151
|
+
"rule_precision": 0.9,
|
|
152
|
+
"target": {
|
|
153
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
154
|
+
"start_line": 64,
|
|
155
|
+
"end_line": 64
|
|
156
|
+
},
|
|
157
|
+
"confidence_score": 77,
|
|
158
|
+
"confidence_band": "High Confidence",
|
|
159
|
+
"confidence_factors": {
|
|
160
|
+
"evidence_quality": 31,
|
|
161
|
+
"reproduction_success": 0,
|
|
162
|
+
"independent_confirmations": 11,
|
|
163
|
+
"environmental_clarity": 15,
|
|
164
|
+
"manual_review_status": 0,
|
|
165
|
+
"memory_boost": 20,
|
|
166
|
+
"test_exemption": false,
|
|
167
|
+
"test_deduction": 0,
|
|
168
|
+
"total_score": 77,
|
|
169
|
+
"classification_band": "High Confidence"
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"finding_id": "TG-SEC-001-d5b3684f",
|
|
174
|
+
"rule_id": "TG-SEC-001",
|
|
175
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
176
|
+
"description": "Hardcoded credential or API secret string",
|
|
177
|
+
"severity": "Critical",
|
|
178
|
+
"category": "secrets",
|
|
179
|
+
"cluster": "cluster-credentials-exposure",
|
|
180
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
181
|
+
"line_number": 90,
|
|
182
|
+
"matched_text": "SECRET_KEY = \"sk_live_1234567890\"",
|
|
183
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": \"app.py\", \"line_start\": 2, \"line_end\": 2},\n \"evidence\": {\"code_snippet\": 'SECRET_KEY = \"sk_live_1234567890\"'},\n \"what_is_wrong\": \"Hardcoded secret exposed in source code.\",\n \"what_should_change\": \"Load SECRET_KEY from environment variables.\",",
|
|
184
|
+
"is_test": false,
|
|
185
|
+
"rule_precision": 0.9,
|
|
186
|
+
"target": {
|
|
187
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
188
|
+
"start_line": 90,
|
|
189
|
+
"end_line": 90
|
|
190
|
+
},
|
|
191
|
+
"confidence_score": 77,
|
|
192
|
+
"confidence_band": "High Confidence",
|
|
193
|
+
"confidence_factors": {
|
|
194
|
+
"evidence_quality": 31,
|
|
195
|
+
"reproduction_success": 0,
|
|
196
|
+
"independent_confirmations": 11,
|
|
197
|
+
"environmental_clarity": 15,
|
|
198
|
+
"manual_review_status": 0,
|
|
199
|
+
"memory_boost": 20,
|
|
200
|
+
"test_exemption": false,
|
|
201
|
+
"test_deduction": 0,
|
|
202
|
+
"total_score": 77,
|
|
203
|
+
"classification_band": "High Confidence"
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"finding_id": "TG-SEC-001-54f1a02a",
|
|
208
|
+
"rule_id": "TG-SEC-001",
|
|
209
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
210
|
+
"description": "Hardcoded credential or API secret string",
|
|
211
|
+
"severity": "Critical",
|
|
212
|
+
"category": "secrets",
|
|
213
|
+
"cluster": "cluster-credentials-exposure",
|
|
214
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
215
|
+
"line_number": 341,
|
|
216
|
+
"matched_text": "PASSWORD=\"secret_in_docker\"",
|
|
217
|
+
"snippet": "COPY . .\n# Running as root user & hardcoding secrets\nENV DATABASE_PASSWORD=\"secret_in_docker\"\nCMD [\"python\", \"main.py\"]\n\"\"\", encoding=\"utf-8\")",
|
|
218
|
+
"is_test": false,
|
|
219
|
+
"rule_precision": 0.9,
|
|
220
|
+
"target": {
|
|
221
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
222
|
+
"start_line": 341,
|
|
223
|
+
"end_line": 341
|
|
224
|
+
},
|
|
225
|
+
"confidence_score": 77,
|
|
226
|
+
"confidence_band": "High Confidence",
|
|
227
|
+
"confidence_factors": {
|
|
228
|
+
"evidence_quality": 31,
|
|
229
|
+
"reproduction_success": 0,
|
|
230
|
+
"independent_confirmations": 11,
|
|
231
|
+
"environmental_clarity": 15,
|
|
232
|
+
"manual_review_status": 0,
|
|
233
|
+
"memory_boost": 20,
|
|
234
|
+
"test_exemption": false,
|
|
235
|
+
"test_deduction": 0,
|
|
236
|
+
"total_score": 77,
|
|
237
|
+
"classification_band": "High Confidence"
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"finding_id": "TG-SEC-001-676f776e",
|
|
242
|
+
"rule_id": "TG-SEC-001",
|
|
243
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
244
|
+
"description": "Hardcoded credential or API secret string",
|
|
245
|
+
"severity": "Critical",
|
|
246
|
+
"category": "secrets",
|
|
247
|
+
"cluster": "cluster-credentials-exposure",
|
|
248
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
249
|
+
"line_number": 356,
|
|
250
|
+
"matched_text": "PASSWORD=\"secret_in_docker\"",
|
|
251
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": \"Dockerfile\", \"line_start\": 5, \"line_end\": 5},\n \"evidence\": {\"code_snippet\": 'ENV DATABASE_PASSWORD=\"secret_in_docker\"'},\n \"what_is_wrong\": \"Secret baked into immutable container image layer.\",\n \"what_should_change\": \"Inject secrets at runtime or use BuildKit --mount=type=secret.\",",
|
|
252
|
+
"is_test": false,
|
|
253
|
+
"rule_precision": 0.9,
|
|
254
|
+
"target": {
|
|
255
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
256
|
+
"start_line": 356,
|
|
257
|
+
"end_line": 356
|
|
258
|
+
},
|
|
259
|
+
"confidence_score": 77,
|
|
260
|
+
"confidence_band": "High Confidence",
|
|
261
|
+
"confidence_factors": {
|
|
262
|
+
"evidence_quality": 31,
|
|
263
|
+
"reproduction_success": 0,
|
|
264
|
+
"independent_confirmations": 11,
|
|
265
|
+
"environmental_clarity": 15,
|
|
266
|
+
"manual_review_status": 0,
|
|
267
|
+
"memory_boost": 20,
|
|
268
|
+
"test_exemption": false,
|
|
269
|
+
"test_deduction": 0,
|
|
270
|
+
"total_score": 77,
|
|
271
|
+
"classification_band": "High Confidence"
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"finding_id": "TG-SEC-001-58f70e46",
|
|
276
|
+
"rule_id": "TG-SEC-001",
|
|
277
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
278
|
+
"description": "Hardcoded credential or API secret string",
|
|
279
|
+
"severity": "Critical",
|
|
280
|
+
"category": "secrets",
|
|
281
|
+
"cluster": "cluster-credentials-exposure",
|
|
282
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
283
|
+
"line_number": 362,
|
|
284
|
+
"matched_text": "PASSWORD=\"secret_in_docker\"",
|
|
285
|
+
"snippet": "+++ b/Dockerfile\n@@ -5,1 +5,2 @@\n-ENV DATABASE_PASSWORD=\"secret_in_docker\"\n+USER appuser\n\"\"\",",
|
|
286
|
+
"is_test": false,
|
|
287
|
+
"rule_precision": 0.9,
|
|
288
|
+
"target": {
|
|
289
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
290
|
+
"start_line": 362,
|
|
291
|
+
"end_line": 362
|
|
292
|
+
},
|
|
293
|
+
"confidence_score": 77,
|
|
294
|
+
"confidence_band": "High Confidence",
|
|
295
|
+
"confidence_factors": {
|
|
296
|
+
"evidence_quality": 31,
|
|
297
|
+
"reproduction_success": 0,
|
|
298
|
+
"independent_confirmations": 11,
|
|
299
|
+
"environmental_clarity": 15,
|
|
300
|
+
"manual_review_status": 0,
|
|
301
|
+
"memory_boost": 20,
|
|
302
|
+
"test_exemption": false,
|
|
303
|
+
"test_deduction": 0,
|
|
304
|
+
"total_score": 77,
|
|
305
|
+
"classification_band": "High Confidence"
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"finding_id": "TG-INPUT-002-02f8e274",
|
|
310
|
+
"rule_id": "TG-INPUT-002",
|
|
311
|
+
"title": "Raw SQL Concatenation",
|
|
312
|
+
"description": "Python f-string interpolation in raw SQL query",
|
|
313
|
+
"severity": "Critical",
|
|
314
|
+
"category": "injection",
|
|
315
|
+
"cluster": "cluster-injection",
|
|
316
|
+
"file_path": "harness/engine/fixture_manager.py",
|
|
317
|
+
"line_number": 128,
|
|
318
|
+
"matched_text": "execute(f'SELECT * FROM items WHERE name LIKE {",
|
|
319
|
+
"snippet": " vulnerable_variant=FixtureVariant(\n relative_path=\"examples/python/sqlalchemy-vuln\",\n code_pattern=\"session.execute(f'SELECT * FROM items WHERE name LIKE {q}')\",\n expected_findings_count=4,\n ),",
|
|
320
|
+
"is_test": false,
|
|
321
|
+
"rule_precision": 0.85,
|
|
322
|
+
"target": {
|
|
323
|
+
"file_path": "harness/engine/fixture_manager.py",
|
|
324
|
+
"start_line": 128,
|
|
325
|
+
"end_line": 128
|
|
326
|
+
},
|
|
327
|
+
"confidence_score": 74,
|
|
328
|
+
"confidence_band": "High Confidence",
|
|
329
|
+
"confidence_factors": {
|
|
330
|
+
"evidence_quality": 29,
|
|
331
|
+
"reproduction_success": 0,
|
|
332
|
+
"independent_confirmations": 5,
|
|
333
|
+
"environmental_clarity": 15,
|
|
334
|
+
"manual_review_status": 0,
|
|
335
|
+
"memory_boost": 25,
|
|
336
|
+
"test_exemption": false,
|
|
337
|
+
"test_deduction": 0,
|
|
338
|
+
"total_score": 74,
|
|
339
|
+
"classification_band": "High Confidence"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"finding_id": "TG-SEC-001-7c852ff3",
|
|
344
|
+
"rule_id": "TG-SEC-001",
|
|
345
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
346
|
+
"description": "Hardcoded credential or API secret string",
|
|
347
|
+
"severity": "Critical",
|
|
348
|
+
"category": "secrets",
|
|
349
|
+
"cluster": "cluster-credentials-exposure",
|
|
350
|
+
"file_path": "harness/master_validation.py",
|
|
351
|
+
"line_number": 257,
|
|
352
|
+
"matched_text": "PASSWORD = 'super_secret_database_password_123'",
|
|
353
|
+
"snippet": " self.log(\"Redaction\", \"JWT Token Redaction\", \"Bearer ***REDACTED_JWT***\" in masked_jwt and \"doNotLeakSignature\" not in masked_jwt)\n\n masked_pwd = mask_sensitive_data(\"DB_PASSWORD = 'super_secret_database_password_123'\")\n self.log(\"Redaction\", \"Password Variable Redaction\", \"***REDACTED***\" in masked_pwd and \"super_secret_database_password_123\" not in masked_pwd)\n",
|
|
354
|
+
"is_test": false,
|
|
355
|
+
"rule_precision": 0.9,
|
|
356
|
+
"target": {
|
|
357
|
+
"file_path": "harness/master_validation.py",
|
|
358
|
+
"start_line": 257,
|
|
359
|
+
"end_line": 257
|
|
360
|
+
},
|
|
361
|
+
"confidence_score": 74,
|
|
362
|
+
"confidence_band": "High Confidence",
|
|
363
|
+
"confidence_factors": {
|
|
364
|
+
"evidence_quality": 31,
|
|
365
|
+
"reproduction_success": 0,
|
|
366
|
+
"independent_confirmations": 8,
|
|
367
|
+
"environmental_clarity": 15,
|
|
368
|
+
"manual_review_status": 0,
|
|
369
|
+
"memory_boost": 20,
|
|
370
|
+
"test_exemption": false,
|
|
371
|
+
"test_deduction": 0,
|
|
372
|
+
"total_score": 74,
|
|
373
|
+
"classification_band": "High Confidence"
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"finding_id": "TG-SEC-001-02761dbb",
|
|
378
|
+
"rule_id": "TG-SEC-001",
|
|
379
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
380
|
+
"description": "Hardcoded credential or API secret string",
|
|
381
|
+
"severity": "Critical",
|
|
382
|
+
"category": "secrets",
|
|
383
|
+
"cluster": "cluster-credentials-exposure",
|
|
384
|
+
"file_path": "harness/master_validation.py",
|
|
385
|
+
"line_number": 460,
|
|
386
|
+
"matched_text": "API_KEY = 'sk_live_998877665544332211'",
|
|
387
|
+
"snippet": "\n def _create_sample_finding(self, rule_id: str, target_path: str, secret_test: bool = False) -> Finding:\n raw_code = \"STRIPE_API_KEY = 'sk_live_998877665544332211'\\nAuthorization = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.doNotLeakSignature'\" if secret_test else f\"# Logic for {rule_id}\\nrole = request.headers.get('X-User-Role')\"\n\n ev = Evidence(",
|
|
388
|
+
"is_test": false,
|
|
389
|
+
"rule_precision": 0.9,
|
|
390
|
+
"target": {
|
|
391
|
+
"file_path": "harness/master_validation.py",
|
|
392
|
+
"start_line": 460,
|
|
393
|
+
"end_line": 460
|
|
394
|
+
},
|
|
395
|
+
"confidence_score": 74,
|
|
396
|
+
"confidence_band": "High Confidence",
|
|
397
|
+
"confidence_factors": {
|
|
398
|
+
"evidence_quality": 31,
|
|
399
|
+
"reproduction_success": 0,
|
|
400
|
+
"independent_confirmations": 8,
|
|
401
|
+
"environmental_clarity": 15,
|
|
402
|
+
"manual_review_status": 0,
|
|
403
|
+
"memory_boost": 20,
|
|
404
|
+
"test_exemption": false,
|
|
405
|
+
"test_deduction": 0,
|
|
406
|
+
"total_score": 74,
|
|
407
|
+
"classification_band": "High Confidence"
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"finding_id": "TG-DB-004-e8cc000a",
|
|
412
|
+
"rule_id": "TG-DB-004",
|
|
413
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
414
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
415
|
+
"severity": "Critical",
|
|
416
|
+
"category": "database",
|
|
417
|
+
"cluster": "cluster-tenant-isolation",
|
|
418
|
+
"file_path": "harness/runner.py",
|
|
419
|
+
"line_number": 505,
|
|
420
|
+
"matched_text": ".objects.get(id=id)",
|
|
421
|
+
"snippet": "\n # 2. Stable Finding Identity\n code_a = \"def view():\\n return Item.objects.get(id=id)\"\n code_b = \"# Shifted comment\\ndef view():\\n return Item.objects.get(id=id)\"\n fp1 = IdentityEngine.generate_identity(\"TG-DB-004\", \"views.py\", code_a, sink_signature=\"Item.objects.get\")",
|
|
422
|
+
"is_test": false,
|
|
423
|
+
"rule_precision": 0.55,
|
|
424
|
+
"target": {
|
|
425
|
+
"file_path": "harness/runner.py",
|
|
426
|
+
"start_line": 505,
|
|
427
|
+
"end_line": 505
|
|
428
|
+
},
|
|
429
|
+
"confidence_score": 74,
|
|
430
|
+
"confidence_band": "High Confidence",
|
|
431
|
+
"confidence_factors": {
|
|
432
|
+
"evidence_quality": 19,
|
|
433
|
+
"reproduction_success": 0,
|
|
434
|
+
"independent_confirmations": 15,
|
|
435
|
+
"environmental_clarity": 15,
|
|
436
|
+
"manual_review_status": 0,
|
|
437
|
+
"memory_boost": 25,
|
|
438
|
+
"test_exemption": false,
|
|
439
|
+
"test_deduction": 0,
|
|
440
|
+
"total_score": 74,
|
|
441
|
+
"classification_band": "High Confidence"
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"finding_id": "TG-DB-004-89b581f9",
|
|
446
|
+
"rule_id": "TG-DB-004",
|
|
447
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
448
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
449
|
+
"severity": "Critical",
|
|
450
|
+
"category": "database",
|
|
451
|
+
"cluster": "cluster-tenant-isolation",
|
|
452
|
+
"file_path": "harness/runner.py",
|
|
453
|
+
"line_number": 506,
|
|
454
|
+
"matched_text": ".objects.get(id=id)",
|
|
455
|
+
"snippet": " # 2. Stable Finding Identity\n code_a = \"def view():\\n return Item.objects.get(id=id)\"\n code_b = \"# Shifted comment\\ndef view():\\n return Item.objects.get(id=id)\"\n fp1 = IdentityEngine.generate_identity(\"TG-DB-004\", \"views.py\", code_a, sink_signature=\"Item.objects.get\")\n fp2 = IdentityEngine.generate_identity(\"TG-DB-004\", \"views.py\", code_b, sink_signature=\"Item.objects.get\")",
|
|
456
|
+
"is_test": false,
|
|
457
|
+
"rule_precision": 0.55,
|
|
458
|
+
"target": {
|
|
459
|
+
"file_path": "harness/runner.py",
|
|
460
|
+
"start_line": 506,
|
|
461
|
+
"end_line": 506
|
|
462
|
+
},
|
|
463
|
+
"confidence_score": 74,
|
|
464
|
+
"confidence_band": "High Confidence",
|
|
465
|
+
"confidence_factors": {
|
|
466
|
+
"evidence_quality": 19,
|
|
467
|
+
"reproduction_success": 0,
|
|
468
|
+
"independent_confirmations": 15,
|
|
469
|
+
"environmental_clarity": 15,
|
|
470
|
+
"manual_review_status": 0,
|
|
471
|
+
"memory_boost": 25,
|
|
472
|
+
"test_exemption": false,
|
|
473
|
+
"test_deduction": 0,
|
|
474
|
+
"total_score": 74,
|
|
475
|
+
"classification_band": "High Confidence"
|
|
476
|
+
}
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
"finding_id": "TG-SEC-001-3a2b5eca",
|
|
480
|
+
"rule_id": "TG-SEC-001",
|
|
481
|
+
"title": "Hardcoded Secret or API Key in Tracked Source",
|
|
482
|
+
"description": "Hardcoded credential or API secret string",
|
|
483
|
+
"severity": "Critical",
|
|
484
|
+
"category": "secrets",
|
|
485
|
+
"cluster": "cluster-credentials-exposure",
|
|
486
|
+
"file_path": "harness/validate_e2e.py",
|
|
487
|
+
"line_number": 355,
|
|
488
|
+
"matched_text": "API_KEY = 'sk_live_998877665544332211'",
|
|
489
|
+
"snippet": "\n def _create_sample_finding(self, rule_id: str, target_path: str, secret_test: bool = False) -> Finding:\n raw_code = \"API_KEY = 'sk_live_998877665544332211'\\nAuthorization = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.doNotLeakSignature'\" if secret_test else f\"# Unsafe logic for {rule_id}\\nrole = request.headers.get('X-User-Role')\"\n \n ev = Evidence(",
|
|
490
|
+
"is_test": false,
|
|
491
|
+
"rule_precision": 0.9,
|
|
492
|
+
"target": {
|
|
493
|
+
"file_path": "harness/validate_e2e.py",
|
|
494
|
+
"start_line": 355,
|
|
495
|
+
"end_line": 355
|
|
496
|
+
},
|
|
497
|
+
"confidence_score": 74,
|
|
498
|
+
"confidence_band": "High Confidence",
|
|
499
|
+
"confidence_factors": {
|
|
500
|
+
"evidence_quality": 31,
|
|
501
|
+
"reproduction_success": 0,
|
|
502
|
+
"independent_confirmations": 8,
|
|
503
|
+
"environmental_clarity": 15,
|
|
504
|
+
"manual_review_status": 0,
|
|
505
|
+
"memory_boost": 20,
|
|
506
|
+
"test_exemption": false,
|
|
507
|
+
"test_deduction": 0,
|
|
508
|
+
"total_score": 74,
|
|
509
|
+
"classification_band": "High Confidence"
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
"finding_id": "TG-DB-002-08d11e50",
|
|
514
|
+
"rule_id": "TG-DB-002",
|
|
515
|
+
"title": "Privileged Database Credential in Browser Context",
|
|
516
|
+
"description": "Service role key or raw database connection string reference in frontend code",
|
|
517
|
+
"severity": "Critical",
|
|
518
|
+
"category": "database",
|
|
519
|
+
"cluster": "cluster-client-leak",
|
|
520
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
521
|
+
"line_number": 134,
|
|
522
|
+
"matched_text": "SUPABASE_SERVICE_ROLE_KEY",
|
|
523
|
+
"snippet": " assert nextjs_file.is_file(), \"Missing actions.ts in vulnerable_nextjs\"\n nx_code = nextjs_file.read_text(encoding=\"utf-8\")\n assert \"TG-CLIENT-001\" in nx_code and \"SUPABASE_SERVICE_ROLE_KEY\" in nx_code\n assert \"TG-AUTH-003\" in nx_code and \"use server\" in nx_code\n print(\" [PASS] vulnerable_nextjs fixture contains TG-CLIENT-001 and TG-AUTH-003 sinks\")",
|
|
524
|
+
"is_test": false,
|
|
525
|
+
"rule_precision": 0.9,
|
|
526
|
+
"target": {
|
|
527
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
528
|
+
"start_line": 134,
|
|
529
|
+
"end_line": 134
|
|
530
|
+
},
|
|
531
|
+
"confidence_score": 74,
|
|
532
|
+
"confidence_band": "High Confidence",
|
|
533
|
+
"confidence_factors": {
|
|
534
|
+
"evidence_quality": 31,
|
|
535
|
+
"reproduction_success": 0,
|
|
536
|
+
"independent_confirmations": 8,
|
|
537
|
+
"environmental_clarity": 15,
|
|
538
|
+
"manual_review_status": 0,
|
|
539
|
+
"memory_boost": 20,
|
|
540
|
+
"test_exemption": false,
|
|
541
|
+
"test_deduction": 0,
|
|
542
|
+
"total_score": 74,
|
|
543
|
+
"classification_band": "High Confidence"
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"finding_id": "TG-INPUT-002-8f877a5f",
|
|
548
|
+
"rule_id": "TG-INPUT-002",
|
|
549
|
+
"title": "Raw SQL Concatenation",
|
|
550
|
+
"description": "Python f-string interpolation in raw SQL query",
|
|
551
|
+
"severity": "Critical",
|
|
552
|
+
"category": "injection",
|
|
553
|
+
"cluster": "cluster-injection",
|
|
554
|
+
"file_path": "harness/validate_v1_1_0_advanced_memory.py",
|
|
555
|
+
"line_number": 107,
|
|
556
|
+
"matched_text": "execute(f'SELECT * FROM users WHERE id = {",
|
|
557
|
+
"snippet": " memory_engine.ensure_memory_structure(root_dir=test_root)\n\n valid_before = \"cursor.execute(f'SELECT * FROM users WHERE id = {uid}')\"\n valid_after = \"cursor.execute('SELECT * FROM users WHERE id = %s', (uid,))\"\n valid_diff = \"- cursor.execute(f'SELECT * FROM users WHERE id = {uid}')\\n+ cursor.execute('SELECT * FROM users WHERE id = %s', (uid,))\"",
|
|
558
|
+
"is_test": false,
|
|
559
|
+
"rule_precision": 0.85,
|
|
560
|
+
"target": {
|
|
561
|
+
"file_path": "harness/validate_v1_1_0_advanced_memory.py",
|
|
562
|
+
"start_line": 107,
|
|
563
|
+
"end_line": 107
|
|
564
|
+
},
|
|
565
|
+
"confidence_score": 74,
|
|
566
|
+
"confidence_band": "High Confidence",
|
|
567
|
+
"confidence_factors": {
|
|
568
|
+
"evidence_quality": 29,
|
|
569
|
+
"reproduction_success": 0,
|
|
570
|
+
"independent_confirmations": 5,
|
|
571
|
+
"environmental_clarity": 15,
|
|
572
|
+
"manual_review_status": 0,
|
|
573
|
+
"memory_boost": 25,
|
|
574
|
+
"test_exemption": false,
|
|
575
|
+
"test_deduction": 0,
|
|
576
|
+
"total_score": 74,
|
|
577
|
+
"classification_band": "High Confidence"
|
|
578
|
+
}
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"finding_id": "TG-INPUT-002-266bcaa1",
|
|
582
|
+
"rule_id": "TG-INPUT-002",
|
|
583
|
+
"title": "Raw SQL Concatenation",
|
|
584
|
+
"description": "Python f-string interpolation in raw SQL query",
|
|
585
|
+
"severity": "Critical",
|
|
586
|
+
"category": "injection",
|
|
587
|
+
"cluster": "cluster-injection",
|
|
588
|
+
"file_path": "harness/validate_v1_1_0_advanced_memory.py",
|
|
589
|
+
"line_number": 109,
|
|
590
|
+
"matched_text": "execute(f'SELECT * FROM users WHERE id = {",
|
|
591
|
+
"snippet": " valid_before = \"cursor.execute(f'SELECT * FROM users WHERE id = {uid}')\"\n valid_after = \"cursor.execute('SELECT * FROM users WHERE id = %s', (uid,))\"\n valid_diff = \"- cursor.execute(f'SELECT * FROM users WHERE id = {uid}')\\n+ cursor.execute('SELECT * FROM users WHERE id = %s', (uid,))\"\n\n recipe = memory_engine.record_golden_recipe(",
|
|
592
|
+
"is_test": false,
|
|
593
|
+
"rule_precision": 0.85,
|
|
594
|
+
"target": {
|
|
595
|
+
"file_path": "harness/validate_v1_1_0_advanced_memory.py",
|
|
596
|
+
"start_line": 109,
|
|
597
|
+
"end_line": 109
|
|
598
|
+
},
|
|
599
|
+
"confidence_score": 74,
|
|
600
|
+
"confidence_band": "High Confidence",
|
|
601
|
+
"confidence_factors": {
|
|
602
|
+
"evidence_quality": 29,
|
|
603
|
+
"reproduction_success": 0,
|
|
604
|
+
"independent_confirmations": 5,
|
|
605
|
+
"environmental_clarity": 15,
|
|
606
|
+
"manual_review_status": 0,
|
|
607
|
+
"memory_boost": 25,
|
|
608
|
+
"test_exemption": false,
|
|
609
|
+
"test_deduction": 0,
|
|
610
|
+
"total_score": 74,
|
|
611
|
+
"classification_band": "High Confidence"
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"finding_id": "TG-DB-002-14cf4139",
|
|
616
|
+
"rule_id": "TG-DB-002",
|
|
617
|
+
"title": "Privileged Database Credential in Browser Context",
|
|
618
|
+
"description": "Service role key or raw database connection string reference in frontend code",
|
|
619
|
+
"severity": "Critical",
|
|
620
|
+
"category": "database",
|
|
621
|
+
"cluster": "cluster-client-leak",
|
|
622
|
+
"file_path": "harness/validate_v0_7_0_runtime.py",
|
|
623
|
+
"line_number": 129,
|
|
624
|
+
"matched_text": "DATABASE_URL",
|
|
625
|
+
"snippet": " self.send_header(\"Content-Type\", \"application/json\")\n self.end_headers()\n self.wfile.write(b'{\"DEBUG\": true, \"DATABASE_URL\": \"sqlite:////app/db.sqlite3\"}')\n\n elif url_path == \"/api/files/download\":",
|
|
626
|
+
"is_test": false,
|
|
627
|
+
"rule_precision": 0.9,
|
|
628
|
+
"target": {
|
|
629
|
+
"file_path": "harness/validate_v0_7_0_runtime.py",
|
|
630
|
+
"start_line": 129,
|
|
631
|
+
"end_line": 129
|
|
632
|
+
},
|
|
633
|
+
"confidence_score": 71,
|
|
634
|
+
"confidence_band": "High Confidence",
|
|
635
|
+
"confidence_factors": {
|
|
636
|
+
"evidence_quality": 31,
|
|
637
|
+
"reproduction_success": 0,
|
|
638
|
+
"independent_confirmations": 5,
|
|
639
|
+
"environmental_clarity": 15,
|
|
640
|
+
"manual_review_status": 0,
|
|
641
|
+
"memory_boost": 20,
|
|
642
|
+
"test_exemption": false,
|
|
643
|
+
"test_deduction": 0,
|
|
644
|
+
"total_score": 71,
|
|
645
|
+
"classification_band": "High Confidence"
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
"finding_id": "TG-DB-002-b53ad22c",
|
|
650
|
+
"rule_id": "TG-DB-002",
|
|
651
|
+
"title": "Privileged Database Credential in Browser Context",
|
|
652
|
+
"description": "Service role key or raw database connection string reference in frontend code",
|
|
653
|
+
"severity": "Critical",
|
|
654
|
+
"category": "database",
|
|
655
|
+
"cluster": "cluster-client-leak",
|
|
656
|
+
"file_path": "harness/validate_v0_7_0_runtime.py",
|
|
657
|
+
"line_number": 423,
|
|
658
|
+
"matched_text": "DATABASE_URL",
|
|
659
|
+
"snippet": "\n # 6. Exposed debug config -> Runtime Confirmed\n r6 = ExploitChecker.check_debug_exposure(val, \"fnd-6\", \"c-4\", f\"{self.base_url}/debug/env\", \"DATABASE_URL\")\n self.log_test(\"Phase 3\", \"Exposed Debug Configuration Confirmed\", r6.status == ExploitabilityStatus.RUNTIME_CONFIRMED.value)\n",
|
|
660
|
+
"is_test": false,
|
|
661
|
+
"rule_precision": 0.9,
|
|
662
|
+
"target": {
|
|
663
|
+
"file_path": "harness/validate_v0_7_0_runtime.py",
|
|
664
|
+
"start_line": 423,
|
|
665
|
+
"end_line": 423
|
|
666
|
+
},
|
|
667
|
+
"confidence_score": 71,
|
|
668
|
+
"confidence_band": "High Confidence",
|
|
669
|
+
"confidence_factors": {
|
|
670
|
+
"evidence_quality": 31,
|
|
671
|
+
"reproduction_success": 0,
|
|
672
|
+
"independent_confirmations": 5,
|
|
673
|
+
"environmental_clarity": 15,
|
|
674
|
+
"manual_review_status": 0,
|
|
675
|
+
"memory_boost": 20,
|
|
676
|
+
"test_exemption": false,
|
|
677
|
+
"test_deduction": 0,
|
|
678
|
+
"total_score": 71,
|
|
679
|
+
"classification_band": "High Confidence"
|
|
680
|
+
}
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"finding_id": "TG-DIFF-001-04571685",
|
|
684
|
+
"rule_id": "TG-DIFF-001",
|
|
685
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
686
|
+
"description": "Disabled TLS certificate verification (verify=False)",
|
|
687
|
+
"severity": "Critical",
|
|
688
|
+
"category": "transport",
|
|
689
|
+
"cluster": "cluster-transport-security",
|
|
690
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
691
|
+
"line_number": 74,
|
|
692
|
+
"matched_text": "verify=False",
|
|
693
|
+
"snippet": " \"expected_orm\": \"SQLAlchemy\",\n \"ecosystem\": \"Python\",\n \"test_bypass\": (\"python\", \"verify=False\", \"auth_bypass\"),\n \"test_tenant\": (\"python\", \"tenant_id\"),\n },",
|
|
694
|
+
"is_test": false,
|
|
695
|
+
"rule_precision": 0.9,
|
|
696
|
+
"target": {
|
|
697
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
698
|
+
"start_line": 74,
|
|
699
|
+
"end_line": 74
|
|
700
|
+
},
|
|
701
|
+
"confidence_score": 69,
|
|
702
|
+
"confidence_band": "Medium Confidence",
|
|
703
|
+
"confidence_factors": {
|
|
704
|
+
"evidence_quality": 31,
|
|
705
|
+
"reproduction_success": 0,
|
|
706
|
+
"independent_confirmations": 8,
|
|
707
|
+
"environmental_clarity": 15,
|
|
708
|
+
"manual_review_status": 0,
|
|
709
|
+
"memory_boost": 15,
|
|
710
|
+
"test_exemption": false,
|
|
711
|
+
"test_deduction": 0,
|
|
712
|
+
"total_score": 69,
|
|
713
|
+
"classification_band": "Medium Confidence"
|
|
714
|
+
}
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
"finding_id": "TG-DIFF-001-8b55ac4b",
|
|
718
|
+
"rule_id": "TG-DIFF-001",
|
|
719
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
720
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
721
|
+
"severity": "Critical",
|
|
722
|
+
"category": "transport",
|
|
723
|
+
"cluster": "cluster-transport-security",
|
|
724
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
725
|
+
"line_number": 151,
|
|
726
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
727
|
+
"snippet": " \"expected_orm\": \"GORM\",\n \"ecosystem\": \"Go\",\n \"test_bypass\": (\"go\", \"InsecureSkipVerify: true\", \"tls_bypass\"),\n \"test_tenant\": (\"go\", '.Where(\"tenant_id = ?\", tenantID)'),\n },",
|
|
728
|
+
"is_test": false,
|
|
729
|
+
"rule_precision": 0.9,
|
|
730
|
+
"target": {
|
|
731
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
732
|
+
"start_line": 151,
|
|
733
|
+
"end_line": 151
|
|
734
|
+
},
|
|
735
|
+
"confidence_score": 69,
|
|
736
|
+
"confidence_band": "Medium Confidence",
|
|
737
|
+
"confidence_factors": {
|
|
738
|
+
"evidence_quality": 31,
|
|
739
|
+
"reproduction_success": 0,
|
|
740
|
+
"independent_confirmations": 8,
|
|
741
|
+
"environmental_clarity": 15,
|
|
742
|
+
"manual_review_status": 0,
|
|
743
|
+
"memory_boost": 15,
|
|
744
|
+
"test_exemption": false,
|
|
745
|
+
"test_deduction": 0,
|
|
746
|
+
"total_score": 69,
|
|
747
|
+
"classification_band": "Medium Confidence"
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
"finding_id": "TG-DIFF-001-cf8d252d",
|
|
752
|
+
"rule_id": "TG-DIFF-001",
|
|
753
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
754
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
755
|
+
"severity": "Critical",
|
|
756
|
+
"category": "transport",
|
|
757
|
+
"cluster": "cluster-transport-security",
|
|
758
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
759
|
+
"line_number": 162,
|
|
760
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
761
|
+
"snippet": " \"expected_orm\": \"SQLx\",\n \"ecosystem\": \"Go\",\n \"test_bypass\": (\"go\", \"tls.Config{InsecureSkipVerify: true}\", \"tls_bypass\"),\n \"test_tenant\": (\"go\", '.Where(\"org_id = ?\", orgID)'),\n },",
|
|
762
|
+
"is_test": false,
|
|
763
|
+
"rule_precision": 0.9,
|
|
764
|
+
"target": {
|
|
765
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
766
|
+
"start_line": 162,
|
|
767
|
+
"end_line": 162
|
|
768
|
+
},
|
|
769
|
+
"confidence_score": 69,
|
|
770
|
+
"confidence_band": "Medium Confidence",
|
|
771
|
+
"confidence_factors": {
|
|
772
|
+
"evidence_quality": 31,
|
|
773
|
+
"reproduction_success": 0,
|
|
774
|
+
"independent_confirmations": 8,
|
|
775
|
+
"environmental_clarity": 15,
|
|
776
|
+
"manual_review_status": 0,
|
|
777
|
+
"memory_boost": 15,
|
|
778
|
+
"test_exemption": false,
|
|
779
|
+
"test_deduction": 0,
|
|
780
|
+
"total_score": 69,
|
|
781
|
+
"classification_band": "Medium Confidence"
|
|
782
|
+
}
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"finding_id": "TG-DIFF-001-3543946e",
|
|
786
|
+
"rule_id": "TG-DIFF-001",
|
|
787
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
788
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
789
|
+
"severity": "Critical",
|
|
790
|
+
"category": "transport",
|
|
791
|
+
"cluster": "cluster-transport-security",
|
|
792
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
793
|
+
"line_number": 173,
|
|
794
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
795
|
+
"snippet": " \"expected_orm\": None,\n \"ecosystem\": \"Go\",\n \"test_bypass\": (\"go\", \"InsecureSkipVerify: true\", \"tls_bypass\"),\n \"test_tenant\": (\"go\", '.Where(\"tenant_id = ?\", tid)'),\n },",
|
|
796
|
+
"is_test": false,
|
|
797
|
+
"rule_precision": 0.9,
|
|
798
|
+
"target": {
|
|
799
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
800
|
+
"start_line": 173,
|
|
801
|
+
"end_line": 173
|
|
802
|
+
},
|
|
803
|
+
"confidence_score": 69,
|
|
804
|
+
"confidence_band": "Medium Confidence",
|
|
805
|
+
"confidence_factors": {
|
|
806
|
+
"evidence_quality": 31,
|
|
807
|
+
"reproduction_success": 0,
|
|
808
|
+
"independent_confirmations": 8,
|
|
809
|
+
"environmental_clarity": 15,
|
|
810
|
+
"manual_review_status": 0,
|
|
811
|
+
"memory_boost": 15,
|
|
812
|
+
"test_exemption": false,
|
|
813
|
+
"test_deduction": 0,
|
|
814
|
+
"total_score": 69,
|
|
815
|
+
"classification_band": "Medium Confidence"
|
|
816
|
+
}
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
"finding_id": "TG-DIFF-001-efffaad0",
|
|
820
|
+
"rule_id": "TG-DIFF-001",
|
|
821
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
822
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
823
|
+
"severity": "Critical",
|
|
824
|
+
"category": "transport",
|
|
825
|
+
"cluster": "cluster-transport-security",
|
|
826
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
827
|
+
"line_number": 349,
|
|
828
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
829
|
+
"snippet": " \"expected_orm\": None,\n \"ecosystem\": \"Polyglot Fleet\",\n \"test_bypass\": (\"go\", \"InsecureSkipVerify: true\", \"tls_bypass\"),\n \"test_tenant\": (\"go\", '.Where(\"tenant_id = ?\", tid)'),\n },",
|
|
830
|
+
"is_test": false,
|
|
831
|
+
"rule_precision": 0.9,
|
|
832
|
+
"target": {
|
|
833
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
834
|
+
"start_line": 349,
|
|
835
|
+
"end_line": 349
|
|
836
|
+
},
|
|
837
|
+
"confidence_score": 69,
|
|
838
|
+
"confidence_band": "Medium Confidence",
|
|
839
|
+
"confidence_factors": {
|
|
840
|
+
"evidence_quality": 31,
|
|
841
|
+
"reproduction_success": 0,
|
|
842
|
+
"independent_confirmations": 8,
|
|
843
|
+
"environmental_clarity": 15,
|
|
844
|
+
"manual_review_status": 0,
|
|
845
|
+
"memory_boost": 15,
|
|
846
|
+
"test_exemption": false,
|
|
847
|
+
"test_deduction": 0,
|
|
848
|
+
"total_score": 69,
|
|
849
|
+
"classification_band": "Medium Confidence"
|
|
850
|
+
}
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
"finding_id": "TG-DIFF-001-91bd06b8",
|
|
854
|
+
"rule_id": "TG-DIFF-001",
|
|
855
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
856
|
+
"description": "Disabled Node.js TLS rejectUnauthorized",
|
|
857
|
+
"severity": "Critical",
|
|
858
|
+
"category": "transport",
|
|
859
|
+
"cluster": "cluster-transport-security",
|
|
860
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
861
|
+
"line_number": 129,
|
|
862
|
+
"matched_text": "rejectUnauthorized: false",
|
|
863
|
+
"snippet": " \"expected_orm\": \"Mongoose\",\n \"ecosystem\": \"JavaScript\",\n \"test_bypass\": (\"javascript\", \"rejectUnauthorized: false\", \"tls_bypass\"),\n \"test_tenant\": (\"javascript\", \"author: req.user.id\"),\n },",
|
|
864
|
+
"is_test": false,
|
|
865
|
+
"rule_precision": 0.9,
|
|
866
|
+
"target": {
|
|
867
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
868
|
+
"start_line": 129,
|
|
869
|
+
"end_line": 129
|
|
870
|
+
},
|
|
871
|
+
"confidence_score": 69,
|
|
872
|
+
"confidence_band": "Medium Confidence",
|
|
873
|
+
"confidence_factors": {
|
|
874
|
+
"evidence_quality": 31,
|
|
875
|
+
"reproduction_success": 0,
|
|
876
|
+
"independent_confirmations": 8,
|
|
877
|
+
"environmental_clarity": 15,
|
|
878
|
+
"manual_review_status": 0,
|
|
879
|
+
"memory_boost": 15,
|
|
880
|
+
"test_exemption": false,
|
|
881
|
+
"test_deduction": 0,
|
|
882
|
+
"total_score": 69,
|
|
883
|
+
"classification_band": "Medium Confidence"
|
|
884
|
+
}
|
|
885
|
+
},
|
|
886
|
+
{
|
|
887
|
+
"finding_id": "TG-DIFF-001-cb245735",
|
|
888
|
+
"rule_id": "TG-DIFF-001",
|
|
889
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
890
|
+
"description": "Disabled PHP curl SSL verification",
|
|
891
|
+
"severity": "Critical",
|
|
892
|
+
"category": "transport",
|
|
893
|
+
"cluster": "cluster-transport-security",
|
|
894
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
895
|
+
"line_number": 261,
|
|
896
|
+
"matched_text": "CURLOPT_SSL_VERIFYPEER => false",
|
|
897
|
+
"snippet": " \"expected_orm\": \"Eloquent\",\n \"ecosystem\": \"PHP\",\n \"test_bypass\": (\"php\", \"CURLOPT_SSL_VERIFYPEER => false\", \"tls_bypass\"),\n \"test_tenant\": (\"php\", 'where(\"tenant_id\", $tenantId)'),\n },",
|
|
898
|
+
"is_test": false,
|
|
899
|
+
"rule_precision": 0.9,
|
|
900
|
+
"target": {
|
|
901
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
902
|
+
"start_line": 261,
|
|
903
|
+
"end_line": 261
|
|
904
|
+
},
|
|
905
|
+
"confidence_score": 69,
|
|
906
|
+
"confidence_band": "Medium Confidence",
|
|
907
|
+
"confidence_factors": {
|
|
908
|
+
"evidence_quality": 31,
|
|
909
|
+
"reproduction_success": 0,
|
|
910
|
+
"independent_confirmations": 8,
|
|
911
|
+
"environmental_clarity": 15,
|
|
912
|
+
"manual_review_status": 0,
|
|
913
|
+
"memory_boost": 15,
|
|
914
|
+
"test_exemption": false,
|
|
915
|
+
"test_deduction": 0,
|
|
916
|
+
"total_score": 69,
|
|
917
|
+
"classification_band": "Medium Confidence"
|
|
918
|
+
}
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"finding_id": "TG-DIFF-001-6667680a",
|
|
922
|
+
"rule_id": "TG-DIFF-001",
|
|
923
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
924
|
+
"description": "Disabled TLS certificate verification (verify=False)",
|
|
925
|
+
"severity": "Critical",
|
|
926
|
+
"category": "transport",
|
|
927
|
+
"cluster": "cluster-transport-security",
|
|
928
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
929
|
+
"line_number": 60,
|
|
930
|
+
"matched_text": "verify = False",
|
|
931
|
+
"snippet": " def authenticate_user(token):\n+ # TODO: bypass auth check for debugging\n+ verify = False\n return True\n\"\"\"",
|
|
932
|
+
"is_test": false,
|
|
933
|
+
"rule_precision": 0.9,
|
|
934
|
+
"target": {
|
|
935
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
936
|
+
"start_line": 60,
|
|
937
|
+
"end_line": 60
|
|
938
|
+
},
|
|
939
|
+
"confidence_score": 69,
|
|
940
|
+
"confidence_band": "Medium Confidence",
|
|
941
|
+
"confidence_factors": {
|
|
942
|
+
"evidence_quality": 31,
|
|
943
|
+
"reproduction_success": 0,
|
|
944
|
+
"independent_confirmations": 8,
|
|
945
|
+
"environmental_clarity": 15,
|
|
946
|
+
"manual_review_status": 0,
|
|
947
|
+
"memory_boost": 15,
|
|
948
|
+
"test_exemption": false,
|
|
949
|
+
"test_deduction": 0,
|
|
950
|
+
"total_score": 69,
|
|
951
|
+
"classification_band": "Medium Confidence"
|
|
952
|
+
}
|
|
953
|
+
},
|
|
954
|
+
{
|
|
955
|
+
"finding_id": "TG-DIFF-001-00b3b8ca",
|
|
956
|
+
"rule_id": "TG-DIFF-001",
|
|
957
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
958
|
+
"description": "Disabled TLS certificate verification (verify=False)",
|
|
959
|
+
"severity": "Critical",
|
|
960
|
+
"category": "transport",
|
|
961
|
+
"cluster": "cluster-transport-security",
|
|
962
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
963
|
+
"line_number": 67,
|
|
964
|
+
"matched_text": "verify=False",
|
|
965
|
+
"snippet": " rule_ids = [v[\"rule_id\"] for v in res_bypass[\"violations\"]]\n assert \"TG-DIFF-001\" in rule_ids, \"TG-DIFF-001 bypass not caught\"\n print(f\" [PASS] TG-DIFF-001: Caught bypass comments and verify=False ({res_bypass['total_violations']} violations)\")\n\n mock_key = \"sk\" + \"_live_\" + \"99887766554433221100aabbccdd\"",
|
|
966
|
+
"is_test": false,
|
|
967
|
+
"rule_precision": 0.9,
|
|
968
|
+
"target": {
|
|
969
|
+
"file_path": "harness/validate_v0_9_2_diff_and_monorepo.py",
|
|
970
|
+
"start_line": 67,
|
|
971
|
+
"end_line": 67
|
|
972
|
+
},
|
|
973
|
+
"confidence_score": 69,
|
|
974
|
+
"confidence_band": "Medium Confidence",
|
|
975
|
+
"confidence_factors": {
|
|
976
|
+
"evidence_quality": 31,
|
|
977
|
+
"reproduction_success": 0,
|
|
978
|
+
"independent_confirmations": 8,
|
|
979
|
+
"environmental_clarity": 15,
|
|
980
|
+
"manual_review_status": 0,
|
|
981
|
+
"memory_boost": 15,
|
|
982
|
+
"test_exemption": false,
|
|
983
|
+
"test_deduction": 0,
|
|
984
|
+
"total_score": 69,
|
|
985
|
+
"classification_band": "Medium Confidence"
|
|
986
|
+
}
|
|
987
|
+
},
|
|
988
|
+
{
|
|
989
|
+
"finding_id": "TG-DIFF-001-f209dec6",
|
|
990
|
+
"rule_id": "TG-DIFF-001",
|
|
991
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
992
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
993
|
+
"severity": "Critical",
|
|
994
|
+
"category": "transport",
|
|
995
|
+
"cluster": "cluster-transport-security",
|
|
996
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
997
|
+
"line_number": 16,
|
|
998
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
999
|
+
"snippet": " - File extension census fallback (no manifest)\n2. Polyglot Diff Guard bypass detection across:\n - Go (InsecureSkipVerify: true)\n - Java (csrf().disable())\n - C# ([AllowAnonymous])",
|
|
1000
|
+
"is_test": false,
|
|
1001
|
+
"rule_precision": 0.9,
|
|
1002
|
+
"target": {
|
|
1003
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1004
|
+
"start_line": 16,
|
|
1005
|
+
"end_line": 16
|
|
1006
|
+
},
|
|
1007
|
+
"confidence_score": 69,
|
|
1008
|
+
"confidence_band": "Medium Confidence",
|
|
1009
|
+
"confidence_factors": {
|
|
1010
|
+
"evidence_quality": 31,
|
|
1011
|
+
"reproduction_success": 0,
|
|
1012
|
+
"independent_confirmations": 8,
|
|
1013
|
+
"environmental_clarity": 15,
|
|
1014
|
+
"manual_review_status": 0,
|
|
1015
|
+
"memory_boost": 15,
|
|
1016
|
+
"test_exemption": false,
|
|
1017
|
+
"test_deduction": 0,
|
|
1018
|
+
"total_score": 69,
|
|
1019
|
+
"classification_band": "Medium Confidence"
|
|
1020
|
+
}
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"finding_id": "TG-DIFF-001-d9adecdb",
|
|
1024
|
+
"rule_id": "TG-DIFF-001",
|
|
1025
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
1026
|
+
"description": "Disabled Go TLS certificate verification (InsecureSkipVerify: true)",
|
|
1027
|
+
"severity": "Critical",
|
|
1028
|
+
"category": "transport",
|
|
1029
|
+
"cluster": "cluster-transport-security",
|
|
1030
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1031
|
+
"line_number": 182,
|
|
1032
|
+
"matched_text": "InsecureSkipVerify: true",
|
|
1033
|
+
"snippet": "+++ b/client.go\n@@ -10,3 +10,4 @@\n+\ttr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}\n\"\"\"\n viol_go = diff_guard.check_diff_content(diff_go, \"client.go\")",
|
|
1034
|
+
"is_test": false,
|
|
1035
|
+
"rule_precision": 0.9,
|
|
1036
|
+
"target": {
|
|
1037
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1038
|
+
"start_line": 182,
|
|
1039
|
+
"end_line": 182
|
|
1040
|
+
},
|
|
1041
|
+
"confidence_score": 69,
|
|
1042
|
+
"confidence_band": "Medium Confidence",
|
|
1043
|
+
"confidence_factors": {
|
|
1044
|
+
"evidence_quality": 31,
|
|
1045
|
+
"reproduction_success": 0,
|
|
1046
|
+
"independent_confirmations": 8,
|
|
1047
|
+
"environmental_clarity": 15,
|
|
1048
|
+
"manual_review_status": 0,
|
|
1049
|
+
"memory_boost": 15,
|
|
1050
|
+
"test_exemption": false,
|
|
1051
|
+
"test_deduction": 0,
|
|
1052
|
+
"total_score": 69,
|
|
1053
|
+
"classification_band": "Medium Confidence"
|
|
1054
|
+
}
|
|
1055
|
+
},
|
|
1056
|
+
{
|
|
1057
|
+
"finding_id": "TG-DIFF-001-ddbf5cf0",
|
|
1058
|
+
"rule_id": "TG-DIFF-001",
|
|
1059
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
1060
|
+
"description": "Disabled PHP curl SSL verification",
|
|
1061
|
+
"severity": "Critical",
|
|
1062
|
+
"category": "transport",
|
|
1063
|
+
"cluster": "cluster-transport-security",
|
|
1064
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1065
|
+
"line_number": 19,
|
|
1066
|
+
"matched_text": "CURLOPT_SSL_VERIFYPEER => false",
|
|
1067
|
+
"snippet": " - Java (csrf().disable())\n - C# ([AllowAnonymous])\n - PHP (CURLOPT_SSL_VERIFYPEER => false)\n - Rust (unsafe { ... })\n3. Polyglot Tenant Scoping Patterns across GORM, LINQ, and Prisma",
|
|
1068
|
+
"is_test": false,
|
|
1069
|
+
"rule_precision": 0.9,
|
|
1070
|
+
"target": {
|
|
1071
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1072
|
+
"start_line": 19,
|
|
1073
|
+
"end_line": 19
|
|
1074
|
+
},
|
|
1075
|
+
"confidence_score": 69,
|
|
1076
|
+
"confidence_band": "Medium Confidence",
|
|
1077
|
+
"confidence_factors": {
|
|
1078
|
+
"evidence_quality": 31,
|
|
1079
|
+
"reproduction_success": 0,
|
|
1080
|
+
"independent_confirmations": 8,
|
|
1081
|
+
"environmental_clarity": 15,
|
|
1082
|
+
"manual_review_status": 0,
|
|
1083
|
+
"memory_boost": 15,
|
|
1084
|
+
"test_exemption": false,
|
|
1085
|
+
"test_deduction": 0,
|
|
1086
|
+
"total_score": 69,
|
|
1087
|
+
"classification_band": "Medium Confidence"
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
"finding_id": "TG-DIFF-001-2b3eb6b7",
|
|
1092
|
+
"rule_id": "TG-DIFF-001",
|
|
1093
|
+
"title": "Accidental Security Check Bypass in Patch Additions",
|
|
1094
|
+
"description": "Disabled PHP curl SSL verification",
|
|
1095
|
+
"severity": "Critical",
|
|
1096
|
+
"category": "transport",
|
|
1097
|
+
"cluster": "cluster-transport-security",
|
|
1098
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1099
|
+
"line_number": 215,
|
|
1100
|
+
"matched_text": "CURLOPT_SSL_VERIFYPEER, false",
|
|
1101
|
+
"snippet": "+++ b/api.php\n@@ -5,3 +5,4 @@\n+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n\"\"\"\n viol_php = diff_guard.check_diff_content(diff_php, \"api.php\")",
|
|
1102
|
+
"is_test": false,
|
|
1103
|
+
"rule_precision": 0.9,
|
|
1104
|
+
"target": {
|
|
1105
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1106
|
+
"start_line": 215,
|
|
1107
|
+
"end_line": 215
|
|
1108
|
+
},
|
|
1109
|
+
"confidence_score": 69,
|
|
1110
|
+
"confidence_band": "Medium Confidence",
|
|
1111
|
+
"confidence_factors": {
|
|
1112
|
+
"evidence_quality": 31,
|
|
1113
|
+
"reproduction_success": 0,
|
|
1114
|
+
"independent_confirmations": 8,
|
|
1115
|
+
"environmental_clarity": 15,
|
|
1116
|
+
"manual_review_status": 0,
|
|
1117
|
+
"memory_boost": 15,
|
|
1118
|
+
"test_exemption": false,
|
|
1119
|
+
"test_deduction": 0,
|
|
1120
|
+
"total_score": 69,
|
|
1121
|
+
"classification_band": "Medium Confidence"
|
|
1122
|
+
}
|
|
1123
|
+
},
|
|
1124
|
+
{
|
|
1125
|
+
"finding_id": "TG-DB-004-e33fd263",
|
|
1126
|
+
"rule_id": "TG-DB-004",
|
|
1127
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1128
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1129
|
+
"severity": "Critical",
|
|
1130
|
+
"category": "database",
|
|
1131
|
+
"cluster": "cluster-tenant-isolation",
|
|
1132
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1133
|
+
"line_number": 119,
|
|
1134
|
+
"matched_text": ".objects.get(id=inv_id)",
|
|
1135
|
+
"snippet": " snippet_v1 = \"\"\"def process_invoice(req, inv_id):\n # Retrieve invoice\n inv = Invoice.objects.get(id=inv_id)\n return inv\n\"\"\"",
|
|
1136
|
+
"is_test": false,
|
|
1137
|
+
"rule_precision": 0.55,
|
|
1138
|
+
"target": {
|
|
1139
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1140
|
+
"start_line": 119,
|
|
1141
|
+
"end_line": 119
|
|
1142
|
+
},
|
|
1143
|
+
"confidence_score": 67,
|
|
1144
|
+
"confidence_band": "Medium Confidence",
|
|
1145
|
+
"confidence_factors": {
|
|
1146
|
+
"evidence_quality": 19,
|
|
1147
|
+
"reproduction_success": 0,
|
|
1148
|
+
"independent_confirmations": 8,
|
|
1149
|
+
"environmental_clarity": 15,
|
|
1150
|
+
"manual_review_status": 0,
|
|
1151
|
+
"memory_boost": 25,
|
|
1152
|
+
"test_exemption": false,
|
|
1153
|
+
"test_deduction": 0,
|
|
1154
|
+
"total_score": 67,
|
|
1155
|
+
"classification_band": "Medium Confidence"
|
|
1156
|
+
}
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"finding_id": "TG-DB-004-ff3f7499",
|
|
1160
|
+
"rule_id": "TG-DB-004",
|
|
1161
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1162
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1163
|
+
"severity": "Critical",
|
|
1164
|
+
"category": "database",
|
|
1165
|
+
"cluster": "cluster-tenant-isolation",
|
|
1166
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1167
|
+
"line_number": 127,
|
|
1168
|
+
"matched_text": ".objects.get(id=inv_id)",
|
|
1169
|
+
"snippet": " snippet_v2 = \"\"\"def process_invoice(req, inv_id):\n # Retrieve invoice\n inv = Invoice.objects.get(id=inv_id)\n return inv\n\"\"\"",
|
|
1170
|
+
"is_test": false,
|
|
1171
|
+
"rule_precision": 0.55,
|
|
1172
|
+
"target": {
|
|
1173
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1174
|
+
"start_line": 127,
|
|
1175
|
+
"end_line": 127
|
|
1176
|
+
},
|
|
1177
|
+
"confidence_score": 67,
|
|
1178
|
+
"confidence_band": "Medium Confidence",
|
|
1179
|
+
"confidence_factors": {
|
|
1180
|
+
"evidence_quality": 19,
|
|
1181
|
+
"reproduction_success": 0,
|
|
1182
|
+
"independent_confirmations": 8,
|
|
1183
|
+
"environmental_clarity": 15,
|
|
1184
|
+
"manual_review_status": 0,
|
|
1185
|
+
"memory_boost": 25,
|
|
1186
|
+
"test_exemption": false,
|
|
1187
|
+
"test_deduction": 0,
|
|
1188
|
+
"total_score": 67,
|
|
1189
|
+
"classification_band": "Medium Confidence"
|
|
1190
|
+
}
|
|
1191
|
+
},
|
|
1192
|
+
{
|
|
1193
|
+
"finding_id": "TG-DB-004-a7c00c05",
|
|
1194
|
+
"rule_id": "TG-DB-004",
|
|
1195
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1196
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1197
|
+
"severity": "Critical",
|
|
1198
|
+
"category": "database",
|
|
1199
|
+
"cluster": "cluster-tenant-isolation",
|
|
1200
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1201
|
+
"line_number": 135,
|
|
1202
|
+
"matched_text": ".objects.get(id=inv_id)",
|
|
1203
|
+
"snippet": " snippet_v3 = \"\"\"def process_invoice(req, inv_id):\n # Different comment text here\n inv = Invoice.objects.get(id=inv_id) \n return inv\n\"\"\"",
|
|
1204
|
+
"is_test": false,
|
|
1205
|
+
"rule_precision": 0.55,
|
|
1206
|
+
"target": {
|
|
1207
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1208
|
+
"start_line": 135,
|
|
1209
|
+
"end_line": 135
|
|
1210
|
+
},
|
|
1211
|
+
"confidence_score": 67,
|
|
1212
|
+
"confidence_band": "Medium Confidence",
|
|
1213
|
+
"confidence_factors": {
|
|
1214
|
+
"evidence_quality": 19,
|
|
1215
|
+
"reproduction_success": 0,
|
|
1216
|
+
"independent_confirmations": 8,
|
|
1217
|
+
"environmental_clarity": 15,
|
|
1218
|
+
"manual_review_status": 0,
|
|
1219
|
+
"memory_boost": 25,
|
|
1220
|
+
"test_exemption": false,
|
|
1221
|
+
"test_deduction": 0,
|
|
1222
|
+
"total_score": 67,
|
|
1223
|
+
"classification_band": "Medium Confidence"
|
|
1224
|
+
}
|
|
1225
|
+
},
|
|
1226
|
+
{
|
|
1227
|
+
"finding_id": "TG-DB-004-8b6c1463",
|
|
1228
|
+
"rule_id": "TG-DB-004",
|
|
1229
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1230
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1231
|
+
"severity": "Critical",
|
|
1232
|
+
"category": "database",
|
|
1233
|
+
"cluster": "cluster-tenant-isolation",
|
|
1234
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1235
|
+
"line_number": 171,
|
|
1236
|
+
"matched_text": ".objects.get(id=inv_id)",
|
|
1237
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": \"apps/billing/views.py\", \"line_start\": 12, \"line_end\": 14},\n \"evidence\": {\"code_snippet\": \"Invoice.objects.get(id=inv_id)\"},\n \"cluster_id\": \"cluster-tenant-isolation\",\n \"recheck_status\": \"Confirmed Fixed\",",
|
|
1238
|
+
"is_test": false,
|
|
1239
|
+
"rule_precision": 0.55,
|
|
1240
|
+
"target": {
|
|
1241
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1242
|
+
"start_line": 171,
|
|
1243
|
+
"end_line": 171
|
|
1244
|
+
},
|
|
1245
|
+
"confidence_score": 67,
|
|
1246
|
+
"confidence_band": "Medium Confidence",
|
|
1247
|
+
"confidence_factors": {
|
|
1248
|
+
"evidence_quality": 19,
|
|
1249
|
+
"reproduction_success": 0,
|
|
1250
|
+
"independent_confirmations": 8,
|
|
1251
|
+
"environmental_clarity": 15,
|
|
1252
|
+
"manual_review_status": 0,
|
|
1253
|
+
"memory_boost": 25,
|
|
1254
|
+
"test_exemption": false,
|
|
1255
|
+
"test_deduction": 0,
|
|
1256
|
+
"total_score": 67,
|
|
1257
|
+
"classification_band": "Medium Confidence"
|
|
1258
|
+
}
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
"finding_id": "TG-DB-004-9a2f13c7",
|
|
1262
|
+
"rule_id": "TG-DB-004",
|
|
1263
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1264
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1265
|
+
"severity": "Critical",
|
|
1266
|
+
"category": "database",
|
|
1267
|
+
"cluster": "cluster-tenant-isolation",
|
|
1268
|
+
"file_path": "harness/validate_v0_6_1_scale.py",
|
|
1269
|
+
"line_number": 115,
|
|
1270
|
+
"matched_text": ".objects.get(id=inv_id)",
|
|
1271
|
+
"snippet": " \"severity\": \"High\",\n \"target\": {\"file_path\": \"apps/django_core/billing/views.py\", \"line_start\": 42, \"line_end\": 42},\n \"evidence\": {\"code_snippet\": \"Invoice.objects.get(id=inv_id)\"},\n },\n # FastAPI Microservice",
|
|
1272
|
+
"is_test": false,
|
|
1273
|
+
"rule_precision": 0.55,
|
|
1274
|
+
"target": {
|
|
1275
|
+
"file_path": "harness/validate_v0_6_1_scale.py",
|
|
1276
|
+
"start_line": 115,
|
|
1277
|
+
"end_line": 115
|
|
1278
|
+
},
|
|
1279
|
+
"confidence_score": 64,
|
|
1280
|
+
"confidence_band": "Medium Confidence",
|
|
1281
|
+
"confidence_factors": {
|
|
1282
|
+
"evidence_quality": 19,
|
|
1283
|
+
"reproduction_success": 0,
|
|
1284
|
+
"independent_confirmations": 5,
|
|
1285
|
+
"environmental_clarity": 15,
|
|
1286
|
+
"manual_review_status": 0,
|
|
1287
|
+
"memory_boost": 25,
|
|
1288
|
+
"test_exemption": false,
|
|
1289
|
+
"test_deduction": 0,
|
|
1290
|
+
"total_score": 64,
|
|
1291
|
+
"classification_band": "Medium Confidence"
|
|
1292
|
+
}
|
|
1293
|
+
},
|
|
1294
|
+
{
|
|
1295
|
+
"finding_id": "TG-DB-004-a932f5b8",
|
|
1296
|
+
"rule_id": "TG-DB-004",
|
|
1297
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1298
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1299
|
+
"severity": "Critical",
|
|
1300
|
+
"category": "database",
|
|
1301
|
+
"cluster": "cluster-tenant-isolation",
|
|
1302
|
+
"file_path": "harness/validate_v0_6_1_scale.py",
|
|
1303
|
+
"line_number": 193,
|
|
1304
|
+
"matched_text": ".objects.get(id=id)",
|
|
1305
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": f\"services/api/module_{i % 15}/views.py\", \"line_start\": 10 + i, \"line_end\": 12 + i},\n \"evidence\": {\"code_snippet\": f\"Model_{i}.objects.get(id=id)\"},\n })\n",
|
|
1306
|
+
"is_test": false,
|
|
1307
|
+
"rule_precision": 0.55,
|
|
1308
|
+
"target": {
|
|
1309
|
+
"file_path": "harness/validate_v0_6_1_scale.py",
|
|
1310
|
+
"start_line": 193,
|
|
1311
|
+
"end_line": 193
|
|
1312
|
+
},
|
|
1313
|
+
"confidence_score": 64,
|
|
1314
|
+
"confidence_band": "Medium Confidence",
|
|
1315
|
+
"confidence_factors": {
|
|
1316
|
+
"evidence_quality": 19,
|
|
1317
|
+
"reproduction_success": 0,
|
|
1318
|
+
"independent_confirmations": 5,
|
|
1319
|
+
"environmental_clarity": 15,
|
|
1320
|
+
"manual_review_status": 0,
|
|
1321
|
+
"memory_boost": 25,
|
|
1322
|
+
"test_exemption": false,
|
|
1323
|
+
"test_deduction": 0,
|
|
1324
|
+
"total_score": 64,
|
|
1325
|
+
"classification_band": "Medium Confidence"
|
|
1326
|
+
}
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"finding_id": "TG-DB-004-14a2d74f",
|
|
1330
|
+
"rule_id": "TG-DB-004",
|
|
1331
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
1332
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
1333
|
+
"severity": "Critical",
|
|
1334
|
+
"category": "database",
|
|
1335
|
+
"cluster": "cluster-tenant-isolation",
|
|
1336
|
+
"file_path": "harness/validate_v1_0_0_memory.py",
|
|
1337
|
+
"line_number": 265,
|
|
1338
|
+
"matched_text": ".objects.get(id=id)",
|
|
1339
|
+
"snippet": "- return Bill.objects.filter(id=id, tenant=tenant)\n+def get_bill(id):\n+ return Bill.objects.get(id=id)\n\"\"\"\n res_reg = diff_guard.audit_diff(regression_diff, check_memory=True, root_dir=test_root)",
|
|
1340
|
+
"is_test": false,
|
|
1341
|
+
"rule_precision": 0.55,
|
|
1342
|
+
"target": {
|
|
1343
|
+
"file_path": "harness/validate_v1_0_0_memory.py",
|
|
1344
|
+
"start_line": 265,
|
|
1345
|
+
"end_line": 265
|
|
1346
|
+
},
|
|
1347
|
+
"confidence_score": 64,
|
|
1348
|
+
"confidence_band": "Medium Confidence",
|
|
1349
|
+
"confidence_factors": {
|
|
1350
|
+
"evidence_quality": 19,
|
|
1351
|
+
"reproduction_success": 0,
|
|
1352
|
+
"independent_confirmations": 5,
|
|
1353
|
+
"environmental_clarity": 15,
|
|
1354
|
+
"manual_review_status": 0,
|
|
1355
|
+
"memory_boost": 25,
|
|
1356
|
+
"test_exemption": false,
|
|
1357
|
+
"test_deduction": 0,
|
|
1358
|
+
"total_score": 64,
|
|
1359
|
+
"classification_band": "Medium Confidence"
|
|
1360
|
+
}
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"finding_id": "TG-SUPPLY-004-e52415c0",
|
|
1364
|
+
"rule_id": "TG-SUPPLY-004",
|
|
1365
|
+
"title": "Unpinned CI Action",
|
|
1366
|
+
"description": "GitHub Action referenced by mutable tag instead of immutable commit SHA",
|
|
1367
|
+
"severity": "Critical",
|
|
1368
|
+
"category": "supply",
|
|
1369
|
+
"cluster": "cluster-supply-chain",
|
|
1370
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1371
|
+
"line_number": 383,
|
|
1372
|
+
"matched_text": "uses: actions/checkout@v2",
|
|
1373
|
+
"snippet": " runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - run: make test\n\"\"\", encoding=\"utf-8\")",
|
|
1374
|
+
"is_test": false,
|
|
1375
|
+
"rule_precision": 0.6,
|
|
1376
|
+
"target": {
|
|
1377
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1378
|
+
"start_line": 383,
|
|
1379
|
+
"end_line": 383
|
|
1380
|
+
},
|
|
1381
|
+
"confidence_score": 47,
|
|
1382
|
+
"confidence_band": "Needs Review",
|
|
1383
|
+
"confidence_factors": {
|
|
1384
|
+
"evidence_quality": 21,
|
|
1385
|
+
"reproduction_success": 0,
|
|
1386
|
+
"independent_confirmations": 11,
|
|
1387
|
+
"environmental_clarity": 15,
|
|
1388
|
+
"manual_review_status": 0,
|
|
1389
|
+
"memory_boost": 0,
|
|
1390
|
+
"test_exemption": false,
|
|
1391
|
+
"test_deduction": 0,
|
|
1392
|
+
"total_score": 47,
|
|
1393
|
+
"classification_band": "Needs Review"
|
|
1394
|
+
}
|
|
1395
|
+
},
|
|
1396
|
+
{
|
|
1397
|
+
"finding_id": "TG-SUPPLY-004-b9d15743",
|
|
1398
|
+
"rule_id": "TG-SUPPLY-004",
|
|
1399
|
+
"title": "Unpinned CI Action",
|
|
1400
|
+
"description": "GitHub Action referenced by mutable tag instead of immutable commit SHA",
|
|
1401
|
+
"severity": "Critical",
|
|
1402
|
+
"category": "supply",
|
|
1403
|
+
"cluster": "cluster-supply-chain",
|
|
1404
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1405
|
+
"line_number": 404,
|
|
1406
|
+
"matched_text": "uses: actions/checkout@v2",
|
|
1407
|
+
"snippet": "+++ b/.github/workflows/ci.yml\n@@ -6,1 +6,1 @@\n- - uses: actions/checkout@v2\n+ - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6\n\"\"\",",
|
|
1408
|
+
"is_test": false,
|
|
1409
|
+
"rule_precision": 0.6,
|
|
1410
|
+
"target": {
|
|
1411
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1412
|
+
"start_line": 404,
|
|
1413
|
+
"end_line": 404
|
|
1414
|
+
},
|
|
1415
|
+
"confidence_score": 47,
|
|
1416
|
+
"confidence_band": "Needs Review",
|
|
1417
|
+
"confidence_factors": {
|
|
1418
|
+
"evidence_quality": 21,
|
|
1419
|
+
"reproduction_success": 0,
|
|
1420
|
+
"independent_confirmations": 11,
|
|
1421
|
+
"environmental_clarity": 15,
|
|
1422
|
+
"manual_review_status": 0,
|
|
1423
|
+
"memory_boost": 0,
|
|
1424
|
+
"test_exemption": false,
|
|
1425
|
+
"test_deduction": 0,
|
|
1426
|
+
"total_score": 47,
|
|
1427
|
+
"classification_band": "Needs Review"
|
|
1428
|
+
}
|
|
1429
|
+
},
|
|
1430
|
+
{
|
|
1431
|
+
"finding_id": "TG-SUPPLY-004-9240a873",
|
|
1432
|
+
"rule_id": "TG-SUPPLY-004",
|
|
1433
|
+
"title": "Unpinned CI Action",
|
|
1434
|
+
"description": "GitHub Action referenced by mutable tag instead of immutable commit SHA",
|
|
1435
|
+
"severity": "Critical",
|
|
1436
|
+
"category": "supply",
|
|
1437
|
+
"cluster": "cluster-supply-chain",
|
|
1438
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1439
|
+
"line_number": 251,
|
|
1440
|
+
"matched_text": "uses: actions/checkout@v2",
|
|
1441
|
+
"snippet": "+++ b/.github/workflows/deploy.yml\n@@ -5,1 +5,2 @@\n- - uses: actions/checkout@v2\n+ - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29\n+ with: { persist-credentials: false }",
|
|
1442
|
+
"is_test": false,
|
|
1443
|
+
"rule_precision": 0.6,
|
|
1444
|
+
"target": {
|
|
1445
|
+
"file_path": "harness/validate_v0_6_3_hardening.py",
|
|
1446
|
+
"start_line": 251,
|
|
1447
|
+
"end_line": 251
|
|
1448
|
+
},
|
|
1449
|
+
"confidence_score": 44,
|
|
1450
|
+
"confidence_band": "Needs Review",
|
|
1451
|
+
"confidence_factors": {
|
|
1452
|
+
"evidence_quality": 21,
|
|
1453
|
+
"reproduction_success": 0,
|
|
1454
|
+
"independent_confirmations": 8,
|
|
1455
|
+
"environmental_clarity": 15,
|
|
1456
|
+
"manual_review_status": 0,
|
|
1457
|
+
"memory_boost": 0,
|
|
1458
|
+
"test_exemption": false,
|
|
1459
|
+
"test_deduction": 0,
|
|
1460
|
+
"total_score": 44,
|
|
1461
|
+
"classification_band": "Needs Review"
|
|
1462
|
+
}
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
"finding_id": "TG-AUTH-004-33adb2d9",
|
|
1466
|
+
"rule_id": "TG-AUTH-004",
|
|
1467
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1468
|
+
"description": "Session cookie secure flag disabled in Django settings",
|
|
1469
|
+
"severity": "High",
|
|
1470
|
+
"category": "auth",
|
|
1471
|
+
"cluster": "cluster-auth-bypass",
|
|
1472
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1473
|
+
"line_number": 107,
|
|
1474
|
+
"matched_text": "SESSION_COOKIE_SECURE = False",
|
|
1475
|
+
"snippet": " \"expected_orm\": \"SQLAlchemy\",\n \"ecosystem\": \"Python\",\n \"test_bypass\": (\"python\", \"SESSION_COOKIE_SECURE = False\", \"auth_bypass\"),\n \"test_tenant\": (\"python\", \"tenant_id\"),\n },",
|
|
1476
|
+
"is_test": false,
|
|
1477
|
+
"rule_precision": 0.8,
|
|
1478
|
+
"target": {
|
|
1479
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1480
|
+
"start_line": 107,
|
|
1481
|
+
"end_line": 107
|
|
1482
|
+
},
|
|
1483
|
+
"confidence_score": 66,
|
|
1484
|
+
"confidence_band": "Medium Confidence",
|
|
1485
|
+
"confidence_factors": {
|
|
1486
|
+
"evidence_quality": 28,
|
|
1487
|
+
"reproduction_success": 0,
|
|
1488
|
+
"independent_confirmations": 8,
|
|
1489
|
+
"environmental_clarity": 15,
|
|
1490
|
+
"manual_review_status": 0,
|
|
1491
|
+
"memory_boost": 15,
|
|
1492
|
+
"test_exemption": false,
|
|
1493
|
+
"test_deduction": 0,
|
|
1494
|
+
"total_score": 66,
|
|
1495
|
+
"classification_band": "Medium Confidence"
|
|
1496
|
+
}
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"finding_id": "TG-AUTH-004-56b1c90f",
|
|
1500
|
+
"rule_id": "TG-AUTH-004",
|
|
1501
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1502
|
+
"description": "Decorator disabling route-level authentication or CSRF protection",
|
|
1503
|
+
"severity": "High",
|
|
1504
|
+
"category": "auth",
|
|
1505
|
+
"cluster": "cluster-auth-bypass",
|
|
1506
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1507
|
+
"line_number": 96,
|
|
1508
|
+
"matched_text": "@csrf_exempt",
|
|
1509
|
+
"snippet": " \"expected_orm\": \"Django ORM\",\n \"ecosystem\": \"Python\",\n \"test_bypass\": (\"python\", \"@csrf_exempt\", \"auth_bypass\"),\n \"test_tenant\": (\"python\", \"tenant\"),\n },",
|
|
1510
|
+
"is_test": false,
|
|
1511
|
+
"rule_precision": 0.8,
|
|
1512
|
+
"target": {
|
|
1513
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1514
|
+
"start_line": 96,
|
|
1515
|
+
"end_line": 96
|
|
1516
|
+
},
|
|
1517
|
+
"confidence_score": 66,
|
|
1518
|
+
"confidence_band": "Medium Confidence",
|
|
1519
|
+
"confidence_factors": {
|
|
1520
|
+
"evidence_quality": 28,
|
|
1521
|
+
"reproduction_success": 0,
|
|
1522
|
+
"independent_confirmations": 8,
|
|
1523
|
+
"environmental_clarity": 15,
|
|
1524
|
+
"manual_review_status": 0,
|
|
1525
|
+
"memory_boost": 15,
|
|
1526
|
+
"test_exemption": false,
|
|
1527
|
+
"test_deduction": 0,
|
|
1528
|
+
"total_score": 66,
|
|
1529
|
+
"classification_band": "Medium Confidence"
|
|
1530
|
+
}
|
|
1531
|
+
},
|
|
1532
|
+
{
|
|
1533
|
+
"finding_id": "TG-AUTH-004-4a33f7e7",
|
|
1534
|
+
"rule_id": "TG-AUTH-004",
|
|
1535
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1536
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1537
|
+
"severity": "High",
|
|
1538
|
+
"category": "auth",
|
|
1539
|
+
"cluster": "cluster-auth-bypass",
|
|
1540
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1541
|
+
"line_number": 239,
|
|
1542
|
+
"matched_text": "[AllowAnonymous]",
|
|
1543
|
+
"snippet": " \"expected_orm\": \"Entity Framework Core\",\n \"ecosystem\": \"C#\",\n \"test_bypass\": (\"csharp\", \"[AllowAnonymous]\", \"auth_bypass\"),\n \"test_tenant\": (\"csharp\", \".Where(x => x.TenantId == tenantId)\"),\n },",
|
|
1544
|
+
"is_test": false,
|
|
1545
|
+
"rule_precision": 0.8,
|
|
1546
|
+
"target": {
|
|
1547
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1548
|
+
"start_line": 239,
|
|
1549
|
+
"end_line": 239
|
|
1550
|
+
},
|
|
1551
|
+
"confidence_score": 66,
|
|
1552
|
+
"confidence_band": "Medium Confidence",
|
|
1553
|
+
"confidence_factors": {
|
|
1554
|
+
"evidence_quality": 28,
|
|
1555
|
+
"reproduction_success": 0,
|
|
1556
|
+
"independent_confirmations": 8,
|
|
1557
|
+
"environmental_clarity": 15,
|
|
1558
|
+
"manual_review_status": 0,
|
|
1559
|
+
"memory_boost": 15,
|
|
1560
|
+
"test_exemption": false,
|
|
1561
|
+
"test_deduction": 0,
|
|
1562
|
+
"total_score": 66,
|
|
1563
|
+
"classification_band": "Medium Confidence"
|
|
1564
|
+
}
|
|
1565
|
+
},
|
|
1566
|
+
{
|
|
1567
|
+
"finding_id": "TG-AUTH-004-95eb27cd",
|
|
1568
|
+
"rule_id": "TG-AUTH-004",
|
|
1569
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1570
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1571
|
+
"severity": "High",
|
|
1572
|
+
"category": "auth",
|
|
1573
|
+
"cluster": "cluster-auth-bypass",
|
|
1574
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1575
|
+
"line_number": 876,
|
|
1576
|
+
"matched_text": "[AllowAnonymous]",
|
|
1577
|
+
"snippet": "| **4. 5-Factor Confidence Scorer** | 100% | Applied objective $0\u2013100$ scoring with memory modifiers and false positive deductions. |\n| **5. Adaptive Security Memory Engine** | 100% | Isolated memory workspace successfully recorded events and verified context cards $\\le 2,000$ tokens. |\n| **6. Polyglot Diff Guard** | 100% | Intercepted Go `InsecureSkipVerify`, Java `csrf().disable()`, C# `[AllowAnonymous]`, PHP `CURLOPT_SSL_VERIFYPEER`, Rust `unsafe {`, and tenant stripping. |\n| **7. Governed Remediation (Ponytail)** | 100% | Enforced patch churn limits ($\\le 35$ additions, $\\le 25$ deletions) and pre-apply snapshot generation. |\n| **8. Visual HTML Dashboard** | 100% | Generated self-contained, air-gapped dark-mode visual report with SVG circular gauge. |",
|
|
1578
|
+
"is_test": false,
|
|
1579
|
+
"rule_precision": 0.8,
|
|
1580
|
+
"target": {
|
|
1581
|
+
"file_path": "harness/evaluate_portfolio_polyglot.py",
|
|
1582
|
+
"start_line": 876,
|
|
1583
|
+
"end_line": 876
|
|
1584
|
+
},
|
|
1585
|
+
"confidence_score": 66,
|
|
1586
|
+
"confidence_band": "Medium Confidence",
|
|
1587
|
+
"confidence_factors": {
|
|
1588
|
+
"evidence_quality": 28,
|
|
1589
|
+
"reproduction_success": 0,
|
|
1590
|
+
"independent_confirmations": 8,
|
|
1591
|
+
"environmental_clarity": 15,
|
|
1592
|
+
"manual_review_status": 0,
|
|
1593
|
+
"memory_boost": 15,
|
|
1594
|
+
"test_exemption": false,
|
|
1595
|
+
"test_deduction": 0,
|
|
1596
|
+
"total_score": 66,
|
|
1597
|
+
"classification_band": "Medium Confidence"
|
|
1598
|
+
}
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
"finding_id": "TG-AUTH-004-e838c41c",
|
|
1602
|
+
"rule_id": "TG-AUTH-004",
|
|
1603
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1604
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1605
|
+
"severity": "High",
|
|
1606
|
+
"category": "auth",
|
|
1607
|
+
"cluster": "cluster-auth-bypass",
|
|
1608
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1609
|
+
"line_number": 18,
|
|
1610
|
+
"matched_text": "[AllowAnonymous]",
|
|
1611
|
+
"snippet": " - Go (InsecureSkipVerify: true)\n - Java (csrf().disable())\n - C# ([AllowAnonymous])\n - PHP (CURLOPT_SSL_VERIFYPEER => false)\n - Rust (unsafe { ... })",
|
|
1612
|
+
"is_test": false,
|
|
1613
|
+
"rule_precision": 0.8,
|
|
1614
|
+
"target": {
|
|
1615
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1616
|
+
"start_line": 18,
|
|
1617
|
+
"end_line": 18
|
|
1618
|
+
},
|
|
1619
|
+
"confidence_score": 66,
|
|
1620
|
+
"confidence_band": "Medium Confidence",
|
|
1621
|
+
"confidence_factors": {
|
|
1622
|
+
"evidence_quality": 28,
|
|
1623
|
+
"reproduction_success": 0,
|
|
1624
|
+
"independent_confirmations": 8,
|
|
1625
|
+
"environmental_clarity": 15,
|
|
1626
|
+
"manual_review_status": 0,
|
|
1627
|
+
"memory_boost": 15,
|
|
1628
|
+
"test_exemption": false,
|
|
1629
|
+
"test_deduction": 0,
|
|
1630
|
+
"total_score": 66,
|
|
1631
|
+
"classification_band": "Medium Confidence"
|
|
1632
|
+
}
|
|
1633
|
+
},
|
|
1634
|
+
{
|
|
1635
|
+
"finding_id": "TG-AUTH-004-5c78d750",
|
|
1636
|
+
"rule_id": "TG-AUTH-004",
|
|
1637
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1638
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1639
|
+
"severity": "High",
|
|
1640
|
+
"category": "auth",
|
|
1641
|
+
"cluster": "cluster-auth-bypass",
|
|
1642
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1643
|
+
"line_number": 204,
|
|
1644
|
+
"matched_text": "[AllowAnonymous]",
|
|
1645
|
+
"snippet": "+++ b/UsersController.cs\n@@ -15,3 +15,4 @@\n+ [AllowAnonymous]\n+ public IActionResult GetFinancialData() {\n\"\"\"",
|
|
1646
|
+
"is_test": false,
|
|
1647
|
+
"rule_precision": 0.8,
|
|
1648
|
+
"target": {
|
|
1649
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1650
|
+
"start_line": 204,
|
|
1651
|
+
"end_line": 204
|
|
1652
|
+
},
|
|
1653
|
+
"confidence_score": 66,
|
|
1654
|
+
"confidence_band": "Medium Confidence",
|
|
1655
|
+
"confidence_factors": {
|
|
1656
|
+
"evidence_quality": 28,
|
|
1657
|
+
"reproduction_success": 0,
|
|
1658
|
+
"independent_confirmations": 8,
|
|
1659
|
+
"environmental_clarity": 15,
|
|
1660
|
+
"manual_review_status": 0,
|
|
1661
|
+
"memory_boost": 15,
|
|
1662
|
+
"test_exemption": false,
|
|
1663
|
+
"test_deduction": 0,
|
|
1664
|
+
"total_score": 66,
|
|
1665
|
+
"classification_band": "Medium Confidence"
|
|
1666
|
+
}
|
|
1667
|
+
},
|
|
1668
|
+
{
|
|
1669
|
+
"finding_id": "TG-AUTH-004-0d028be7",
|
|
1670
|
+
"rule_id": "TG-AUTH-004",
|
|
1671
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1672
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1673
|
+
"severity": "High",
|
|
1674
|
+
"category": "auth",
|
|
1675
|
+
"cluster": "cluster-auth-bypass",
|
|
1676
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1677
|
+
"line_number": 208,
|
|
1678
|
+
"matched_text": "[AllowAnonymous]",
|
|
1679
|
+
"snippet": "\"\"\"\n viol_cs = diff_guard.check_diff_content(diff_cs, \"UsersController.cs\")\n assert len(viol_cs) >= 1, \"Failed to catch C# [AllowAnonymous]\"\n print(\" [PASS] Caught C# ASP.NET [AllowAnonymous] bypass\")\n",
|
|
1680
|
+
"is_test": false,
|
|
1681
|
+
"rule_precision": 0.8,
|
|
1682
|
+
"target": {
|
|
1683
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1684
|
+
"start_line": 208,
|
|
1685
|
+
"end_line": 208
|
|
1686
|
+
},
|
|
1687
|
+
"confidence_score": 66,
|
|
1688
|
+
"confidence_band": "Medium Confidence",
|
|
1689
|
+
"confidence_factors": {
|
|
1690
|
+
"evidence_quality": 28,
|
|
1691
|
+
"reproduction_success": 0,
|
|
1692
|
+
"independent_confirmations": 8,
|
|
1693
|
+
"environmental_clarity": 15,
|
|
1694
|
+
"manual_review_status": 0,
|
|
1695
|
+
"memory_boost": 15,
|
|
1696
|
+
"test_exemption": false,
|
|
1697
|
+
"test_deduction": 0,
|
|
1698
|
+
"total_score": 66,
|
|
1699
|
+
"classification_band": "Medium Confidence"
|
|
1700
|
+
}
|
|
1701
|
+
},
|
|
1702
|
+
{
|
|
1703
|
+
"finding_id": "TG-AUTH-004-3ae1d9c1",
|
|
1704
|
+
"rule_id": "TG-AUTH-004",
|
|
1705
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1706
|
+
"description": "Attribute disabling ASP.NET authentication",
|
|
1707
|
+
"severity": "High",
|
|
1708
|
+
"category": "auth",
|
|
1709
|
+
"cluster": "cluster-auth-bypass",
|
|
1710
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1711
|
+
"line_number": 209,
|
|
1712
|
+
"matched_text": "[AllowAnonymous]",
|
|
1713
|
+
"snippet": " viol_cs = diff_guard.check_diff_content(diff_cs, \"UsersController.cs\")\n assert len(viol_cs) >= 1, \"Failed to catch C# [AllowAnonymous]\"\n print(\" [PASS] Caught C# ASP.NET [AllowAnonymous] bypass\")\n\n # PHP CURLOPT_SSL_VERIFYPEER bypass",
|
|
1714
|
+
"is_test": false,
|
|
1715
|
+
"rule_precision": 0.8,
|
|
1716
|
+
"target": {
|
|
1717
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1718
|
+
"start_line": 209,
|
|
1719
|
+
"end_line": 209
|
|
1720
|
+
},
|
|
1721
|
+
"confidence_score": 66,
|
|
1722
|
+
"confidence_band": "Medium Confidence",
|
|
1723
|
+
"confidence_factors": {
|
|
1724
|
+
"evidence_quality": 28,
|
|
1725
|
+
"reproduction_success": 0,
|
|
1726
|
+
"independent_confirmations": 8,
|
|
1727
|
+
"environmental_clarity": 15,
|
|
1728
|
+
"manual_review_status": 0,
|
|
1729
|
+
"memory_boost": 15,
|
|
1730
|
+
"test_exemption": false,
|
|
1731
|
+
"test_deduction": 0,
|
|
1732
|
+
"total_score": 66,
|
|
1733
|
+
"classification_band": "Medium Confidence"
|
|
1734
|
+
}
|
|
1735
|
+
},
|
|
1736
|
+
{
|
|
1737
|
+
"finding_id": "TG-AUTH-004-ea07db54",
|
|
1738
|
+
"rule_id": "TG-AUTH-004",
|
|
1739
|
+
"title": "Insecure Session Cookie Configuration",
|
|
1740
|
+
"description": "Spring Security CSRF protection explicitly disabled",
|
|
1741
|
+
"severity": "High",
|
|
1742
|
+
"category": "auth",
|
|
1743
|
+
"cluster": "cluster-auth-bypass",
|
|
1744
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1745
|
+
"line_number": 193,
|
|
1746
|
+
"matched_text": ".csrf().disable()",
|
|
1747
|
+
"snippet": "+++ b/SecurityConfig.java\n@@ -20,3 +20,4 @@\n+ http.csrf().disable();\n\"\"\"\n viol_java = diff_guard.check_diff_content(diff_java, \"SecurityConfig.java\")",
|
|
1748
|
+
"is_test": false,
|
|
1749
|
+
"rule_precision": 0.8,
|
|
1750
|
+
"target": {
|
|
1751
|
+
"file_path": "harness/validate_v1_3_0_polyglot.py",
|
|
1752
|
+
"start_line": 193,
|
|
1753
|
+
"end_line": 193
|
|
1754
|
+
},
|
|
1755
|
+
"confidence_score": 66,
|
|
1756
|
+
"confidence_band": "Medium Confidence",
|
|
1757
|
+
"confidence_factors": {
|
|
1758
|
+
"evidence_quality": 28,
|
|
1759
|
+
"reproduction_success": 0,
|
|
1760
|
+
"independent_confirmations": 8,
|
|
1761
|
+
"environmental_clarity": 15,
|
|
1762
|
+
"manual_review_status": 0,
|
|
1763
|
+
"memory_boost": 15,
|
|
1764
|
+
"test_exemption": false,
|
|
1765
|
+
"test_deduction": 0,
|
|
1766
|
+
"total_score": 66,
|
|
1767
|
+
"classification_band": "Medium Confidence"
|
|
1768
|
+
}
|
|
1769
|
+
},
|
|
1770
|
+
{
|
|
1771
|
+
"finding_id": "TG-RATE-001-758a7750",
|
|
1772
|
+
"rule_id": "TG-RATE-001",
|
|
1773
|
+
"title": "Unlimited Authentication Endpoint",
|
|
1774
|
+
"description": "Authentication POST endpoint defined without rate-limiting middleware",
|
|
1775
|
+
"severity": "High",
|
|
1776
|
+
"category": "rate",
|
|
1777
|
+
"cluster": "cluster-rate-limiting",
|
|
1778
|
+
"file_path": "harness/runner.py",
|
|
1779
|
+
"line_number": 575,
|
|
1780
|
+
"matched_text": "app.post('/login', async (",
|
|
1781
|
+
"snippet": " \"line_number\": 25,\n \"description\": \"Unprotected auth route lacking rate limiting.\",\n \"snippet\": \"app.post('/login', async (req, res) => {})\",\n \"confidence_score\": 85,\n \"confidence_band\": \"High Confidence\"",
|
|
1782
|
+
"is_test": false,
|
|
1783
|
+
"rule_precision": 0.45,
|
|
1784
|
+
"target": {
|
|
1785
|
+
"file_path": "harness/runner.py",
|
|
1786
|
+
"start_line": 575,
|
|
1787
|
+
"end_line": 575
|
|
1788
|
+
},
|
|
1789
|
+
"confidence_score": 65,
|
|
1790
|
+
"confidence_band": "Medium Confidence",
|
|
1791
|
+
"confidence_factors": {
|
|
1792
|
+
"evidence_quality": 15,
|
|
1793
|
+
"reproduction_success": 0,
|
|
1794
|
+
"independent_confirmations": 15,
|
|
1795
|
+
"environmental_clarity": 15,
|
|
1796
|
+
"manual_review_status": 0,
|
|
1797
|
+
"memory_boost": 20,
|
|
1798
|
+
"test_exemption": false,
|
|
1799
|
+
"test_deduction": 0,
|
|
1800
|
+
"total_score": 65,
|
|
1801
|
+
"classification_band": "Medium Confidence"
|
|
1802
|
+
}
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
"finding_id": "TG-DIFF-003-3d00a189",
|
|
1806
|
+
"rule_id": "TG-DIFF-003",
|
|
1807
|
+
"title": "Unintentional Removal of Tenant Filter in Patch Deletions",
|
|
1808
|
+
"description": "Removal of tenant isolation boundary in patch deletion",
|
|
1809
|
+
"severity": "High",
|
|
1810
|
+
"category": "diff",
|
|
1811
|
+
"cluster": "cluster-tenant-isolation",
|
|
1812
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1813
|
+
"line_number": 262,
|
|
1814
|
+
"matched_text": "- stmt = select(Account).where(Account.id == account_id",
|
|
1815
|
+
"snippet": "+++ b/queries.py\n@@ -7,1 +7,1 @@\n- stmt = select(Account).where(Account.id == account_id)\n+ stmt = select(Account).where(Account.id == account_id, Account.tenant_id == tenant_id)\n\"\"\",",
|
|
1816
|
+
"is_test": false,
|
|
1817
|
+
"rule_precision": 0.8,
|
|
1818
|
+
"target": {
|
|
1819
|
+
"file_path": "harness/validate_v0_6_2_modern_stacks.py",
|
|
1820
|
+
"start_line": 262,
|
|
1821
|
+
"end_line": 262
|
|
1822
|
+
},
|
|
1823
|
+
"confidence_score": 54,
|
|
1824
|
+
"confidence_band": "Medium Confidence",
|
|
1825
|
+
"confidence_factors": {
|
|
1826
|
+
"evidence_quality": 28,
|
|
1827
|
+
"reproduction_success": 0,
|
|
1828
|
+
"independent_confirmations": 11,
|
|
1829
|
+
"environmental_clarity": 15,
|
|
1830
|
+
"manual_review_status": 0,
|
|
1831
|
+
"memory_boost": 0,
|
|
1832
|
+
"test_exemption": false,
|
|
1833
|
+
"test_deduction": 0,
|
|
1834
|
+
"total_score": 54,
|
|
1835
|
+
"classification_band": "Medium Confidence"
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
"finding_id": "TG-INPUT-005-7f81ea7f",
|
|
1840
|
+
"rule_id": "TG-INPUT-005",
|
|
1841
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
1842
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
1843
|
+
"severity": "High",
|
|
1844
|
+
"category": "injection",
|
|
1845
|
+
"cluster": "cluster-injection",
|
|
1846
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1847
|
+
"line_number": 177,
|
|
1848
|
+
"matched_text": "render_template_string(",
|
|
1849
|
+
"snippet": " \"flask-app\": {\n \"vulnerable\": {\n \"app.py\": 'from flask import Flask, request, render_template_string\\nimport os\\n\\napp = Flask(__name__)\\n\\n@app.route(\"/greet\")\\ndef greet():\\n name = request.args.get(\"name\", \"Guest\")\\n # SSTI: Unescaped string formatting in template\\n return render_template_string(f\"Hello {name}\")\\n\\n@app.route(\"/upload\", methods=[\"POST\"])\\ndef upload():\\n f = request.files[\"file\"]\\n # Path Traversal in filename\\n f.save(os.path.join(\"/var/uploads\", f.filename))\\n return \"Saved\"\\n'\n },\n \"hardened\": {",
|
|
1850
|
+
"is_test": false,
|
|
1851
|
+
"rule_precision": 0.75,
|
|
1852
|
+
"target": {
|
|
1853
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1854
|
+
"start_line": 177,
|
|
1855
|
+
"end_line": 177
|
|
1856
|
+
},
|
|
1857
|
+
"confidence_score": 52,
|
|
1858
|
+
"confidence_band": "Medium Confidence",
|
|
1859
|
+
"confidence_factors": {
|
|
1860
|
+
"evidence_quality": 26,
|
|
1861
|
+
"reproduction_success": 0,
|
|
1862
|
+
"independent_confirmations": 11,
|
|
1863
|
+
"environmental_clarity": 15,
|
|
1864
|
+
"manual_review_status": 0,
|
|
1865
|
+
"memory_boost": 0,
|
|
1866
|
+
"test_exemption": false,
|
|
1867
|
+
"test_deduction": 0,
|
|
1868
|
+
"total_score": 52,
|
|
1869
|
+
"classification_band": "Medium Confidence"
|
|
1870
|
+
}
|
|
1871
|
+
},
|
|
1872
|
+
{
|
|
1873
|
+
"finding_id": "TG-INPUT-005-d5aaebe0",
|
|
1874
|
+
"rule_id": "TG-INPUT-005",
|
|
1875
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
1876
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
1877
|
+
"severity": "High",
|
|
1878
|
+
"category": "injection",
|
|
1879
|
+
"cluster": "cluster-injection",
|
|
1880
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1881
|
+
"line_number": 190,
|
|
1882
|
+
"matched_text": "render_template_string(",
|
|
1883
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": \"app.py\", \"line_start\": 10, \"line_end\": 10},\n \"evidence\": {\"code_snippet\": 'return render_template_string(f\"Hello {name}\")'},\n \"what_is_wrong\": \"User input formatted directly into template string.\",\n \"what_should_change\": \"Render static template file with contextual autoescaping.\",",
|
|
1884
|
+
"is_test": false,
|
|
1885
|
+
"rule_precision": 0.75,
|
|
1886
|
+
"target": {
|
|
1887
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1888
|
+
"start_line": 190,
|
|
1889
|
+
"end_line": 190
|
|
1890
|
+
},
|
|
1891
|
+
"confidence_score": 52,
|
|
1892
|
+
"confidence_band": "Medium Confidence",
|
|
1893
|
+
"confidence_factors": {
|
|
1894
|
+
"evidence_quality": 26,
|
|
1895
|
+
"reproduction_success": 0,
|
|
1896
|
+
"independent_confirmations": 11,
|
|
1897
|
+
"environmental_clarity": 15,
|
|
1898
|
+
"manual_review_status": 0,
|
|
1899
|
+
"memory_boost": 0,
|
|
1900
|
+
"test_exemption": false,
|
|
1901
|
+
"test_deduction": 0,
|
|
1902
|
+
"total_score": 52,
|
|
1903
|
+
"classification_band": "Medium Confidence"
|
|
1904
|
+
}
|
|
1905
|
+
},
|
|
1906
|
+
{
|
|
1907
|
+
"finding_id": "TG-INPUT-005-e0ffb03b",
|
|
1908
|
+
"rule_id": "TG-INPUT-005",
|
|
1909
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
1910
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
1911
|
+
"severity": "High",
|
|
1912
|
+
"category": "injection",
|
|
1913
|
+
"cluster": "cluster-injection",
|
|
1914
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1915
|
+
"line_number": 193,
|
|
1916
|
+
"matched_text": "render_template_string(",
|
|
1917
|
+
"snippet": " \"what_is_wrong\": \"User input formatted directly into template string.\",\n \"what_should_change\": \"Render static template file with contextual autoescaping.\",\n \"proposed_diff\": \"--- a/app.py\\n+++ b/app.py\\n@@ -10,1 +10,1 @@\\n-return render_template_string(f\\\"Hello {name}\\\")\\n+return render_template(\\\"greet.html\\\", name=name)\\n\",\n \"verification_steps\": \"Send name={{7*7}} and verify output contains literal {{7*7}} instead of 49.\",\n },",
|
|
1918
|
+
"is_test": false,
|
|
1919
|
+
"rule_precision": 0.75,
|
|
1920
|
+
"target": {
|
|
1921
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
1922
|
+
"start_line": 193,
|
|
1923
|
+
"end_line": 193
|
|
1924
|
+
},
|
|
1925
|
+
"confidence_score": 52,
|
|
1926
|
+
"confidence_band": "Medium Confidence",
|
|
1927
|
+
"confidence_factors": {
|
|
1928
|
+
"evidence_quality": 26,
|
|
1929
|
+
"reproduction_success": 0,
|
|
1930
|
+
"independent_confirmations": 11,
|
|
1931
|
+
"environmental_clarity": 15,
|
|
1932
|
+
"manual_review_status": 0,
|
|
1933
|
+
"memory_boost": 0,
|
|
1934
|
+
"test_exemption": false,
|
|
1935
|
+
"test_deduction": 0,
|
|
1936
|
+
"total_score": 52,
|
|
1937
|
+
"classification_band": "Medium Confidence"
|
|
1938
|
+
}
|
|
1939
|
+
},
|
|
1940
|
+
{
|
|
1941
|
+
"finding_id": "TG-INPUT-005-0d595acd",
|
|
1942
|
+
"rule_id": "TG-INPUT-005",
|
|
1943
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
1944
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
1945
|
+
"severity": "High",
|
|
1946
|
+
"category": "injection",
|
|
1947
|
+
"cluster": "cluster-injection",
|
|
1948
|
+
"file_path": "harness/master_validation.py",
|
|
1949
|
+
"line_number": 314,
|
|
1950
|
+
"matched_text": "render_template_string(",
|
|
1951
|
+
"snippet": " \"severity\": SeverityLevel.HIGH,\n \"path\": \"rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md\",\n \"vuln_sample\": \"return render_template_string(f'<h1>Hello {name}</h1>')\",\n \"hard_sample\": \"return render_template('hello.html', name=name)\",\n \"remediation\": \"Pass inputs as context variables in autoescaped template files or use Django's format_html() to safely construct HTML wrappers.\",",
|
|
1952
|
+
"is_test": false,
|
|
1953
|
+
"rule_precision": 0.75,
|
|
1954
|
+
"target": {
|
|
1955
|
+
"file_path": "harness/master_validation.py",
|
|
1956
|
+
"start_line": 314,
|
|
1957
|
+
"end_line": 314
|
|
1958
|
+
},
|
|
1959
|
+
"confidence_score": 49,
|
|
1960
|
+
"confidence_band": "Needs Review",
|
|
1961
|
+
"confidence_factors": {
|
|
1962
|
+
"evidence_quality": 26,
|
|
1963
|
+
"reproduction_success": 0,
|
|
1964
|
+
"independent_confirmations": 8,
|
|
1965
|
+
"environmental_clarity": 15,
|
|
1966
|
+
"manual_review_status": 0,
|
|
1967
|
+
"memory_boost": 0,
|
|
1968
|
+
"test_exemption": false,
|
|
1969
|
+
"test_deduction": 0,
|
|
1970
|
+
"total_score": 49,
|
|
1971
|
+
"classification_band": "Needs Review"
|
|
1972
|
+
}
|
|
1973
|
+
},
|
|
1974
|
+
{
|
|
1975
|
+
"finding_id": "TG-INPUT-005-d7ef73f1",
|
|
1976
|
+
"rule_id": "TG-INPUT-005",
|
|
1977
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
1978
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
1979
|
+
"severity": "High",
|
|
1980
|
+
"category": "injection",
|
|
1981
|
+
"cluster": "cluster-injection",
|
|
1982
|
+
"file_path": "harness/validate_e2e.py",
|
|
1983
|
+
"line_number": 457,
|
|
1984
|
+
"matched_text": "render_template_string(",
|
|
1985
|
+
"snippet": " \"\",\n \"- **`TG-AUTH-008` (Untrusted Role/Tenant Header Injection):** Verified detection on client headers (`X-User-Role`, `X-Tenant-ID`) and verified FastAPI/DRF JWT token extraction remediations.\",\n \"- **`TG-INPUT-005` (Unsafe Template Rendering & Disabled Autoescaping):** Verified detection on `mark_safe()`, `| safe`, and `render_template_string()`; verified Jinja2 context variable autoescaping and `format_html()` remediations.\",\n \"- **`TG-INPUT-006` (Path Traversal & Unsafe Upload Storage):** Verified detection on `os.path.join(UPLOAD_DIR, filename)`; verified `secure_filename()` + UUID storage remediations.\",\n \"- **`TG-DB-004` (Missing Tenant Query Isolation):** Verified detection on unscoped primary key queries; verified SQLAlchemy composite tenant filters and DRF ViewSet `get_queryset()` tenant isolation.\",",
|
|
1986
|
+
"is_test": false,
|
|
1987
|
+
"rule_precision": 0.75,
|
|
1988
|
+
"target": {
|
|
1989
|
+
"file_path": "harness/validate_e2e.py",
|
|
1990
|
+
"start_line": 457,
|
|
1991
|
+
"end_line": 457
|
|
1992
|
+
},
|
|
1993
|
+
"confidence_score": 49,
|
|
1994
|
+
"confidence_band": "Needs Review",
|
|
1995
|
+
"confidence_factors": {
|
|
1996
|
+
"evidence_quality": 26,
|
|
1997
|
+
"reproduction_success": 0,
|
|
1998
|
+
"independent_confirmations": 8,
|
|
1999
|
+
"environmental_clarity": 15,
|
|
2000
|
+
"manual_review_status": 0,
|
|
2001
|
+
"memory_boost": 0,
|
|
2002
|
+
"test_exemption": false,
|
|
2003
|
+
"test_deduction": 0,
|
|
2004
|
+
"total_score": 49,
|
|
2005
|
+
"classification_band": "Needs Review"
|
|
2006
|
+
}
|
|
2007
|
+
},
|
|
2008
|
+
{
|
|
2009
|
+
"finding_id": "TG-INPUT-005-95cb57ba",
|
|
2010
|
+
"rule_id": "TG-INPUT-005",
|
|
2011
|
+
"title": "Unsafe Template Rendering & Disabled Autoescaping",
|
|
2012
|
+
"description": "Flask render_template_string rendering untrusted input",
|
|
2013
|
+
"severity": "High",
|
|
2014
|
+
"category": "injection",
|
|
2015
|
+
"cluster": "cluster-injection",
|
|
2016
|
+
"file_path": "harness/engine/fixture_manager.py",
|
|
2017
|
+
"line_number": 176,
|
|
2018
|
+
"matched_text": "render_template_string(",
|
|
2019
|
+
"snippet": " vulnerable_variant=FixtureVariant(\n relative_path=\"examples/python/flask-vuln\",\n code_pattern=\"render_template_string(f'<h1>Hello {name}</h1>')\",\n expected_findings_count=1,\n ),",
|
|
2020
|
+
"is_test": false,
|
|
2021
|
+
"rule_precision": 0.75,
|
|
2022
|
+
"target": {
|
|
2023
|
+
"file_path": "harness/engine/fixture_manager.py",
|
|
2024
|
+
"start_line": 176,
|
|
2025
|
+
"end_line": 176
|
|
2026
|
+
},
|
|
2027
|
+
"confidence_score": 46,
|
|
2028
|
+
"confidence_band": "Needs Review",
|
|
2029
|
+
"confidence_factors": {
|
|
2030
|
+
"evidence_quality": 26,
|
|
2031
|
+
"reproduction_success": 0,
|
|
2032
|
+
"independent_confirmations": 5,
|
|
2033
|
+
"environmental_clarity": 15,
|
|
2034
|
+
"manual_review_status": 0,
|
|
2035
|
+
"memory_boost": 0,
|
|
2036
|
+
"test_exemption": false,
|
|
2037
|
+
"test_deduction": 0,
|
|
2038
|
+
"total_score": 46,
|
|
2039
|
+
"classification_band": "Needs Review"
|
|
2040
|
+
}
|
|
2041
|
+
},
|
|
2042
|
+
{
|
|
2043
|
+
"finding_id": "TG-PLATFORM-003-69f083d6",
|
|
2044
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2045
|
+
"title": "Production Stack Trace Exposure",
|
|
2046
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2047
|
+
"severity": "Medium",
|
|
2048
|
+
"category": "platform",
|
|
2049
|
+
"cluster": "cluster-platform",
|
|
2050
|
+
"file_path": "harness/runner.py",
|
|
2051
|
+
"line_number": 392,
|
|
2052
|
+
"matched_text": "DEBUG = True",
|
|
2053
|
+
"snippet": " type=EvidenceType.SOURCE,\n location=\"settings.py:10\",\n raw_snippet=\"DEBUG = True\\nSECRET_KEY = 'sk_live_secret_key_12345'\",\n rationale=\"Production debug mode exposure and hardcoded secret.\",\n confidence_level=ConfidenceBand.CONFIRMED,",
|
|
2054
|
+
"is_test": false,
|
|
2055
|
+
"rule_precision": 0.75,
|
|
2056
|
+
"target": {
|
|
2057
|
+
"file_path": "harness/runner.py",
|
|
2058
|
+
"start_line": 392,
|
|
2059
|
+
"end_line": 392
|
|
2060
|
+
},
|
|
2061
|
+
"confidence_score": 56,
|
|
2062
|
+
"confidence_band": "Medium Confidence",
|
|
2063
|
+
"confidence_factors": {
|
|
2064
|
+
"evidence_quality": 26,
|
|
2065
|
+
"reproduction_success": 0,
|
|
2066
|
+
"independent_confirmations": 15,
|
|
2067
|
+
"environmental_clarity": 15,
|
|
2068
|
+
"manual_review_status": 0,
|
|
2069
|
+
"memory_boost": 0,
|
|
2070
|
+
"test_exemption": false,
|
|
2071
|
+
"test_deduction": 0,
|
|
2072
|
+
"total_score": 56,
|
|
2073
|
+
"classification_band": "Medium Confidence"
|
|
2074
|
+
}
|
|
2075
|
+
},
|
|
2076
|
+
{
|
|
2077
|
+
"finding_id": "TG-PLATFORM-003-6f253f06",
|
|
2078
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2079
|
+
"title": "Production Stack Trace Exposure",
|
|
2080
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2081
|
+
"severity": "Medium",
|
|
2082
|
+
"category": "platform",
|
|
2083
|
+
"cluster": "cluster-platform",
|
|
2084
|
+
"file_path": "harness/runner.py",
|
|
2085
|
+
"line_number": 405,
|
|
2086
|
+
"matched_text": "DEBUG = True",
|
|
2087
|
+
"snippet": " prov = ProvenanceChain(\n discovery_module=\"rules/TG-PLATFORM-003-production-stack-trace-exposure.md\",\n triggering_input=\"DEBUG = True assignment in settings.py\",\n evidence_collected=[\"settings.py:10\"],\n decision_path=[\"Loaded Django settings\", \"Found DEBUG enabled\"],",
|
|
2088
|
+
"is_test": false,
|
|
2089
|
+
"rule_precision": 0.75,
|
|
2090
|
+
"target": {
|
|
2091
|
+
"file_path": "harness/runner.py",
|
|
2092
|
+
"start_line": 405,
|
|
2093
|
+
"end_line": 405
|
|
2094
|
+
},
|
|
2095
|
+
"confidence_score": 56,
|
|
2096
|
+
"confidence_band": "Medium Confidence",
|
|
2097
|
+
"confidence_factors": {
|
|
2098
|
+
"evidence_quality": 26,
|
|
2099
|
+
"reproduction_success": 0,
|
|
2100
|
+
"independent_confirmations": 15,
|
|
2101
|
+
"environmental_clarity": 15,
|
|
2102
|
+
"manual_review_status": 0,
|
|
2103
|
+
"memory_boost": 0,
|
|
2104
|
+
"test_exemption": false,
|
|
2105
|
+
"test_deduction": 0,
|
|
2106
|
+
"total_score": 56,
|
|
2107
|
+
"classification_band": "Medium Confidence"
|
|
2108
|
+
}
|
|
2109
|
+
},
|
|
2110
|
+
{
|
|
2111
|
+
"finding_id": "TG-PLATFORM-003-fbe8ec66",
|
|
2112
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2113
|
+
"title": "Production Stack Trace Exposure",
|
|
2114
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2115
|
+
"severity": "Medium",
|
|
2116
|
+
"category": "platform",
|
|
2117
|
+
"cluster": "cluster-platform",
|
|
2118
|
+
"file_path": "harness/runner.py",
|
|
2119
|
+
"line_number": 416,
|
|
2120
|
+
"matched_text": "DEBUG = True",
|
|
2121
|
+
"snippet": " framework_pattern=FrameworkPattern(\n framework=\"Django\",\n unsafe_snippet=\"DEBUG = True\",\n safe_snippet=\"DEBUG = False\",\n ),",
|
|
2122
|
+
"is_test": false,
|
|
2123
|
+
"rule_precision": 0.75,
|
|
2124
|
+
"target": {
|
|
2125
|
+
"file_path": "harness/runner.py",
|
|
2126
|
+
"start_line": 416,
|
|
2127
|
+
"end_line": 416
|
|
2128
|
+
},
|
|
2129
|
+
"confidence_score": 56,
|
|
2130
|
+
"confidence_band": "Medium Confidence",
|
|
2131
|
+
"confidence_factors": {
|
|
2132
|
+
"evidence_quality": 26,
|
|
2133
|
+
"reproduction_success": 0,
|
|
2134
|
+
"independent_confirmations": 15,
|
|
2135
|
+
"environmental_clarity": 15,
|
|
2136
|
+
"manual_review_status": 0,
|
|
2137
|
+
"memory_boost": 0,
|
|
2138
|
+
"test_exemption": false,
|
|
2139
|
+
"test_deduction": 0,
|
|
2140
|
+
"total_score": 56,
|
|
2141
|
+
"classification_band": "Medium Confidence"
|
|
2142
|
+
}
|
|
2143
|
+
},
|
|
2144
|
+
{
|
|
2145
|
+
"finding_id": "TG-PLATFORM-003-153d982f",
|
|
2146
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2147
|
+
"title": "Production Stack Trace Exposure",
|
|
2148
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2149
|
+
"severity": "Medium",
|
|
2150
|
+
"category": "platform",
|
|
2151
|
+
"cluster": "cluster-platform",
|
|
2152
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2153
|
+
"line_number": 64,
|
|
2154
|
+
"matched_text": "DEBUG = True",
|
|
2155
|
+
"snippet": " \"tiny-repo\": {\n \"vulnerable\": {\n \"app.py\": 'DEBUG = True\\nSECRET_KEY = \"sk_live_1234567890\"\\n\\ndef index():\\n return \"Welcome\"\\n'\n },\n \"hardened\": {",
|
|
2156
|
+
"is_test": false,
|
|
2157
|
+
"rule_precision": 0.75,
|
|
2158
|
+
"target": {
|
|
2159
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2160
|
+
"start_line": 64,
|
|
2161
|
+
"end_line": 64
|
|
2162
|
+
},
|
|
2163
|
+
"confidence_score": 52,
|
|
2164
|
+
"confidence_band": "Medium Confidence",
|
|
2165
|
+
"confidence_factors": {
|
|
2166
|
+
"evidence_quality": 26,
|
|
2167
|
+
"reproduction_success": 0,
|
|
2168
|
+
"independent_confirmations": 11,
|
|
2169
|
+
"environmental_clarity": 15,
|
|
2170
|
+
"manual_review_status": 0,
|
|
2171
|
+
"memory_boost": 0,
|
|
2172
|
+
"test_exemption": false,
|
|
2173
|
+
"test_deduction": 0,
|
|
2174
|
+
"total_score": 52,
|
|
2175
|
+
"classification_band": "Medium Confidence"
|
|
2176
|
+
}
|
|
2177
|
+
},
|
|
2178
|
+
{
|
|
2179
|
+
"finding_id": "TG-PLATFORM-003-21644311",
|
|
2180
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2181
|
+
"title": "Production Stack Trace Exposure",
|
|
2182
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2183
|
+
"severity": "Medium",
|
|
2184
|
+
"category": "platform",
|
|
2185
|
+
"cluster": "cluster-platform",
|
|
2186
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2187
|
+
"line_number": 77,
|
|
2188
|
+
"matched_text": "DEBUG = True",
|
|
2189
|
+
"snippet": " \"confidence_band\": \"Confirmed\",\n \"target\": {\"file_path\": \"app.py\", \"line_start\": 1, \"line_end\": 1},\n \"evidence\": {\"code_snippet\": \"DEBUG = True\"},\n \"what_is_wrong\": \"DEBUG is statically enabled.\",\n \"what_should_change\": \"Load DEBUG from environment variables.\",",
|
|
2190
|
+
"is_test": false,
|
|
2191
|
+
"rule_precision": 0.75,
|
|
2192
|
+
"target": {
|
|
2193
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2194
|
+
"start_line": 77,
|
|
2195
|
+
"end_line": 77
|
|
2196
|
+
},
|
|
2197
|
+
"confidence_score": 52,
|
|
2198
|
+
"confidence_band": "Medium Confidence",
|
|
2199
|
+
"confidence_factors": {
|
|
2200
|
+
"evidence_quality": 26,
|
|
2201
|
+
"reproduction_success": 0,
|
|
2202
|
+
"independent_confirmations": 11,
|
|
2203
|
+
"environmental_clarity": 15,
|
|
2204
|
+
"manual_review_status": 0,
|
|
2205
|
+
"memory_boost": 0,
|
|
2206
|
+
"test_exemption": false,
|
|
2207
|
+
"test_deduction": 0,
|
|
2208
|
+
"total_score": 52,
|
|
2209
|
+
"classification_band": "Medium Confidence"
|
|
2210
|
+
}
|
|
2211
|
+
},
|
|
2212
|
+
{
|
|
2213
|
+
"finding_id": "TG-PLATFORM-003-21b8a588",
|
|
2214
|
+
"rule_id": "TG-PLATFORM-003",
|
|
2215
|
+
"title": "Production Stack Trace Exposure",
|
|
2216
|
+
"description": "Django DEBUG mode enabled in configuration",
|
|
2217
|
+
"severity": "Medium",
|
|
2218
|
+
"category": "platform",
|
|
2219
|
+
"cluster": "cluster-platform",
|
|
2220
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2221
|
+
"line_number": 80,
|
|
2222
|
+
"matched_text": "DEBUG = True",
|
|
2223
|
+
"snippet": " \"what_is_wrong\": \"DEBUG is statically enabled.\",\n \"what_should_change\": \"Load DEBUG from environment variables.\",\n \"proposed_diff\": \"--- a/app.py\\n+++ b/app.py\\n@@ -1,1 +1,2 @@\\n-DEBUG = True\\n+import os\\n+DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'\\n\",\n \"verification_steps\": \"Check DEBUG setting resolution in production.\",\n },",
|
|
2224
|
+
"is_test": false,
|
|
2225
|
+
"rule_precision": 0.75,
|
|
2226
|
+
"target": {
|
|
2227
|
+
"file_path": "harness/validate_qa_v0_6_0.py",
|
|
2228
|
+
"start_line": 80,
|
|
2229
|
+
"end_line": 80
|
|
2230
|
+
},
|
|
2231
|
+
"confidence_score": 52,
|
|
2232
|
+
"confidence_band": "Medium Confidence",
|
|
2233
|
+
"confidence_factors": {
|
|
2234
|
+
"evidence_quality": 26,
|
|
2235
|
+
"reproduction_success": 0,
|
|
2236
|
+
"independent_confirmations": 11,
|
|
2237
|
+
"environmental_clarity": 15,
|
|
2238
|
+
"manual_review_status": 0,
|
|
2239
|
+
"memory_boost": 0,
|
|
2240
|
+
"test_exemption": false,
|
|
2241
|
+
"test_deduction": 0,
|
|
2242
|
+
"total_score": 52,
|
|
2243
|
+
"classification_band": "Medium Confidence"
|
|
2244
|
+
}
|
|
2245
|
+
},
|
|
2246
|
+
{
|
|
2247
|
+
"finding_id": "TG-DB-004-6a739666",
|
|
2248
|
+
"rule_id": "TG-DB-004",
|
|
2249
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
2250
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
2251
|
+
"severity": "Low",
|
|
2252
|
+
"category": "database",
|
|
2253
|
+
"cluster": "cluster-tenant-isolation",
|
|
2254
|
+
"file_path": "tests/test_v0_6_0_governed_remediation.py",
|
|
2255
|
+
"line_number": 79,
|
|
2256
|
+
"matched_text": ".objects.get(id=invoice_id)",
|
|
2257
|
+
"snippet": " def get_invoice(request, invoice_id):\n # Fetch invoice directly without tenant filter\n invoice = Invoice.objects.get(id=invoice_id)\n return JsonResponse({\"id\": invoice.id})\n \"\"\"",
|
|
2258
|
+
"is_test": true,
|
|
2259
|
+
"rule_precision": 0.55,
|
|
2260
|
+
"target": {
|
|
2261
|
+
"file_path": "tests/test_v0_6_0_governed_remediation.py",
|
|
2262
|
+
"start_line": 79,
|
|
2263
|
+
"end_line": 79
|
|
2264
|
+
},
|
|
2265
|
+
"confidence_score": 24,
|
|
2266
|
+
"confidence_band": "Needs Review",
|
|
2267
|
+
"confidence_factors": {
|
|
2268
|
+
"evidence_quality": 19,
|
|
2269
|
+
"reproduction_success": 0,
|
|
2270
|
+
"independent_confirmations": 5,
|
|
2271
|
+
"environmental_clarity": 5,
|
|
2272
|
+
"manual_review_status": 0,
|
|
2273
|
+
"memory_boost": 25,
|
|
2274
|
+
"test_exemption": true,
|
|
2275
|
+
"test_deduction": -30,
|
|
2276
|
+
"total_score": 24,
|
|
2277
|
+
"classification_band": "Needs Review"
|
|
2278
|
+
}
|
|
2279
|
+
},
|
|
2280
|
+
{
|
|
2281
|
+
"finding_id": "TG-DB-004-fe2c60e3",
|
|
2282
|
+
"rule_id": "TG-DB-004",
|
|
2283
|
+
"title": "Missing Tenant Query Isolation in Multi-Tenant Models",
|
|
2284
|
+
"description": "Django ORM .get(id=...) query lacking explicit tenant scope filter",
|
|
2285
|
+
"severity": "Low",
|
|
2286
|
+
"category": "database",
|
|
2287
|
+
"cluster": "cluster-tenant-isolation",
|
|
2288
|
+
"file_path": "tests/test_v0_6_0_governed_remediation.py",
|
|
2289
|
+
"line_number": 86,
|
|
2290
|
+
"matched_text": ".objects.get(id=invoice_id)",
|
|
2291
|
+
"snippet": " # Lines shifted down by 10 lines\n def get_invoice(request, invoice_id):\n invoice = Invoice.objects.get(id=invoice_id)\n return JsonResponse({\"id\": invoice.id})\n \"\"\"",
|
|
2292
|
+
"is_test": true,
|
|
2293
|
+
"rule_precision": 0.55,
|
|
2294
|
+
"target": {
|
|
2295
|
+
"file_path": "tests/test_v0_6_0_governed_remediation.py",
|
|
2296
|
+
"start_line": 86,
|
|
2297
|
+
"end_line": 86
|
|
2298
|
+
},
|
|
2299
|
+
"confidence_score": 24,
|
|
2300
|
+
"confidence_band": "Needs Review",
|
|
2301
|
+
"confidence_factors": {
|
|
2302
|
+
"evidence_quality": 19,
|
|
2303
|
+
"reproduction_success": 0,
|
|
2304
|
+
"independent_confirmations": 5,
|
|
2305
|
+
"environmental_clarity": 5,
|
|
2306
|
+
"manual_review_status": 0,
|
|
2307
|
+
"memory_boost": 25,
|
|
2308
|
+
"test_exemption": true,
|
|
2309
|
+
"test_deduction": -30,
|
|
2310
|
+
"total_score": 24,
|
|
2311
|
+
"classification_band": "Needs Review"
|
|
2312
|
+
}
|
|
2313
|
+
}
|
|
2314
|
+
]
|