Files
Marius CiepluchandClaude Opus 5.5 d86ba281ec bench(independent): reserve population v3 (PHP, 16 cases) by rule
Maintainer's selection 2026-09-30, "Recommended 16, minus v2 mentions": the
research's rule-based 16 with Winter, elFinder and Easy!Appointments replaced
by the next candidate in their family by the same rule (named fix first, then
newest first), v2-mentioned alternates (Grav, Backpack CRUD, Koel) skipped.
Winter -> mantisbt-tokenizer-eval-rce; elFinder -> pagible (inferred fix, to
be confirmed at freeze); Easy!Appointments -> empty slot (no remaining
untrusted_destination candidate), so 15 cases are reserved.

The reservation guard now covers v3: all six families, a declared-language
population, status "reserved".

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
2026-09-30 18:03:07 +02:00

1809 lines
75 KiB
JSON

{
"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": "`<enclosure url>` 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": "`'<span class=\"text-primary\">'.$group->getTranslation('title').'</span>'` in modules/utenti/edit.php",
"source": "group name saved when creating a user group",
"sites": [
"modules/utenti/edit.php::<global>"
],
"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
}
]
}