PHP2Shell vulnerability: the 2 PHP flaws attackers are now using
PHP2Shell is a pair of critical PHP flaws that let attackers run code on web servers without logging in. How it was found, how it leaked and how to check yours.

On this page 8 sections ▾
WHAT TO DO
- The PHP2Shell vulnerability is two bugs in PHP itself (CVE-2026-109618 and CVE-2026-109619) that allow unauthenticated remote code execution on servers that handle web requests.
- Fixed in PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 on October 21; CISA added both to its Known Exploited Vulnerabilities catalog on October 26.
- Updating WordPress, Drupal or any other app does not fix it: the PHP runtime underneath has to be updated and its workers restarted.
- Affected
- PHP 8.2 to 8.5 before the fixed releases, plus unsupported older branches
- Fixed in
- 8.5.12, 8.4.27, 8.3.36, 8.2.35
- Disclosed
- Oct 21, 2026
- Exploited
- Yes, added to CISA KEV on 2026-10-26
- Workaround
- Partial only: session.upload_progress.enabled=0 and memory_limit=-1, then restart workers
For your information
PHP2Shell is two CVEs. This card shows NVD's CVSS 3.1 score for CVE-2026-109618 (9.8). NVD scores its twin, CVE-2026-109619, at 8.1, and PHP itself rates both 9.2 on CVSS 4.0, so the number you see depends on which scorer a site quotes.
Three separate teams found PHP2Shell with AI help: Calif reported first on August 11, Wiz on August 24 and OpenAI on September 18.
A PHP core developer spotted one of the two bugs back in 2024, but the fix stalled for months, which the PHP Foundation called a structural failure.
After the CVE numbers leaked, one of the reporting firms accidentally published a video of its exploit working, and copies kept circulating after it was deleted.
Amazon's honeypots logged an exploitation attempt on October 17, four days before anyone disclosed the bugs publicly.
A server can say it runs PHP 8.3.6 and still be patched, because Linux distributions fix old version numbers instead of jumping to new ones.
#What is the PHP2Shell vulnerability?
PHP2Shell is the nickname for CVE-2026-109618 and CVE-2026-109619, two flaws in the PHP engine that can let someone who never logs in run their own commands on a web server. PHP says every installation that serves web requests is at risk, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed, and it rates mod_php as the highest risk because the attack can fire before any of the site's own code runs.
Both bugs come from the same family of mistakes: PHP not cleaning up properly when a request goes wrong. CVE-2026-109619 abuses the built-in session upload progress feature, where PHP keeps pointers into memory that gets freed and reused, so an attacker can slip fake data into that spot. CVE-2026-109618 forces PHP to run out of memory mid-request, and the emergency exit skips normal cleanup, leaving half-built data behind that PHP later trusts during shutdown.
ELI5: explain it simply▾

THE WORDS
- Use-after-free
- A program keeps using a piece of memory after it has handed it back.
- Heap
- The pool of memory a program borrows from while it runs.
- Worker
- A PHP process that handles one web request after another.
- Out of memory (OOM)
- The program hits its memory limit and has to stop what it was doing.
THE IDEA
Picture a coat check that gives your hanger to someone else but still keeps your ticket pointing at it. If an attacker hangs their own coat there, the attendant hands back whatever is on that hanger. PHP2Shell tricks PHP into reading a hanger the attacker filled, and what is hanging there is a command to run.
Warning
One flaw can also leak memory without running any code. PHP lists memory disclosure as a confirmed impact of CVE-2026-109619, and the researchers say that memory can hold passwords, tokens and API keys from other visitors' requests.
#How it was found, and how it leaked
Calif's Ryan Austin found the first bug on August 1 while auditing PHP with help from OpenAI's GPT-5.6 Sol, and reported it to PHP on August 11. Wiz Research and OpenAI's own team later found the same flaws independently and filed their own reports.
Wiz Research used Wiz Atlas, Gemini 4 Argon and GPT-5.6 Sol, and confirmed working attacks against Drupal and WordPress within two days of its first find. The plan was a coordinated release on October 22, but the CVE numbers started circulating on forums around 15:00 UTC on October 20 with a wrong score of 10.0, so PHP moved the release up a full day.
The leak then got worse in two ways. Calif mistakenly published a video showing its proof of concept, which sped up public exploit code, and Chainguard published container images containing the fix more than six hours before the official release, which the PHP Foundation said disregarded weeks of coordinated work.
- Amazon's MadPot honeypots record an exploitation attempt
- CVE numbers leak; PHP moves the release up from Oct 22
- PHP ships 8.5.12, 8.4.27, 8.3.36 and 8.2.35 at 14:00 UTC
- PHP warns of a related third issue, CVE-2026-115560
- CISA adds both CVEs to KEV with an Oct 29 federal deadline
#Is PHP2Shell being exploited?
Yes. CISA added both CVEs to its Known Exploited Vulnerabilities catalog on October 26, which means it has evidence of real attacks, and gave federal civilian agencies until October 29 to fix them.
The most detailed attack so far came from the security firm Dream, which says a suspected China-linked actor chained PHP2Shell with a Linux kernel bug called Fragnesia (CVE-2026-46300) to get root on 25 servers in the US, Japan, Taiwan and South Korea, including three in a US government-affiliated network. The targets were firewalls running PHP 8.0.30 on their management interface, and the attacker went on to go after Active Directory credentials.
For your information
Mass exploitation has been slower than the CVSS scores might suggest. A working attack needs memory offsets that differ for each PHP build, which is why attackers on underground forums have complained that public exploits mostly work on a lab copy, and why the Dream attacker built a custom version for one specific firewall.
#Which PHP versions are affected?
| System | Status |
|---|---|
| PHP 8.5 before 8.5.12 | Affected |
| PHP 8.5.12 | Fixed |
| PHP 8.4 before 8.4.27 | Affected |
| PHP 8.4.27 | Fixed |
| PHP 8.3 before 8.3.36 | Affected |
| PHP 8.3.36 | Fixed |
| PHP 8.2 before 8.2.35 | Affected |
| PHP 8.2.35 | Fixed |
| PHP 8.1 and older | No official release: use a vendor backport or upgrade |
PHP is also built into appliances, network devices and management interfaces that don't advertise it, where admins often can't update PHP themselves. The Dutch NCSC is tracking 757 products with a PHP dependency, and as of October 28 it listed 218 of them as vulnerable and only 144 as fixed.
#How to check your PHP version for PHP2Shell
$ php -v | head -1 PHP 8.3.6 (cli) (built: Oct 19 2026 15:16:58) (NTS) # 8.3.6 looks older than the fixed 8.3.36, so check the distro package $ dpkg-query -W php8.3-cli php8.3-cli 8.3.6-0ubuntu0.24.04.13 $ zcat /usr/share/doc/php8.3-cli/changelog.Debian.gz | grep -m2 "CVE-2026-10961" - debian/patches/CVE-2026-109618_109619.patch: Avoid state corruption via - CVE-2026-109618 # the CVE is in the changelog, so this build is patched $ php -i | grep upload_progress.enabled session.upload_progress.enabled => On => On # still on: PHP suggests turning it off until the next release
ELI5: explain it simply▾

THE WORDS
- Backport
- Copying a fix into an older version instead of shipping a new version number.
- Changelog
- A file listing every change made to a package.
- dpkg
- The tool Ubuntu and Debian use to track installed packages.
THE IDEA
Ubuntu and Debian keep the same main version number for years and quietly patch it, like a car that keeps its model year after a recall repair. So the number from php -v is not the whole story. The package version and its changelog tell you whether the repair was actually done.
Tip
The command-line php and the PHP behind your website can be different builds, especially with PHP-FPM or containers. Check the package your web server actually loads, and for containers, check the image your app is built from.
#What to do now
- Find every PHP you runInclude websites, container images, hosting panels and appliances that bundle PHP. CISA warns that PHP often sits inside other software where it is not obvious.
- Update PHP itselfMove to 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or install your distribution's patched package. Updating WordPress, Drupal or Laravel alone does not touch the runtime.
- Restart the workersRestart Apache, PHP-FPM and any long-running PHP processes, because old workers keep running the old code until they are replaced.
- Turn off upload progressSet session.upload_progress.enabled=0 in php.ini or the FPM pool, not with ini_set(), unless your site needs upload progress bars. PHP recommends this until its next regular release.
- Look for signs of compromiseCheck for PHP worker processes launching shells or downloading tools, and start from October 17, since attempts predate the disclosure.
Checking package versions, reading changelogs and restarting services are core sysadmin skills, and Server Administration is Level 2 of the Security Pro course, which runs in a simulated terminal in your browser, with Level 1 free.
#Other PHP vulnerabilities being fixed right now
CVE-2026-115560 (PHP): a third remote code execution path PHP disclosed on October 23. It only hits apps configured with session.serialize_handler set to php_binary or php_serialize that switch it back to php at runtime with upload progress still on, so PHP will fix it in its next regular release; turning upload progress off blocks it now.
CVE-2026-114509 (Laravel): an authentication bypass in Laravel's built-in token guard that, on MySQL or MariaDB, lets an attacker log in as an existing user without knowing their token. It is rated 9.2 on CVSS 4.0 and fixed in laravel/framework 12.68.0 and 13.29.0.
For your information
Laravel shipped the token guard fix quietly on August 25 and only published the advisory on October 19, so any app updated since late August is already covered.
#The rest of the "2Shell" wave
Node2Shell (CVE-2026-111497): an out-of-bounds write in Google's Brotli decompression library, which Node.js builds in. Public exploits are out, threat intelligence firm ELLIO says its sensors have seen exploit traffic in the wild, and it's fixed in Node.js 26.12.1, 24.22.1 and 22.23.4, while end-of-life lines like 20.x get no fix.
Plex2Shell: four chained Plex Media Server bugs (CVE-2026-96652, -96654, -96655 and -96656) that attackers have used to plant crypto miners. CISA added them to KEV on October 21, and Plex Media Server 1.43.3.10861 fixes them.
Did you know
The Brotli fix sat in Google's public code for eight months, committed in February 2026, before any release or advisory pointed people to it.
What is PHP2Shell?
Does updating WordPress fix PHP2Shell?
Is PHP 7.4 or 8.1 affected?
Does php -v tell me if I'm patched?
What this means for you
If you run anything on PHP, including a CMS, a hosting panel or an appliance, update PHP and restart its workers today, then check whether the server was probed before you patched. For anyone learning security, PHP2Shell is a textbook example of why patch management, asset inventory and knowing how distro backports work show up on exams like Security+.