Two memory flaws in PHP core: request memory is read after it is freed
Two separate flaws in PHP core live in the same place, request cleanup: memory from one request is still read while the next one is handled. The path is any request that reaches PHP — no login, no special route.
What happens
CVE-2026-109618: on an out-of-memory error PHP uses longjmp() to leave the current context. Some contexts do not account for that, so request memory is left uninitialised, and the cleanup step reads or branches on it.
CVE-2026-109619: PHP's global state sometimes points into request memory. When it is not reset correctly, the next request reads stale state from freed memory.
Both are flaws in the engine itself, not in an extension, and NVD rates them CVSS 9.2. A malformed request can lead to code execution.
The path in
- Any request that reaches PHP. The flaw sits in request cleanup, so no login and no special route is needed to reach it.
- One path named so far:
session.upload_progress. Independent analysis points at thephp_session_rfc1867_callbackhandler inext/session/session.c. That is one path, not the only one. - Shared hosting: one FPM pool serves several sites, so one site's request can be the malformed request for another site in the same pool.
Which PHP
- The distro's build: the
php8.x-fpmpackage from the distro repository or a PPA. Patch withaptwhen the vendor ships the fix. - A container build: the
php:8.x-fpmimage or your own. The image must be rebuilt;apt upgradeon the host never reaches PHP inside the image. - An application image with its own PHP:
php -von the host says nothing about it.
Running is not installed
- FPM loads code at start-up: after the package upgrade,
kill -USR2the master process (a graceful reload) or restart the service. An upgraded package that was not reloaded still runs the old code. - Read configuration from the right SAPI too: CLI and FPM read different
php.inisets, and FPM is what serves requests.
Affected and fixed versions
| Product | CVE | Affected | Fixed in |
|---|---|---|---|
| PHP | CVE-2026-109618 | >=7.3.0 <8.2.35 · >=8.3.0 <8.3.36 · >=8.4.0 <8.4.27 · >=8.5.0 <8.5.12 | 8.2.35 · 8.3.36 · 8.4.27 · 8.5.12 |
| PHP | CVE-2026-109619 | >=5.4.0 <8.2.35 · >=8.3.0 <8.3.36 · >=8.4.0 <8.4.27 · >=8.5.0 <8.5.12 | 8.2.35 · 8.3.36 · 8.4.27 · 8.5.12 |
Original description (PHP · CVE-2026-109618): PHP uses longjmp() for out-of-memory (OOM) errors to exit the current context and abort handling of the request. Some contexts may not properly account for this scenario and leave request memory in an uninitialized state before performing an allocation. The subsequent request cleanup procedure may read or branch on this memory. Multiple OOM strategies can consistently trigger this condition and …
Original description (PHP · CVE-2026-109619): PHP has various global state that temporarily points into request memory. In some scenarios, global state may not be correctly reset, or may be repopulated after being reset. The global state may then refer to request memory even after it has been freed. Subsequent requests may read or branch on this stale state before it is fully initialized. Multiple strategies can trigger this condition and …
What to do
- Upgrade to the fixed release for your line — the table above lists them, read from the data's affected ranges.
- Lines out of support (8.1 and older) get no fix from the project: move to a supported line, or apply the mitigation below.
- Mitigation: set
session.upload_progress.enabled = Offthrough a drop-in file inconf.d— never by editingphp.ini, so a package upgrade cannot revert it — then reload FPM. - This is a mitigation, not a fix: public analysis suggests it closes one of two paths, so do not record a host as patched because the flag is off.
Check yourself
php -vTells you: the PHP version of the CLI SAPI
php-fpm -i | grep -i upload_progressTells you: the value FPM actually uses; Off => Off means it is off
grep -r session.upload_progress /etc/phpTells you: the configuration line; a line commented with ; still means on, because the compiled default is On
php -i | grep -i 'Loaded Configuration File'Tells you: (none) means compiled defaults apply, and that default is On
systemctl list-units 'php*-fpm'Tells you: the PHP lines running on this machine
docker exec <container> php -vTells you: the version inside the image, not on the host
Sources
Written from the original advisory and the vendor's documentation; versions come from the site's data, updated 2026-11-10. Where they differ, the original advisory wins.