Security advisory
PHP2Shell: What the PHP Flaw Means for Your Website, and What to Do Today
On October 21, 2026, the PHP project shipped fixes for two critical bugs that had lived inside the language for more than a decade. If your website runs on PHP, it is either patched or waiting to be. This page tells you which, and what to do about it.
October 23, 2026 · 12 min read

The short answer
PHP2Shell is the name for two critical PHP flaws, CVE-2026-109618 and CVE-2026-109619, disclosed October 21, 2026. Under the right conditions an anonymous request can run code on the server. The fix is PHP 8.5.12, 8.4.27, 8.3.36 or 8.2.35. PHP 8.1 and older get no release from the PHP project.
On this page
- A flaw in the engine, not in the car
- Who is exposed, and who gets to skip this
- Four moves, in this order, starting today
- The fixed releases, branch by branch
- Nine weeks from discovery to a Wednesday release
- Attempts now, breaches later: why this outlasts the news cycle
- Find your page in this section
- How DataCram handles it: the patch today, the exit after
A flaw in the engine, not in the car
Most website security news is about a plugin. This one is about the floor the plugins stand on. PHP2Shell is a pair of flaws in PHP itself, the programming language that runs most WordPress, Drupal, Joomla, WooCommerce and Magento sites, along with a great many custom sites built in the last fifteen years. Your theme did nothing wrong. Your plugins did nothing wrong. The interpreter reading them had a hole, and on an unpatched server it still does.
The specifics. The PHP project tracks the bugs as CVE-2026-109618, where out-of-memory handling can interrupt PHP while internal request data is only partially initialized, and CVE-2026-109619, a use-after-free in which request-owned state survives after the memory behind it has been freed. Both carry a CVSS v4.0 score of 9.2, which the project rates critical. Wiz Research, which found the bugs and gave them the name, says the two CVEs cover four separate bugs.
What they allow is the part that earns the name. Under the right conditions, an attacker with no account and no password sends a request, and the server runs the attacker's code: a shell. Wiz also showed a quieter variant that discloses the server's process memory without running anything. Memory is where passwords, tokens and API keys sit while a site does its work, so a leak is not a small consolation prize.
An anonymous POST
No login, no password. One crafted upload request to any PHP page.
PHP parses the upload
Before your site's code runs, PHP reads the multipart body and tracks upload progress.
stops here
Memory runs out mid-step
A fatal error leaves request data half built, or freed memory still referenced.
The next request inherits it
The same worker reuses that stale state, and the attacker's code runs on your server.
Who is exposed, and who gets to skip this
The PHP project's list is short because it is total. At risk are "all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed," with risk highest for mod_php. Wiz adds that even a "Hello World" app on an affected version can be vulnerable, and that the upload-progress path works even when the application never calls `session_start()`. Good code on top does not save a bad interpreter underneath.

How much of the web is that? Wiz says PHP powers roughly 70% of websites. According to Qualys, which reported counting about 167 million PHP installations, 73% are internet-facing and 71% run versions past end of life. The second number matters more than the first: a site on PHP 7.4 or 8.0 gets no release from the PHP project at all, which is its own problem with its own page, old PHP past end of life. Three groups can stop worrying early:
- Sites with no PHP on the public server. Static sites, a Next.js site served from an edge network, and hosted platforms such as Shopify, Squarespace and Wix, which do not run customer PHP code.
- Sites already on a fixed release. PHP 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or a distribution package with the fix backported. Confirm it rather than assume it with the five-minute version check.
- That is the whole list. A fully updated WordPress with a security plugin and a firewall is still running the old interpreter underneath. Here is why WordPress, Drupal and Joomla are all in this.
Four moves, in this order, starting today
The order matters more than the speed. Updating closes the hole for good, so it goes first. Mitigations only narrow the hole, so they come second and only if the update must wait. The compromise check comes third, because a patched server can still be carrying something that arrived before the patch. The long-term decision comes last, once nothing is on fire.
- 1
Update PHP to a fixed release
On shared hosting the host installs the build and you choose it per site: patching on cPanel, Plesk and managed WordPress. On a VPS or in containers, the update, the restart and the image rebuild are yours: patching a VPS or a Docker image.
- 2
Narrow the exposure if the update has to wait
Turn off session upload progress where applications cannot override it, cap memory and request sizes, and put a firewall rule in front. The PHP project calls these partial. The interim settings, line by line.
- 3
Look for signs someone got in first
Memory-limit errors after odd multipart requests, repeated 500 errors, oversized PHPSESSID cookies, PHP workers restarting for no reason. What a compromise looks like and where to look.
- 4
Decide what the site should run on next year
PHP 8.2 reaches end of life on December 31, 2026. If the site is stuck on old PHP, or you would rather not repeat this week, there is a route that takes PHP off the public internet while editors keep their dashboard.
The fixed releases, branch by branch
PHP ships in branches, and each supported branch got its own fixed release on October 21, 2026. The number you need is the one on your branch. A site on 8.3 does not have to leap to 8.5 tonight; it needs 8.3.36. Anything older on the same branch is vulnerable.
| Branch | Fixed release | Status | Your move |
|---|---|---|---|
| PHP 8.5 | 8.5.12 | Supported | Update to 8.5.12 or later |
| PHP 8.4 | 8.4.27 | Supported | Update to 8.4.27 or later |
| PHP 8.3 | 8.3.36 | Supported | Update to 8.3.36 or later |
| PHP 8.2 | 8.2.35 | Security fixes end December 31, 2026 | Update now, then plan the move to 8.3 or 8.4 before the year ends |
| PHP 8.1, 8.0 and 7.4 | No release from the PHP project | Past end of life; source patches published | Get a vendor backport confirmed in writing, or upgrade to a supported branch |
| PHP 7.3 and older | None | Past end of life; affected back to 5.4, per Wiz | Upgrade; there is nothing to install |
| PHP 8.6 | 8.6.0 RC4 | Release candidate | Carries the fixes; a build for testing, not for the live site |
One wrinkle trips careful people. Linux distributions backport fixes into their own packages, so `php -v` on a patched Debian or Ubuntu server can show an older-looking number that is in fact fixed. Check the distribution's security tracker for the CVE ID, not the version string. The reverse happens too: a control panel can say "8.3" while the host is still running an 8.3 build from before the fix. The full version check covers both.
Nine weeks from discovery to a Wednesday release
According to Wiz, the flaws sat in plain sight for more than a decade, in code nearly every PHP version since 5.4 shares. Plenty of capable people read that code over the years. Then Wiz Research went looking with the help of AI models, and the company says work that would have taken a team months took one researcher about a week. Somewhere, a decade of code review is quietly asking for a recount.
- August 19, 2026: Wiz finds the first bug.
- August 20 and 21: unauthenticated code execution confirmed against Drupal, then WordPress.
- August 24: the bugs are reported to the PHP security team.
- September 21: the PHP project acknowledges the reports.
- October 20: advance notice of a critical release.
- October 21, 14:00 UTC: fixed releases ship and the details go public.
- October 23: a follow-up advisory for a separate, less likely issue, CVE-2026-115560.
Wiz's demonstrations ran against the official latest Docker images of WordPress, Drupal and Joomla at the time of testing, which is to say the versions a careful person would have picked. The October 23 issue needs an unusual setup, an application that changes the session serialize handler at runtime. The project's advice for it is the same setting it already gave, `session.upload_progress.enabled = 0`, until the next regular release. If you set it this week, you are done with that one.
For readers who want the primary sources: the PHP project's announcements, the GitHub advisories for CVE-2026-109618 and CVE-2026-109619, and Wiz's research post. Our running notes on site security live under web security.
Attempts now, breaches later: why this outlasts the news cycle
Within a day of disclosure, security firms reported attack attempts against their sensors and honeypots. Cloudflare was among those that observed them, and most aimed at the session upload-progress path. On October 22, NBC News reported that several security firms had not seen a confirmed successful attack, and that exploitation is difficult because it depends on chaining bugs and on how a server reuses its workers. CISA had not added the CVEs to its Known Exploited Vulnerabilities catalog as of October 21. All of that can change any day.
The people paid to watch expect it to. In a CNBC video interview on October 23, CrowdStrike's chief executive said the industry "will see a lot of breaches in coming months" from the PHP vulnerability. Read that as the calendar for this problem: months, not a news cycle. The headlines will move on next week. The unpatched servers will still be there in February, and so will the people scanning for them.
The host's status page says all systems normal. It said that on Tuesday, too.
Two details from CrowdStrike's own analysis explain why a quiet log is weak comfort. On Apache with mod_php, a single unauthenticated POST request can be enough to start a shell. And the attack traffic can come back as ordinary 200 responses, so the access log looks like a normal day. Patching today is a bounded job with a known price. A breach discovered in the spring is neither.
Vendors moved quickly. Wiz says Cloudflare, Fastly, Google, Vercel and others published guidance and out-of-the-box mitigations for organizations that cannot patch immediately, and Google Cloud published guidance for Cloud Armor, containers and App Engine. A firewall rule in front of an unpatched server buys time. It does not replace the update, because a rule can only match the attacks someone has already described.
Find your page in this section
Nine pages, each written for one situation. Start with the one that sounds most like your week, and come back here when you need the next step.
Check and patch
Am I vulnerable?
Five places to find your PHP version and a table that turns the number into a next step. Run the check.
Shared hosting
cPanel, Plesk and managed WordPress: what the host must do, what you choose, and the note to send. Patch on shared hosting.
VPS and Docker
Packages, restarts, image rebuilds and the trap of the old container. Patch your own server.
Can't update today
Every partial mitigation the PHP project lists, with the exact settings. Interim mitigations.
Assess and decide
WordPress, Drupal, Joomla
Why an up-to-date CMS is still exposed, and what breaks on newer PHP. CMS owners start here.
Signs of compromise
The warning signs, the logs worth reading and what to do if you find something. Check for a visit.
Old PHP past end of life
PHP 8.1 and older, backports, and the December 31 deadline for 8.2. Your options.
Have it done for you
DataCram updates PHP, tests the site and checks for compromise. The emergency fix, or the Next.js move that ends the PHP question.
How DataCram handles it: the patch today, the exit after
We are a web studio in San Antonio, Texas, working with businesses across the US, and this week the job is unglamorous: get PHP to a fixed release, prove it, and make sure nothing broke on the way. The PHP2Shell emergency fix updates PHP or moves the site to a host or plan that offers a fixed build, applies the interim settings when the update has to wait, tests the site afterward, checks for signs of compromise and cleans up when needed.
Fix It Now, paid on the page
- Site down or white screen, $249: back online first, then the cause, a full backup and a note on what failed
- Malware cleanup, $349: infected files and database entries removed, passwords, keys and the way in closed
- WordPress error fix, $149; theme, builder or plugin conflict, $199
- We start within one business day of payment, and you get a full refund if we can't fix it
After the patch
- Custom PHP apps, server fleets and sites that cannot run on PHP 8.2 or newer are quoted after a free check
- Hosting and maintenance plans: tested updates, off-server backups, security and uptime monitoring, no long contract
- A Next.js front end with WordPress kept private, or a full move to Athena CMS, from $1,750 as a fixed price
- We keep your URLs and redirect every old one, and the patch always comes before the move
The Fix It Now prices are for WordPress sites. Drupal, Joomla, Magento and custom PHP sites get a free check and a quote. Call (210) 346-0848, or use the form below. Our free website health check gives a quick outside look at security, speed and search basics; it is not a PHP2Shell scanner and cannot read a version the server hides, so treat it as a second opinion, not a verdict. If you suspect a break-in, go straight to malware removal and website security.
Everything in PHP2Shell
9 pages so far. New ones go up every morning.
More in PHP2Shell
- Check your exposureAm I Affected by PHP2Shell? Find Your PHP Version and Read the Result
- Shared hostingPatching PHP2Shell on Shared Hosting: cPanel, Plesk and Managed WordPress
- Server patch guidePatch PHP2Shell on a VPS or in Docker: Packages, Restarts and Proof
- Stopgap settingsPHP2Shell Temporary Mitigations: What Buys Days and What Only Looks Busy
- CMS owners' briefingPHP2Shell on WordPress, Drupal and Joomla: Your CMS Is Current. Is Your PHP?
- Incident checkPHP2Shell Signs of Compromise: How to Tell Whether Anyone Got In
- Unsupported versionsEnd-of-Life PHP and PHP2Shell: What to Do When No Fix Is Coming
- Emergency servicePHP2Shell Emergency Fix: We Patch Your PHP, Test the Site and Check for Intruders
- The long-term fixNobody Can Exploit PHP on a Site That Does Not Run It: The Next.js Way Out of PHP2Shell
Questions owners ask about PHP2Shell
Yes, on a fixed release. PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 close both CVEs, and a patched PHP is no more dangerous than any other software you keep current. The risk sits with servers still on older builds, and with PHP 8.1 and older, which get no release from the PHP project. If you want PHP off the public web entirely, see the Next.js route or whether to leave WordPress.
No. A security plugin is PHP code that runs after PHP has started handling the request, and the bug lives below WordPress. The PHP project says that on mod_php the attack can fire before any application code runs, plugins included. Keep the plugin for what it does well, but the fix is a patched interpreter. The longer argument is in WordPress vs Next.js security.
Look for what Wiz describes: unusual multipart requests followed by memory-limit errors, repeated 500 responses, large or malformed PHPSESSID cookies, and PHP workers restarting without a reason. Application logs may show little, because the bug sits below the application. If WordPress shows infected files, WordPress malware removal covers the cleanup, and signs of compromise lists where else to look.
It is a good start and a thin record. Ask for the exact PHP version serving your site, in writing, and check it yourself with phpinfo or WordPress Site Health. A server can carry several PHP versions at once, and a site can sit on an old one after the new builds land. Our shared hosting guide has the wording to send.
For WordPress sites, DataCram's Fix It Now prices apply, paid on the page: $249 for a site that broke after a PHP update, $349 for a malware cleanup, $149 for a WordPress error and $199 for a theme or plugin conflict. We start within one business day of payment, with a full refund if we can't fix it. Other PHP sites are quoted after a free check. Rebuilds can be spread out through website financing.
Sometimes, and predictably. An update within a branch, say 8.3 to 8.3.36, is a bugfix release and seldom breaks anything. The jump from 7.4 or 8.0 to 8.2 or newer is where old themes, page builders and plugins fail, often with a white screen. Back up first, test on a copy if you can, and if the site goes down, check whether it is down for everyone before you panic.
Keep reading
- Emergency servicePHP2Shell Emergency Fix: We Patch Your PHP, Test the Site and Check for IntrudersWe update PHP to a fixed release, test every page, check for signs of a break-in and clean up if needed. WordPress fixes from $249, paid on the page.
- The long-term fixNobody Can Exploit PHP on a Site That Does Not Run It: The Next.js Way Out of PHP2ShellKeep WordPress private behind a Next.js front end, or drop PHP for Athena CMS. What each removes, what carries over, the honest limits and the prices.
- Check your exposureAm I Affected by PHP2Shell? Find Your PHP Version and Read the ResultFive ways to find the PHP version and SAPI behind your site, a table that turns the number into a next step, and which sites PHP2Shell cannot touch.
- Shared hostingPatching PHP2Shell on Shared Hosting: cPanel, Plesk and Managed WordPressOn shared hosting your host patches PHP for PHP2Shell. How to confirm it in cPanel or Plesk, what to ask for in writing, and what breaks on newer PHP.
- Server patch guidePatch PHP2Shell on a VPS or in Docker: Packages, Restarts and ProofPatch PHP2Shell on Debian, Ubuntu, RHEL, Docker, FrankenPHP and LiteSpeed: which packages, which restarts, and how to prove the fix landed.
- Stopgap settingsPHP2Shell Temporary Mitigations: What Buys Days and What Only Looks BusyEvery interim PHP2Shell setting from the PHP project, where each line goes, what it blocks, what it misses, and why a firewall rule is only a stopgap.
Get PHP patched and proven, today
Tell us where the site is hosted and what it runs. We confirm the PHP version, tell you the fastest safe path, and give you a fixed price or a free check before any work starts.
Which of these sounds like you? (pick any)
Rather talk now? Call (210) 346-0848.