mirror of
https://github.com/norandom/OpenUltraSAST.git
synced 2026-10-16 03:49:26 +00:00
The analyzer was not run. freeze.py read each case's source at both pins: - both pins are commits in the repository and in the right order; - the declared sink site's file is present at the vulnerable pin, and its declared functions appear in it; - the fix touches a declared site file (Budibase's sites reordered so the changed file, queries.ts, comes first). Benign controls: - 12 are reviewed automatic proposals. - 3 automatic proposals were rejected as not benign: qwed's merged a ReDoS fix, ReactPress's corrected a SQL column whitelist, and Sulu's was a branch merge that can carry the fix. - Those three, plus cct-studio and Directorist (no automatic proposal), were chosen by hand. Directorist's comes from before the vulnerable pin, because only 3 commits follow its fix. freeze.py now accepts a recorded benign control instead of reporting that none was proposed. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
339 lines
20 KiB
TOML
339 lines
20 KiB
TOML
# Independent evaluation population v2 (milestone M4). Reserved 2026-09-26.
|
|
#
|
|
# RESERVED, NOT SCANNED. Chosen by web research alone (research-2026-09-26.md): advisories taken newest-first per
|
|
# language under fixed criteria, never by how easy a case looks for this analyzer; 261 advisories examined, 224
|
|
# rejected with reasons. No repository was cloned, no scanner or project tooling run on any of them, and none is
|
|
# referenced anywhere in this project's development tree (checked against every github.com URL under benchmarks/,
|
|
# src/, tests/ and .kiro/, which includes the v1 population).
|
|
#
|
|
# Why a v2: v1 (2026-09-24) was evaluated and then used to retune the analyzer (file-owned gaps, Node vm sinks,
|
|
# Django sources, quoted-only SQL escapes, guards, .gitignore semantics). A retune cannot be qualified on the
|
|
# population that informed it.
|
|
#
|
|
# Rules for this file are v1's: no scan, trace, probe or census of these repositories before the population is
|
|
# FROZEN and protocol-v2.md is committed; no rule, fact or query change may cite these cases before their
|
|
# evaluation is recorded.
|
|
#
|
|
# `sites` are the sink or execution locations the ADVISORY names, declared here before any scan. Protocol v2
|
|
# credits a finding at one of them as well as one matching the fix's changed lines.
|
|
#
|
|
# Selected by the maintainer on 2026-09-26 ("balanced" rule-based selection, 17 cases -- the menu called it 16; the
|
|
# list it showed held 17). Licences marked "verify" must be checked before any result is published.
|
|
|
|
schema_version = 1
|
|
status = "frozen"
|
|
frozen_on = "2026-09-26"
|
|
freeze_record = "freeze-v2.json"
|
|
reserved_on = "2026-09-26"
|
|
selected_by = "maintainer"
|
|
research = "research-2026-09-26.md"
|
|
protocol = "protocol-v2.md"
|
|
multi_language_members = ["wp-gopay-log-filter-sqli", "wp-user-registration-login-redirect", "wp-directorist-avatar-ssrf", "wp-groundhogg-confirm-redirect"]
|
|
also_reserved = ["population-v1.toml", "../push/ghost-reserved.toml"]
|
|
|
|
[[case]]
|
|
id = "pgadmin-maintenance-sqli"
|
|
repo = "https://github.com/pgadmin-org/pgadmin4"
|
|
language = "python"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-7815", "GHSA-hp84-p2gq-6fvr"]
|
|
vulnerable = "d112dc3b962218efc3613fa727d54f0fc5b1d527"
|
|
fixed = "cf53953d9ad66c182a08e662c1ba29c5831b486b"
|
|
ancestry = "parent"
|
|
sink = "web/pgadmin/tools/maintenance/templates/maintenance/sql/command.sql (string concatenation of vacuum_index_cleanup, vacuum_parallel, buffer_usage_limit, reindex_tablespace) rendered in web/pgadmin/tools/maintenance/__init__.py :: create_maintenance_job() → render_template(...) → BatchProcess(cmd=psql, args=[..., '--command', query])"
|
|
source = "JSON body of POST /maintenance/job/<sid>/<did>"
|
|
sites = ["web/pgadmin/tools/maintenance/__init__.py::create_maintenance_job"]
|
|
privilege = "authenticated (tools_maintenance permission)"
|
|
license = "PostgreSQL License (OSI; GitHub: NOASSERTION) [verify before publishing]"
|
|
confidence = "high"
|
|
benign = { base = "e7eaef0dc002c254e4dd15705df800c448e8eb4c", tip = "a50a553b0a7e529e5d87f52bdc6d3a5ee3e8b9e8", subject = "chore: feature tests use sys.executable; sync yarn.lock to package.json", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "qwed-sympy-eval"
|
|
repo = "https://github.com/QWED-AI/qwed-verification"
|
|
language = "python"
|
|
also = []
|
|
family = "injection"
|
|
advisory = ["CVE-2026-55585", "GHSA-q27q-98j4-9pfv"]
|
|
vulnerable = "06801f68cbf9c9b5e54cc17f2a61cb2792da7a26"
|
|
fixed = "6066b68c0c4f4cc2c3771824822aaa864d082ef8"
|
|
ancestry = "first parent (fixed is the merge of PR #200; the PR commit `dc9d4db72ca4b4ae3f96d0e6a0c27a9e38a06f61` is a direct child of the vulnerable SHA)"
|
|
sink = "src/qwed_new/api/main.py :: verify_math() → sympy.parsing.sympy_parser.parse_expr(expression_normalized) (also left_str/right_str); second path src/qwed_new/core/batch.py :: _verify_item() → parse_expr(item.query)"
|
|
source = "POST /verify/math JSON expression; POST /verify/batch item query"
|
|
sites = ["src/qwed_new/api/main.py::verify_math", "src/qwed_new/core/batch.py::_verify_item"]
|
|
privilege = "authenticated tenant (API key; self-signup /auth/signup is on by default)"
|
|
license = "Apache-2.0"
|
|
confidence = "high"
|
|
benign = { base = "5214f2c558641f4d02d3d75abf039f164e393131", tip = "637a880a8333875543090894fc13bf092783d90e", subject = "feat: emit VC v1.0 outputs from Docker action entrypoint (#313)", how = "chosen by hand after review" }
|
|
|
|
[[case]]
|
|
id = "contextforge-prompt-ssti"
|
|
repo = "https://github.com/IBM/mcp-context-forge"
|
|
language = "python"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["GHSA-vwf3-4xxj-qg6h"]
|
|
vulnerable = "0f8e0ad679f1fff685f486e17f642ac863c8ca9e"
|
|
fixed = "4d31004661858a2e99055b3c0c9f14218b8f7120"
|
|
ancestry = "parent"
|
|
sink = "mcpgateway/services/prompt_service.py :: PromptService._render_template() → _compile_jinja_template() → _get_jinja_env().from_string(template).render() (plain jinja2.Environment)"
|
|
source = "prompt template stored through register_prompt (prompts create/update API), rendered on prompt get"
|
|
sites = ["mcpgateway/services/prompt_service.py::_render_template", "mcpgateway/services/prompt_service.py::_compile_jinja_template"]
|
|
privilege = "authenticated (permission to create or update prompts)"
|
|
license = "Apache-2.0"
|
|
confidence = "high"
|
|
benign = { base = "1f8fd58980f4565d4788ffc3587d6e3bd16b3342", tip = "9938c58f7819c526932c4ae4ad646a9c028cb19e", subject = "fix: add rust coverage reports (#4458)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "lmdeploy-media-url-ssrf"
|
|
repo = "https://github.com/InternLM/lmdeploy"
|
|
language = "python"
|
|
also = []
|
|
family = "untrusted_destination"
|
|
advisory = ["GHSA-39wr-7q6h-cf68"]
|
|
vulnerable = "71648d239c978452720a6d6692fe914efc8a7b94"
|
|
fixed = "03c313006d17cc3feae86b633c44206a997c44db"
|
|
ancestry = "parent"
|
|
sink = "lmdeploy/vl/media/connection.py :: _load_http_url() → requests.Session().get(url_spec.geturl(), allow_redirects=True), gated by _is_safe_url() (the urlparse host differs from the requests host)"
|
|
source = "image_url/video/audio URLs in POST /v1/chat/completions → serve/processors/multimodal.py :: MultimodalProcessor._parse_multimodal_item() → load_from_url()"
|
|
sites = ["lmdeploy/vl/media/connection.py::_load_http_url"]
|
|
privilege = "unauthenticated by default (api_keys is optional, default None)"
|
|
license = "Apache-2.0"
|
|
confidence = "medium"
|
|
benign = { base = "b6a29db4d2d218838048975977f125dc9b1ac75d", tip = "3d9d23087b59fa44afe83deb03ee7cce04df3b4d", subject = "fix(benchmark): seed NumPy RNG so --seed controls random-mode lengths (#4785)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "winml-cli-serve-cors"
|
|
repo = "https://github.com/microsoft/winml-cli"
|
|
language = "python"
|
|
also = []
|
|
family = "config_secrets"
|
|
advisory = ["CVE-2026-84452", "GHSA-96p9-rh4f-92cf"]
|
|
vulnerable = "02179d185f0e3ac23518236b5ca1f61fd37ef680"
|
|
fixed = "f4073e0ef4700a25b623487e7e45c421ca0b9993"
|
|
ancestry = "parent"
|
|
sink = "src/winml/modelkit/serve/cli_api.py :: module level app.add_middleware(CORSMiddleware, allow_origins=[\"*\"], ...) (same in serve/app.py :: create_app())"
|
|
source = "any web page in the victim's browser calling POST /v1/cli/{command} on 127.0.0.1"
|
|
sites = ["src/winml/modelkit/serve/cli_api.py::<global>", "src/winml/modelkit/serve/app.py::create_app"]
|
|
privilege = "unauthenticated (cross-origin from any website)"
|
|
license = "MIT"
|
|
confidence = "high"
|
|
benign = { base = "8d631f6f1e5db26a04e8c13045280408c6f984dc", tip = "be3e59dd412d4918c5a852aa4d8f0207c34aaf6f", subject = "Remove preload ORT DLL (undo PR 689) (#1380)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "reactpress-findall-column-sqli"
|
|
repo = "https://github.com/fecommunity/reactpress"
|
|
language = "typescript"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-61685", "GHSA-wmw4-mw6x-6vfm"]
|
|
vulnerable = "c3dd10681b3d2b5e224f7ac647b3769557603975"
|
|
fixed = "78ecb70af1c021455c05fdcbe137212c70e310d6"
|
|
ancestry = "parent"
|
|
sink = "server/src/modules/article/article.service.ts :: ArticleService.findAll() (query-string key interpolated as article.${key} into andWhere); same pattern in comment/file/page/knowledge services"
|
|
source = "@Query() queryParams in ArticleController.findAll() (GET /api/article)"
|
|
sites = ["server/src/modules/article/article.service.ts::findAll"]
|
|
privilege = "unauthenticated"
|
|
license = "MIT"
|
|
confidence = "high"
|
|
benign = { base = "295f5de807ed1ebec7b6b155cce16b24a743f247", tip = "903d4b2e2de1c259843f3a8c67701fa7d50d2205", subject = "docs: update documentation links to new site URL", how = "chosen by hand after review" }
|
|
|
|
[[case]]
|
|
id = "fuxa-tdengine-escape-sqli"
|
|
repo = "https://github.com/frangoteam/FUXA"
|
|
language = "javascript"
|
|
also = ["typescript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-47720", "GHSA-h9fj-c2qr-76g2"]
|
|
vulnerable = "193a888f8e3f805325072829b1644a2c768c948b"
|
|
fixed = "b78f6159d02a56ce5ff48207feb936afb3534fc8"
|
|
ancestry = "parent"
|
|
sink = "server/runtime/storage/tdengine/index.js :: TDengine.getDaqValue() (escapeTdString(tagid) doubles quotes but not backslashes, then SQL string for cursor.query)"
|
|
source = "sids of GET /api/daq (server/api/daq/index.js) or Socket.IO DAQ_QUERY"
|
|
sites = ["server/runtime/storage/tdengine/index.js::getDaqValue"]
|
|
privilege = "unauthenticated (guest level; socket handler has no auth check)"
|
|
license = "MIT"
|
|
confidence = "medium"
|
|
benign = { base = "e787e4140b5e71c5b02e23c295fa08b8df0edc53", tip = "bf998eeee3158e338724c71979b7cdafcfa74b32", subject = "Button control with configurable icon (#2349)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "budibase-mongo-template-nosqli"
|
|
repo = "https://github.com/Budibase/budibase"
|
|
language = "typescript"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["GHSA-pmpg-2mxq-6xwr", "GHSA-qw6m-8fw2-2v64"]
|
|
vulnerable = "b7e63df737eede85d951aa9665b0c0778ece7ccb"
|
|
fixed = "dd8c0654b35cd89ce3645f2355f4bf2ff9a5dd80"
|
|
ancestry = "parent"
|
|
sink = "packages/server/src/sdk/workspace/queries/queries.ts :: enrichContext() (handlebars processStringSync(..., {noEscaping: true}) into the json template, then JSON.parse) → packages/server/src/integrations/mongodb.ts :: MongoIntegration.read() (collection.find(json))"
|
|
source = "query parameters / bindings (e.g. currentUser.email, request parameters) of POST /api/v2/queries/:queryId (packages/server/src/api/controllers/query/index.ts :: executeV2)"
|
|
sites = ["packages/server/src/sdk/workspace/queries/queries.ts::enrichContext", "packages/server/src/integrations/mongodb.ts::read"]
|
|
privilege = "authenticated app user (BASIC role)"
|
|
license = "GPL-3.0 (root LICENSE says \"GPLv3 overall\"; server package.json GPL-3.0; GitHub NOASSERTION)"
|
|
confidence = "medium"
|
|
benign = { base = "a4423fc5bf237e6101c2e8348ef5372fff6484cd", tip = "272c6a61a2a386688792f9e26c2665f2f431a5c2", subject = "Merge pull request #18865 from Budibase/feature/18784-ai-credit", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "unleash-addon-webhook-ssrf"
|
|
repo = "https://github.com/Unleash/unleash"
|
|
language = "typescript"
|
|
also = ["javascript"]
|
|
family = "untrusted_destination"
|
|
advisory = ["CVE-2026-63004", "GHSA-5vf6-jrqr-78fj"]
|
|
vulnerable = "b9f3217d327f24094b4352130baa30387f85cffe"
|
|
fixed = "2100db76af3473f13e6fb40096cf17a9c2b741a1"
|
|
ancestry = "parent"
|
|
sink = "src/lib/addons/addon.ts :: Addon.fetchRetry() (ky(url, ...)), called from webhook.ts / slack / teams / datadog / new-relic addons"
|
|
source = "addon parameters.url saved through the admin addons API (CREATE_ADDON/UPDATE_ADDON), fired on feature events"
|
|
sites = ["src/lib/addons/addon.ts::fetchRetry"]
|
|
privilege = "authenticated (CREATE_ADDON/UPDATE_ADDON root permission)"
|
|
license = "AGPL-3.0"
|
|
confidence = "high"
|
|
benign = { base = "d4efb3a31616483c438606edbecce13b868fc587", tip = "cb4e6250743fac364bae50b985b2b8348def7a2b", subject = "Merge commit '232b5d575c7d455ce7ac767183e61fd389dd8aac' into automation/sync-oss-upstream", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "medplum-external-auth-open-redirect"
|
|
repo = "https://github.com/medplum/medplum"
|
|
language = "typescript"
|
|
also = ["javascript"]
|
|
family = "untrusted_destination"
|
|
advisory = ["CVE-2026-53728", "GHSA-m44r-7c5h-m6mj"]
|
|
vulnerable = "5d4a8654b02aa67c444f96ae1eb5663c09854006"
|
|
fixed = "7ae10035ddadde4dba7b18d3156553940465b3a1"
|
|
ancestry = "parent"
|
|
sink = "packages/server/src/auth/external.ts :: externalCallbackHandler() (res.redirect(redirectUrl) with URI accepted by getClientRedirectUri(client, body.redirectUri, true) prefix match in packages/server/src/oauth/clients.ts)"
|
|
source = "redirectUri inside JSON state query parameter of GET /auth/external"
|
|
sites = ["packages/server/src/auth/external.ts::externalCallbackHandler"]
|
|
privilege = "unauthenticated (victim completes external IdP login)"
|
|
license = "Apache-2.0"
|
|
confidence = "high"
|
|
benign = { base = "0dd335e8520b859563626d9bf50d602a5f3ad79a", tip = "20790b17d76f335e60dd703f65d4eb13bbb4754d", subject = "tweak(cdk): make `minHealthyPercent` 100 (#8836)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "cct-studio-server-cmdi"
|
|
repo = "https://github.com/davila7/claude-code-templates"
|
|
language = "javascript"
|
|
also = ["typescript", "python"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-73222", "GHSA-79wm-x847-7cvg"]
|
|
vulnerable = "acdb5893412a81eaec9862ee24a4613bf296ab45"
|
|
fixed = "bc4618b07232633c1c0aac12a43e436268d31783"
|
|
ancestry = "parent"
|
|
sink = "cli-tool/src/sandbox-server.js :: executeLocalTask() (spawn('claude', [finalPrompt], {shell: true})), route handler POST /api/install-agent and checkAndInstallAgent() (spawn('npx', [..., agentName, ...], {shell: true}))"
|
|
source = "req.body.prompt, req.body.agentName, req.body.agent"
|
|
sites = ["cli-tool/src/sandbox-server.js::executeLocalTask", "cli-tool/src/sandbox-server.js::checkAndInstallAgent"]
|
|
privilege = "unauthenticated (server on 0.0.0.0, wildcard CORS)"
|
|
license = "MIT"
|
|
confidence = "high"
|
|
benign = { base = "c2ed4066bc7ea66806e90d6c0b97988495ff44b2", tip = "025520a8bfc8ed05e9a197bf53fa2f871f666dea", subject = "feat(dashboard): hide Loops from navigation menu (#738)", how = "chosen by hand after review" }
|
|
|
|
[[case]]
|
|
id = "wp-gopay-log-filter-sqli"
|
|
repo = "https://github.com/gopaycommunity/gopay-woocommerce-integration"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-75959", "GHSA-88c4-2f34-57h5"]
|
|
vulnerable = "626bc8b5f8d33de6eefd921e3a05ed52ac320bcd"
|
|
fixed = "7190c985370f9758f226c2f2addd79532a2f93d5"
|
|
ancestry = "parent"
|
|
sink = "admin/views/log.php :: file scope (included by admin/class-gopay-gateway-admin.php), two $wpdb->get_results(sprintf(\"... REGEXP '[\\w\\W]*%s[\\w\\W]*' ...\", ..., strtoupper($log_table_filter)))"
|
|
source = "filter_input(INPUT_GET, 'log_table_filter')"
|
|
sites = ["admin/views/log.php::<global>"]
|
|
privilege = "admin (shop manager, manage_woocommerce)"
|
|
license = "GitHub: none; plugin header GPLv2 or later [verify before publishing]"
|
|
confidence = "high"
|
|
benign = { base = "2b5fe58d6dadbfecb01ed34611aed8502d11e612", tip = "88b10bda704a37e88121e22dc22f4e5019097272", subject = "GPY025-136: fix i18n and remove translation calls on non-literal text", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "wp-user-registration-login-redirect"
|
|
repo = "https://github.com/themegrill/user-registration"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "untrusted_destination"
|
|
advisory = ["CVE-2026-80072", "GHSA-w78c-fx7q-9x8m"]
|
|
vulnerable = "e52cf151cb229852e6209fb3a627aa51485139c1"
|
|
fixed = "75c940dab15fd54d5a3fbb9f2213767b89467b08"
|
|
ancestry = "parent"
|
|
sink = "includes/functions-ur-core.php :: ur_process_login() (wp_redirect(wp_validate_redirect($redirect, $redirect)), and wp_send_json_success(['message'=>$redirect]) on the AJAX path)"
|
|
source = "$post['redirect'] (login form POST) or wp_get_raw_referer()"
|
|
sites = ["includes/functions-ur-core.php::ur_process_login"]
|
|
privilege = "unauthenticated attacker, victim logs in"
|
|
license = "GitHub: NOASSERTION; repo has license.txt, plugin header GPLv3 [verify before publishing]"
|
|
confidence = "high"
|
|
benign = { base = "064dd7ab1585082b9b5cf078f2d22c0234f25e48", tip = "3b6acc4695e93d9d48969ed894c21419bd09b33a", subject = "Fix - Deactivate Licence button did nothing when the pro-activation transient was set (#1418)", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "wp-directorist-avatar-ssrf"
|
|
repo = "https://github.com/sovware/directorist"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "untrusted_destination"
|
|
advisory = ["CVE-2026-84046", "GHSA-6q63-3w56-m722"]
|
|
vulnerable = "77cfc9bc8b453f97ab7e720330706fa4ef056867"
|
|
fixed = "1a67825d5cf6e7c768c3a692da1d18bae732bea9"
|
|
ancestry = "parent"
|
|
sink = "includes/rest-api/functions.php :: directorist_rest_upload_image_from_url() (download_url($image_url))"
|
|
source = "$request['avater']['src'] in includes/rest-api/Version1/class-users-controller.php :: update_user_meta_fields() (REST user update)"
|
|
sites = ["includes/rest-api/functions.php::directorist_rest_upload_image_from_url"]
|
|
privilege = "authenticated (subscriber)"
|
|
license = "GitHub: NOASSERTION; plugin header GPLv3 [verify before publishing]"
|
|
confidence = "medium"
|
|
benign = { base = "61ddcdf84f18cbe7749036a912d2931cef8cbd5a", tip = "986becd484f8f2d9b60604737d4fb4bf08fa6d1b", subject = "Replaced Location with Address on the All Listings map view (#2280)", how = "chosen by hand after review" }
|
|
|
|
[[case]]
|
|
id = "wp-groundhogg-confirm-redirect"
|
|
repo = "https://github.com/groundhoggwp/groundhogg"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "untrusted_destination"
|
|
advisory = ["CVE-2026-81741", "GHSA-m96f-c5vh-h7cm"]
|
|
vulnerable = "9472a1dd79d4556c40eece501a61930793f170d3"
|
|
fixed = "028247d4b8ec9ba051d3eb48f1466a759bc16bfd"
|
|
ancestry = "parent (follow-up is the direct child of the fix)"
|
|
sink = "templates/preferences.php :: file scope, case 'confirm': (wp_redirect($redirect_to))"
|
|
source = "get_url_var('redirect_to') (query string, only through esc_url_raw(sanitize_text_field(...)))"
|
|
sites = ["templates/preferences.php::<global>"]
|
|
privilege = "unauthenticated (crafted preferences link)"
|
|
license = "GitHub: none, no LICENSE file; plugin header GPLv3 [verify before publishing]"
|
|
confidence = "high"
|
|
benign = { base = "61c8a03f11b6030c630be6ae0b0c2ad641eb733a", tip = "e3a69f1c2814c6bebed940505894008748566b93", subject = "output a square image regardless of image dimensions", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "froxlor-admin-ip-second-order-sqli"
|
|
repo = "https://github.com/froxlor/froxlor"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-54348", "GHSA-w27m-rmmf-g5w4"]
|
|
vulnerable = "9bf03de643a2edee4642bfc6c94db1f05253da02"
|
|
fixed = "a1eaca5a1601c8a30e00814a4fc73ad0c185f89e"
|
|
ancestry = "parent (ancestor of tag 2.3.8)"
|
|
sink = "lib/Froxlor/Api/Commands/IpsAndPorts.php :: IpsAndPorts::listing() / listingCount() (implode(\", \", json_decode($this->getUserDetail('ip'), true)) into WHERE id IN (...)); also lib/Froxlor/Api/Commands/Domains.php :: validateIpAddresses()"
|
|
source = "ipaddress API parameter of Admins.add / Admins.update (lib/Froxlor/Api/Commands/Admins.php), stored as JSON in panel_admins.ip, read back via getUserDetail('ip')"
|
|
sites = ["lib/Froxlor/Api/Commands/IpsAndPorts.php::listing", "lib/Froxlor/Api/Commands/IpsAndPorts.php::listingCount", "lib/Froxlor/Api/Commands/Domains.php::validateIpAddresses"]
|
|
privilege = "admin (API key with change_serversettings)"
|
|
license = "LGPL-2.1 (per GitHub)"
|
|
confidence = "high"
|
|
benign = { base = "b595f061fbb68874423809fec9f2a42bf6b34175", tip = "9d274828bdc4eefec0058a5a3a25bf4eb69d0f70", subject = "avoid warnings regarding php8.5 in config/database.php; adjust phpunit for froxlor/framework testing", how = "automatic proposal, reviewed" }
|
|
|
|
[[case]]
|
|
id = "sulu-smart-content-sql2-injection"
|
|
repo = "https://github.com/sulu/sulu"
|
|
language = "php"
|
|
also = ["javascript"]
|
|
family = "injection"
|
|
advisory = ["CVE-2026-92692", "GHSA-jg26-q8hg-3pq4"]
|
|
vulnerable = "d061094f5b7bb1d5e974544fce30bede9c7adf8e"
|
|
fixed = "d19c01487af8c3de2fb3aa145856707a6367392c"
|
|
ancestry = "parent (2.6 branch; ancestor of tag 2.6.25)"
|
|
sink = "src/Sulu/Component/Content/SmartContent/QueryBuilder.php :: QueryBuilder::buildCategoriesWhere() (also buildTagsWhere(), buildAudienceTargeting()), string-concatenated into the SQL2 WHERE clause built by buildWhere()"
|
|
source = "?categories= query parameter, read in src/Sulu/Component/Category/Request/CategoryRequestHandler.php :: getCategories() (explode + trim only), passed by src/Sulu/Component/SmartContent/ContentType.php as websiteCategories"
|
|
sites = ["src/Sulu/Component/Content/SmartContent/QueryBuilder.php::buildCategoriesWhere", "src/Sulu/Component/Content/SmartContent/QueryBuilder.php::buildWhere"]
|
|
privilege = "unauthenticated (any public page with a category-filtered Smart Content block)"
|
|
license = "MIT"
|
|
confidence = "high"
|
|
benign = { base = "777f4eb47d45dab420c82b43ae6f513638294de0", tip = "6621a429c5284bd05ee1b60f333aff83297fecde", subject = "Removing unused service argument (#7169)", how = "chosen by hand after review" }
|