What is PHP?
PHP runs about 70 percent of the websites whose server-side language can be fingerprinted, and it is the foundation of WordPress, Drupal, Joomla, Magento, Nextcloud, and countless bespoke applications. It is also embedded, often invisibly, in network appliances and vendor management consoles.
What matters for this vulnerability specifically is how PHP is deployed. Under PHP-FPM, mod_php, or FrankenPHP, a pool of long-lived worker processes each handle request after request. PHP's design promise is that every request starts from a clean slate: memory allocated during a request lives in a per-request arena that is released wholesale at the end. A bug that lets state from one request survive into the next breaks that promise, and it breaks it between unrelated visitors on the same server.
Overview
CVE-2026-109619 is the second half of php2shell. Where its companion CVE-2026-109618 corrupts memory within a single request, this one reaches across the request boundary. A fatal error, in practice usually an attacker-forced out-of-memory condition, interrupts PHP before cleanup completes. Internal global structures are left holding pointers into the per-request memory arena. Request shutdown then frees that arena anyway. The worker process stays alive, and the next request it handles dereferences pointers to memory that has been freed and very likely reallocated with attacker-chosen contents.
That is a use-after-free with an unusually comfortable exploitation window: the attacker sends a first request to poison the worker, then a second request to groom the heap and trigger the reuse. No authentication and no user interaction are needed at any step, and the trigger happens inside PHP's own parsing, before any application routing.
NVD scores this 8.1 with AC:H, reflecting the heap grooming and worker-affinity requirements; the PHP project scores both php2shell issues CVSS v4.0 9.2. Note also a mapping disagreement in the published analysis: Red Hat, watchTowr, and CISA's own catalogue titles describe this CVE as the stale-state issue and CVE-2026-109618 as the in-request corruption, while Sansec and Wiz assign the specific upload-progress and fatal-error-backtrace bug chains the other way round. The practical guidance is identical either way, because the same releases fix both.
Affected Versions
| Product | Vulnerable | Fixed |
|---|---|---|
| PHP 8.5 | 8.5.11 and earlier | 8.5.12 |
| PHP 8.4 | 8.4.26 and earlier | 8.4.27 |
| PHP 8.3 | 8.3.35 and earlier | 8.3.36 |
| PHP 8.2 | 8.2.34 and earlier | 8.2.35 |
| PHP 8.1, 8.0, 7.4 | All (end of life) | No upstream release; minimal source backports published, plus distribution and LTS vendor builds |
| PHP 7.3 and earlier | All (end of life) | No fix; migrate to a supported branch |
| RHEL 7 php package | Affected by this CVE (unlike CVE-2026-109618) | Vendor errata, or disable session upload progress |
The vulnerable path dates to PHP 5.4.0, released in 2012, and is present in default configurations. All web SAPIs are in scope: PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, and LiteSpeed. Verify the fix from the package changelog rather than the version string alone, for example rpm -q --changelog php-common | grep CVE-2026-109619 or the equivalent zgrep against the Debian changelog.
Technical Details
The CWE is CWE-416, use after free: the program keeps and later follows a pointer to memory it has already released.
Calif documents two concrete chains, one per deployment style. On Apache mod_php, a multipart file part can initialise the session through the session upload progress feature before module activation has finished. If parsing then hits a fatal, the session cleanup is skipped, but request shutdown still frees the heap, leaving session globals pointing at freed memory. A later multipart request without a file part reads and destroys that stale data. On PHP-FPM, a fatal during unserialize decoding skips php_var_unserialize_destroy(), leaving a dangling decoder pointer and a non-zero nesting level that a subsequent upload progress request reuses. A negative used_slots value in a destructor block then gives the attacker control over where a zval is written, which is the step that converts corruption into execution.
Session upload progress is enabled by default and is the confirmed path for this CVE; it is not the only one. The SAPI difference matters: PHP-FPM workers exit on an early initialisation failure, which is why CVE-2026-109618 is hard to exploit there, but a fatal raised after startup leaves the worker alive, which is exactly the condition this bug needs. A closely related third issue, CVE-2026-115560, covers a session upload progress serialisation-handler switch and is being fixed in a routine release.
Discovery
The php2shell pair was found by Calif, with OpenAI and Wiz also credited by the PHP project and Red Hat. The published write-up is by Ryan Austin (@lcfr_hax) of Calif, building on a long lineage: Stefan Esser's 2004 memory-limit RCE, PHP bug #78876 from 2020, and a 2024 OSTIF and Quarkslab audit that flagged a related out-of-memory issue without proving exploitation. This second bug was reported to the PHP project on 2026-08-21, ten days after the first. Volker Dusch of the PHP Foundation coordinated disclosure, and the release was pulled forward from 2026-10-22 to 2026-10-21 when the CVE identifiers leaked.
Exploitation Context
CISA added both php2shell CVEs to KEV on 2026-10-26 on evidence of active exploitation, with a three-day remediation deadline. watchTowr reported attack traffic against its Attacker Eye honeypots on release day, and Cloudflare began blocking attempts at 07:43 UTC on 2026-10-21. On 2026-10-24 a researcher at Perplexity published a confirmed honeypot RCE including an 800 KiB memory disclosure, though on an intentionally favourable single-worker mod_php target.
The counterweight is worth recording. Sansec tested the public proof-of-concept code and found it does not work against a default installation; most public PoCs additionally require a local file inclusion bug in the target application, and in some cases the tester had added one. No single universal request has been demonstrated, which argues against indiscriminate mass exploitation even while targeted exploitation is real.
Censys counts more than 32.51 million PHP services still on an affected version. No threat actor has been attributed and no ransomware use has been reported. Note that a WAF sitting in front of the application cannot see this: the vulnerable code runs inside PHP before application code, which is why Sansec states plainly that its own Shield product does not cover this layer.
Remediation
- Update to PHP 8.5.12, 8.4.27, 8.3.36, or 8.2.35, then confirm the CVE appears in the installed package changelog. Patching is the only complete fix.
- Inventory every PHP interpreter, including those bundled inside appliances, vendor consoles, and third-party container images, and check vendor advisories where PHP is embedded.
- If you run PHP 8.1 or earlier, apply a distribution or LTS vendor backport, or follow CISA's instruction to take the system offline until it can be moved to a supported branch.
- Until patched, set
session.upload_progress.enabled = 0. This is the single most effective mitigation for this CVE and fully removes the RHEL 7 exposure, but it does not close every path. The directive is commented out in the shippedphp.ini, so it must be added explicitly. - Add
memory_limit = -1only where an external cgroup or container limit is enforced, reducepost_max_sizeto 8M or 32M withupload_max_filesizebelow it, and on PHP 8.5 setfatal_error_backtraces = 0. Apply withphp_admin_valueand restart workers, since a reload does not pick these up. - Where file uploads are not needed, block
multipart/form-datarequest bodies at nginx or Apache. Test a checkout or form submission afterwards, because this breaks more than uploads. - Reduce worker lifetime so poisoned state is discarded quickly: lower
pm.max_requestsin the PHP-FPM pool. This narrows the window rather than closing it. - Hunt for PHP worker processes spawning shells or fetching remote tools, for repeated multipart POSTs that trip the memory limit, and for abnormally large responses indicating memory disclosure. CISA publishes SIGMA rules for this in its GitHub repository.
- Federal civilian agencies must remediate by 2026-10-29 under BOD 22-01.
Key Details
| Property | Value |
|---|---|
| CVE ID | CVE-2026-109619 |
| Vendor / Product | PHP Group — PHP |
| NVD Published | 2026-10-21 |
| NVD Last Modified | 2026-10-27 |
| CVSS 3.1 Score | 8.1 |
| CVSS 3.1 Vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Severity | HIGH |
| CWE | CWE-416 find similar ↗ |
| CISA KEV Added | 2026-10-26 |
| CISA KEV Deadline | 2026-10-29 |
| Known Ransomware Use | No |
CVSS 3.1 Breakdown
Required Action
Timeline
| Date | Event |
|---|---|
| 2026-08-01 | Calif researchers identify several independent paths from an interrupted request to code execution |
| 2026-08-21 | The second of the two php2shell bugs reported to the PHP project |
| 2026-10-20 | CVE identifiers leak ahead of the embargo; PHP brings the release forward |
| 2026-10-21 | PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 released; CISA issues an alert the same day |
| 2026-10-21 | Cloudflare reports blocking attack traffic from 07:43 UTC, before most sites had patched |
| 2026-10-24 | Successful php2shell RCE with memory disclosure confirmed against a honeypot |
| 2026-10-26 | Added to CISA Known Exploited Vulnerabilities catalog |
| 2026-10-29 | CISA BOD 22-01 remediation deadline |
References
| Resource | Type |
|---|---|
| NVD - CVE-2026-109619 | Vulnerability Database |
| CISA KEV Catalog Entry | US Government |
| PHP - Security Advisory: Critical Remote Code Execution Vulnerabilities, Update Now | Vendor Advisory |
| Red Hat RHSB-2026-013 - Request Handling Memory Corruption in PHP (php2shell) | Vendor Advisory |
| Calif - PHP2Shell: A Tale of Two PHP Remote Vulnerabilities | Security Research |
| watchTowr - PHP2Shell RCE Exploited in the Wild | Security Research |
| Sansec - PHP2Shell: PHP RCE and What It Means for Stores | Security Research |
| Help Net Security - PHP2Shell: Critical PHP Vulnerabilities Patched, Update Now | News |
| The Hacker News - CISA Confirms Active Exploitation of Two PHP2Shell Flaws | News |
| CISA Alert - Critical Vulnerabilities in PHP Require Immediate Patching | US Government |