On October 21, 2026 at 14:00 UTC, a day earlier than planned, the PHP project shipped four security releases, PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, to close two critical vulnerabilities that its advisory says "can allow unauthenticated remote code execution". The CVE identifiers are CVE-2026-109618 and CVE-2026-109619, both rated CVSS v4.0 9.2. Wiz Research, which found the bugs independently of the Calif team that first reported them on August 11, calls the pair PHP2Shell. If you own a PHP site, pay someone to host one, or build on WordPress, Drupal, Laravel or Magento, the only complete fix is a PHP update, and the project's own release notes say so in one line: "There are no complete mitigations, updating is the only safe choice."
This post covers the release, not the strategy. Where the patch comes from on a managed host, a distro package or an end-of-life PHP branch is a separate question, answered in our PHP2Shell fix table by distro, control panel and PHP version. What this week should change about how a business patches is in website security after PHP2Shell. Here we stay with the facts of October 21: what shipped, who is in scope, what the interim settings actually do, what is known about exploitation as of our check, and how the bugs were found. Sources were read on October 21 and 22, 2026 (CEST), and each claim names its source.
- 01Update to 8.5.12, 8.4.27, 8.3.36 or 8.2.35. Nothing else is a fix.The PHP security advisory lists interim settings for people who cannot update today and states that they reduce exposure to specific attack paths but do not make an installation safe. Treat them as a few hours of cover, not a plan.
- 02Every web-facing PHP install is in scope; mod_php is the worst case.php.net names PHP-FPM, Apache mod_php, php-cgi, FrankenPHP and LiteSpeed. It rates mod_php highest because a demonstrated exploit fires on an unauthenticated request before any application code runs. Wiz says every version back to PHP 5.4 carries at least one of the bugs.
- 03A plugin update cannot fix this. The flaw is in PHP itself.Wiz showed unauthenticated code execution against the then-latest WordPress, Drupal and Joomla images, and says even a Hello World app on an affected version can be vulnerable. Cloudflare's advisory says updating site code or plugins alone does not fix it.
- 04PHP 8.1 and older get no project release, but minimal source backports exist.The PHP security team published source-only backports for 7.4, 8.0 and 8.1 on GitHub for people building from source. Everyone else on an old branch depends on a distribution or LTS vendor, which php.net says received the patches in advance.
- 05Exploitation status is moving. As of our check, neither CVE was in CISA's KEV catalog.The CISA Known Exploited Vulnerabilities feed dated 14:04 UTC on October 21, checked at 20:44 UTC, did not list either CVE. Cloudflare says it observed attack traffic and payload mutation after deploying WAF rules at 03:02 UTC. The PHP Foundation says no functional exploit was found public at release time.
01 — The ReleaseWhat shipped at 14:00 UTC
The PHP security advisory is short and worth reading in full, because most of what matters is in it. Four supported branches received a release. Each release note says the same thing: a security release fixing two critical vulnerabilities, update immediately. The 8.2 note adds a date that matters for planning: PHP 8.2 reaches end of life on December 31, 2026 and will receive no further security fixes after that, so an 8.2 site is buying about ten weeks with this update, not a year.
Older branches are covered differently. PHP 8.1 and earlier get no release from the project. Instead the security team published what it calls minimal source backports for PHP 7.4, 8.0 and 8.1 as branches on GitHub, aimed at people who build from source or have no LTS vendor. The advisory also says Linux distributions and LTS vendors received the patches in advance, and singles out one volunteer package repository, remirepo, which it says would not have updates on release day and urges users to move to distribution packages or source builds.
| Branch | Fixed in | Form | Note from php.net |
|---|---|---|---|
| 8.5 | 8.5.12 | Full release | Also the only branch with the fatal_error_backtraces path |
| 8.4 | 8.4.27 | Full release | Update immediately |
| 8.3 | 8.3.36 | Full release | Update immediately |
| 8.2 | 8.2.35 | Full release | Branch ends December 31, 2026; plan the upgrade |
| 8.1 · 8.0 · 7.4 | Source branches | Minimal backport, no release | For source builders; otherwise ask your distro or LTS vendor |
| 7.3 and older | None | Nothing from the project | Upgrade, or depend entirely on a vendor backport |
02 — ExposureWho is actually exposed
The honest answer is almost everyone running PHP on the public internet. The advisory's own scope line is "all PHP installations serving web requests", and it lists the server integrations by name: PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. The team rates the risk highest for mod_php, the module that embeds PHP inside Apache, because it has a demonstrated exploit in which an unauthenticated request triggers the bug before any application code runs. A login page, a firewall rule in your app, or a hardened theme does nothing in that case, because the attack lands below them.
Wiz's research post widens the version picture. Its authors write that every PHP version released in the last decade is affected by at least one of the vulnerabilities, back to 5.4, and that the flaws sit in the engine rather than in any application. Their demonstration used the then-latest official container images of WordPress, Drupal and Joomla and achieved unauthenticated code execution on each. Calif's write-up lists a longer set it reports pre-authentication code execution against, including MediaWiki, Roundcube, Magento, phpMyAdmin, Nextcloud, Laravel, Symfony and WHMCS at specific recent versions. The failure case to understand is the quiet one: Wiz also demonstrated an unauthenticated memory disclosure that returns a slice of live worker memory, which it says can contain passwords, tokens, API keys and certificates belonging to other requests. A site can be read without being visibly broken.
- Server integrations named at riskphp.net advisory
- FPM · mod_php · php-cgi · FrankenPHP · LiteSpeed
- Highest riskphp.net advisory
- Apache mod_php, pre-auth, before app code
- Affected versionsWiz Research
- At least one bug back to PHP 5.4
- Demonstrated pre-auth RCEWiz (3 apps) · Calif (11 apps)
- WordPress, Drupal, Joomla and more
- Share of websites on PHPWiz's framing, not measured here
- “70% of all websites”
One number needs its label. Wiz's headline says PHP2Shell affects "70% of the Internet", drawing on the common statistic that PHP "powers 70% of all websites in the world". That figure is Wiz's framing of a server-side language share; we have our own view of the WordPress and PHP share data and the point survives any reasonable estimate. The population is tens of millions of sites, which is why infrastructure vendors were briefed in advance.
03 — MechanismThe two bugs, in plain words
The advisory describes each bug in two sentences, and the descriptions are enough to understand why the interim settings look the way they do. CVE-2026-109618 is labelled "RCE via OOM corruption". When a request runs PHP out of memory, PHP can be interrupted while its internal request data is only partly set up, and the cleanup that follows may treat that half-built data as valid. An attacker who can make a request hit the memory limit at the right moment gets a say in what the cleanup does.
CVE-2026-109619 is labelled "RCE via stale global state". Some request-owned internal state can outlive the memory that backed it, and a later request handled by the same worker process can use that stale state before normal initialisation resets it. That is why Wiz describes cross-request and cross-worker effects, and why the disclosure variant can leak data from someone else's request. Wiz's technical write-up groups several specific chains under the two identifiers, including a use-after-free in the session upload progress code, a second in the fatal-error backtrace feature that only exists in PHP 8.5, and an OPcache type confusion it used against WordPress. The PHP Foundation adds the detail that the out-of-memory bug reaches mod_php before application code and was confirmed on PHP-FPM through application-level code paths.
The PHP Foundation's post traces CVE-2026-109618 to PHP's 2024 external security audit, funded by the Sovereign Tech Agency, organised through OSTIF and carried out by Quarkslab. A core developer saw the first signs of the out-of-memory problem while fixing an audit finding, an exploit was theorised, no concrete vector was found, and the fix stalled on trade-offs between competing approaches. The Foundation calls that delay "a structural failure" of its own decision process and resources. Calif's history goes back further still, to a 2004 memory-limit bug and a 2020 bug report. The flaw was known in outline for years. What changed in 2026 was the cost of proving it exploitable.
04 — ExploitationWhat is known about attacks so far
This is the part of the story that will date fastest, so the table gives each statement with its source and the time we read it. We checked the CISA Known Exploited Vulnerabilities catalog directly through its JSON feed. The feed carried a release stamp of 14:04 UTC on October 21 and, when we read it at 20:44 UTC, listed 1,754 entries, none of them either PHP CVE. The newest entries were dated October 20. That is a statement about the catalog at that moment, not a statement that no exploitation has occurred.
Cloudflare's post says its managed WAF rules went live at 03:02 UTC on October 21, on every plan including Free, and that the company "observed attack traffic targeting our customers" with attackers "mutating the attack payload" to get past the rules. It gives no counts or timestamps for that traffic. The PHP Foundation's post, written for release day, says the team found no functional exploits public at the time of release. Those statements are compatible: attempted traffic against a WAF is not the same as a working public exploit. CISA's own enrichment of both CVE records, added at 14:34 UTC on October 21, rated exploitation "none" in its SSVC assessment; that is a point-in-time judgement too.
| Source | As of (UTC) | What it says |
|---|---|---|
| CISA KEV feed | Oct 21, 14:04 (read 20:44) | Neither CVE-2026-109618 nor CVE-2026-109619 listed among 1,754 entries |
| Cloudflare | Oct 21, 03:02 rules live | Attack traffic observed against customers; payloads being mutated to evade rules; no volumes given |
| PHP Foundation | Oct 21, 14:00 release | No functional exploit found public at release time |
| Wiz Research | Oct 21 | Indicators to hunt for: odd multipart requests followed by memory-limit errors or repeated 500s, oversized or malformed PHPSESSID cookies, unexplained worker churn |
05 — Interim SettingsIf you cannot update today
The advisory lists configuration changes for people who cannot update immediately, and it frames them precisely: they reduce exposure to specific attack paths but do not make an installation safe. Calif's write-up says the same in fewer words, that the changes do not replace a patch. Read them as a way to narrow the window between now and the update, and note that the advisories ask for these settings to be applied where applications cannot override them, followed by a restart of every worker.
For the out-of-memory bug, the advice is to set the PHP memory limit to unlimited, enforced through an admin value in the FPM pool or Apache configuration so no application can put a finite limit back. That removes the controllable memory-limit failure, with the stated caveat that an underlying allocation failure can still reach the vulnerable path. Alongside it, cap request size: an 8M post limit where no uploads are needed, 32M where they are, upload size below the post limit, and limits at the web server or proxy for decoded request size, field count, multipart part count, header count and nesting depth, including for requests with no usable content length. Use a container or cgroup limit as the availability boundary, and specifically do not substitute the RLIMIT_AS or RLIMIT_DATA process limits, because those can cause the very allocation failure the bug needs.
For the stale-state bug, disable session upload progress in php.ini or pool configuration and restart the workers. The advisory says not to rely on a runtime ini_set call or an FPM .user.ini file, because those apply too late. On PHP 8.5 also disable fatal error backtraces. Then remove any invalid or deprecated per-request settings that emit diagnostics before initialisation, and fix any fatal errors or execution timeouts an attacker can reach. The example that trips people up is the last one: hiding diagnostics with error_reporting, display_errors or the @ operator does not help, because the problem is that the error happens, not that it is shown.
Unlimited memory_limit
Removes the controllable memory-limit failure. An underlying allocation failure can still reach the vulnerable path, so it narrows the door rather than closing it.
Small request limits
Bounds what an attacker can send. Must also cover requests without a usable Content-Length. Pair with a cgroup limit, never RLIMIT_AS or RLIMIT_DATA.
Upload progress off
Blocks the confirmed session paths but not other variants. Set it in php.ini or pool config, not ini_set() or .user.ini, and restart every worker.
Fatal backtraces off
Blocks the confirmed fatal backtrace path on PHP 8.5 only. Older branches do not have the feature and need nothing here.
A WAF belongs in the same category. Cloudflare's rules check both the request and the origin's response and can block a response before it reaches the requester, which is more than a simple request filter can do. The same post still tells customers to patch PHP with the protections left on, and states that restricting uploads and limiting upload sizes do not replace the PHP fix. That is the right order of operations for anyone: keep the shield up, and update behind it today.
06 — DiscoveryHow a decade-old flaw was proven in weeks
Calif and Wiz found the bugs independently, both with frontier AI models in the loop, and the PHP Foundation also credits a same-day report from OpenAI. Calif, a small research group, joined OpenAI's Patch the Planet initiative and began auditing PHP around July 30, 2026, by its own account not expecting to find anything critical. The first critical bug surfaced on August 1. Calif reported it to PHP on August 11, shared a working proof of concept on August 14, had it confirmed on August 15, and reported the second bug on August 21. OpenAI's coordination post says Calif used GPT-5.6 Sol; Calif's own write-up describes an LLM "audit buddy" agent for source review and a reusable pattern written into a skill file, with no special harness or restricted model access.
Wiz Research came at it separately. Its post dates the first discovery to August 19, using Wiz Atlas together with Gemini 4 Argon and GPT-5.6 Sol, confirms unauthenticated code execution against Drupal on August 20 and WordPress on August 21, and reports to PHP on August 24; by Wiz's timeline, PHP acknowledged its reports on September 21. The PHP Foundation's post records the same August 11 date for Calif's report, says OpenAI independently reported the same root cause that day, and says fixing it was the security team's top priority from August 11 onward. Calif's and Wiz's timelines describe two groups arriving at the same place a fortnight apart.
With frontier AI models and the right tools, a single researcher completed in a week what previously would have taken a world-class team months of work.Sagi Tzadik, Shir Tamari, Nir Ohfeld and Tomer Schwartz, Wiz Research, October 21, 2026
The claim that matters for the rest of the industry is in the same Wiz post: building a working exploit meant chaining several flaws and adapting to each target's memory layout through repeated testing, and the models made it practical to develop and adapt exploits across applications "in hours". OpenAI's post makes the other half of the argument. It says that to its knowledge, frontier AI found these vulnerabilities before attackers did, and that it expects similar findings "to increase sharply in the coming months". The PHP Foundation puts a number on the load that creates: the security team has published 15 CVEs since July 1 and handled more than 100 reports that were invalid, duplicates or not reproducible. Our write-up of a vendor-published AI disclosure ledger covers the same pattern across hundreds of open-source projects.
07 — The TimelineHow the embargo came apart
The release was planned for October 22. It happened on October 21 because the embargo failed in stages, and the PHP Foundation's post lays out the sequence in UTC. Around 15:00 on October 20 both CVE identifiers circulated online with a wrong release time and a wrong severity score; the leaked score was 10.0, and the Foundation says the actual score is 9.2. No technical detail leaked at that point. At 19:30 the project published its advance notice early, with the release date already moved forward to October 21 at 14:00. Around 20:00 Calif mistakenly published a video showing its proof of concept against several targets; it was deleted, but copies spread. Mitigation advice the Foundation began sending to a few critical infrastructure providers around 23:00 may also have leaked.
Then, at 07:41 on October 21, Chainguard published container images containing the fix, more than six hours before the release. The Foundation says that disregarded weeks of coordinated work by many parties. Cloudflare's rules had gone live at 03:02, which in hindsight was fortunate ordering. The Foundation calls the one-day move the best compromise between acting quickly, giving people time to prepare and keeping a simple update path for everyone, and the advance notice reserved the right to release earlier still. The lesson for anyone who runs a site is unglamorous: when a project posts a dated critical pre-announcement, put an engineer on standby for that hour, because the hour can move.
| Date (2026) | Event | Source |
|---|---|---|
| Jul 30 – Aug 1 | Calif begins its PHP audit; first critical bug found | PHP Foundation · Calif |
| Aug 11 | Calif reports the first bug; OpenAI reports the same day | Calif · PHP Foundation |
| Aug 19 – 24 | Wiz finds the bugs independently, confirms RCE on Drupal and WordPress, reports to PHP | Wiz |
| Sep 21 | PHP acknowledges Wiz's reports; the Foundation dates top-priority fix work from Aug 11 | Wiz · PHP Foundation |
| Oct 20, ~15:00 UTC | CVE IDs leak with a wrong score and time | PHP Foundation |
| Oct 20, 19:30 UTC | Advance notice published; release pulled forward to Oct 21 | PHP Foundation · php.net |
| Oct 20, ~20:00 UTC | Calif's PoC video published by mistake, then deleted | PHP Foundation |
| Oct 21, 03:02 UTC | Cloudflare managed WAF rules live on all plans | Cloudflare |
| Oct 21, 07:41 UTC | Chainguard publishes fixed images, breaking the embargo | PHP Foundation |
| Oct 21, 14:00 UTC | PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 released | php.net |
08 — Your SituationWhat to do first, by who you are
The routing below is the advisory's guidance sorted by the reader. Two things apply to everyone. First, confirm what you are actually running, and do not trust the bare PHP version string to tell you. Distributions and control panels often backport a security fix without changing the upstream version number, so a server can report 8.3.6 and still carry the fix inside its package build, or report a fixed-looking number from a different pool than the one serving your site. The check that counts is the package or build version your distro, panel or host lists as fixed, read against the package actually installed. OpenAI published a version checker as a Codex skill to help map versions to the right update; use it as a starting point, not a verdict. Second, if an exposure window existed, assume the memory disclosure variant could have been used, and rotate the credentials a worker could have held in memory, which means database passwords, API keys and session secrets. Wiz says that memory can hold passwords, authentication tokens, API keys and certificates.
Related deadlines stack this week. Anyone whose stack also includes a Next.js front end should note that Next.js 15 left its maintenance window on the same day, and WooCommerce stores had their own security release in August. None of those is a reason to delay the PHP update; PHP is the layer the others run on. If your team does not have the hours this week, our web development team patches and verifies PHP estates for clients as a standing service.
09 — ConclusionThe patch is the whole answer
Update every web-facing PHP install to a fixed release today, treat the interim settings as hours of cover, and rotate anything a worker could have held in memory.
PHP2Shell is two critical remote code execution flaws in PHP itself, fixed on October 21, 2026 in 8.5.12, 8.4.27, 8.3.36 and 8.2.35, with source-only backports for 7.4, 8.0 and 8.1 and nothing for anything older. The project rates both CVSS v4.0 9.2, names every web-serving integration as in scope, and says the risk is highest for Apache mod_php, where an unauthenticated request can trigger the bug before any application code runs.
Nothing short of the update fixes it. The advisory's interim settings reduce exposure to specific paths and say so; Cloudflare's rules block known traffic and tell you to patch anyway; a plugin update cannot touch the engine. As of our check of the CISA feed at 20:44 UTC on October 21, neither CVE was listed as known exploited, while Cloudflare reported attack traffic and mutating payloads. Expect that picture to change within days.
The larger story is how it was found. A decade-old weakness that an external audit flagged in 2024 was turned into working exploits against the most common PHP applications by researchers using frontier models, in weeks rather than months, and, to OpenAI's knowledge, found before attackers did. That is the good version of this story. The PHP Foundation's own count, 15 CVEs since July 1, is the preview of how often it will repeat.