@hoanghainh/komagu 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +1 -1
- package/assess/lsa/examples/eval-run-4/ground-truth.json +823 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/ai-run-stats.json +58 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/coverage.json +85 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/findings/priv-privilege-001.json +822 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/findings/priv-privilege-002.json +393 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/findings.json +4477 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter0-gptoss-a/score.json +120 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/ai-run-stats.json +55 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/coverage.json +50 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/findings/priv-privilege-001.json +613 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/findings/priv-privilege-002.json +287 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/findings.json +4870 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-a/score.json +107 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/ai-run-stats.json +58 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/coverage.json +92 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/findings/priv-privilege-001.json +645 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/findings/priv-privilege-002.json +222 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/findings.json +4859 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter1-gptoss-b/score.json +121 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/coverage.json +111 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/findings/priv-privilege-001.json +6 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/findings/priv-privilege-002.json +344 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/findings.json +3544 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter1-qwen-a-incomplete/score.json +123 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/ai-run-stats.json +50 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/coverage.json +42 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/findings/priv-privilege-001.json +540 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/findings/priv-privilege-002.json +238 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/findings.json +4383 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/findings.sarif +8729 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/report.ja.md +1911 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/report.md +1911 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/score.json +101 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-a/stack-profile.json +226 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/ai-run-stats.json +54 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/coverage.json +66 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/findings/priv-privilege-001.json +440 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/findings/priv-privilege-002.json +229 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/findings.json +3424 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-4/iter2-gptoss-b/score.json +120 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/ai-run-stats.json +88 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/coverage.json +36 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/findings/priv-privilege-001.json +530 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/findings/priv-privilege-002.json +248 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/findings.json +4766 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/findings.sarif +9326 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/report.ja.md +2011 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/report.md +2011 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/score.json +80 -0
- package/assess/lsa/examples/eval-run-5/gptoss-a/stack-profile.json +226 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/ai-run-stats.json +83 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/coverage.json +44 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/findings/priv-privilege-001.json +579 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/findings/priv-privilege-002.json +268 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/findings.json +3913 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-5/gptoss-b/score.json +94 -0
- package/assess/lsa/examples/eval-run-5/ground-truth.json +823 -0
- package/assess/lsa/knowledge/injection-patterns.md +8 -1
- package/assess/lsa/knowledge/stacks/nextjs.md +62 -0
- package/assess/lsa/prompts/35-privilege-auditor.md +3 -1
- package/assess/lsa/prompts/_shared-rules.md +1 -0
- package/assess/lsa/scripts/detect_stack.py +5 -1
- package/assess/lsa/scripts/find_injection.py +34 -5
- package/assess/lsa/scripts/lsa_common.py +9 -2
- package/assess/lsa/scripts/make_batches.py +2 -1
- package/assess/lsa/scripts/map_routes.py +10 -2
- package/assess/lsa/scripts/nextjs_routes.py +236 -0
- package/assess/lsa/templates/audit-config.json +1 -1
- package/assess/lsa/tests/EVAL-RESULTS.md +156 -0
- package/assess/lsa/tests/score_findings.py +58 -0
- package/assess/lsa/tests/test_default_scope.py +86 -0
- package/assess/lsa/tests/test_eval_run_4.py +73 -0
- package/assess/lsa/tests/test_eval_run_5.py +73 -0
- package/assess/lsa/tests/test_js_tagged_sql.py +112 -0
- package/assess/lsa/tests/test_nextjs.py +198 -0
- package/assess/lsa/tests/test_privilege_tier2.py +30 -0
- package/operate/ai/anchoring.py +130 -0
- package/operate/ai/client.py +13 -0
- package/operate/ai/context.py +105 -0
- package/operate/ai/runner.py +197 -69
- package/operate/cli/__init__.py +1 -1
- package/operate/cli/commands/scan.py +1 -1
- package/operate/tests/test_ai_anchoring.py +184 -0
- package/operate/tests/test_headless_ai.py +148 -1
- package/package.json +1 -1
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
{
|
|
2
|
+
"batch_id": "privilege-002",
|
|
3
|
+
"findings": [
|
|
4
|
+
{
|
|
5
|
+
"finding_id": "MASS-M-0006-1",
|
|
6
|
+
"category": "mass_assignment",
|
|
7
|
+
"subtype": "whole_object_binding",
|
|
8
|
+
"title": "Profile update binds entire request body to User model",
|
|
9
|
+
"candidate_id": "M-0006",
|
|
10
|
+
"location": {
|
|
11
|
+
"file": "routes/profile.js",
|
|
12
|
+
"start_line": 7
|
|
13
|
+
},
|
|
14
|
+
"evidence": [
|
|
15
|
+
{
|
|
16
|
+
"file": "routes/profile.js",
|
|
17
|
+
"line": 7,
|
|
18
|
+
"why": "ensureLoggedIn only checks authentication"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"file": "routes/profile.js",
|
|
22
|
+
"line": 8,
|
|
23
|
+
"why": "User.findByIdAndUpdate(req.user._id, req.body, ...) binds whole body"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"impact": "Any authenticated user can set privileged fields such as role or admin flag via the profile update endpoint.",
|
|
27
|
+
"severity": "critical",
|
|
28
|
+
"confidence": "high",
|
|
29
|
+
"cwe": [
|
|
30
|
+
"CWE-915"
|
|
31
|
+
],
|
|
32
|
+
"recommendation": "Limit bound fields to a whitelist and set privileged fields server\u2011side.",
|
|
33
|
+
"status": "unverified"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"finding_id": "MASS-M-0007-1",
|
|
37
|
+
"category": "mass_assignment",
|
|
38
|
+
"subtype": "whole_object_binding",
|
|
39
|
+
"title": "Profile update binds entire request body to User model (duplicate route)",
|
|
40
|
+
"candidate_id": "M-0007",
|
|
41
|
+
"location": {
|
|
42
|
+
"file": "routes/profile.js",
|
|
43
|
+
"start_line": 7
|
|
44
|
+
},
|
|
45
|
+
"evidence": [
|
|
46
|
+
{
|
|
47
|
+
"file": "routes/profile.js",
|
|
48
|
+
"line": 7,
|
|
49
|
+
"why": "ensureLoggedIn only checks authentication"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"file": "routes/profile.js",
|
|
53
|
+
"line": 8,
|
|
54
|
+
"why": "User.findByIdAndUpdate(req.user._id, req.body, ...) binds whole body"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"impact": "Any authenticated user can set privileged fields such as role or admin flag via the profile update endpoint.",
|
|
58
|
+
"severity": "critical",
|
|
59
|
+
"confidence": "high",
|
|
60
|
+
"cwe": [
|
|
61
|
+
"CWE-915"
|
|
62
|
+
],
|
|
63
|
+
"recommendation": "Limit bound fields to a whitelist and set privileged fields server\u2011side.",
|
|
64
|
+
"status": "unverified"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"finding_id": "MASS-M-0008-1",
|
|
68
|
+
"category": "mass_assignment",
|
|
69
|
+
"subtype": "whole_object_binding",
|
|
70
|
+
"title": "User registration binds entire request body to User model",
|
|
71
|
+
"candidate_id": "M-0008",
|
|
72
|
+
"location": {
|
|
73
|
+
"file": "app/Http/Controllers/AccountController.php",
|
|
74
|
+
"start_line": 11
|
|
75
|
+
},
|
|
76
|
+
"evidence": [
|
|
77
|
+
{
|
|
78
|
+
"file": "app/Http/Controllers/AccountController.php",
|
|
79
|
+
"line": 13,
|
|
80
|
+
"why": "User::create($request->all()) binds whole body"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"impact": "Any user can set privileged fields such as role or admin flag during registration.",
|
|
84
|
+
"severity": "critical",
|
|
85
|
+
"confidence": "high",
|
|
86
|
+
"cwe": [
|
|
87
|
+
"CWE-915"
|
|
88
|
+
],
|
|
89
|
+
"recommendation": "Use $fillable or guarded properties to restrict writable fields.",
|
|
90
|
+
"status": "unverified"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"finding_id": "MASS-M-0009-1",
|
|
94
|
+
"category": "mass_assignment",
|
|
95
|
+
"subtype": "privileged_field_writable",
|
|
96
|
+
"title": "Team creation allows setting owner_id via request body",
|
|
97
|
+
"candidate_id": "M-0009",
|
|
98
|
+
"location": {
|
|
99
|
+
"file": "app/Http/Controllers/AccountController.php",
|
|
100
|
+
"start_line": 21
|
|
101
|
+
},
|
|
102
|
+
"evidence": [
|
|
103
|
+
{
|
|
104
|
+
"file": "app/Http/Controllers/AccountController.php",
|
|
105
|
+
"line": 23,
|
|
106
|
+
"why": "Team::create($request->all()) binds whole body, including owner_id"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"impact": "Any user can set the owner_id of a team, effectively assigning ownership to themselves or others.",
|
|
110
|
+
"severity": "critical",
|
|
111
|
+
"confidence": "high",
|
|
112
|
+
"cwe": [
|
|
113
|
+
"CWE-915",
|
|
114
|
+
"CWE-269"
|
|
115
|
+
],
|
|
116
|
+
"recommendation": "Do not allow owner_id to be set from the request; set it server\u2011side to the authenticated user.",
|
|
117
|
+
"status": "unverified"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"finding_id": "MASS-M-0013-1",
|
|
121
|
+
"category": "mass_assignment",
|
|
122
|
+
"subtype": "whole_object_binding",
|
|
123
|
+
"title": "User insertion uses extract($_POST) to bind all POST fields",
|
|
124
|
+
"candidate_id": "M-0013",
|
|
125
|
+
"location": {
|
|
126
|
+
"file": "register.php",
|
|
127
|
+
"start_line": 4
|
|
128
|
+
},
|
|
129
|
+
"evidence": [
|
|
130
|
+
{
|
|
131
|
+
"file": "register.php",
|
|
132
|
+
"line": 4,
|
|
133
|
+
"why": "extract($_POST) pulls all POST fields into variables"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"file": "register.php",
|
|
137
|
+
"line": 5,
|
|
138
|
+
"why": "INSERT uses $email and $name from extracted variables"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"impact": "Any POST field can be inserted into the users table, including privileged columns if they exist.",
|
|
142
|
+
"severity": "critical",
|
|
143
|
+
"confidence": "high",
|
|
144
|
+
"cwe": [
|
|
145
|
+
"CWE-915"
|
|
146
|
+
],
|
|
147
|
+
"recommendation": "Avoid extract(); explicitly bind only allowed fields.",
|
|
148
|
+
"status": "unverified"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"finding_id": "MASS-M-0015-1",
|
|
152
|
+
"category": "mass_assignment",
|
|
153
|
+
"subtype": "whole_object_binding",
|
|
154
|
+
"title": "PATCH endpoint sets arbitrary attributes from request JSON",
|
|
155
|
+
"candidate_id": "M-0015",
|
|
156
|
+
"location": {
|
|
157
|
+
"file": "app.py",
|
|
158
|
+
"start_line": 24
|
|
159
|
+
},
|
|
160
|
+
"evidence": [
|
|
161
|
+
{
|
|
162
|
+
"file": "app.py",
|
|
163
|
+
"line": 27,
|
|
164
|
+
"why": "for key, value in request.json.items(): setattr(user, key, value) binds all fields"
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"impact": "Any user can modify any attribute of the user record, including privileged fields.",
|
|
168
|
+
"severity": "critical",
|
|
169
|
+
"confidence": "high",
|
|
170
|
+
"cwe": [
|
|
171
|
+
"CWE-915"
|
|
172
|
+
],
|
|
173
|
+
"recommendation": "Whitelist allowed fields or use a DTO.",
|
|
174
|
+
"status": "unverified"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"finding_id": "MASS-M-0014-1",
|
|
178
|
+
"category": "mass_assignment",
|
|
179
|
+
"subtype": "whole_object_binding",
|
|
180
|
+
"title": "User creation binds entire request JSON to User model",
|
|
181
|
+
"candidate_id": "M-0014",
|
|
182
|
+
"location": {
|
|
183
|
+
"file": "app.py",
|
|
184
|
+
"start_line": 8
|
|
185
|
+
},
|
|
186
|
+
"evidence": [
|
|
187
|
+
{
|
|
188
|
+
"file": "app.py",
|
|
189
|
+
"line": 10,
|
|
190
|
+
"why": "User(**request.json) binds all JSON fields"
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
"impact": "Any user can set privileged fields such as role or admin flag during account creation.",
|
|
194
|
+
"severity": "critical",
|
|
195
|
+
"confidence": "high",
|
|
196
|
+
"cwe": [
|
|
197
|
+
"CWE-915"
|
|
198
|
+
],
|
|
199
|
+
"recommendation": "Use a DTO or whitelist to restrict writable fields.",
|
|
200
|
+
"status": "unverified"
|
|
201
|
+
}
|
|
202
|
+
],
|
|
203
|
+
"privilege_route_verdicts": [],
|
|
204
|
+
"candidate_verdicts": [
|
|
205
|
+
{
|
|
206
|
+
"candidate_id": "M-0006",
|
|
207
|
+
"verdict": "vulnerable"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"candidate_id": "M-0007",
|
|
211
|
+
"verdict": "vulnerable"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"candidate_id": "M-0008",
|
|
215
|
+
"verdict": "vulnerable"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"candidate_id": "M-0009",
|
|
219
|
+
"verdict": "vulnerable"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"candidate_id": "M-0010",
|
|
223
|
+
"verdict": "needs_review"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"candidate_id": "M-0013",
|
|
227
|
+
"verdict": "vulnerable"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"candidate_id": "M-0015",
|
|
231
|
+
"verdict": "vulnerable"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"candidate_id": "M-0014",
|
|
235
|
+
"verdict": "vulnerable"
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}
|