{ "schema_version": 1, "status": "candidates (not reserved, not frozen)", "research": "research-2026-09-30-php.md", "researched_on": "2026-09-30", "note": "Web research only: GitHub advisory records and commit/compare metadata via gh api. No candidate repository was cloned, scanned or run through any project tool. `sites` come from the advisory text; where only a file (or only a class) is named, `site_files` and `sink_evidence` carry what the advisory states and the function must be resolved at freeze. `benign.proposal` is an API-side proposal made with freeze.py's filter; freeze.py and a reviewer decide.", "recommended_selection": [ "gitlist-commandline-cmdi", "qloapps-customermessage-bo-query-sqli", "roundcube-markasjunk-cmd-learn-rce", "winter-filter-numberrange-sqli", "maccms10-template-blacklist-rce", "sharp-editor-iframe-srcdoc-xss", "privatebin-jsonld-request-uri-injection", "openstamanager-group-name-html-injection", "wp-geo-my-wp-info-window-lfi", "kirby-realpath-sibling-traversal", "mineadmin-appstore-identifier-traversal", "elfinder-fsock-dns-rebinding-ssrf", "easyappointments-caldav-ssrf", "wp-graphql-updatepost-publish-bypass", "sylius-mollie-thankyou-order-idor", "wp-podlove-generation-guard-poi" ], "cases": [ { "id": "grav-blueprint-bare-function-rce", "repo": "https://github.com/getgrav/grav", "language": "php", "also": [], "wordpress": false, "family": "injection", "subtype": "code injection (callable allow-list bypass → arbitrary PHP function)", "advisory": [ "CVE-2026-75827", "GHSA-f8wv-xp27-6gq7" ], "published": "2026-09-17", "lane": "A (reviewed, composer)", "vulnerable_versions": "<= 2.0.14", "fixed_version": "2.0.15", "vulnerable": "24e8717ae317d50941472479f748b974f4034c51", "fixed": "af31066e9b6a5e6b5e675cc3368f4a741fe3ea21", "ancestry": "parent; ancestor of tag 2.0.15", "fix_named_by_advisory": false, "fix_note": "The advisory links no commit. Found in the release compare 2.0.14...2.0.15 (14 commits, each security fix labelled): `af31066e` '[security] Gate the blueprint bare-function data directive on a positive allowlist', 1 file (Blueprint.php +11-1). A later commit in the same release, `c51987f5` 'Trust blueprint dynamic-data providers by provenance, not by allowlist', reworks the same gate.", "fix_changed_files": [ "system/src/Grav/Common/Data/Blueprint.php" ], "sink": "system/src/Grav/Common/Data/Blueprint.php:455-458 `call_user_func_array($o, $params)` (bare-function dynamic-data provider), gated by `Blueprint::isSafeDynamicCall()` (Blueprint.php:514-536), whose bare-function branch uses only the denylist `Utils::isDangerousFunction()`; twin sink system/src/Grav/Framework/Flex/FlexDirectory.php:936-938 `call_user_func_array($function, $params)`", "source": "a blueprint `data-*@` directive naming a bare PHP function (e.g. `error_log`) with attacker parameters, resolved by `Blueprint::init()`", "sites": [ "system/src/Grav/Common/Data/Blueprint.php::isSafeDynamicCall", "system/src/Grav/Common/Data/Blueprint.php::init" ], "site_files": [ "system/src/Grav/Framework/Flex/FlexDirectory.php" ], "sink_evidence": "call_user_func_array($o, $params)", "site_derivation": "file paths and function names quoted by the advisory", "privilege": "authenticated account that can edit pages/blueprint data (per the advisory's root-cause section; verify)", "license": "MIT", "repo_size_mb": 34, "default_branch": "develop", "languages_pct": { "PHP": 100 }, "confidence": "high", "caveats": [ "guard bypass: the vulnerable pin already has a denylist check", "the enclosing function of the call_user_func_array line is not named by this advisory (sink_evidence is used instead)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "4f1340631b9d28d119986f43f65887c92a21959b", "tip": "8661b3b5644821235c7f669a073db6bfa551f4d0", "subject": "Deduplicate repeated debugger deprecation traces", "files": [ "CHANGELOG.md", "system/src/Grav/Common/Debugger.php", "tests/unit/Grav/Common/DebuggerDeprecationsTest.php" ], "lines": 172, "branch": "develop", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": false }, { "id": "backpack-stats-host-header-cmdi", "repo": "https://github.com/Laravel-Backpack/CRUD", "language": "php", "also": [], "wordpress": false, "family": "injection", "subtype": "OS command injection", "advisory": [ "CVE-2026-54182", "GHSA-mrc5-3mm3-45c5" ], "published": "2026-08-20", "lane": "A", "vulnerable_versions": "7.x < 7.0.36 (also 4.1.x < 4.1.72, 5.x < 5.6.2, 6.x < 6.8.13)", "fixed_version": "7.0.36", "vulnerable": "baae0420b6ebefaf5fe4cd88c1fc358feb9c2816", "fixed": "282ba2a0b88749fb1888b3836678ba462d7023f0", "ancestry": "parent; the fixed commit is tag 7.0.36", "fix_named_by_advisory": false, "fix_note": "The advisory links only release tags. The compare 7.0.35...7.0.36 contains exactly one commit, `282ba2a0` 'refactor stats to use guzzle only' (src/Stats.php +6-31), matching the advisory's 'makeCurlRequest was replaced with the Guzzle-based path'.", "fix_changed_files": [ "src/Stats.php" ], "sink": "`Backpack\\CRUD\\Stats::makeCurlRequest` builds a shell command and passes it to `exec()`", "source": "HTTP `Host` header, on every production request through `BackpackServiceProvider::boot()` (1-in-100 random gate)", "sites": [ "src/Stats.php::makeCurlRequest" ], "site_files": [ "src/BackpackServiceProvider.php" ], "sink_evidence": "", "site_derivation": "class and method named by the advisory; the path src/Stats.php follows from the PSR-4 class name and is confirmed only by the fix commit's file list", "privilege": "unauthenticated", "license": "MIT", "repo_size_mb": 76, "default_branch": "main", "languages_pct": { "PHP": 80, "Blade": 17 }, "confidence": "high", "caveats": [ "needs exec() and curl available, and a Host header that the web server passes through (the advisory rates AC:H)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "dd25c2086b8ea2cb765993b65876c66ab824eef0", "tip": "608652b1020ba274781f222d2959d7780a559a08", "subject": "fix color display (#5992)", "files": [ "src/resources/views/crud/columns/color.blade.php" ], "lines": 8, "branch": "main", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": false }, { "id": "winter-filter-numberrange-sqli", "repo": "https://github.com/wintercms/winter", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "injection", "subtype": "SQL injection", "advisory": [ "CVE-2026-32593", "GHSA-m7jc-g4rc-jmvh" ], "published": "2026-08-12", "lane": "A", "vulnerable_versions": "<= 1.2.12", "fixed_version": "1.2.13", "vulnerable": "555e67c84b503b60aa0a5775382087c5da97b7ca", "fixed": "50713de95adf5298536d93f4d999652525d36d43", "ancestry": "parent; ancestor of tag v1.2.13, not of v1.2.12", "fix_named_by_advisory": true, "fix_note": "Advisory workaround names commit `50713de9` 'Use parameter binding for filter scope values in conditions statements' (modules/backend/widgets/Filter.php +64-24, plus a test).", "fix_changed_files": [ "modules/backend/tests/widgets/FilterWidgetTest.php", "modules/backend/widgets/Filter.php" ], "sink": "`Backend\\Widgets\\Filter` builds SQL for a `numberrange` scope configured with a `conditions` key", "source": "the filter widget's AJAX handler (`numbersFromAjax`, per the advisory title)", "sites": [ "modules/backend/widgets/Filter.php::numbersFromAjax" ], "site_files": [], "sink_evidence": "", "site_derivation": "class `Backend\\Widgets\\Filter` and `numbersFromAjax` named by the advisory; path confirmed by the fix commit", "privilege": "authenticated backend user with access to an affected list view", "license": "MIT", "repo_size_mb": 68, "default_branch": "develop", "languages_pct": { "PHP": 70, "JavaScript": 19, "Less": 8 }, "confidence": "medium", "caveats": [ "no built-in view uses the vulnerable scope/config combination: exploitable only with a plugin that registers a numberrange scope with `conditions` (the sink is in core, the configuration is not)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "555e67c84b503b60aa0a5775382087c5da97b7ca", "tip": "2a342f94ae7cc9d20852337aa980f075106420d6", "subject": "Improved Ukrainian translation (#1467)", "files": [ "modules/backend/lang/uk/lang.php" ], "lines": 46, "branch": "develop", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "mantisbt-tokenizer-eval-rce", "repo": "https://github.com/mantisbt/mantisbt", "language": "php", "also": [], "wordpress": false, "family": "injection", "subtype": "code injection (eval)", "advisory": [ "CVE-2026-49273", "GHSA-v84x-qvhg-f36r" ], "published": "2026-07-15", "lane": "A", "vulnerable_versions": ">= 1.3.0, <= 2.28.3", "fixed_version": "2.28.4", "vulnerable": "e7041ecc80c8d35f76a7ea1027a8a231244f7dc5", "fixed": "78c0af63d1fe0118004744cab21ca3bf2cea0f5c", "ancestry": "parent; ancestor of tag release-2.28.4", "fix_named_by_advisory": true, "fix_note": "Advisory patch link `78c0af63` 'Remove use of eval() in Tokenizer class' (core/classes/Tokenizer.class.php +2-6).", "fix_changed_files": [ "core/classes/Tokenizer.class.php" ], "sink": "`Tokenizer` (reached through `ConfigParser`) calls `eval()` with a `return;` prefix; PHP hoists class declarations past the return", "source": "non-string configuration value submitted to adm_config_set.php (Manage Configuration)", "sites": [], "site_files": [ "core/classes/Tokenizer.class.php", "adm_config_set.php" ], "sink_evidence": "eval(", "site_derivation": "the advisory names adm_config_set.php, ConfigParser, Tokenizer and eval(); the Tokenizer file path and the enclosing function are not named (path from the fix commit)", "privilege": "administrator", "license": "GitHub: none [verify]", "repo_size_mb": 89, "default_branch": "master", "languages_pct": { "PHP": 82, "CSS": 10 }, "confidence": "high", "caveats": [ "function-level site must be resolved at freeze by reading the file (the advisory names only the class)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "f734bff6ea55d50d62db4ce518aae1536ab3da72", "tip": "c867fcc0c1198298bf90b3e29bc63410aaefc9e0", "subject": "Web UI: use project category commands", "files": [ "manage_proj_cat_add.php", "manage_proj_cat_copy.php", "manage_proj_cat_delete.php", "manage_proj_cat_update.php" ], "lines": 58, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": false }, { "id": "gitlist-commandline-cmdi", "repo": "https://github.com/klaussilveira/gitlist", "language": "php", "also": [], "wordpress": false, "family": "injection", "subtype": "OS command / argument injection", "advisory": [ "CVE-2026-82668", "GHSA-v64j-pgc3-qgc9" ], "published": "2026-08-31", "lane": "B (unreviewed, GitHub fix reference)", "vulnerable_versions": "2.0.0", "fixed_version": "3.0.0-beta", "vulnerable": "f67609d52c1812fa8a7ed80eae5e795cfd72115f", "fixed": "88cf2866083d5f7c20d9d565c45f828a7ad1516b", "ancestry": "parent; ancestor of tag 3.0.0-beta", "fix_named_by_advisory": true, "fix_note": "Advisory names patch `88cf2866` 'Prevent textconv. Fixes #947.' (src/SCM/System/Git/CommandLine.php +2-2, plus a test).", "fix_changed_files": [ "src/SCM/System/Git/CommandLine.php", "tests/unit/SCM/System/Git/CommandLineTest.php" ], "sink": "`getDefaultBranch` of src/SCM/System/Git/CommandLine.php (git command line)", "source": "repository content/arguments reaching the git command line (not stated precisely)", "sites": [ "src/SCM/System/Git/CommandLine.php::getDefaultBranch" ], "site_files": [], "sink_evidence": "", "site_derivation": "file and function quoted by the advisory (VulDB-generated text)", "privilege": "not stated ('remotely')", "license": "BSD-3-Clause", "repo_size_mb": 6, "default_branch": "master", "languages_pct": { "PHP": 87, "Twig": 9 }, "confidence": "medium", "caveats": [ "VulDB auto-generated description; the fix message ('Prevent textconv') suggests git config/attribute abuse rather than shell metacharacters, and the patched lines may not be in getDefaultBranch -- verify at freeze" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": null, "idea": "no API proposal passed the freeze.py filter within 60 commits after the fix; let freeze.py propose one from the clone, or pick by hand (a small non-security PHP change on the default branch that does not touch the sink file)" }, "recommended": true }, { "id": "qloapps-customermessage-bo-query-sqli", "repo": "https://github.com/Qloapps/QloApps", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "injection", "subtype": "SQL injection", "advisory": [ "CVE-2026-75497", "GHSA-5w6r-2mxc-fq3v" ], "published": "2026-08-25", "lane": "B", "vulnerable_versions": "not stated ('Fixed in 123c97c')", "fixed_version": "commit 123c97c", "vulnerable": "5b4d65cbb8570a4ba46364ee0f2ded79d294ab84", "fixed": "123c97c110b7053ea3297d8e58fe95b3c3536560", "ancestry": "parent", "fix_named_by_advisory": true, "fix_note": "Advisory names `123c97c1` 'Fixed: validate request parameters before database query' (PR #1783): classes/CustomerMessage.php +1-1, classes/Address.php +8-8 (twin advisory GHSA-mj48-jjc7-6wqr) and three hotel-module classes.", "fix_changed_files": [ "classes/Address.php", "classes/CustomerMessage.php", "modules/hotelreservationsystem/classes/HotelBranchRefundRules.php", "modules/hotelreservationsystem/classes/HotelRoomTypeFeaturePricing.php", "modules/hotelreservationsystem/classes/HotelRoomTypeGlobalDemandAdvanceOption.php" ], "sink": "database query in CustomerMessage.php built from the `bo_query` parameter", "source": "`bo_query` request parameter", "sites": [], "site_files": [ "classes/CustomerMessage.php" ], "sink_evidence": "", "site_derivation": "the advisory names 'CustomerMessage.php' (basename) and the parameter; the classes/ path is from the fix commit; no function named", "privilege": "administrator", "license": "OSL-3.0", "repo_size_mb": 129, "default_branch": "develop", "languages_pct": { "PHP": 80, "Smarty": 9, "JavaScript": 7 }, "confidence": "medium", "caveats": [ "one fix covers two advisories (Address.php is GHSA-mj48); repo 129 MB, near the size cap", "function-level site to be resolved at freeze" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "2ae1b491672aa8c6ca0eb766a81bab3cd9a20487", "tip": "54c12b4efe41fe3d8bc55e43923fbd917e525b10", "subject": "fixed issues", "files": [ "classes/order/Order.php", "classes/order/OrderPayment.php", "modules/hotelreservationsystem/classes/HotelBookingDetail.php", "modules/hotelreservationsystem/classes/HotelRoomInformation.php", "modules/hotelreservationsystem/classes/ServiceProductOrderDetail.php", "modules/qlohotelreports/qlohotelreports.php", "modules/qlohotelreports/views/templates/hook/group-bookings.tpl", "modules/qlohotelreports/views/templates/hook/group-channels.tpl", "modules/qlohotelreports/views/templates/hook/group-guests.tpl", "modules/qlohotelreports/views/templates/hook/group-occupancy.tpl", "modules/qlohotelreports/views/templates/hook/group-property.tpl", "modules/qlohotelreports/views/templates/hook/group-revenue.tpl" ], "lines": 106, "branch": "develop", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "roundcube-markasjunk-cmd-learn-rce", "repo": "https://github.com/roundcube/roundcubemail", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "injection", "subtype": "OS command injection", "advisory": [ "CVE-2026-74997", "GHSA-q5rh-mmp4-ppgq" ], "published": "2026-08-17", "lane": "B", "vulnerable_versions": "< 1.6.18; 1.7.x < 1.7.3", "fixed_version": "1.6.18 / 1.7.3", "vulnerable": "a1afb8fd1f00ed4cb9376c072bb5ca5ded64495e", "fixed": "b8f90e28a46d42e79a69568cba897f8f4223d9cd", "ancestry": "parent; ancestor of tag 1.6.18", "fix_named_by_advisory": true, "fix_note": "Advisory links `14044f84` (master) and `b8f90e28` (1.6 line), both 'Fix RCE via cmd_learn driver of markasjunk plugin' (plugins/markasjunk/drivers/cmd_learn.php +14-10), and a follow-up warning fix `495d2116`. The 1.6-line pin is used because it is an ancestor of tag 1.6.18.", "fix_changed_files": [ "CHANGELOG.md", "plugins/markasjunk/drivers/cmd_learn.php" ], "sink": "the markasjunk plugin's cmd_learn driver runs a shell command with placeholder replacement values", "source": "crafted placeholder replacement values (message/user data) when a message is marked as junk", "sites": [], "site_files": [ "plugins/markasjunk/drivers/cmd_learn.php" ], "sink_evidence": "", "site_derivation": "the advisory names 'the cmd_learn driver of the markasjunk plugin'; the file path follows from that name and is confirmed by the fix commit; no function named", "privilege": "authenticated webmail user", "license": "GPL-3.0", "repo_size_mb": 67, "default_branch": "master", "languages_pct": { "PHP": 90, "JavaScript": 7 }, "confidence": "medium", "caveats": [ "only instances that enable the markasjunk plugin with the cmd_learn driver" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "1cddafded973c4bf6faa173accaf8f52ca1ac0d0", "tip": "747f544708ed1d698b677d333346164a9451aeda", "subject": "Simplify", "files": [ "tests/Framework/TnefDecoderTest.php" ], "lines": 6, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "tests-only change, on master (the fixed pin is on the 1.6 line)" }, "idea": null }, "recommended": true }, { "id": "maccms10-template-blacklist-rce", "repo": "https://github.com/magicblack/maccms10", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "injection", "subtype": "code injection (template → PHP, blacklist bypass)", "advisory": [ "CVE-2026-71232", "GHSA-cv48-22qx-mpmx" ], "published": "2026-08-05", "lane": "B", "vulnerable_versions": "before commit 71ad3bb (2026-06-22)", "fixed_version": "commit 71ad3bb", "vulnerable": "2cabecda29947e8f9ea7cd3aa47ab90ed817605b", "fixed": "71ad3bb29570e110d8e973acff68040a3050ddf0", "ancestry": "parent", "fix_named_by_advisory": true, "fix_note": "Advisory names `71ad3bb2` (application/admin/controller/Template.php +1-1: adds the missing functions to the blacklist regex).", "fix_changed_files": [ "application/admin/controller/Template.php" ], "sink": "ThinkPHP `{if condition=...}` compiled into raw PHP; the admin template editor only blocks a function blacklist", "source": "template content saved through the admin template editor", "sites": [], "site_files": [ "application/admin/controller/Template.php" ], "sink_evidence": "", "site_derivation": "file path quoted by the advisory; no function named", "privilege": "administrator", "license": "GitHub: NOASSERTION [verify]", "repo_size_mb": 29, "default_branch": "master", "languages_pct": { "PHP": 66, "HTML": 23, "JavaScript": 9 }, "confidence": "medium", "caveats": [ "guard bypass (incomplete blacklist); the fix is still a blacklist", "licence not declared on GitHub" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "d9f09011a1523d0bfaed5dea9b2139461f2b0ea8", "tip": "668ba418e50e96ab32ac612f3b6528beb172b3b7", "subject": "fix #1356 修正注册API校验器解析错误及缺参报错", "files": [ "application/api/controller/User.php", "application/common/model/User.php", "tests/regression/user_register_validate.php", "说明文档/API接口说明V2.txt" ], "lines": 166, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "review: subject says it fixes a register-API validator" }, "idea": null }, "recommended": true }, { "id": "kirby-realpath-sibling-traversal", "repo": "https://github.com/getkirby/kirby", "language": "php", "also": [], "wordpress": false, "family": "path", "subtype": "path traversal (prefix containment check)", "advisory": [ "CVE-2026-75592", "GHSA-6j4c-mgqr-qv76" ], "published": "2026-09-02", "lane": "A", "vulnerable_versions": "< 4.9.5; 5.0.0 - 5.5.1", "fixed_version": "4.9.5 / 5.5.2", "vulnerable": "e90257fd7504053e13e93a1e9a5a9a5137aed966", "fixed": "2b6fab950bc89d505ea89576bf71c8de614cc3b2", "ancestry": "parent; ancestor of tag 4.9.5 (not of 5.5.2)", "fix_named_by_advisory": true, "fix_note": "Advisory links `2b6fab95` 'fix: Ensure containment in ::realpath()' (4.x line: src/Filesystem/Dir.php, src/Filesystem/F.php) and `e0dca5f7` (5.x line, which also carries the Media::thumb fix of GHSA-9vx2-j98c-p72w). The 4.x pin keeps the case to this advisory alone.", "fix_changed_files": [ "src/Filesystem/Dir.php", "src/Filesystem/F.php", "tests/Filesystem/DirTest.php", "tests/Filesystem/FTest.php" ], "sink": "`Dir::realpath()` / `F::realpath()` containment check accepts a sibling directory sharing the prefix (site vs site2)", "source": "media handler request path for not-yet-generated thumbnails", "sites": [ "src/Filesystem/Dir.php::realpath", "src/Filesystem/F.php::realpath" ], "site_files": [], "sink_evidence": "", "site_derivation": "`Dir::realpath()` and `F::realpath()` named by the advisory; paths confirmed by the fix commit", "privilege": "unauthenticated", "license": "GitHub: NOASSERTION [verify]", "repo_size_mb": 66, "default_branch": "main", "languages_pct": { "PHP": 77, "Vue": 15 }, "confidence": "medium", "caveats": [ "only deployments whose index root has a sibling directory with the same name prefix", "Kirby is under a proprietary licence (GitHub NOASSERTION); must be cleared before publishing" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "99e6aaa1dbcc997ebf2725b11f87a4bcaed9933c", "tip": "3989964ac1cb32fdfce69b2410280093f6ede46c", "subject": "fix: Stuck unsaved changes for untouched fields (#8355)", "files": [ "config/fields/object.php", "config/fields/toggle.php", "src/Form/Field.php", "tests/Form/Field/ObjectFieldTest.php", "tests/Form/Field/ToggleFieldTest.php", "tests/Form/FieldTest.php" ], "lines": 80, "branch": "main", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "on the default branch (5.x); the fixed pin is on the 4.x line" }, "idea": null }, "recommended": true }, { "id": "mineadmin-appstore-identifier-traversal", "repo": "https://github.com/mineadmin/MineAdmin", "language": "php", "also": [], "wordpress": false, "family": "path", "subtype": "path traversal", "advisory": [ "CVE-2026-55224", "GHSA-59xm-4m8c-g3xj" ], "published": "2026-08-18", "lane": "A", "vulnerable_versions": "< 3.2.0-alpha.2", "fixed_version": "3.2.0-alpha.2", "vulnerable": "ac0dcad616c5d304c249d1db4a6675f65cf736dc", "fixed": "ca41902a2a5422676227e5088f4cc1dec06044f1", "ancestry": "parent; the fixed commit is tag v3.2.0-alpha.2", "fix_named_by_advisory": true, "fix_note": "Advisory links `ca41902a` 'fix(app-store): 修复app-store几处安全风险。 (#728)' (Service.php +81-9, IndexController.php +4-0).", "fix_changed_files": [ "plugin/mine-admin/app-store/src/Controller/IndexController.php", "plugin/mine-admin/app-store/src/Service/Service.php" ], "sink": "`BASE_PATH . '/plugin/' . $params['identifier']` in download()/install()/unInstall(), then `Plugin::install($params['identifier'])`", "source": "`identifier` request parameter of the app-store plugin endpoints", "sites": [ "plugin/mine-admin/app-store/src/Service/Service.php::download", "plugin/mine-admin/app-store/src/Service/Service.php::install", "plugin/mine-admin/app-store/src/Service/Service.php::unInstall" ], "site_files": [], "sink_evidence": "", "site_derivation": "file path and methods quoted by the advisory", "privilege": "authenticated admin with app-store access (verify)", "license": "Apache-2.0", "repo_size_mb": 53, "default_branch": "3.2", "languages_pct": { "PHP": 99 }, "confidence": "high", "caveats": [ "Hyperf framework (not Laravel/Symfony)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "243956c6d08532ff0a6f36a4cfbb7c6b499c1de2", "tip": "c2f97b772c101053fb8606215ac8676f8e50896c", "subject": "feat(install): 添加前端项目下载与依赖安装功能 (#735)", "files": [ "app/Command/InstallCommand.php" ], "lines": 193, "branch": "3.2", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "facturascripts-uploadedfile-move-traversal", "repo": "https://github.com/NeoRazorX/facturascripts", "language": "php", "also": [], "wordpress": false, "family": "path", "subtype": "path traversal (arbitrary file write)", "advisory": [ "GHSA-hgjx-r89m-m7v4" ], "published": "2026-07-14", "lane": "A", "vulnerable_versions": ">= 2025, <= 2026.2", "fixed_version": "not stated", "vulnerable": "6baefcdc00c24970a568ff86d971b46be0fd7d75", "fixed": "d3770be64a3e1516a32aa9eb36e8907c53e28b14", "ancestry": "parent", "fix_named_by_advisory": false, "fix_note": "The advisory links no commit and states no patched version. File history of Core/UploadedFile.php has `d3770be6` 'Fix uploaded file path traversal' (2026-05-19; UploadedFile.php +38-4 plus tests). Inferred, not confirmed by the advisory.", "fix_changed_files": [ "Core/UploadedFile.php", "Test/Core/UploadedFileTest.php" ], "sink": "`UploadedFile::move($destiny, $destinyName)` concatenates the client filename into `move_uploaded_file()`", "source": "`getClientOriginalName()` of an uploaded file", "sites": [ "Core/UploadedFile.php::move" ], "site_files": [], "sink_evidence": "", "site_derivation": "file and method quoted by the advisory", "privilege": "authenticated user", "license": "LGPL-3.0", "repo_size_mb": 60, "default_branch": "master", "languages_pct": { "PHP": 90, "Twig": 9 }, "confidence": "medium", "caveats": [ "fix commit inferred from file history", "the advisory's affected range ends at 2026.2 while the inferred fix is dated 2026-05-19 -- confirm at freeze that the fixed pin is really unaffected" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "d6fc3f051781c83041c7318a980c915daeb00d50", "tip": "add96d2bbee5a391bc123dfcf263e57bb53ad6f5", "subject": "test: add API smoke test", "files": [ "Test/Core/Controller/ApiSmokeTest.php" ], "lines": 192, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "tests-only change" }, "idea": null }, "recommended": false }, { "id": "wp-geo-my-wp-info-window-lfi", "repo": "https://github.com/Fitoussi/geo-my-wp", "language": "php", "also": [ "javascript" ], "wordpress": true, "family": "path", "subtype": "local file inclusion", "advisory": [ "CVE-2026-85200", "GHSA-6hw9-7gx5-mw88" ], "published": "2026-09-12", "lane": "B", "vulnerable_versions": "<= 4.5.5.3", "fixed_version": "4.5.5.4", "vulnerable": "1dbb7b1672a45a8f88fdcd379ceb07b6cf2beceb", "fixed": "5a768bf1c6e44ded83a65be8789f3587515665ac", "ancestry": "parent", "fix_named_by_advisory": true, "fix_note": "Advisory links `5a768bf1` 'Release 4.5.5.4' (5 files: includes/gmw-functions.php +93-6, the posts/members locator functions files, version bumps). A release commit, but small and on-topic.", "fix_changed_files": [ "geo-my-wp.php", "includes/gmw-functions.php", "plugins/members-locator/includes/gmw-members-locator-functions.php", "plugins/posts-locator/includes/gmw-posts-locator-functions.php", "readme.txt" ], "sink": "include of a file chosen through `gmw_posts_locator_ajax_info_window_loader`", "source": "AJAX request parameters (unauthenticated)", "sites": [ "plugins/posts-locator/includes/gmw-posts-locator-functions.php::gmw_posts_locator_ajax_info_window_loader" ], "site_files": [ "includes/gmw-functions.php" ], "sink_evidence": "", "site_derivation": "function named by the advisory text; files from the advisory's own trac reference links (gmw-functions.php#L1945/L1987, gmw-posts-locator-functions.php#L964/L975); the function-to-file pairing is an assumption to confirm at freeze", "privilege": "unauthenticated", "license": "GitHub: none [verify]", "repo_size_mb": 9, "default_branch": "master", "languages_pct": { "PHP": 47, "JavaScript": 44, "CSS": 9 }, "confidence": "medium", "caveats": [ "WordPress plugin; GitHub shows no licence (plugin header GPL presumed, verify)", "release commit (small)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": null, "idea": "no API proposal passed the freeze.py filter within 60 commits after the fix; let freeze.py propose one from the clone, or pick by hand (a small non-security PHP change on the default branch that does not touch the sink file)" }, "recommended": true }, { "id": "elfinder-fsock-dns-rebinding-ssrf", "repo": "https://github.com/Studio-42/elFinder", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "untrusted_destination", "subtype": "SSRF (DNS rebinding guard bypass)", "advisory": [ "CVE-2026-81889", "GHSA-8x3q-jpjh-qh5c" ], "published": "2026-08-31", "lane": "A", "vulnerable_versions": "<= 2.1.69", "fixed_version": "2.1.70", "vulnerable": "dd73e702820c146a192969800ee674ecdb208365", "fixed": "6d997386cd0f1abab4706c220b46b0aea0ecff51", "ancestry": "parent; ancestor of tag 2.1.70-src (tag 2.1.70 is a build branch with no common history)", "fix_named_by_advisory": true, "fix_note": "Advisory links `6d997386` 'Merge commit from fork' (php/elFinder.class.php +113-12, i18n) and the build commit `191372c1`. `6d997386` has a single parent `dd73e702` (the fix of the sibling ZIP-extraction advisory).", "fix_changed_files": [ "js/i18n/elfinder.en.js", "js/i18n/elfinder.ja.js", "php/elFinder.class.php" ], "sink": "`fsock_get_contents()` fallback reconnects by hostname after the URL validation resolved it (TOCTOU)", "source": "URL submitted for server-side upload", "sites": [ "php/elFinder.class.php::fsock_get_contents" ], "site_files": [], "sink_evidence": "", "site_derivation": "function named by the advisory, file linked by the advisory", "privilege": "depends on the integrating connector", "license": "GitHub: NOASSERTION [verify]", "repo_size_mb": 43, "default_branch": "master", "languages_pct": { "JavaScript": 65, "PHP": 29 }, "confidence": "medium", "caveats": [ "only when PHP lacks cURL", "guard bypass (DNS rebinding); repository is 65% JavaScript", "licence NOASSERTION on GitHub (verify)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": null, "idea": "no API proposal passed the freeze.py filter within 60 commits after the fix; let freeze.py propose one from the clone, or pick by hand (a small non-security PHP change on the default branch that does not touch the sink file)" }, "recommended": true }, { "id": "easyappointments-caldav-ssrf", "repo": "https://github.com/alextselegidis/easyappointments", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "untrusted_destination", "subtype": "SSRF", "advisory": [ "CVE-2026-52840", "GHSA-pm5p-7w5h-jm5q" ], "published": "2026-07-29", "lane": "A", "vulnerable_versions": "<= 1.5.2", "fixed_version": "1.6.0", "vulnerable": "725eafa647308846ce887657db12771a829e42ef", "fixed": "4abb10545d83ac1a57d03f6502376ee67696ea7c", "ancestry": "parent of 4abb1054; ancestor of tag 1.6.0", "fix_named_by_advisory": true, "fix_note": "Advisory links four linear commits of 2026-05-26: `4abb1054` 'fix: harden caldav url validation against ssrf' (the validation), then `6b34b78c`, `2da2baed`, `6eb9336a` (opt-in private-host toggle and its relocation). The first carries the fix and is used as the fixed pin; `6eb9336a` is the end of the chain if the maintainer prefers it.", "fix_changed_files": [ "CHANGELOG.md", "application/controllers/Caldav.php", "application/libraries/Caldav_sync.php" ], "sink": "`$this->caldav_sync->test_connection($caldav_url, ...)` → Guzzle REPORT request", "source": "`caldav_url` request parameter of Caldav::connect_to_server", "sites": [ "application/controllers/Caldav.php::connect_to_server", "application/libraries/Caldav_sync.php::test_connection" ], "site_files": [], "sink_evidence": "", "site_derivation": "controller path and method quoted by the advisory; the library path follows from `$this->caldav_sync` and the fix commit", "privilege": "authenticated backend user (admin, provider or secretary)", "license": "GPL-3.0", "repo_size_mb": 49, "default_branch": "main", "languages_pct": { "PHP": 89, "JavaScript": 9 }, "confidence": "high", "caveats": [ "fix spread over four linear commits (v2 allowed up to three; the first commit alone is the fix)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "6084d99b59bd060d64506b3981e0bdddff59418f", "tip": "1b51132026c78ebec3e732e045587306853d77be", "subject": "Minor translation change.", "files": [ "application/language/german/translations_lang.php" ], "lines": 2, "branch": "main", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "koel-podcast-enclosure-ipv6-ssrf", "repo": "https://github.com/koel/koel", "language": "php", "also": [ "typescript" ], "wordpress": false, "family": "untrusted_destination", "subtype": "SSRF (guard bypass via IPv6 transition addresses)", "advisory": [ "CVE-2026-54494", "GHSA-rjg7-r26h-cfp2" ], "published": "2026-07-15", "lane": "A", "vulnerable_versions": "<= 9.7.0", "fixed_version": "9.7.1", "vulnerable": "8ee1de0f5589ef34d3e3bbb9c9555a5de69eaf06", "fixed": "5f6ce2cefd08f437a269236b677ad971517ccbb6", "ancestry": "parent; ancestor of tag v9.7.1", "fix_named_by_advisory": true, "fix_note": "Advisory links `5f6ce2ce` 'fix: close remaining SSRF advisories (DNS rebinding, IPv6 transition, bail) (#2549)', 28 files; one commit that closes several SSRF advisories (same family).", "fix_changed_files": [ "app/Ai/Tools/AddRadioStation.php", "app/Helpers/Network.php", "app/Helpers/SafeHttp.php", "app/Http/Requests/API/Radio/RadioStationStoreRequest.php", "app/Http/Requests/API/Radio/RadioStationUpdateRequest.php", "app/Http/Requests/Subsonic/CreateInternetRadioStationRequest.php", "app/Http/Requests/Subsonic/UpdateInternetRadioStationRequest.php", "app/Providers/AppServiceProvider.php", "app/Rules/HasAudioContentType.php", "app/Rules/SafeUrl.php", "app/Services/DownloadService.php", "app/Services/Network/Network.php", "app/Services/Network/SafeHttp.php", "app/Services/Podcast/PodcastService.php", "app/Services/Radio/RadioStreamProxy.php", "app/Services/Streamer/Adapters/PodcastStreamerAdapter.php", "app/Values/Podcast/EpisodePlayable.php", "composer.json", "composer.lock", "tests/Fakes/FakeNetwork.php", "tests/Feature/RadioStationTest.php", "tests/Integration/Services/Podcast/PodcastServiceTest.php", "tests/Integration/Values/EpisodePlayableTest.php", "tests/TestCase.php", "tests/Unit/Helpers/SafeHttpTest.php", "tests/Unit/Services/Network/NetworkTest.php", "tests/Unit/Services/Network/SafeHttpTest.php", "tests/Unit/Services/Radio/RadioStreamProxyTest.php" ], "sink": "`EpisodePlayable::createForEpisode()` → `Http::sink($file)->get($url)`, guarded only by `Network::isPublicHost()`", "source": "`` of an attacker-hosted RSS feed subscribed by any user", "sites": [ "app/Helpers/Network.php::isPublicHost", "app/Values/Podcast/EpisodePlayable.php::createForEpisode" ], "site_files": [], "sink_evidence": "", "site_derivation": "app/Helpers/Network.php and isPublicHost quoted by the advisory; EpisodePlayable path from the class name `App\\Values\\Podcast\\EpisodePlayable`", "privilege": "authenticated user", "license": "MIT", "repo_size_mb": 29, "default_branch": "master", "languages_pct": { "PHP": 55, "TypeScript": 27, "Vue": 18 }, "confidence": "medium", "caveats": [ "large multi-advisory fix commit (28 files), same family", "exploitation needs NAT64/6to4 routing" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "74d949b28b9a830b1e917d5790bdd0ef3a0dfd1f", "tip": "eafb61deaad021b4a4d934d278bfbb937a053715", "subject": "test: serve a real response to the radio stream connector (#2671)", "files": [ "tests/Integration/Services/Radio/RadioStreamConnectorTest.php", "tests/Unit/Services/Radio/RadioStreamConnectorTest.php" ], "lines": 178, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "tests-only change" }, "idea": null }, "recommended": false }, { "id": "pagible-admin-proxy-dns-rebinding-ssrf", "repo": "https://github.com/aimeos/pagible", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "untrusted_destination", "subtype": "SSRF (DNS rebinding guard bypass)", "advisory": [ "CVE-2026-49262", "GHSA-mmj8-wcvw-6789" ], "published": "2026-06-26", "lane": "A", "vulnerable_versions": "< 0.10.4", "fixed_version": "0.10.4", "vulnerable": "03f03b2f81b20b1c1625ff227235c43791ddbb33", "fixed": "09a8205d513ec89ed22cdd7bdae0f4c181cee082", "ancestry": "parent; ancestor of tag 0.10.4", "fix_named_by_advisory": false, "fix_note": "The advisory links no commit. The compare 0.10.3...0.10.4 has three commits; `09a8205d` 'Fixed SSRF via DNS rebinding in admin proxy' (admin/src/Controllers/AdminController.php +21-7, core/src/Utils.php +22-4).", "fix_changed_files": [ "admin/src/Controllers/AdminController.php", "admin/tests/AdminControllerTest.php", "core/src/Utils.php" ], "sink": "`AdminController::proxy` → Guzzle request after `\\Aimeos\\Cms\\Utils::isValidUrl($url)`", "source": "`url` query parameter of `/cmsproxy`", "sites": [ "admin/src/Controllers/AdminController.php::proxy", "core/src/Utils.php::isValidUrl" ], "site_files": [], "sink_evidence": "", "site_derivation": "class::method names quoted by the advisory; paths from the fix commit", "privilege": "authenticated (proxy token)", "license": "MIT", "repo_size_mb": 73, "default_branch": "master", "languages_pct": { "PHP": 57, "JavaScript": 16, "CSS": 12, "Vue": 11 }, "confidence": "medium", "caveats": [ "guard bypass (DNS rebinding)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "36cbcdb6ea44c9b4eab019887656ed76c57b44cb", "tip": "bc5a10a515bd4413bd336bab5f7952f2da876393", "subject": "Fixed admin test", "files": [ "admin/tests/AdminControllerTest.php" ], "lines": 2, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "tests-only change" }, "idea": null }, "recommended": false }, { "id": "wp-graphql-updatepost-publish-bypass", "repo": "https://github.com/wp-graphql/wp-graphql", "language": "php", "also": [ "javascript" ], "wordpress": true, "family": "access_control", "subtype": "missing object-level capability check", "advisory": [ "CVE-2026-88974", "GHSA-5mmc-8pc9-wggg" ], "published": "2026-09-23", "lane": "A", "vulnerable_versions": "< 2.22.2 (confirmed 2.19.0)", "fixed_version": "2.22.2", "vulnerable": "d53b0e566f20a8df0664559cb6432d52a7cd285c", "fixed": "55441663eaa33c3f2e05de038c8286c845916461", "ancestry": "parent; ancestor of tag wp-graphql/v2.22.2", "fix_named_by_advisory": true, "fix_note": "Advisory links `55441663` (PR #4270) whose subject is 'do not invoke bare callable-string field definitions in Model'; it also changes plugins/wp-graphql/src/Mutation/PostObjectUpdate.php (+27-0) -- two fixes in one commit.", "fix_changed_files": [ "plugins/wp-graphql/src/Model/Model.php", "plugins/wp-graphql/src/Mutation/PostObjectUpdate.php", "plugins/wp-graphql/tests/wpunit/ModelFieldMemoizationTest.php", "plugins/wp-graphql/tests/wpunit/PostObjectMutationsTest.php" ], "sink": "`updatePost` mutation checks only `$post_type_object->cap->edit_posts`", "source": "GraphQL `updatePost` mutation input (status PUBLISH, published post id)", "sites": [], "site_files": [ "plugins/wp-graphql/src/Mutation/PostObjectUpdate.php" ], "sink_evidence": "", "site_derivation": "the advisory names src/Mutation/PostObjectUpdate.php; the repository is a monorepo (plugins/wp-graphql/ prefix from the fix commit); no function named", "privilege": "Contributor", "license": "GPL-3.0", "repo_size_mb": 120, "default_branch": "main", "languages_pct": { "PHP": 68, "JavaScript": 26 }, "confidence": "medium", "caveats": [ "fix commit also carries an unrelated Model.php change", "function-level site to resolve at freeze" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": null, "idea": "no API proposal passed the freeze.py filter within 60 commits after the fix; let freeze.py propose one from the clone, or pick by hand (a small non-security PHP change on the default branch that does not touch the sink file)" }, "recommended": true }, { "id": "sylius-mollie-thankyou-order-idor", "repo": "https://github.com/Sylius/MolliePlugin", "language": "php", "also": [], "wordpress": false, "family": "access_control", "subtype": "IDOR (missing ownership check)", "advisory": [ "CVE-2026-68501", "GHSA-x83g-979r-f5fh" ], "published": "2026-07-31", "lane": "A", "vulnerable_versions": "< 2.2.8; 3.0.0-3.2.3; 3.3.0", "fixed_version": "2.2.8 / 3.2.4 / 3.3.1", "vulnerable": "7400f1489a4b699df97ced9499acde4faaa476d5", "fixed": "01316b3ad3cf82e3c5ad160115d0a2cf89174e49", "ancestry": "first parent of a merge; ancestor of tag v3.3.1", "fix_named_by_advisory": true, "fix_note": "Advisory links three merge commits (one per branch). `01316b3a` (PR #354, 3.3 line) is used: PageRedirectController.php +17-6, QrCodeAction.php +9-11, PaymentWebhookController.php (the sibling webhook advisory GHSA-rc52-c4hv-w89p).", "fix_changed_files": [ "UPGRADE-3.3.md", "assets/shop/js/mollie/app.js", "src/Controller/Shop/PageRedirectController.php", "src/Controller/Shop/PaymentWebhookController.php", "src/Controller/Shop/QrCodeAction.php", "tests/Unit/Controller/Shop/PageRedirectControllerTest.php", "tests/Unit/Controller/Shop/PaymentWebhookControllerTest.php" ], "sink": "`findOneBy(['id' => $orderId])` without ownership/session check, returning the order token (302 Location) and QR code", "source": "`orderId` of GET /{_locale}/thank-you and /{_locale}/get-code", "sites": [ "src/Controller/Shop/PageRedirectController.php::thankYouAction", "src/Controller/Shop/QrCodeAction.php::fetchQrCodeFromOrder" ], "site_files": [], "sink_evidence": "", "site_derivation": "Class::method names quoted by the advisory; paths from the fix commit", "privilege": "unauthenticated", "license": "MIT", "repo_size_mb": 9, "default_branch": "3.4", "languages_pct": { "PHP": 90 }, "confidence": "high", "caveats": [ "merge commit; one fix covers two advisories (webhook forgery GHSA-rc52 is the other)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "5ffb17c6fa4a254a62ef7285b4fd57a1a9619deb", "tip": "ad215c9c0fc3df201c196d2ef893a1e8c9ff3aab", "subject": "Refactor `PaymentMethodLogoUploader` to use `FilesystemAdapterInterface` instead of `Gaufrette\\Filesystem`.", "files": [ "config/services/uploader.xml", "src/Uploader/PaymentMethodLogoUploader.php" ], "lines": 15, "branch": "3.4", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "paymenter-checkout-config-override", "repo": "https://github.com/Paymenter/Paymenter", "language": "php", "also": [], "wordpress": false, "family": "access_control", "subtype": "unvalidated URL-writable properties override provisioning parameters", "advisory": [ "CVE-2026-47198", "GHSA-5q4q-834j-g8g4" ], "published": "2026-06-30", "lane": "A", "vulnerable_versions": "< 1.5.1", "fixed_version": "1.5.1", "vulnerable": "9d305ea444f7aa3a73f84583c28be0f06da61969", "fixed": "75719ae46b4096505a252e24c302961b700251f1", "ancestry": "parent; ancestor of tag v1.5.1", "fix_named_by_advisory": false, "fix_note": "The advisory links no commit. The compare v1.5.0...v1.5.1 has 17 commits; `75719ae4` 'Merge commit from fork' changes only app/Livewire/Products/Checkout.php (+7-1).", "fix_changed_files": [ "app/Livewire/Products/Checkout.php" ], "sink": "`$checkoutConfig` (`#[Url]`, alias `config`) keys stored by Cart.php into service properties, later passed to createServer()", "source": "`config[...]` query parameters of the checkout page", "sites": [], "site_files": [ "app/Livewire/Products/Checkout.php", "app/Livewire/Cart.php" ], "sink_evidence": "", "site_derivation": "file paths quoted by the advisory; no function named", "privilege": "authenticated customer", "license": "MIT", "repo_size_mb": 15, "default_branch": "master", "languages_pct": { "PHP": 87, "Blade": 12 }, "confidence": "medium", "caveats": [ "mass-assignment shape (CWE-20/639); classed access_control by its CWE", "fix commit inferred from the release compare" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "8299b27e37e263b9b6b5fd0c166c762120719830", "tip": "e60567981acfb12e3c8d13e513e2959edd8b9d1c", "subject": "fix: reCAPTCHA v3 not working after Livewire navigation", "files": [ "themes/default/views/components/captcha/recaptcha-v3.blade.php" ], "lines": 24, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "review: subject mentions reCAPTCHA (anti-abuse)" }, "idea": null }, "recommended": false }, { "id": "wp-buddypress-messages-rest-idor", "repo": "https://github.com/buddypress/buddypress", "language": "php", "also": [], "wordpress": true, "family": "access_control", "subtype": "IDOR in REST permission callback", "advisory": [ "CVE-2026-53673", "GHSA-j3j5-5m8v-7gvc" ], "published": "2026-06-10", "lane": "A", "vulnerable_versions": "< 14.5.0 (confirmed 14.4.0)", "fixed_version": "14.5.0", "vulnerable": "56b1fd3b40549f542936b12e265fd08a59df72ae", "fixed": "27d41e9749a878103b3a673b37dfc92b7f8f2cb7", "ancestry": "parent", "fix_named_by_advisory": true, "fix_note": "Advisory links `27d41e97` 'Improve security of messages endpoint.' (class-bp-messages-rest-controller.php +113-42, tests). The commit is dated 2026-07-07, after the advisory; confirm at freeze that the release carrying it is 14.5.0.", "fix_changed_files": [ "src/bp-messages/classes/class-bp-messages-rest-controller.php", "tests/phpunit/testcases/messages/test-controller.php" ], "sink": "`get_item_permissions_check` validates the supplied user_id instead of the logged-in user; reused by update/delete", "source": "`user_id` parameter of the messages REST API", "sites": [ "src/bp-messages/classes/class-bp-messages-rest-controller.php::get_item_permissions_check" ], "site_files": [], "sink_evidence": "", "site_derivation": "method named by the advisory; file path from the fix commit", "privilege": "authenticated (any user)", "license": "GitHub: none [verify]", "repo_size_mb": 79, "default_branch": "master", "languages_pct": { "PHP": 76, "CSS": 14, "SCSS": 6 }, "confidence": "medium", "caveats": [ "the GitHub repository is the project's own mirror of its development SVN", "no GitHub licence metadata (GPL-2.0+ per project, verify)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "e530c9c056200bdcc55442ce81eb3372d20d7879", "tip": "ea5cb85f4d8a86bc518fff5e22a83abd07eb727b", "subject": "PHPDoc: Improve parameter descriptions.", "files": [ "src/bp-activity/bp-activity-embeds.php", "src/bp-activity/bp-activity-filters.php", "src/bp-activity/bp-activity-functions.php", "src/bp-activity/bp-activity-template.php", "src/bp-activity/classes/class-bp-activity-activity.php", "src/bp-activity/classes/class-bp-activity-oembed-extension.php", "src/bp-blogs/bp-blogs-functions.php", "src/bp-blogs/classes/class-bp-blogs-template.php", "src/bp-core/bp-core-attachments.php", "src/bp-friends/bp-friends-activity.php", "src/bp-groups/bp-groups-activity.php", "src/bp-groups/bp-groups-functions.php", "src/bp-groups/bp-groups-template.php", "src/bp-groups/classes/class-bp-groups-invitation-manager.php", "src/bp-groups/classes/class-bp-groups-membership-requests-template.php", "src/bp-members/bp-members-membership-requests.php", "src/bp-members/bp-members-template.php", "src/bp-members/classes/class-bp-members-invitation-manager.php", "src/bp-members/classes/class-bp-members-invitations-template.php", "src/bp-messages/classes/class-bp-messages-notices-list-table.php", "src/bp-notifications/bp-notifications-template.php", "src/bp-notifications/classes/class-bp-notifications-template.php", "src/bp-templates/bp-legacy/buddypress-functions.php", "src/bp-templates/bp-nouveau/includes/activity/functions.php", "src/bp-templates/bp-nouveau/includes/blogs/functions.php", "src/bp-templates/bp-nouveau/includes/classes/class-bp-buttons-group.php", "src/bp-templates/bp-nouveau/includes/functions.php", "src/bp-templates/bp-nouveau/includes/groups/functions.php", "src/bp-templates/bp-nouveau/includes/members/template-tags.php", "src/bp-templates/bp-nouveau/includes/messages/functions.php", "src/bp-templates/bp-nouveau/includes/notifications/functions.php", "src/bp-templates/bp-nouveau/includes/template-tags.php", "src/bp-templates/bp-nouveau/includes/xprofile/functions.php", "src/bp-xprofile/bp-xprofile-template.php" ], "lines": 132, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": false }, { "id": "sharp-editor-iframe-srcdoc-xss", "repo": "https://github.com/code16/sharp", "language": "php", "also": [ "typescript" ], "wordpress": false, "family": "output_encoding", "subtype": "stored XSS (sanitizer allow-list)", "advisory": [ "CVE-2026-61823", "GHSA-qxg3-46rw-79j8" ], "published": "2026-09-25", "lane": "A", "vulnerable_versions": "< 9.22.5", "fixed_version": "9.22.5", "vulnerable": "67743149309054493ec8f5505173fc57aaff760f", "fixed": "ec509a22c808a5bd9dfad6a0a85c92ce6f411e21", "ancestry": "parent; ancestor of tag v9.22.5", "fix_named_by_advisory": true, "fix_note": "Advisory links `ec509a22` 'Improve sanitization' (src/Utils/Sanitization/FormatsSanitizedValue.php +4-2, test). The same commit fixes the sibling GHSA-vj3q-vp3g-j9c8.", "fix_changed_files": [ "src/Utils/Sanitization/FormatsSanitizedValue.php", "tests/Unit/Form/Fields/Formatters/EditorFormatterTest.php" ], "sink": "Symfony HtmlSanitizer config allows the iframe `srcdoc` attribute; the value is rendered as live HTML", "source": "Editor field content saved by a user with edit permission", "sites": [], "site_files": [ "src/Utils/Sanitization/FormatsSanitizedValue.php" ], "sink_evidence": "srcdoc", "site_derivation": "file path quoted by the advisory; no function named", "privilege": "authenticated editor", "license": "MIT", "repo_size_mb": 109, "default_branch": "9.x", "languages_pct": { "PHP": 66, "Vue": 23, "TypeScript": 9 }, "confidence": "medium", "caveats": [ "the flaw is a sanitizer allow-list entry, not a missing escape call" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "ec509a22c808a5bd9dfad6a0a85c92ce6f411e21", "tip": "7c601fffe930fc321a5d8bcb25cb072d50a6fc08", "subject": "Update version to v9.22.5", "files": [ "src/SharpInternalServiceProvider.php" ], "lines": 2, "branch": "9.x", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "privatebin-jsonld-request-uri-injection", "repo": "https://github.com/PrivateBin/PrivateBin", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "output_encoding", "subtype": "reflected JSON injection (CWE-116)", "advisory": [ "CVE-2026-55891", "GHSA-xrjc-c68j-hp7w" ], "published": "2026-08-28", "lane": "A", "vulnerable_versions": "<= 2.0.4", "fixed_version": "2.0.5", "vulnerable": "e0dd4c025c19a182b6a4c6fb77a8bf81ceff6899", "fixed": "75f056dcda955d94c17ec5a4f8c54a9b7bfcee07", "ancestry": "first parent of a merge; ancestor of tag 2.0.5", "fix_named_by_advisory": true, "fix_note": "Advisory links `75f056dc` 'Merge commit from fork' (first-parent diff: lib/Request.php +2-2, lib/Configuration.php, CHANGELOG, test). Its first parent `e0dd4c02` is the fix of the sibling attachment-XSS advisory GHSA-f2xf-7x3g-4272.", "fix_changed_files": [ "CHANGELOG.md", "lib/Configuration.php", "lib/Request.php", "tst/RequestTest.php" ], "sink": "`Controller::_jsonld()` splices `$_urlBase` into a .jsonld template with `str_replace()`", "source": "`$_SERVER['REQUEST_URI']` via `Request::getRequestUri()` (FILTER_SANITIZE_URL keeps quotes and angle brackets)", "sites": [ "lib/Request.php::getRequestUri", "lib/Controller.php::_jsonld" ], "site_files": [], "sink_evidence": "", "site_derivation": "Class::method names quoted by the advisory; paths lib/*.php from the fix commit", "privilege": "unauthenticated", "license": "GitHub: NOASSERTION [verify]", "repo_size_mb": 16, "default_branch": "master", "languages_pct": { "PHP": 46, "JavaScript": 38, "CSS": 16 }, "confidence": "high", "caveats": [ "the fix changes Request.php only; Controller::_jsonld is a declared site outside the diff", "response type is JSON-LD, not HTML", "licence NOASSERTION on GitHub (zlib-style per project, verify)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "5bbb4e00788d2ba32212341e54313098f86a0817", "tip": "48ae4ed5d3d4dde0d0026878a4e2ba3408686277", "subject": "fix: quote administration storage path", "files": [ "bin/administration", "tst/AdministrationEmptyDirsTest.php" ], "lines": 54, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "review: 'quote administration storage path' may be a shell-quoting fix" }, "idea": null }, "recommended": true }, { "id": "openstamanager-group-name-html-injection", "repo": "https://github.com/devcode-it/openstamanager", "language": "php", "also": [ "javascript" ], "wordpress": false, "family": "output_encoding", "subtype": "stored HTML injection", "advisory": [ "CVE-2026-44701", "GHSA-crx4-7mmq-j74j" ], "published": "2026-08-26", "lane": "A", "vulnerable_versions": "<= 2.10.1", "fixed_version": "2.11-beta", "vulnerable": "57a2734e2121aa8fcd456eff7c59f03e29e69176", "fixed": "0b88ad1963871abfa5e134004ca0c74c496d8d2f", "ancestry": "parent; ancestor of tag v2.11-beta", "fix_named_by_advisory": true, "fix_note": "Advisory links `0b88ad19` 'fix: HTML Injection in modules/utenti/edit.php' (edit.php +2-2, ajax/select.php, src/AJAX.php, src/Modules.php) and a broader input-filter refactor `7c9eafe9`. The first is used.", "fix_changed_files": [ "modules/utenti/ajax/select.php", "modules/utenti/edit.php", "src/AJAX.php", "src/Modules.php" ], "sink": "`''.$group->getTranslation('title').''` in modules/utenti/edit.php", "source": "group name saved when creating a user group", "sites": [ "modules/utenti/edit.php::" ], "site_files": [], "sink_evidence": "$group->getTranslation('title')", "site_derivation": "file and code quoted by the advisory", "privilege": "authenticated user able to create groups", "license": "GPL-3.0", "repo_size_mb": 43, "default_branch": "master", "languages_pct": { "PHP": 80, "JavaScript": 17 }, "confidence": "high", "caveats": [ "second advisory commit (7c9eafe9, global GET/POST filtering) is not in the pinned pair" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "a99b8f921dfbc53c2290316925a4e01ce1333eee", "tip": "570eff68c5049b3a336a83e5de5d5b09e6cb219a", "subject": "fix: definizione variabile", "files": [ "modules/fatture/src/Gestori/Scadenze.php" ], "lines": 2, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "symfony-ux-live-child-tag-xss", "repo": "https://github.com/symfony/ux", "language": "php", "also": [ "typescript", "javascript" ], "wordpress": false, "family": "output_encoding", "subtype": "XSS (unescaped tag name)", "advisory": [ "CVE-2026-49210", "GHSA-38x5-rcv4-xf7x" ], "published": "2026-06-19", "lane": "A", "vulnerable_versions": "ux-live-component >= 2.8.0, < 2.36.0; >= 3.0.0, < 3.1.0", "fixed_version": "2.36.0 / 3.1.0", "vulnerable": "a6e9bf808476ae43895cf80f088af392a79537ea", "fixed": "fbc5e9a1bda7e4556be21bb1d970f382760ed9a9", "ancestry": "parent; ancestor of tag v2.36.0", "fix_named_by_advisory": true, "fix_note": "Advisory links `fbc5e9a1` '[LiveComponent] Reject malicious child component tags' (ChildComponentPartialRenderer.php +7-0, test).", "fix_changed_files": [ "src/LiveComponent/src/Util/ChildComponentPartialRenderer.php", "src/LiveComponent/tests/Functional/EventListener/InterceptChildComponentRenderSubscriberTest.php" ], "sink": "`ChildComponentPartialRenderer::createHtml()` interpolates `$childTag` into HTML", "source": "client JSON `children[id].tag` parsed by `LiveComponentSubscriber` and passed through `InterceptChildComponentRenderSubscriber`", "sites": [ "src/LiveComponent/src/Util/ChildComponentPartialRenderer.php::createHtml" ], "site_files": [], "sink_evidence": "", "site_derivation": "FQCN::method quoted by the advisory; monorepo path from the fix commit", "privilege": "unauthenticated (Accept header gate; CORS or same-origin needed)", "license": "MIT", "repo_size_mb": 59, "default_branch": "3.x", "languages_pct": { "PHP": 61, "TypeScript": 22, "JavaScript": 10, "Twig": 7 }, "confidence": "medium", "caveats": [ "the advisory calls it primarily defense in depth (custom Accept header cannot be sent cross-origin without preflight)", "component framework in a monorepo (UX packages)" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": null, "idea": "no API proposal passed the freeze.py filter within 60 commits after the fix; let freeze.py propose one from the clone, or pick by hand (a small non-security PHP change on the default branch that does not touch the sink file)" }, "recommended": false }, { "id": "wp-podlove-generation-guard-poi", "repo": "https://github.com/podlove/podlove-publisher", "language": "php", "also": [ "javascript", "typescript" ], "wordpress": true, "family": "deserialization", "subtype": "PHP object injection → arbitrary file deletion (in-plugin POP chain)", "advisory": [ "CVE-2026-16099", "GHSA-q83h-6954-x259" ], "published": "2026-08-16", "lane": "C (WordPress, deserialization)", "vulnerable_versions": "<= 4.5.3", "fixed_version": "4.5.4 (not stated in the advisory; first release after the fix)", "vulnerable": "4eedbd66796942ab052de2dbd6311a24cc75c4a7", "fixed": "ea878175f2612d54888d9e2aa49ae4db93b724fd", "ancestry": "linear chain of 3 commits (4eedbd66 → d49c4d7f → b59d7962 → ea878175); ancestor of tag 4.5.4", "fix_named_by_advisory": false, "fix_note": "The advisory links wp.org trac only. The GitHub history of the referenced files has three consecutive commits of 2026-07-26: `d49c4d7f` 'fix: constrain image lock deletion' (generation_guard.php), `b59d7962` 'fix: harden shownotes REST input' (rest_api.php +173-20), `ea878175` 'fix: limit model unserialization' (lib/model/base.php). The pair spans all three (vulnerable = parent of d49c4d7f).", "fix_changed_files": [ "lib/model/base.php", "lib/model/job.php", "tests/phpunit/integration/BaseModelSerializationTest.php" ], "sink": "unserialize() of model data (lib/model/base.php#L552) instantiating `Podlove\\ImageCache\\GenerationGuard`, whose `__destruct()` calls `wp_delete_file()`", "source": "shownotes REST input handled by `create_link_item` (contributor+)", "sites": [ "lib/modules/shownotes/rest_api.php::create_link_item", "lib/image_cache/generation_guard.php::__destruct" ], "site_files": [ "lib/model/base.php" ], "sink_evidence": "", "site_derivation": "create_link_item and GenerationGuard::__destruct named by the advisory; files from the advisory's own trac reference links", "privilege": "Contributor", "license": "MIT", "repo_size_mb": 33, "default_branch": "master", "languages_pct": { "PHP": 63, "JavaScript": 18, "Vue": 10, "TypeScript": 6 }, "confidence": "medium", "caveats": [ "fix inferred from file history (three commits)", "the advisory text describes the impact (file deletion) under CWE-502" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "af187ad4bba2739839a0aa1e6cf2cabd6f9b99f5", "tip": "50da8db0f5a85afaf27cd6199940be0403b368ec", "subject": "fix PHP warning", "files": [ "lib/modules/contributors/contributor_list_table.php" ], "lines": 2, "branch": "master", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": true }, { "id": "wp-admin-columns-ids-to-collection-poi", "repo": "https://github.com/codepress/admin-columns", "language": "php", "also": [ "javascript", "typescript" ], "wordpress": true, "family": "deserialization", "subtype": "PHP object injection (bundled POP chain)", "advisory": [ "CVE-2026-7654", "GHSA-h6x4-229g-5f43" ], "published": "2026-06-06", "lane": "C", "vulnerable_versions": "<= 7.0.18", "fixed_version": "7.0.19 (not stated; first release after the fix)", "vulnerable": "ea6db9a02e014fdde69c24b809ad3711f2a691e3", "fixed": "c64e9aaecd202ea9e8c0e110b10a06e7441f9863", "ancestry": "parent; ancestor of tag 7.0.19", "fix_named_by_advisory": false, "fix_note": "The advisory links wp.org trac only. The compare 7.0.18...7.0.19 has one commit touching the named file: `c64e9aae` 'Update IdsToCollection.php' (+1-1). An identical change `25e276e0` sits on the 7.1 development line. Inferred; the commit message does not say what changed.", "fix_changed_files": [ "classes/Formatter/IdsToCollection.php" ], "sink": "`unserialize()` without `allowed_classes` in `IdsToCollection::get_ids_from_string()`", "source": "post meta values set by a Contributor", "sites": [ "classes/Formatter/IdsToCollection.php::get_ids_from_string" ], "site_files": [ "classes/Formatter/Meta.php" ], "sink_evidence": "unserialize(", "site_derivation": "Class::method named by the advisory; files from its trac reference links", "privilege": "Contributor", "license": "GPL-3.0", "repo_size_mb": 37, "default_branch": "main", "languages_pct": { "PHP": 69, "Svelte": 10, "SCSS": 7, "JavaScript": 6, "TypeScript": 6 }, "confidence": "medium", "caveats": [ "fix inferred (one-line change, uninformative message) -- confirm at freeze that it adds allowed_classes" ], "benign": { "fixed_side": "the fixed pin (both runs) is the fixed-side control", "proposal": { "base": "7d20b2c8ab843d265e0b3561d3c33e6dddb58dc5", "tip": "e998321863c4842445d8c71e48aaf4510cbfa498", "subject": "Todo ans PHP code fixer", "files": [ "classes/ColumnCollection.php", "classes/DI/Container.php", "classes/Exception/IteratorException.php", "classes/Formatter/ImplodeRecursive.php", "classes/Formatter/Post/DatePublishFormatted.php", "classes/Formatter/Post/DescriptivePostStatus.php", "classes/Formatter/Post/PostStatusIcon.php", "classes/ListScreenCollection.php", "classes/ListTable/RenderColumnTrait.php", "classes/Table/TableScreenCollection.php" ], "lines": 40, "branch": "main", "how": "API proposal (freeze.py filter applied to default-branch commits after the fix date); confirm at freeze", "flag": "" }, "idea": null }, "recommended": false } ] }