CVE-2026-109619: PHP2Shell Stale-State Flaw, Advisory Summary and Fix
CVE-2026-109619: PHP2Shell Stale-State Flaw, Advisory Summary and Fix

As of 23 October 2026, CVE-2026-109619 is fixed in PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, it is not on CISA's Known Exploited Vulnerabilities list, and PHP has added a related informational advisory, CVE-2026-115560, that affects even patched releases under an unusual setup. CVE-2026-109619 is the second PHP2Shell flaw. The PHP project calls it "RCE via stale global state": leftover data from one web request can be reused by a later request on the same PHP worker, which can let an attacker who never logs in read server memory or run code.
The fix is to install a fixed PHP release or your distribution's patched package, restart every worker, and keep session.upload_progress.enabled=0 in place until PHP's next regular release if you don't need that feature.
This is a defender's summary for IT staff and developers. It does not explain how the flaw is triggered.
Key Takeaways
- CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp) is a PHP engine flaw. Confirmed impact includes memory disclosure and remote code execution, with no login required.
- PHP scores it CVSS 4.0 9.2. NVD scores it 8.1 (high) on CVSS 3.1; Red Hat rates it "Important" at 8.1; Ubuntu rates it "Critical."
- PHP's advisory names session upload progress (on by default), the PHP 8.5 fatal error backtrace and early configuration warnings as confirmed areas.
- Interim settings must go in php.ini, the FPM pool or server configuration. PHP says not to rely on ini_set() or .user.ini.
- Treat secrets held by an exposed PHP process (passwords, API keys, tokens) as possibly exposed if you find signs of attack.
What PHP Says About CVE-2026-109619
The PHP project's 21 October 2026 announcement describes it in one sentence: "request-owned internal state can survive after its backing memory has been freed. A later request handled by the same worker may use that stale state before normal initialization resets it."
| Item | Value |
|---|---|
| CVE ID | CVE-2026-109619 |
| GitHub advisory | GHSA-6wmf-4rv5-p3rp |
| PHP's name | RCE via stale global state |
| Confirmed impact (PHP) | "unauthenticated heap use-after-free, memory disclosure and remote code execution with the web worker's privileges" |
| Related follow-up | CVE-2026-115560, informational advisory, 23 October 2026 |
| NVD status, 23 Oct | Undergoing Analysis |
The advisory lists the same five weakness types as CVE-2026-109618: CWE-416 Use After Free, CWE-755 Improper Handling of Exceptional Conditions, CWE-824 Access of Uninitialized Pointer, CWE-1325 Improperly Controlled Sequential Memory Allocation and CWE-1419 Incorrect Initialization of Resource.
A note on naming: one research blog's table assigned some findings to the other CVE. PHP's own mapping, used here and on the researchers' php2shell.com site, puts session upload progress and the fatal error backtrace under CVE-2026-109619. For the companion flaw, see our CVE-2026-109618 summary.
How Severe Is It?
| Source | Score | Scale |
|---|---|---|
| PHP (the CVE numbering authority) | 9.2 | CVSS 4.0 |
| NVD (NIST) | 8.1 | CVSS 3.1 |
| Red Hat | Important, 8.1 | CVSS 3.1 |
| Ubuntu | Priority "Critical" | Ubuntu's own priority |
PHP's vector is CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N: network reachable, no privileges, no user interaction, high impact, with high attack complexity and attack requirements present. The lower NVD and Red Hat numbers use the older CVSS 3.1 method, so they are not a downgrade of PHP's rating. The 10.0 score that circulated before release was wrong, according to the PHP Foundation.
Who Is at Risk
PHP lists "all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed," and says "We consider the risk highest for mod_php." For this CVE, the GitHub advisory adds:
- mod_php and FPM: "Session lifecycle RCE was validated against mod_php and FPM."
- FPM settings passed by the web server: FPM is "conditionally exposed when nginx, Apache mod_proxy_fcgi or another frontend sends PHP_VALUE/PHP_ADMIN_VALUE parameters that produce a diagnostic before request initialization." If your web server passes PHP settings this way, check that none produce warnings.
- FrankenPHP: an early configuration path "was not established in the default configuration of FrankenPHP. This does not make this environment immune."
- Any application: PHP says session upload progress "is enabled by default, and no application call to session_start() is required."
Because this is in the engine, a WordPress, Drupal or Joomla update cannot fix it, and neither can hiding errors. The advisory is direct: "Changing error_reporting, using @, or disabling display_errors or log_errors does not protect against this vulnerability."
Affected and Fixed Versions
| Branch | Vulnerable | Fixed upstream release |
|---|---|---|
| PHP 8.5 | Below 8.5.12 | 8.5.12 |
| PHP 8.4 | Below 8.4.27 | 8.4.27 |
| PHP 8.3 | Below 8.3.36 | 8.3.36 |
| PHP 8.2 | Below 8.2.35 | 8.2.35 (end of life 31 December 2026) |
| PHP 8.1, 8.0, 7.4 | No official release | Source-only backports from PHP; vendor or distribution packages |
NVD's affected-product data for this CVE starts at PHP 5.4.0, and researchers report older branches are affected. Linux distributions patch without changing the upstream number: Ubuntu 24.04 LTS's fixed php8.3 package is 8.3.6-0ubuntu0.24.04.13, which still reports 8.3.6. Use our PHP2Shell fixed versions table and guide to checking your PHP version to confirm what your web server really runs.
Official Interim Settings for CVE-2026-109619
PHP's framing: these "reduce exposure to specific attack paths but do not make an installation safe." The settings for this CVE, quoted exactly from php.net:
- "Set session.upload_progress.enabled=0 and restart every worker. Use php.ini, an FPM pool or server configuration that applies before request parsing. Do not rely on ini_set() or FPM .user.ini. This blocks the confirmed session paths but not other variants."
- "On PHP 8.5, set fatal_error_backtraces=0 and restart every worker. This blocks the confirmed fatal backtrace path only."
- "Remove invalid or deprecated settings applied per request that emit diagnostics before initialization. Hiding diagnostics with error_reporting, display_errors or @ does not help."
- "Fix attacker-reachable fatal errors and execution timeouts, including failures in callbacks, upload or import processing and cleanup."
The GitHub advisory adds: "If performance is not a factor, consider limiting the number of requests a worker may execute using pm.max_requests=1." It also says "There is no complete generic configuration mitigation."
Caveats and side effects
| Setting | What it affects |
|---|---|
| session.upload_progress.enabled=0 | Only PHP's built-in upload progress tracking. Fastly notes most progress bars use JavaScript instead. PHP suggests keeping it off "even after applying the patch" if you don't need it. |
| fatal_error_backtraces=0 | PHP 8.5 only. Fatal error messages no longer include a backtrace. |
| pm.max_requests=1 | Each FPM worker handles one request and is replaced. Fastly calls the cost "severe"; test under load first. |
| Removing bad per-request settings | Check that the site still behaves the same afterward. |
Some researchers, including watchTowr and Datadog, warn that ini changes do not fully protect you. That matches PHP's own wording: partial, not complete. Both CVEs' settings are compared in our PHP2Shell interim mitigations guide.
Defender Note: CVE-2026-115560
On 23 October 2026, PHP published an informational advisory, CVE-2026-115560, about session upload progress. PHP says: "We suggest you set session.upload_progress.enabled=0 until the next regular bugfix release, to fully protect from an unlikely RCE vector." If you set it for CVE-2026-109619, "keep it in place and no further action is needed."
PHP says the issue needs "an unusual combination of configuration and application code," involving a site that changes its session serializer at runtime. Cloudflare notes it "affects fully patched PHP releases, including 8.5.12." CERT-EU says PHP will not issue an out-of-band release for it. As of 23 October, NVD has no record for CVE-2026-115560 yet.
Restart Every Worker
Each setting above, and the fix itself, only takes effect in fresh PHP processes. That matters more for this CVE than most, because the problem is state carried between requests on a running worker. Examples for Debian or Ubuntu (replace 8.3 with your version):
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2
Also restart long-running PHP workers and redeploy containers on a fixed image. On hosted plans, ask your host to confirm.
Detection Signs
There are no official indicators of compromise. Behavioral signs named by vendors, checked from at least 17 October 2026:
- Sophos: "requests containing the PHP_SESSION_UPLOAD_PROGRESS field" and "newly created or modified PHP files that may indicate web shells."
- Wiz: "unexpectedly large or malformed PHPSESSID response cookies, and unexplained PHP worker churn."
- Beazley: "child processes launched by PHP or web server workers."
- CISA: "PHP worker processes launching shells or downloading tools."
Two cautions from PHP's advisory: "absence of an error in logs is not proof of safety," and for an audit, "Enable log_errors=On, a functional error_log, and error_reporting=E_ALL in startup configuration during an isolated audit." Because memory disclosure is a confirmed impact, Beazley advises you "treat secrets held by an affected PHP process as potentially exposed." That means rotating database passwords, API keys and admin credentials, as covered in our access control and 2FA guide. If you find signs of a break-in, start with our PHP2Shell compromise check and how to remove malware.
Timeline and Primary Sources
| Date (2026) | Event |
|---|---|
| 11 August onward | Calif, Wiz (24 August) and OpenAI (further vectors, 18 September) report to PHP, per the PHP Foundation. All are credited on GHSA-6wmf. |
| 20 October | CVE IDs leak; PHP pre-announces at 19:30 UTC. |
| 21 October | Fixed releases around 14:00 UTC; GHSA-6wmf published 13:34 UTC. |
| 23 October | PHP informational advisory CVE-2026-115560; NVD record for 109619 "Undergoing Analysis"; not on CISA KEV. |
Read the primary sources: the php.net announcement, GitHub advisory GHSA-6wmf-4rv5-p3rp, and the NVD entry for CVE-2026-109619.
Conclusion
As of 23 October 2026, CVE-2026-109619 is a critical PHP flaw that can expose memory or allow code execution through state left over between requests. Install a fixed release or patched package, restart every worker, set session.upload_progress.enabled=0 in php.ini or the FPM pool if you don't use it, and keep it off until PHP's next regular release because of CVE-2026-115560. Need help with the server side? Our emergency PHP patching team can work with your host. Every PHP2Shell guide is in our PHP2Shell Resource Center.
Frequently Asked Questions
Does my site need to use PHP sessions to be affected?
No. PHP says session upload progress is on by default and "no application call to session_start() is required." Patch regardless of what your application does.
Can I turn off upload progress with ini_set() or .user.ini?
No. PHP says "Do not rely on ini_set() or FPM .user.ini." Set it in php.ini, the FPM pool or server configuration, then restart every worker.
Will turning off upload progress break my site?
Only if the site uses PHP's built-in upload progress tracking. Fastly says most upload progress bars use JavaScript instead. Test your upload forms after the change.
Is PHP 8.5.12 enough on its own?
It fixes CVE-2026-109619, but PHP's 23 October note on CVE-2026-115560 says to keep session.upload_progress.enabled=0 until the next regular bugfix release.
Should I rotate passwords and keys?
If you find signs of attack, yes. The advisory confirms memory disclosure as an impact, and Beazley advises treating secrets held by an affected PHP process as potentially exposed.
Put this into action with eSEOspace
We help businesses grow with maintenance & support that actually performs. Explore the services behind this guide:
Get a FREE Audit
We'll perform a comprehensive SEO, AEO, GEO & CRO audit of your website — completely free — and show you exactly how to outrank your competitors.
Don't have a site yet? Get in touch →
Get a FREE GEO/AEO/SEO Audit
We'll analyze your site's SEO, GEO, AEO & CRO — completely free — and show you exactly how to get found across Google and AI answers.
Don't have a site yet? Get in touch →
Great — your audit is on the way!
We'll send your free SEO/GEO/AEO/CRO audit within the next few hours. Where should we send it?
You're all set! ✓
Your free audit is being prepared — check your inbox in the next few hours. Talk soon!





