Security alert · 21 October 2026 · updated after PHP’s release
Two critical PHP flaws, patched today: what WordPress and server operators must do now
At 14:00 UTC on Wednesday 21 October 2026 the PHP project released PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, fixing two vulnerabilities it rates critical, CVSS v4.0 9.2, that allow unauthenticated remote code execution in PHP itself: CVE-2026-109618, a memory corruption reached through out-of-memory handling, and CVE-2026-109619, request state that survives after its memory has been freed. PHP says every installation that serves web requests is at risk, with Apache and mod_php the most exposed, that there are no complete mitigations, and that updating is the only safe choice. Details had leaked a day early under the name php2shell. PHP 8.1 and older receive no release, but the security team has published minimal source backports for 7.4, 8.0 and 8.1 and says distributions and long-term-support vendors got the patches in advance. This is a flaw in the runtime under every WordPress, WooCommerce, Laravel and Magento site, not in any plugin, so nothing you change inside WordPress closes it. Here is what PHP has published, what it means for each hosting stack, and what to do now, in order.
Prepared by G. Schad, WordPress and Linux security specialist
CVE-2026-109618 (RCE via out-of-memory corruption) and CVE-2026-109619 (RCE via stale global state), both unauthenticated, both CVSS v4.0 9.2, in PHP core
Fixed versions
PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, released 21 October 2026 at 14:00 UTC (16:00 CEST, 10:00 EDT)
Who is at risk
Every PHP installation serving web requests: PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. PHP rates mod_php the highest risk, with a demonstrated unauthenticated exploit
PHP 8.1 and older
No release from PHP; minimal source backports for 7.4, 8.0 and 8.1 on GitHub, and distributions and LTS vendors received the patches in advance
Exploitation
None reported in the wild at the time of this update; PHP validated an exploit against mod_php during its own work, and code claiming to be an exploit was circulating before the release
Start here
The short version: a runtime flaw, a leaked embargo, and a fix that now exists
On 20 October a post on Hacker News claimed that two remote code execution flaws in PHP, rated CVSS 10, would be disclosed on 22 October. The post was removed, but screenshots spread, a researcher on X named the reserved identifiers CVE-2026-109618 and CVE-2026-109619, and the security firm watchTowr confirmed publicly that the flaws are real, that it did not discover them, and that it had reproduced one of them. That evening the PHP security team published an advance notice on php.net: a security release for Wednesday 21 October at 14:00 UTC, addressing two critical vulnerabilities, both rated CVSS v4.0 9.2. The release came out on time, with a security advisory on php.net and a GitHub advisory for each flaw.
PHP’s advisory describes the two flaws in a few sentences each. CVE-2026-109618, which PHP calls remote code execution via out-of-memory corruption: out-of-memory handling can interrupt PHP while its internal request data is only partly initialised, and request cleanup then treats the invalid data as valid. CVE-2026-109619, remote code execution via stale global state: internal state that belongs to one request can survive after its memory has been freed, and a later request handled by the same worker can use that stale state before normal initialisation resets it. Both are reachable by an unauthenticated request, both give code execution as the web server’s user, and PHP’s advisory rates the risk highest for Apache with mod_php, where a demonstrated exploit triggers the attack before any application code runs.
What makes this different from the plugin and Core flaws these briefings usually cover is where it sits. The flaw is in PHP, the interpreter that runs WordPress, so it is reachable on any site that executes PHP regardless of which plugins are installed, how well they are maintained, or whether WordPress itself is current. You cannot fix it from within the application. The fix is a new PHP package, installed by whoever operates the server, followed by a restart of the PHP processes. The version range remains the lasting problem: PHP has fixed the four branches it supports, has published minimal source backports for 7.4, 8.0 and 8.1 given the severity, and says distributions and long-term-support vendors received the patches in advance. Mallory’s Shodan count on 20 October found about 1.5 million internet-facing hosts that announce a PHP version, and 59 percent of them announce a branch that gets no upstream release.
Figure 1 · Status after PHP’s release of 21 October
A flaw in the interpreter: nothing inside WordPress closes it.
Question
Status after the release
What to do
Severity
Two unauthenticated RCEs in PHP core, CVSS v4.0 9.2
Treat as an emergency; update today
Patch
PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, 21 October 14:00 UTC
Install the package, then restart PHP-FPM or Apache
Who is at risk
Every PHP serving web requests; mod_php highest, FPM included
Update per site, not per server; check what each site selects
PHP 8.1 and older
No release; source backports for 7.4, 8.0, 8.1; vendors had patches early
Move to a supported branch or confirm a vendor backport
Exploitation
None reported in the wild; PHP validated an exploit on mod_php
Expect scanning of unpatched servers within hours
Mitigations
Partial, per PHP: upload progress off, memory_limit -1, low post_max_size
Only while the update is hours away; not a fix
What PHP has confirmed about the two vulnerabilities since its release of 21 October 2026 at 14:00 UTC, and what each item means for a WordPress or server operator.
What PHP has confirmed
Two critical, unauthenticated remote code execution flaws in PHP core, CVSS v4.0 9.2 each, fixed in 8.5.12, 8.4.27, 8.3.36 and 8.2.35, released 21 October at 14:00 UTC. Every installation serving web requests is at risk: PHP-FPM, mod_php, php-cgi, FrankenPHP and LiteSpeed, with mod_php the highest risk.
What PHP says about mitigations
There are no complete mitigations and updating is the only safe choice. For systems that cannot update immediately, PHP lists settings that reduce exposure to specific attack paths: memory_limit=-1 and a low post_max_size for the first flaw, session.upload_progress.enabled=0 and, on 8.5, fatal_error_backtraces=0 for the second. They are given below with PHP’s own caveats.
What about older PHP
PHP 8.1 and older receive no release. The security team published minimal source backports for 7.4, 8.0 and 8.1 on GitHub for people who build from source or have no vendor, and says distributions and LTS vendors got the patches in advance, so a Debian, Ubuntu or CloudLinux package can carry the fix under the old version number. Check your vendor rather than the version string.
What you must do now
Update the supported branches and restart PHP, move or patch every site on an older branch, verify from the web side which PHP actually serves each site, apply the mitigations only where an update is genuinely hours away, and watch what the PHP workers spawn on anything that stayed exposed.
What is known
Each claim from the leak, and what PHP’s advisory now says about it
Most of what circulated about these flaws before 14:00 UTC came from a leak, not from the vendor. This table sets each claim against PHP’s security advisory and the two GitHub advisories it links. Where the two disagree, the advisory wins.
Two details in the GitHub advisories matter for choosing what to do first. For CVE-2026-109618, PHP says Apache with mod_php is affected by default because it runs request shutdown even after a failed startup, while PHP-FPM exits the child process on startup failure and is less exposed; no complete PHP-FPM exploit had been demonstrated for this flaw, FrankenPHP is likely susceptible, and LiteSpeed’s LSAPI is likely susceptible but unvalidated. For CVE-2026-109619, the session upload-progress path was validated on both mod_php and PHP-FPM, and a second path through fatal error backtraces was confirmed on PHP 8.5 with mod_php. A WordPress server on PHP-FPM is therefore not out of scope; it is in scope for the second flaw and probably for the first.
Claim before the release
Source
What PHP’s advisory says
Two critical flaws, CVSS v4.0 9.2, fix due 21 October 14:00 UTC
PHP security team, php.net, 20 October
Confirmed; released on time. Both advisories carry the vector CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H, network-reachable, no privileges, no user interaction
Both are remote code execution; one has been reproduced in a lab
watchTowr, statement on X and its FAQ
Confirmed: both allow unauthenticated remote code execution as the web worker’s user. PHP validated an exploit over HTTP against mod_php with default limits
Identifiers CVE-2026-109618 and CVE-2026-109619
Leaked post, repeated by watchTowr and most reporting
Confirmed. CVE-2026-109618 is GHSA-w8hw-w9fx-j79w, RCE via OOM corruption; CVE-2026-109619 is GHSA-6wmf-4rv5-p3rp, RCE via stale global state
Every PHP release from 5.x onward is affected
Leaked post; the exploit tool’s banner reportedly claims 5.4.0 and later
The advisories list the affected range as everything before the fixed versions. PHP does not name a lower bound, but it published backports for 7.4, 8.0 and 8.1, which it would not do for unaffected branches. Assume everything older is affected too
CVSS 10.0
Leaked post and early reporting
Superseded; PHP’s rating is 9.2, with attack complexity rated high
Fixed versions will be 8.5.12, 8.4.27, 8.3.36 and 8.2.35
Alpine Linux packaging, Kevin Beaumont, several trackers
Confirmed: exactly those four
The bug is in the session upload-progress feature, reached through a crafted multipart POST
GMO Flatt Security, from a leaked exploit video; repeated by Sansec and Syhunt
Half right. Session upload progress is one confirmed path for CVE-2026-109619, and disabling it is one of PHP’s listed mitigations, which blocks the confirmed session paths but not other variants. CVE-2026-109618 is a separate flaw in out-of-memory handling, and crafted multipart requests are one way to drive a worker there
No exploitation in the wild
Huntress, watchTowr, Sansec
Still true at the time of this update; PHP does not report in-the-wild exploitation. The patch is now public and shows attackers where to look
Every WordPress site, through the server it runs on, and most of all the ones on old PHP
WordPress officially recommends PHP 7.4 or newer and still runs on 7.2.24. That generosity is now a liability. A great many WordPress sites, especially older ones on shared hosting, run PHP 7.4, 8.0 or 8.1 because that is what the panel selected years ago and nothing broke. None of those branches will receive a fix from PHP. Mallory’s branch counts from Shodan on 20 October show the shape of it: 106,834 hosts announce PHP 8.1, 78,955 announce 8.0, 68,895 announce 7.4, 184,302 announce 7.2 and 187,154 still announce 5.6. These are banners, not confirmed vulnerable systems, and they exclude the roughly 740,000 hosts that hide their version, so the real number is higher.
Shared hosting multiplies this. One host in those counts is one server, and a cPanel or Plesk server commonly runs hundreds of sites, each pinned to a PHP version its owner chose in the panel. Mallory’s provider table puts Hostinger at 142,401 PHP hosts, Hetzner at 51,354, DigitalOcean at 47,105 and OVH at 36,848. On such a server the operator can update the ea-php or alt-php packages for the supported branches, but every site still selecting 7.4 or 8.1 stays exposed until it is moved to a branch that has the fix.
PHP’s advisory settles which ways of running PHP are in scope: all of them that serve web requests, which it lists as PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. It rates mod_php the highest risk, because the demonstrated exploit for the out-of-memory flaw works with default input and memory limits and a normal prefork configuration, and because mod_php runs request shutdown even after a failed startup where PHP-FPM would simply exit the worker. A typical cPanel server runs mod_php or LSAPI; a typical Nginx server runs PHP-FPM, which PHP describes as less exposed to the first flaw but confirmed vulnerable to the second through session upload progress. The command-line interpreter does not receive web requests, but it is the same binary and is updated by the same package.
Where PHP runs
Who updates it
What to check
Debian, Ubuntu, RHEL and derivatives, distribution packages
The system administrator, through apt, dnf or yum. PHP says Linux distributions and LTS vendors received the patches in advance, so updated packages should follow quickly
Distribution versions lag upstream by design: Debian 12 ships 8.2, Ubuntu 22.04 ships 8.1 and Ubuntu 24.04 ships 8.3. A security update keeps the branch number and adds the fix, so compare the package changelog or the distribution’s advisory, not the version string
cPanel and WHM, EasyApache 4
cPanel publishes ea-php82 to ea-php85 packages; the server operator installs them. Each site picks its version in MultiPHP Manager
Which ea-php versions are installed, and which sites select 7.4, 8.0 or 8.1. Watch the EasyApache 4 change log for the rebuilt packages and whether cPanel backports to ea-php74, ea-php80 and ea-php81
CloudLinux, alt-php and HardenedPHP
CloudLinux publishes alt-php packages. HardenedPHP is its programme for backporting security fixes to end-of-life alt-php versions
CloudLinux’s knowledge-base note said updated packages would follow PHP’s release and that availability would be posted there. PHP’s statement that LTS vendors had the patches in advance makes a HardenedPHP backport for 7.x and 8.1 likely; confirm it on that page before relying on it
Plesk
Plesk ships its own PHP packages per version; the operator installs them and each domain selects a version
The installed Plesk PHP versions and each domain’s handler
Docker and container images
Whoever builds the image. A running container does not pick up a fix until the image is rebuilt and redeployed
The base image tag in every Dockerfile; restarting the same container changes nothing
Managed WordPress hosting, shared hosting
The provider
Ask which PHP branches they will update, when, and what happens to sites still on 7.4 or 8.1
Appliances, panels and Windows software that bundle PHP
The vendor
An inventory; these are the installations nobody remembers until they are exploited
How a coordinated disclosure became a public countdown
When (UTC)
What happened
Source
Original plan
Coordinated disclosure set for Thursday 22 October, 15:00 UTC (11:00 ET, 18:00 CEST)
watchTowr; the removed Hacker News post
20 Oct, about 15:20
A Hacker News post claims two PHP remote code execution flaws, CVSS 10, will be announced on 22 October. It is removed; screenshots spread on X and Mastodon, and a post names the reserved CVE identifiers
Sansec timeline; Threat Landscape
20 Oct, afternoon
watchTowr states the flaws are real, that it did not find them, that it has reproduced one, and that “we were all supposed to wait until Thursday at 11am ET”
watchTowr on X; Huntress
20 Oct, 19:33
PHP publishes its advance notice: two critical vulnerabilities, CVSS v4.0 9.2, release on 21 October at 14:00 UTC, possibly earlier
php.net
20 Oct, evening
Mallory publishes Shodan exposure figures; Huntress publishes its rapid-response guidance and begins baselining PHP process behaviour across its partner base
Mallory; Huntress
21 Oct, 02:12
GMO Flatt Security publishes its analysis of a leaked exploit video, pointing to session upload progress; by 05:00 it adds that the mitigation is partial and that exploit code is circulating
Flatt Security (times converted from JST)
21 Oct, 14:00
PHP releases 8.5.12, 8.4.27, 8.3.36 and 8.2.35 and publishes its security advisory: two unauthenticated remote code execution flaws, CVE-2026-109618 (OOM corruption) and CVE-2026-109619 (stale global state), with GitHub advisories, partial mitigations, and source backports for 7.4, 8.0 and 8.1
php.net; GitHub advisories GHSA-w8hw-w9fx-j79w and GHSA-6wmf-4rv5-p3rp
Next
Distribution, cPanel, CloudLinux and Plesk packages; exploitation attempts against servers that have not updated
Updating PHP on each stack, and proving the fix is actually serving requests
The fixed releases are PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, confirmed by PHP. Source and Windows builds are on php.net; distribution, panel and vendor packages follow their own channels, and PHP says those vendors had the patches before the release. Work through this per server and then per site, and write down what you change.
01
Inventory every PHP version and how it serves requests
On each server, record the interpreter version and which processes handle web requests:
The first command shows the command-line interpreter, which can differ from what the web server uses; the second shows which server processes handle web requests, and whether it is mod_php, the case PHP rates highest; the third lists the distribution’s PHP packages.
02
On cPanel and CloudLinux, list the packages and the per-site selection
The installed branches and what each site actually runs:
The second command prints the system default and every per-domain PHP version; anything on ea-php74, ea-php80 or ea-php81 is a site that the supported-branch packages will not fix. Plesk users can read the same from the PHP settings of each domain.
03
Debian and Ubuntu, distribution packages
Apply the distribution’s security update as soon as it is published:
shell
$ apt update$ apt list --upgradable2>/dev/null|grep-i php$ apt upgrade
A distribution package keeps its branch number and adds the fix, so Ubuntu 24.04 will still report 8.3.x and Debian 12 will still report 8.2.x; the package changelog or the distribution advisory is what confirms the fix. Ubuntu 22.04 ships PHP 8.1 and is in standard support until April 2027, and PHP’s statement that LTS vendors received the patches in advance makes a Canonical backport likely; confirm it on the Ubuntu CVE pages before treating 8.1 there as fixed. Third-party repositories such as the Sury packages follow their own schedule.
04
cPanel and WHM
Watch the EasyApache 4 change log, then update the PHP packages and check what each site uses:
Then move every site still on ea-php74, ea-php80 or ea-php81 to a fixed branch in MultiPHP Manager, and test it, unless cPanel publishes rebuilt packages for those branches. On a CloudLinux server, do the same for the alt-php packages when CloudLinux announces them, and check its note for HardenedPHP coverage of the older branches.
05
PHP 7.4, 8.0 and 8.1 built from source
PHP has published minimal source backports of both fixes in the php-src repository, on the branches PHP-7.4-CVE-2026-109618-109619, PHP-8.0-CVE-2026-109618-109619 and PHP-8.1-CVE-2026-109618-109619. They are for people who build PHP themselves or have no LTS vendor; they are not releases, carry no other fixes, and do not change the fact that those branches are end of life. If you run one of them from a vendor package, wait for the vendor; if from your own build, rebuild from the branch and restart.
06
Restart the processes, or the fix is not running
A package update replaces files on disk; the PHP-FPM workers that are already running keep the old code until they are restarted. With mod_php, Apache must restart. For example:
Use the unit names your server has; a cPanel server restarts through WHM or the restart scripts. Rebuild and redeploy any container image that includes PHP; restarting the same container changes nothing.
07
Verify from the web side, not the command line
Confirm the version that serves requests: in WordPress at Tools, Site Health, Info, Server, or through a temporary phpinfo page that you delete afterwards. On a multi-version server, check one site per branch. On a distribution package, compare the package version against the advisory rather than the PHP version string. Then remove any interim php.ini changes you no longer need.
08
Keep watching for a week
The patch is public and exploitation attempts against servers that have not updated are the expected next step. A server patched by 15:00 UTC is in a good position; a site moved from 8.1 to 8.3 on Friday was exposed for three days. For anything that stayed exposed, review the child processes of the PHP workers, new files in web roots, new cron entries and new administrators as in the indicators section.
PHP’s advisory is explicit: only an update is a complete solution, and the measures below reduce exposure to specific attack paths but do not make an installation safe. They are for the system that will be updated in hours, not days. Each must be set where it applies before request parsing, that is in php.ini, an FPM pool or the web server configuration, and the workers must be restarted afterwards; ini_set() in application code and FPM .user.ini files do not count. Work from a trusted device and write down what you change so you can revert it.
01
Against CVE-2026-109619: disable session upload progress and restart every worker
This blocks the confirmed session paths but, in PHP’s words, not other variants. In php.ini or a conf.d drop-in, or in every PHP-FPM pool:
php.ini, or a PHP-FPM pool file
; php.ini or conf.d drop-insession.upload_progress.enabled = 0; PHP-FPM pool, /etc/php/*/fpm/pool.d/ or /opt/alt/php*/etc/php-fpm.d/php_admin_flag[session.upload_progress.enabled] = off
Then restart PHP-FPM or Apache, not merely reload, and confirm what the web SAPI sees with a phpinfo page you delete afterwards, or from WordPress at Tools, Site Health, Info, Server. The command-line interpreter reads its own php.ini and will not tell you. WordPress does not use session upload progress, so this costs nothing on a WordPress site.
02
On PHP 8.5 only: disable fatal error backtraces
The second confirmed path for CVE-2026-109619 goes through the fatal error backtrace feature introduced in 8.5. PHP says to set it off and restart every worker; it blocks that path only:
php.ini, PHP 8.5
fatal_error_backtraces = 0
Or php_admin_flag[fatal_error_backtraces] = off in the pool. 8.4 and older do not have the setting.
03
Against CVE-2026-109618: remove the controllable memory limit, and bound request size instead
PHP’s mitigation is to set memory_limit to -1 in a way applications cannot override, and to check that no pool, directory or application setting puts a finite limit back; this removes the memory-limit failure an attacker can trigger on purpose, though an underlying allocation failure can still reach the vulnerable path. Then cap the request size so a worker cannot be driven out of memory from outside:
PHP suggests post_max_size of 8M where the application does not need uploads and 32M where it does, with upload_max_filesize below it; WordPress needs uploads, and a theme or plugin update through the dashboard needs post_max_size at least as large as the ZIP file. Note what WordPress loses with memory_limit unlimited: a runaway request can take the worker’s memory until the operating system intervenes, which is why PHP pairs this with a container or cgroup limit as the availability boundary, preferably one that kills only the affected worker. Do not substitute RLIMIT_AS or RLIMIT_DATA, because PHP says those can cause exactly the allocation failure that reaches the vulnerable path.
04
Enforce the request limits at the web server or proxy as well
PHP asks for limits on decoded request size, input field count, multipart part count, header count and nesting depth, and says they must also cover requests without a usable Content-Length. In Nginx that is client_max_body_size and large_client_header_buffers; in Apache, LimitRequestBody, LimitRequestFields and LimitRequestFieldSize; the GitHub advisory additionally suggests lowering max_input_nesting_level and bounding max_input_vars and max_file_uploads in PHP itself. Set them to what your largest legitimate upload needs, not to zero.
05
Blocking multipart requests at the front: now a listed workaround, still a trade-off
PHP’s GitHub advisory for CVE-2026-109618 lists blocking multipart requests at the front end as a workaround for applications that do not use them. WordPress uses them for every media upload, every plugin and theme ZIP and most contact forms, so a blanket rule breaks the site. If you use one, scope it to paths that never accept uploads, test it, and remove it once patched. The same goes for the Apache rewrite rule Syhunt published before the release.
06
Remove per-request settings that emit diagnostics, and fix fatal errors attackers can reach
PHP’s last two mitigations for CVE-2026-109619 are housekeeping with a security purpose: remove invalid or deprecated INI settings applied per request that produce a diagnostic before initialisation, because hiding the diagnostic with error_reporting, display_errors or the @ operator does not help; and fix fatal errors and execution timeouts an attacker can trigger, including failures in callbacks, upload or import processing and cleanup. On a WordPress server that means reviewing .htaccess and .user.ini files for stale php_value lines and clearing the fatal errors in the PHP error log that a visitor can cause on demand.
07
What the earlier advice got right and wrong
Before the release, researchers suggested disabling session upload progress and enabling session.use_strict_mode. The first is now PHP’s own mitigation; the second does not appear in PHP’s advisory, does no harm, and should not be counted as protection. The advisory for CVE-2026-109619 also mentions, where performance allows, setting pm.max_requests to 1 in PHP-FPM so that no worker handles a second request with stale state; on a busy WordPress site that respawns a worker per request, which is expensive, and it is the kind of measure to use for an hour, not a week.
08
Prepare to see exploitation
A memory-corruption exploit in PHP ends with PHP spawning something it should not. List the child processes of the PHP workers now, so you know what normal looks like on each server:
shell
$ for p in $(pgrep-x php-fpm);dops-o pid=,user=,comm= --ppid"$p";done|grep-vE'php-fpm|^$'
On a WordPress server this should return nothing, or only processes you can name. Huntress’s guidance is to alert when php-fpm, php-cgi, httpd or apache2 launches sh, bash, curl, wget, python, perl or nc. A host with endpoint detection has this already; a host without can log it with a process watcher, which records but prevents nothing.
09
Tell your clients and your provider
Agencies: tell site owners that a server-level PHP update is being applied and that a short restart is part of it. Shared-hosting customers: ask the provider which branches they have updated, when, and what they intend for sites on 7.4 or 8.1. A scheduled update is not a deployed one; ask for confirmation afterwards, and check Site Health yourself.
What exploitation of a PHP flaw leaves behind, and where to look
PHP’s advisories describe the shape of an attack without publishing one. For CVE-2026-109618 it is a request, typically multipart, built to drive the worker out of memory while staying inside the apparent PHP limits: a missing Content-Length, very many headers, empty file controls, deeply nested field names. For CVE-2026-109619 it is a pair of requests to the same worker, the first causing a fatal error, an out-of-memory condition or a diagnostic during shutdown, the second using the stale state, for example through the session upload-progress feature. Nobody has published indicators specific to either, so what follows is what exploitation of a code-execution flaw in PHP produces in general, and is the same list Huntress recommends. Preserve before you remove.
Now that PHP has published the details, Huntress intends to release Sigma and YARA rules through its public threat-intel repository, and web application firewall vendors will ship signatures. Neither covers the first hours after the release, which is why the process-level watch matters more than usual here.
Indicator
Where to look
What it means
A PHP worker with a child process that is a shell, an interpreter or a download tool
Process list; the child-process check above; endpoint detection
The clearest sign of code execution through PHP. Reconnaissance commands such as whoami, id and uname -a are typical first steps
New or modified PHP files in uploads, mu-plugins, the site root or other plugins’ folders
The file system, by modification time since 20 October and by content
A webshell written for persistence; the exploit itself leaves no file
An administrator account you did not create, or a changed administrator email
wp user list --role=administrator; the wp_users table
The attacker converting server access into durable application access
New cron entries, for the account user or system-wide
crontab -l for each user; /etc/cron.d; /var/spool/cron
Persistence that survives a file cleanup and a PHP update
New SSH keys in authorized_keys, new system users
Every account home; /etc/passwd
The incident has left the web layer; the question is now the whole server
Outbound connections from PHP workers to unfamiliar addresses
Connection monitoring, firewall logs
A reverse shell or a loader fetching its next stage
Bursts of “Allowed memory size exhausted” fatal errors, or fatal errors from the same client, in the PHP error log
The PHP-FPM or Apache error log since 20 October, grouped by client address and path
The first flaw is reached by driving a worker out of memory and the second by a fatal error that leaves state behind; a burst of either from one source, against pages that never produce them, is an attempt
Unusual multipart POST requests to pages that accept no uploads, or POSTs carrying the PHP_SESSION_UPLOAD_PROGRESS field
Web server access logs; the method and path, since the content type and body are not usually logged
A possible exploitation attempt against either flaw; useful for scoping now that the attack shape is public
What this means: the application is not the attack surface this time
Most WordPress security work happens inside WordPress: update the plugins, verify the checksums, review the administrators, harden the configuration. All of it still matters and none of it touches this. The interpreter is below the application, it is operated by a different person on most hosting arrangements, and it is updated on a different schedule. Site owners who have never thought about which PHP their host runs are about to find out that the answer determines whether they are protected today, next week, or never.
The end-of-life problem is the lasting one. PHP’s support policy is published and predictable: 8.1 reached its end on 31 December 2025, 8.2 reaches its own on 31 December 2026, and a branch that has reached its end gets nothing, however severe the flaw. This time PHP bent the rule as far as it goes, with source backports for 7.4, 8.0 and 8.1 and early access for vendors, and still those are patches for people who build PHP, not releases for people who install it. Hosting panels have made it painless to leave a site on an old branch indefinitely, and a large part of the WordPress estate has done so. A critical runtime flaw that reaches back through every branch is the moment that decision comes due. Moving sites to a supported branch is work, and it occasionally breaks a theme or an old plugin; leaving them where they are is now an accepted compromise, with the emphasis on compromise.
For operators, the leak changed the clock, not the task. A coordinated release gives everyone the same starting gun; a leaked one gave attackers a head start on understanding where to look, and the patch itself now shows them the rest. Sansec’s expectation of mass attacks within minutes of the release is a reasonable reading of how the last PHP flaw of this kind, CVE-2024-4577 in June 2024, went: Akamai saw exploitation of its honeypots within a day. The servers that matter are the ones updated in the first hours and the ones on branches that cannot be updated at all. Know which of yours is which today.
Sort the results into 8.2 or newer, which has a release, and 8.1 or older, which has a backport at best. Note which servers run mod_php, the case PHP rates highest. Include containers, appliances and anything a vendor bundled.
02
Update the supported branches and restart PHP
To 8.5.12, 8.4.27, 8.3.36 or 8.2.35: distribution packages through apt, dnf or yum as the distribution publishes them; ea-php and alt-php packages through the panel’s package manager when cPanel and CloudLinux publish them; container images by rebuild and redeploy; source builds from php.net. Then restart PHP-FPM or Apache, because running workers keep the old code until they do.
03
Move or patch every site on 8.1 or older
In MultiPHP Manager, Plesk or the host’s panel, switch every site still on 7.4, 8.0 or 8.1 to a fixed branch and test it. Where a vendor has shipped a backported package for the old branch, or you build PHP yourself from PHP’s backport branches, that is the alternative. Sites that can do neither go behind access control or offline. This is the step that actually protects most WordPress sites on shared servers.
04
Verify what is serving requests
Check the PHP version in Site Health, Info, Server on one site per branch, or through a temporary phpinfo page you then delete. On distribution packages compare the package version against the advisory, because the PHP version string will not change. Confirm the processes restarted.
05
Apply PHP’s mitigations only where the update is hours away
Disable session upload progress, and on 8.5 fatal error backtraces, in php.ini or every pool; set memory_limit to -1 with php_admin_value and bound post_max_size and the request shape at the web server; restart the workers; verify from the web side. PHP says these reduce exposure to specific paths and do not make the installation safe.
06
Baseline PHP’s child processes and arrange to be told when they change
Run the child-process check above on each server and keep the output. Alert on PHP workers spawning shells, interpreters or download tools, through endpoint detection where you have it and a process watcher where you do not.
07
Look behind the door on anything that stayed exposed
For any server that was reachable on a vulnerable version after exploit code became public, work through the indicators table: child processes, new PHP files, administrators, cron entries, SSH keys, outbound connections, and bursts of memory-exhausted or fatal errors in the PHP log. Then roll back the interim php.ini changes and keep the baseline running for a week.
08
Plan the next one now
PHP 8.2 reaches end of life on 31 December 2026. Every site that moved from 8.1 to 8.2 today moves again within ten weeks; move it to 8.3 or 8.4 instead and skip the second round.
This alert was first compiled on the morning of 21 October 2026, before PHP’s scheduled release, and revised the same day once PHP published its security advisory, the four releases and the two GitHub advisories. The vendor statements are now PHP’s advisory and the GitHub advisories for each CVE; the description of the flaws, the fixed versions, the at-risk SAPIs, the mitigations and the backports are taken from them. Everything attributed to researchers and reporting before the release is labelled as such and kept for the record. Exposure figures are quoted as Mallory reported them from Shodan banners and were not re-measured. The German report on Golem.de that prompted the first version is listed for completeness; its body sits behind a consent wall and the facts above were taken from the primary sources. This page will be revised again if PHP amends its advisory or exploitation is confirmed, and the modified date at the top will change.
No. The flaws are in PHP, the interpreter that runs WordPress, not in WordPress or any plugin. The fix is a new PHP package installed by whoever operates the server, followed by a restart of PHP-FPM or Apache. On shared hosting that is your provider; on a VPS or dedicated server it is you or your administrator.
Which PHP versions fix this?
PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, released on 21 October 2026. Everything older than those four is affected. A distribution or panel package can carry the same fix under an older version number, so on Debian, Ubuntu, cPanel or CloudLinux check the package changelog or the vendor advisory rather than the version string.
My site is on PHP 8.1 or older. What do I do?
PHP 8.1 reached end of life on 31 December 2025 and gets no release. Move the site to 8.2 or newer, which most WordPress sites tolerate without changes, and preferably to 8.3 or 8.4 since 8.2 ends on 31 December 2026. Alternatively, confirm with your host or distribution that a backported package exists: PHP says distributions and LTS vendors received the patches in advance, and it has published minimal source backports for 7.4, 8.0 and 8.1 on GitHub for people who build PHP themselves. A site that can do none of these goes behind access control or offline.
I run PHP-FPM behind Nginx, not mod_php. Am I affected?
Yes. PHP says every installation that serves web requests is at risk and names PHP-FPM first. It rates mod_php the highest risk because the demonstrated exploit for the out-of-memory flaw works there by default, and says PHP-FPM is less exposed to that one flaw, but the session upload-progress path for the second flaw was validated on PHP-FPM. Update either way.
Does disabling session upload progress make me safe?
No. It is now one of PHP’s own mitigations for CVE-2026-109619, and PHP says it blocks the confirmed session paths but not other variants, and does nothing for CVE-2026-109618. Use it, with the other settings PHP lists, to buy time on a system you cannot patch within the hour, verify it took effect on the web side, and update.
Should I really set memory_limit to -1?
PHP lists it as a mitigation for CVE-2026-109618 because it removes the memory-limit failure an attacker can trigger deliberately. The cost is that a runaway request can consume the worker’s memory until the operating system stops it, which is why PHP pairs it with a low post_max_size and a container or cgroup limit as the availability boundary, and warns against RLIMIT_AS or RLIMIT_DATA. It is an interim setting for a system that will be updated in hours. Once updated, put the normal memory limit back.
Will a web application firewall protect me?
Partly, and not immediately. Vendor signatures follow disclosure, so they are arriving now rather than before the release. A rule that blocks all multipart POSTs blocks one of the attack shapes but also breaks every file upload on the site; PHP lists it as a workaround only for applications that do not use multipart requests, which WordPress does. Memory-corruption exploits are also often reachable in ways signature rules miss. Treat the firewall as a delay, not a fix.
Is this being exploited?
No in-the-wild exploitation had been reported at the time of this update, by PHP, Huntress, watchTowr or Sansec, and neither CVE was on CISA’s catalog. Code claiming to be an exploit circulated before the release, PHP validated a working exploit against mod_php during its own work, and the patch now shows attackers where to look. Expect scanning against unpatched servers within hours.
How do I know which PHP version my site actually uses?
In WordPress, go to Tools, Site Health, Info and expand Server; the PHP version shown is the one serving web requests. On a cPanel server, MultiPHP Manager lists the version per domain, and the rebuild_phpconf command above prints the same. The version printed by php -v on the command line can be different and is not the one that matters.
Will this page be updated?
It has been, on 21 October after PHP’s release. It will be revised again if PHP amends its advisory, vendors publish backports for the older branches, or exploitation is confirmed, and the modified date at the top will change.
Choose the response path
The containment plan should match the size of the incident.
The server under the sites
Get every PHP version, SAPI and per-site selection on your servers accounted for.
Best when you run one or more Linux, cPanel or Plesk servers, are not certain which sites still run through an end-of-life PHP, and want the update and the branch moves done in one pass with the processes verified afterwards.
A PHP worker spawned a shell, or a server stayed exposed and now shows new files.
Best when a server could not be patched on the day, or the indicators above have turned up something, and you need the compromise scoped and removed rather than another update applied over it.