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

Red halftone collage of a blue toy elephant on a stack of server racks, perched on a large seashell glowing green inside, with an open padlock above

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
  1. A flaw in the engine, not in the car
  2. Who is exposed, and who gets to skip this
  3. Four moves, in this order, starting today
  4. The fixed releases, branch by branch
  5. Nine weeks from discovery to a Wednesday release
  6. Attempts now, breaches later: why this outlasts the news cycle
  7. Find your page in this section
  8. 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.

1

An anonymous POST

No login, no password. One crafted upload request to any PHP page.

2

PHP parses the upload

Before your site's code runs, PHP reads the multipart body and tracks upload progress.

Patched PHP stops here
3

Memory runs out mid-step

A fatal error leaves request data half built, or freed memory still referenced.

4

The next request inherits it

The same worker reuses that stale state, and the attacker's code runs on your server.

Four steps from an anonymous POST to a shell, and patched PHP breaks the chain before stale state can be reused.

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.

A blue elephant cutout balanced on stacked server racks above a seashell with a glowing green cursor inside, cracks spreading across the floor, halftone collage on red
PHP's elephant has carried most of the web for years. Nobody mentioned the crack in the floor until October.

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. 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. 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. 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. 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.

PHP2Shell fixed releases by branch, per the PHP project, October 21, 2026
BranchFixed releaseStatusYour move
PHP 8.58.5.12SupportedUpdate to 8.5.12 or later
PHP 8.48.4.27SupportedUpdate to 8.4.27 or later
PHP 8.38.3.36SupportedUpdate to 8.3.36 or later
PHP 8.28.2.35Security fixes end December 31, 2026Update now, then plan the move to 8.3 or 8.4 before the year ends
PHP 8.1, 8.0 and 7.4No release from the PHP projectPast end of life; source patches publishedGet a vendor backport confirmed in writing, or upgrade to a supported branch
PHP 7.3 and olderNonePast end of life; affected back to 5.4, per WizUpgrade; there is nothing to install
PHP 8.68.6.0 RC4Release candidateCarries 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.

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.

Free · No obligation

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.

CallGet a quote