Files
Open_Ultra_SAST/benchmarks/independent/results-v2-hunter.json
T

1207 lines
33 KiB
JSON
Raw Normal View History

{
"protocol": "protocol-v2.md",
"cases_scored": 17,
"cases_incomplete": [],
"recall": [
1,
17
],
"recall_wilson95": [
0.01,
0.27
],
"unstable_detections": [],
"fixed_side_alerts": 1,
"benign_alerts": 16,
"completion": [
368,
408
],
"stability": [
846,
1159
],
"pooled_stable_vulnerable_findings": 40,
"unstable_vulnerable_findings": 163,
"precision_sample_size": 14,
"cases": [
{
"id": "pgadmin-maintenance-sqli",
"family": "injection",
"language": "python",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
21,
31
],
"fixed": [
43,
51
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 122.5,
"vulnerable_b": 143.5,
"fixed_a": 133.3,
"fixed_b": 145.2,
"benign_base": 143.5,
"benign_tip": 114.1
}
},
{
"id": "qwed-sympy-eval",
"family": "injection",
"language": "python",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
48,
59
],
"fixed": [
44,
50
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 55.0,
"vulnerable_b": 54.2,
"fixed_a": 50.5,
"fixed_b": 48.7,
"benign_base": 55.0,
"benign_tip": 53.1
}
},
{
"id": "contextforge-prompt-ssti",
"family": "injection",
"language": "python",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
37,
48
],
"fixed": [
19,
34
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 120.8,
"vulnerable_b": 119.2,
"fixed_a": 116.6,
"fixed_b": 115.4,
"benign_base": 109.5,
"benign_tip": 110.1
}
},
{
"id": "lmdeploy-media-url-ssrf",
"family": "untrusted_destination",
"language": "python",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
29,
42
],
"fixed": [
29,
43
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 62.3,
"vulnerable_b": 60.8,
"fixed_a": 57.2,
"fixed_b": 58.3,
"benign_base": 64.6,
"benign_tip": 64.6
}
},
{
"id": "winml-cli-serve-cors",
"family": "config_secrets",
"language": "python",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [
"src/winml/modelkit/analyze/models/onnx_model.py:1:",
"src/winml/modelkit/analyze/onnx_opset/_impl/opset_ai_onnx_preview_training1.py:1:",
"src/winml/modelkit/analyze/onnx_opset/_impl/opset_com_microsoft1.py:1:",
"src/winml/modelkit/analyze/runtime_checker/runner.py:1:",
"src/winml/modelkit/analyze/utils/avalizble_ep_device_ops/case_index_key_codec.py:1:"
],
"stability": {
"vulnerable": [
24,
28
],
"fixed": [
22,
24
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 63.3,
"vulnerable_b": 70.0,
"fixed_a": 72.0,
"fixed_b": 60.8,
"benign_base": 64.6,
"benign_tip": 68.4
}
},
{
"id": "reactpress-findall-column-sqli",
"family": "injection",
"language": "typescript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [
"cli/bin/reactpress.js:341:",
"cli/lib/dev-banner.js:1:"
],
"stability": {
"vulnerable": [
30,
41
],
"fixed": [
16,
28
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 51.8,
"vulnerable_b": 593.6,
"fixed_a": 49.1,
"fixed_b": 47.7,
"benign_base": 51.8,
"benign_tip": 54.4
}
},
{
"id": "fuxa-tdengine-escape-sqli",
"family": "injection",
"language": "javascript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {
"vulnerable_a": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"vulnerable_b": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"fixed_a": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"fixed_b": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"benign_base": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"benign_tip": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request"
},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
0,
0
],
"fixed": [
0,
0
]
},
"completion": {
"vulnerable_a": [
0,
4
],
"vulnerable_b": [
0,
4
],
"fixed_a": [
0,
4
],
"fixed_b": [
0,
4
],
"benign_base": [
0,
4
],
"benign_tip": [
0,
4
]
},
"seconds": {
"vulnerable_a": 78.9,
"vulnerable_b": 86.6,
"fixed_a": 78.3,
"fixed_b": 98.5,
"benign_base": 104.8,
"benign_tip": 102.9
}
},
{
"id": "budibase-mongo-template-nosqli",
"family": "injection",
"language": "typescript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [
"packages/backend-core/src/context/mainContext.ts:34:",
"packages/backend-core/src/context/mainContext.ts:45:",
"packages/backend-core/src/context/mainContext.ts:54:"
],
"stability": {
"vulnerable": [
33,
41
],
"fixed": [
35,
44
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 115.0,
"vulnerable_b": 107.9,
"fixed_a": 110.8,
"fixed_b": 118.6,
"benign_base": 100.8,
"benign_tip": 104.3
}
},
{
"id": "unleash-addon-webhook-ssrf",
"family": "untrusted_destination",
"language": "typescript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [
"frontend/src/component/App.tsx:56:",
"frontend/src/component/admin/Admin.tsx:30:"
],
"stability": {
"vulnerable": [
23,
33
],
"fixed": [
15,
30
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 61.2,
"vulnerable_b": 80.1,
"fixed_a": 65.3,
"fixed_b": 67.3,
"benign_base": 70.7,
"benign_tip": 88.1
}
},
{
"id": "medplum-external-auth-open-redirect",
"family": "untrusted_destination",
"language": "typescript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
24,
31
],
"fixed": [
12,
27
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 67.9,
"vulnerable_b": 69.4,
"fixed_a": 55.4,
"fixed_b": 67.3,
"benign_base": 61.7,
"benign_tip": 61.1
}
},
{
"id": "cct-studio-server-cmdi",
"family": "injection",
"language": "javascript",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
37,
48
],
"fixed": [
38,
49
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 127.5,
"vulnerable_b": 126.1,
"fixed_a": 119.9,
"fixed_b": 117.7,
"benign_base": 136.8,
"benign_tip": 131.9
}
},
{
"id": "wp-gopay-log-filter-sqli",
"family": "injection",
"language": "php",
"detected": true,
"detected_sites": [
"admin/views/log.php:13:",
"admin/views/log.php:22:"
],
"unstable": false,
"unstable_sites": [
"admin/views/log.php:14:",
"admin/views/log.php:30:",
"admin/views/log.php:41:"
],
"unanswered": false,
"instrument_errors": {},
"fixed_side_alerts": [
"admin/views/log.php:14:"
],
"benign_alerts": [],
"stability": {
"vulnerable": [
25,
34
],
"fixed": [
15,
24
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 43.5,
"vulnerable_b": 43.5,
"fixed_a": 39.2,
"fixed_b": 43.7,
"benign_base": 41.7,
"benign_tip": 44.7
}
},
{
"id": "wp-user-registration-login-redirect",
"family": "untrusted_destination",
"language": "php",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
18,
35
],
"fixed": [
29,
45
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 56.0,
"vulnerable_b": 70.5,
"fixed_a": 72.4,
"fixed_b": 53.9,
"benign_base": 58.6,
"benign_tip": 65.8
}
},
{
"id": "wp-directorist-avatar-ssrf",
"family": "untrusted_destination",
"language": "php",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {
"vulnerable_a": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"vulnerable_b": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request",
"fixed_a": "no hunt completed: OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request; OpenRouterError: OpenRouter chat request failed: HTTPError: HTTP Error 400: Bad Request"
},
"fixed_side_alerts": [],
"benign_alerts": [
"assets/js/add-listing.min.js:1:",
"assets/js/admin-extension-update.min.js:1:",
"includes/classes/class-add-listing.php:456:",
"includes/classes/class-add-listing.php:954:"
],
"stability": {
"vulnerable": [
0,
0
],
"fixed": [
37,
37
]
},
"completion": {
"vulnerable_a": [
0,
4
],
"vulnerable_b": [
0,
4
],
"fixed_a": [
0,
4
],
"fixed_b": [
1,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
3,
4
]
},
"seconds": {
"vulnerable_a": 126.4,
"vulnerable_b": 96.4,
"fixed_a": 98.3,
"fixed_b": 136.2,
"benign_base": 102.5,
"benign_tip": 112.5
}
},
{
"id": "wp-groundhogg-confirm-redirect",
"family": "untrusted_destination",
"language": "php",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
31,
39
],
"fixed": [
33,
45
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 56.7,
"vulnerable_b": 55.4,
"fixed_a": 55.6,
"fixed_b": 51.1,
"benign_base": 59.7,
"benign_tip": 55.1
}
},
{
"id": "froxlor-admin-ip-second-order-sqli",
"family": "injection",
"language": "php",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
38,
46
],
"fixed": [
25,
36
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 51.2,
"vulnerable_b": 44.9,
"fixed_a": 48.4,
"fixed_b": 43.5,
"benign_base": 23.5,
"benign_tip": 24.9
}
},
{
"id": "sulu-smart-content-sql2-injection",
"family": "injection",
"language": "php",
"detected": false,
"detected_sites": [],
"unstable": false,
"unstable_sites": [],
"unanswered": true,
"instrument_errors": {},
"fixed_side_alerts": [],
"benign_alerts": [],
"stability": {
"vulnerable": [
4,
16
],
"fixed": [
12,
20
]
},
"completion": {
"vulnerable_a": [
4,
4
],
"vulnerable_b": [
4,
4
],
"fixed_a": [
4,
4
],
"fixed_b": [
4,
4
],
"benign_base": [
4,
4
],
"benign_tip": [
4,
4
]
},
"seconds": {
"vulnerable_a": 69.7,
"vulnerable_b": 73.3,
"fixed_a": 73.7,
"fixed_b": 72.9,
"benign_base": 86.1,
"benign_tip": 84.1
}
}
],
"precision_sample": [
{
"case": "budibase-mongo-template-nosqli",
"site": "packages/backend-core/src/configs/configs.ts:158:",
"family": "injection",
"model_family": "url-injection",
"title": "Tenant ID interpolated into platform URL host without validation",
"witness": "getPlatformUrl builds the tenant-aware platform URL via platformUrl.replace(\"://\", `://${tenantId}.`) using context.getTenantId(). The tenant ID is derived from request context (mainContext.getTenantId / getTenantIDFromWorkspaceID splits workspace IDs) and is not validated or encoded before being placed into the URL authority. A tenant ID containing characters such as '/', '@', ':', or '#' could a",
"verdict": "False, not attacker",
"reason": "tenant id from request context not shown attacker-controlled"
},
{
"case": "cct-studio-server-cmdi",
"site": "api/claude-code-monitor/parser.js:14:",
"family": "injection",
"model_family": "regex-injection",
"title": "RegExp constructed from version string (regex injection / ReDoS)",
"witness": "parseVersionChangelog builds `new RegExp(`^##\\\\s+(?:v)?${cleanVersion.replace(/\\./g, '\\\\.')}`, 'm')` from the `version` argument. Only dots are escaped; other regex metacharacters pass through unescaped, so a crafted version string can alter the pattern, cause a SyntaxError, or trigger catastrophic backtracking (ReDoS) against the changelog. The same pattern is duplicated in api/_parser-claude.js ",
"verdict": "False, not attacker",
"reason": "regex built from an internal changelog version"
},
{
"case": "contextforge-prompt-ssti",
"site": "mcp-servers/python/data_analysis_server/src/data_analysis_server/utils/query_parser.py:89:",
"family": "injection",
"model_family": "code-injection",
"title": "Arbitrary expression evaluation via pandas DataFrame.query on user-supplied query string",
"witness": "execute_query passes the raw user query to _parse_and_execute, which for any non-SELECT input calls df.query(query) directly. pandas query uses numexpr/python eval semantics, so attacker-controlled query text is evaluated as an expression rather than treated as data. The same pattern recurs at lines 257 and 477 (df.query(condition) inside _apply_where_clause and the HAVING handler), so WHERE/HAVIN",
"verdict": "True, privileged",
"reason": "sample MCP data server passes the caller's query to DataFrame.query"
},
{
"case": "contextforge-prompt-ssti",
"site": "mcp-servers/python/mcp_eval_server/mcp_eval_server/rest_server.py:829:",
"family": "injection",
"model_family": "prompt-injection",
"title": "agent_benchmark endpoint passes request data to agent tools",
"witness": "The handler forwards caller-supplied request fields into AgentTools without visible validation, allowing untrusted input to flow into downstream evaluation logic.",
"verdict": "False",
"reason": "no sink established ('without visible validation')"
},
{
"case": "pgadmin-maintenance-sqli",
"site": "runtime/src/js/pgadmin.js:243:",
"family": "injection",
"model_family": "",
"title": "Shell-style command string built from pythonPath/pgadminFile",
"witness": "let command = pythonPath + ' -s ' + pgadminFile; concatenates paths into a command string. If this string is ever passed to a shell (e.g. exec/execSync) rather than the argument-array spawn at line 269, the dev_config-controlled paths would allow command injection. Worth verifying all consumers of `command`.",
"verdict": "False",
"reason": "hypothetical: the string is spawned as an argv array"
},
{
"case": "qwed-sympy-eval",
"site": "qwed_sdk/guards/mcp_poison_guard.py:162:",
"family": "injection",
"model_family": "prompt-injection",
"title": "MCP tool schema scanning uses fixed injection regex list",
"witness": "verify_tool_definition scans descriptions/parameters with a hardcoded _DEFAULT_INJECTION_PATTERNS list plus optional custom patterns; novel injection phrasings not matching these regexes pass, and the guard trusts the schema structure it is given.",
"verdict": "False",
"reason": "guard regex list incompleteness is not a vulnerability"
},
{
"case": "reactpress-findall-column-sqli",
"site": "cli/lib/dev.js:79:",
"family": "injection",
"model_family": "command-injection",
"title": "spawn with shell:true for client dev",
"witness": "spawnClient runs spawn('pnpm', ['run', '--dir', './client', 'dev'], { shell: true, cwd: projectRoot }). With shell:true the argv is joined into a shell command line, so shell metacharacters in the resolved cwd/args can break out of the intended command. The sibling spawnApi at line 43 avoids the shell, making this the outlier.",
"verdict": "False, not attacker",
"reason": "dev CLI spawn with fixed args"
},
{
"case": "reactpress-findall-column-sqli",
"site": "cli/lib/publish.js:234:",
"family": "injection",
"model_family": "command-injection",
"title": "execSync with interpolated package name/version",
"witness": "execSync(`npm view ${packageName}@${nextVersion} version`, ...) interpolates packageName and nextVersion into a shell command string. If either value is derived from package.json or user input without validation, shell metacharacters would be executed by the shell.",
"verdict": "False, not attacker",
"reason": "release script interpolates package.json name/version"
},
{
"case": "sulu-smart-content-sql2-injection",
"site": "src/Sulu/Bundle/AdminBundle/Admin/View/TabViewBuilderInterface.php:27:",
"family": "injection",
"model_family": "expression-injection",
"title": "setTabCondition accepts arbitrary string stored as view option",
"witness": "The interface exposes `setTabCondition(string $tabCondition)` (and `addRouterAttributesToBlacklist(array)`) with no validation. Implementations (TabViewChildBuilderTrait.php:21) store the raw string as the `tabCondition` view option, which is later evaluated as a jexl expression on the client \u2014 the entry point through which unvalidated condition strings reach the expression evaluator.",
"verdict": "False",
"reason": "admin view-builder configuration API"
},
{
"case": "sulu-smart-content-sql2-injection",
"site": "src/Sulu/Bundle/AdminBundle/Resources/js/components/Number/Number.js:1:",
"family": "injection",
"model_family": "no-sink",
"title": "Number ranked hotspot: no injection sink found",
"witness": "Inspected the full component. It parses input with parseFloat, guards NaN, and forwards the numeric value plus event to props.onChange, rendering through the shared Input component. No HTML/script sink, no string concatenation into markup, no URL handling. Ranking is not corroborated by an injection primitive.",
"verdict": "False",
"reason": "non-finding filed by the model"
},
{
"case": "unleash-addon-webhook-ssrf",
"site": "frontend/src/component/admin/AdminRedirect.tsx:3:",
"family": "untrusted_destination",
"model_family": "",
"title": "Static Navigate redirect to hardcoded admin path",
"witness": "The component renders <Navigate to='/admin/users' replace />. The destination is a hardcoded literal, not derived from user input, query params, or state, so the 'untrusted_destination' ranking is a false positive here. No open-redirect or attacker-controlled navigation sink exists in this file.",
"verdict": "False",
"reason": "static Navigate target; the model says so"
},
{
"case": "winml-cli-serve-cors",
"site": "scripts/download_rules.py:83:",
"family": "config_secrets",
"model_family": "credential_exposure",
"title": "GitHub token embedded in clone URL (credential exposure)",
"witness": "The gh CLI token is read from `gh auth token` and interpolated directly into a git remote URL (`https://x-access-token:{token}@github.com/...`). This URL is passed to `git clone`, so the live credential can leak into process listings (argv), git error output, shell history, and any logs that echo the command. The token is a full-access credential for the authenticated account, so exposure is high ",
"verdict": "False, not attacker",
"reason": "local dev script, user's own token"
},
{
"case": "wp-gopay-log-filter-sqli",
"site": "admin/views/log.php:13:",
"family": "injection",
"model_family": "sql-injection",
"title": "SQL injection via unsanitized log_table_filter in REGEXP query",
"witness": "$log_table_filter = filter_input( INPUT_GET, 'log_table_filter' ) is taken raw from the request with no sanitize/escape, then interpolated directly into SQL via sprintf() at lines 22 and 41 and passed to $wpdb->get_results() without $wpdb->prepare(). Only strtoupper() is applied, which does not neutralize SQL metacharacters such as quotes, so an attacker can break out of the REGEXP '[\\w\\W]*%s[\\w\\W",
"verdict": "True, privileged",
"reason": "the case's CVE: filter_input GET -> sprintf REGEXP -> $wpdb->get_results"
},
{
"case": "wp-user-registration-login-redirect",
"site": "assets/js/admin/ur-setup.js:711:",
"family": "untrusted_destination",
"model_family": "untrusted_destination",
"title": "Navigation to server-supplied redirectUrl in show_toast_and_reload",
"witness": "show_toast_and_reload(redirectUrl) assigns window.location.href = redirectUrl. The value is passed in from callers (e.g. activate_feature_from_settings builds it from window.location.href, but the function itself accepts an arbitrary string and performs a top-level navigation without validation). This is the untrusted_destination sink the ranker flagged.",
"verdict": "False, not attacker",
"reason": "redirect URL built from window.location.href"
}
],
"precision": [
2,
14
],
"precision_wilson95": [
0.04,
0.399
],
"under_test": "tool_hunter unchanged (default prompt/tools/4 steps), deepseek-flash, runner 6bfb05f",
"cost_usd": 8.8776,
"scope_in_reach": {
"cases_where_the_vulnerable_file_was_among_the_hotspots": 1,
"of": 17,
"detected_when_in_reach": "1/1 (wp-gopay-log-filter-sqli)"
},
"instrument_failures": {
"fuxa-tdengine-escape-sqli": "all six pins: every hunt rejected with DeepSeek HTTP 400 (undiagnosed); 0 regions offered the family",
"wp-directorist-avatar-ssrf": "three pins: every hunt HTTP 400; 0 regions offered the family"
},
"gates": {
"precision>=0.95": "not met",
"recall>=0.90": "not met",
"fixed_alerts==0": "not met (1)",
"benign_alerts==0": "not met (16)"
}
}