Security operationsAnalysis
How two PHP flaws let one unauthenticated request run code, why the exposure counts disagree, and what to patch and restart first, 17 to 30 October 2026.
If your organisation has a website, a customer portal or a firewall with a web console, it almost certainly runs PHP, whether or not anyone on your payroll writes it. W3Techs puts PHP behind roughly 70% of websites.8 The questions are narrower: what breaks when one request arrives, why switching a feature off does not close it, and how to find every copy of PHP you answer for before someone else does. Node.js, Oracle and Java are in our roundup of the patch week; this piece stays with PHP.
Picture how a PHP site serves traffic. The web server keeps a pool of PHP workers, long-lived processes that each handle request after request, often thousands before they are recycled. For every request a worker does three things. It sets up: reads the headers, cookies and uploaded body into memory and builds the request’s internal state. It runs the application’s script. Then it cleans up, freeing that memory so it is ready for the next stranger. PHP2Shell is two bugs in the first and third steps, so the application’s own login check and input validation never get a say.
In PHP’s words, CVE-2026-109618 is out-of-memory handling that “can interrupt PHP while internal request data is only partially initialized”, after which “request cleanup may then treat the invalid data as valid.” CVE-2026-109619 is request state that “can survive after its backing memory has been freed”, so “a later request handled by the same worker may use that stale state before normal initialization resets it.”1 Engineers call the second a use-after-free.4 Memory is handed back and handed out again while an old pointer still trusts it, and an attacker who decides what gets written there next decides what the worker does with it.
The attack lives in the worker's setup and cleanup, before and after the application, so the application cannot stop it
The life of one PHP worker and where the two October 2026 flaws sit in it
Step 1 of 5
1. A worker serves strangers in turn
PHP-FPM, Apache mod_php, php-cgi, FrankenPHP and LiteSpeed all keep workers that handle request after request. All five are in scope.
Source: PHP security advisory, 21 October 2026; Qualys TRU; BleepingComputer on the first confirmed exploitation · as of 26 October 2026
PHP rates the risk highest under Apache mod_php, “with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs.”1 The first confirmed compromise in the wild matched that profile exactly: a honeypot running Apache with mod_php on PHP 8.4.26, with a single worker.8 PHP has not published why mod_php is worse than PHP-FPM, and we will not guess at the internals. What matters is that a mod_php server needs nothing from the application to be taken.
The disclosure did not go to plan. On 17 October Amazon’s MadPot honeypot logged an attempt from 103.216.220[.]92, an address Amazon tied to “a commercial anonymization network”. A spokesperson said there was “no evidence” the probe was benign.5 On 20 October PHP pre-announced a release for 21 October at 14:00 UTC, reserving the right to go earlier “should details of either vulnerability become public”.1 The Hacker News reports that the coordinated date had been 22 October and was brought forward a day, and that the CVE identifiers and proof-of-concept code leaked ahead of time.5
Release day ran ahead of the release. Amazon saw its first attempt at about 02:00 UTC. ELLIO logged its first PHP2Shell request at 08:36 UTC, less than an hour after Chainguard published container images with the fix. ELLIO says Chainguard “unilaterally broke the embargo”; the PHP Foundation says Chainguard had received the patch in advance “so its users could update the moment the vulnerabilities were disclosed.”5 Cloudflare’s CTO said it was seeing attacks on both flaws before the patches shipped.7 The web host Pantheon had blocked more than 60,000 suspicious requests by that evening.5
Attackers were probing four days before the fix and scanning hours before the release
PHP2Shell disclosure and exploitation events, 17 to 29 October 2026 (UTC)
| Date | Event | Detail |
|---|---|---|
| 17 Oct 2026 | Amazon honeypot probed | From an anonymiser in Australia, four days before disclosure |
| 20 Oct 2026 | PHP pre-announces fix | Release set for 21 October, 14:00 UTC; earlier if details leak |
| 21 Oct 2026 | First release-day attempt | Amazon, about 02:00 UTC |
| 21 Oct 2026 | Scans after Chainguard images | ELLIO's first request, under an hour after patched images appeared |
| 21 Oct 2026 | PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 | Scheduled release; no complete mitigation without it |
| 24 Oct 2026 | First confirmed takeover | Honeypot running mod_php on 8.4.26; same day, operators shortlist 216 hosts |
| 26 Oct 2026 | CISA adds both to KEV | Known exploited; forensic triage required |
| 29 Oct 2026 | US federal deadline | KEV due date, three days after listing |
Source: The Hacker News; PHP security announcements; BleepingComputer; Security Affairs on Cyfirma; CISA KEV catalogue · as of 29 October 2026 · The leak of the CVE identifiers and proof-of-concept is reported without a date, so it is not plotted
Four public counts appeared within a week, and the largest is 64 times the smallest. VulnCheck found 2,608,039 internet-facing PHP hosts and judged 2,607,985 of them, 99.998%, vulnerable or likely vulnerable.9 Modat counted 4.38 million internet-facing PHP services on 20 October.5 VirusTotal put exposed PHP hosts at over 5.1 million.7 Qualys found 167 million PHP package installs across more than 10,000 customers, 73% of them on internet-facing assets, and only 199,000 patched in the first 12 hours.4
They are not contradicting each other. A host is one internet address that answers a web request. A service is an address and a port, so a server answering on two ports counts twice. An install is a PHP package an agent found on a scanned machine, including internal servers, containers and machines carrying two PHP versions. And a version banner is not a vulnerability: VulnCheck counts the 1,133,000 hosts that show no version as likely vulnerable, and notes that Linux distributions backport fixes without changing the version string.9 The scanners overstate on a patched Debian box and understate wherever the banner is hidden.
Three counts, three units, one answer: about three in four PHP deployments that show a version are past end of life
Per cent of each count by PHP branch status, as published 20 to 29 October 2026
| End-of-life branch (8.1 or older) | Supported branch (8.2 to 8.5) | Version hidden or not reported | |
|---|---|---|---|
| VulnCheck: 2.61M internet hosts | 42 | 15 | 43 |
| Modat: 4.38M internet services | 79 | 0 | 21 |
| Qualys: 167M installs | 66 | 26 | 8 |
Source: VulnCheck (internet hosts, 21 Oct); Modat via The Hacker News (internet services, 20 Oct); Qualys TRU (installs in its customer base, updated 29 Oct) · as of 29 October 2026 · Shares as each vendor published them, rounded to whole per cent. VulnCheck: about 42% end-of-life, 403,000 hosts (15%) supported, 43% showing no version. Modat published only the end-of-life share. Qualys: 110 million end-of-life and 44 million supported installs leave 13 million of its 167 million without a stated branch, which it does not reconcile.
That is the real problem. The PHP project fixed 8.2 to 8.5. For 7.4, 8.0 and 8.1 it published “minimal source-backports” for people who build PHP themselves; there is no release to install.1 PHP 7.3 and older, PHP 5 included, get no fix at all.3 VulnCheck counts more than 700,000 internet hosts on PHP 3.x to 7.3.9 For those, the patch was never coming.
Most organisations do not run PHP; they run something built on it. VulnCheck could identify the application on part of the exposed estate, and calls every figure a floor.9 WordPress alone is more than all the others combined.
WordPress sits on nearly half a million exposed PHP hosts, more than every other named application combined
Internet-facing PHP hosts by application identified, 21 October 2026
Source: VulnCheck, PHP2Shell exposure analysis · as of 21 October 2026 · Floors: only hosts where the application could be identified. Hosts are counted once, at their latest scan.
The harder inventory is the PHP inside things you bought. Palo Alto Networks lists PAN-OS and Panorama 10.2, 11.1, 11.2, 12.1 and 12.2 as affected through the management web interface, both the HTTPS console and the XML API; GlobalProtect is not. Its first hotfixes were 10.2.18-h13, 11.1.16-h4 and 11.2.10-h16, with 17 more due between 27 and 30 October. Cisco lists Ultra-Reliable Wireless Backhaul, Expressway and Duo Access Gateway (fixed in 3.2.0) as affected, with 11 products and services under investigation. Fortinet’s FG-IR-26-186 has four products under investigation (FortiDDoS, FortiClient Cloud Services, FortiSOAR and FortiSOAR PaaS) and 43 not affected, FortiOS and FortiWeb among them.12
PHP’s release notes put it in one line: “There are no complete mitigations, updating is the only safe choice.”2 Everything below follows from that.
4
Fixed releases: 8.5.12, 8.4.27, 8.3.36, 8.2.35
PHP, 21 Oct 2026
0
Settings that make an unpatched server safe
PHP advisory
3 days
From KEV listing to the US federal deadline
CISA KEV
php.ini, a low post_max_size, a container memory limit, then a restart) “reduce exposure to specific attack paths but do not make an installation safe.”1 A web application firewall rule is a bridge too; Cloudflare described its own as temporary.7Sources
Related on TechBag: the vulnerability management guide covers the scanners that find every PHP install, including the agent-based kind behind the Qualys count; the RMM and patch guide covers the tools that push fixes and restarts at scale; the Palo Alto Networks hub tracks the PAN-OS line whose console is affected.
Disclosure. TechBag is a software reseller: it earns a margin when a reader buys through it, including from vendors named here. The analysis is TechBag’s own; no vendor paid for or saw this piece before publication. Facts are labelled reported, TechBag count or our view.