Active CVE-2026-109618 · CVE-2026-109619 Updated
php2shell: critical remote code execution in PHP
Two critical bugs in PHP itself let attackers run code on your server, reportedly without logging in. It doesn't matter which app or framework you run. A working exploit has leaked. Fixed PHP builds are due 21 Oct 2026, 14:00 UTC. Until then, work through the steps below.
- Severity
- CriticalCVSS 4.0 9.2, both CVEs
- Fixed builds
- 21 Oct, 14:00 UTCMay ship earlier if exploitation spreads
- Exploit
- LeakedTool and demo video public
- Affected
- PHP 5.4+Reported; official list due with the fix
Do this now
Work from the top. Steps marked Unofficial come from researcher root-cause analysis that PHP hasn't confirmed. They're low-risk and reversible, but not a substitute for the patch. Everything else follows PHP and CERT guidance.
-
Find every PHP install, and the
php.iniyour web server loadsInclude PHP inside vendor appliances, control panels and containers.
php --inishows the CLI config; web requests use the FPM or Apache one, usually at a different path.shellphp -v php-fpm8.3 -i | grep "Loaded Configuration File" # Debian/Ubuntu, match your version php-fpm -i | grep "Loaded Configuration File" # RHEL / Alma / RockyWhere php.ini usually is
Debian / Ubuntu, PHP-FPM /etc/php/8.3/fpm/php.iniDebian / Ubuntu, mod_php /etc/php/8.3/apache2/php.iniRHEL / Alma / Rocky / Amazon /etc/php.iniDocker php:*imagesDrop-in: /usr/local/etc/php/conf.d/zz-php2shell.inicPanel / Plesk / shared hosting MultiPHP INI Editor or PHP Settings, or .user.iniin the web root -
Unofficial stopgap
Turn off
session.upload_progress, then reload PHPResearcher analysis puts one of the flaws in this handler. Almost no site needs it, and the change is reversible. Edit the web server's php.ini from step 1, not the CLI one.
php.inisession.upload_progress.enabled = Offshellsudo systemctl reload php8.3-fpm # Debian/Ubuntu FPM (match your version) sudo systemctl reload php-fpm # RHEL family FPM sudo systemctl reload apache2 # mod_php (httpd on RHEL) php-fpm8.3 -i | grep upload_progress.enabled # verify: should print OffCan't edit php.ini? Equivalent settings
FPM pool ( pool.d/www.conf)php_admin_flag[session.upload_progress.enabled] = offApache mod_php vhost php_admin_flag session.upload_progress.enabled OffShared hosting (FPM/CGI) .user.iniin the web root; picked up within about 5 minutes -
Unofficial stopgap
Block
multipart/form-dataPOSTs you don't needThe second suspected path is the multipart parser itself, which runs on any multipart POST regardless of step 2. No uploads on the site? Block multipart entirely. Need uploads? Allow-list those paths, rate-limit them and block the rest. This reduces exposure; it doesn't remove the bug.
nginx
No uploads at all? One line in
server {}:nginxif ($content_type ~* "^multipart/form-data") { return 403; }Need uploads? Allow-list the real endpoints and rate-limit them. The check sits in
server {}so it also covers direct*.phprequests:nginx# http {} context limit_req_zone $binary_remote_addr zone=p2s_upload:10m rate=3r/m; map $content_type $p2s_multipart { default 0; ~*^multipart/form-data 1; } map $uri $p2s_upload_ok { default 0; /wp-admin/async-upload.php 1; # your real upload endpoint(s), exact paths } map "$p2s_multipart$p2s_upload_ok" $p2s_block { default 0; 10 1; } # server {} context: runs before any location block if ($p2s_block) { return 403; } location = /wp-admin/async-upload.php { # one per allow-listed endpoint limit_req zone=p2s_upload burst=3 nodelay; client_max_body_size 32m; include snippets/fastcgi-php.conf; # your usual PHP handler fastcgi_pass unix:/run/php/php8.3-fpm.sock; }shellsudo nginx -t && sudo systemctl reload nginxApache 2.4 (vhost or .htaccess)
apacheRewriteEngine On RewriteCond %{HTTP:Content-Type} ^multipart/form-data [NC] # Allow-list your real upload endpoint(s). Delete the next line to block all multipart. RewriteCond %{REQUEST_URI} !^/wp-admin/async-upload\.php$ RewriteRule ^ - [F] # Optional: cap request bodies where uploads aren't expected (not on upload paths) # LimitRequestBody 1048576shellsudo apachectl configtest && sudo systemctl reload apache2 # httpd on RHELCloudflare WAF (custom rule)
Security → WAF → Custom rules, action Block (or Managed Challenge). Edit the allow-listed paths. This only helps if your origin isn't reachable directly, so restrict it to Cloudflare's IP ranges.
rule expressionhttp.request.method eq "POST" and starts_with(lower(http.request.headers["content-type"][0]), "multipart/form-data") and not http.request.uri.path in {"/wp-admin/async-upload.php"} -
Take end-of-life PHP off the internet
PHP 8.1 and older, all 7.x and all 5.x get no fix. Firewall it, put it behind a VPN, or serve a maintenance page until it's upgraded to 8.2 or later.
-
Patch the moment fixed builds ship
Due for 8.2, 8.3, 8.4 and 8.5 (latest releases before the fix: 8.5.11, 8.4.26, 8.3.35, 8.2.34). PHP may ship earlier if exploitation spreads. Have the update staged: mass scanning is expected within minutes of release. On managed hosting, open a ticket now and ask them to stand by.
Update commands
Debian / Ubuntu sudo apt update && sudo apt upgradeRHEL / Alma / Rocky sudo dnf upgrade 'php*'Docker php:*imagesPull the new tag, rebuild, redeploy Windows New build from windows.php.net Then reload PHP-FPM or Apache as in step 2. Distro packages often backport fixes without changing PHP's version number, so check your vendor's security tracker rather than comparing against php.net versions.
-
After patching, check for compromise
Look for new web shells, unexpected cron jobs, services or users, and odd outbound connections. Detection lists the signals. Found something? Treat it as an incident.
What we know
- Is it real?
- Confirmed On 20 Oct 2026 PHP's security team pre-announced an emergency release for two critical RCEs. Details leaked ahead of coordinated disclosure. watchTowr has reproduced CVE-2026-109618.
- Is there an exploit?
- Reported A tool called “php2shell” (credited to Calif.IO) was shown compromising WordPress, Magento, Joomla, Drupal, Laravel, Symfony, phpBB, MediaWiki and WHMCS. It claims to work on every PHP release from 5.4.0 onward. A demo video is public.
- Exploited in the wild?
- Unconfirmed Huntress and watchTowr report no confirmed mass exploitation at time of writing. Researchers sharing the video, such as Kirill Firsov, consider it in the wild.
- What happens at release?
- Expected Sansec expects mass attacks within 15 minutes of the patch, because the fix reveals the bug.
- Root cause and versions
- Pending Official details publish with the release. Until then, anything unconfirmed on this page is labelled.
“All PHP users are encouraged to prepare now so they can upgrade as soon as the release is available. We reserve the right to release earlier should details of either vulnerability become public, or should evidence of active exploitation appear in the wild.”
CVE records
| CVE | Score | Notes | Records |
|---|---|---|---|
| CVE-2026-109618 | CVSS 4.0 9.2 | Reproduced by watchTowr | CVE.org · NVD |
| CVE-2026-109619 | CVSS 4.0 9.2 | — | CVE.org · NVD |
Early leaks said CVSS 10.0. The official score is 9.2 (CVSS v4.0) for each.
Affected versions
Pending From researcher reporting and the tool's own claims. Verify against the official advisory when it lands.
| PHP | Exposure | Official fix | What to do |
|---|---|---|---|
| 8.2 – 8.5 supported | Reported affected | Due 21 Oct | Patch on release |
| 8.0 – 8.1 EOL | Reported affected | None | Upgrade or isolate |
| 7.x EOL | Reported affected | None | Upgrade or take offline |
| 5.4 – 5.6 EOL | Tool claims 5.4.0+ | None | Isolate now; migrate |
Detection
No reliable public signatures yet. The durable signal is a PHP or web-server worker spawning something it never should (per Huntress and Florian Roth's process-watcher).
| Parent process | php-fpm php-cgi php-cgi.exe apache2 httpd |
|---|---|
| Child shells | sh bash cmd.exe powershell.exe |
| Child tools | python perl curl wget nc certutil.exe |
| Recon from the web server | whoami id uname -a ipconfig |
| Reverse-shell strings | /dev/tcp/ fsockopen mkfifo |
| Access logs | Bursts of multipart/form-data POSTs to endpoints that don't take uploads |
# Shells or tools running under php-fpm / apache2 / httpd?
ps -eo pid,ppid,user,etime,args --forest | less
# PHP files changed in the last 3 days (adjust the web root)
find /var/www -name '*.php' -mtime -3 -ls
# New or changed cron jobs?
sudo ls -laR /etc/cron.d /var/spool/cron
FAQ
I'm on managed or shared hosting. What do I do?
Open a ticket today. Confirm your PHP version, ask them to apply the 21 Oct release as soon as it ships, and to move you off anything at 8.1 or older. If you can, apply step 2 with a .user.ini file. You can't fix this from your app code.
Will a WordPress, Magento or Laravel plugin protect me?
Not reliably. The flaw is in PHP, below your app. Edge rules (step 3) are defence in depth. The only complete fix is updating PHP.
Is step 2 enough on its own?
No. It's an unofficial, reversible stopgap that may close one of two paths. Do steps 2 and 3, then patch.
Can I see the exploit?
This site doesn't host or link exploit code for attacking systems. Researcher analysis is linked for defenders and labelled where it contains PoC material.
References
Official and technical sources first.
Official & authoritative
- PHP.net — Upcoming Critical PHP Security Release primary source 20 Oct 2026
- CERT-EU — Critical Vulnerabilities in PHP (2026-018) advisory 20 Oct 2026
Technical analysis & research
- Sansec — Critical PHP RCE: CVE-2026-109618 and CVE-2026-109619 research 21 Oct 2026
- Huntress — Rapid Response: php2shell IR / detection 21 Oct 2026
- J4ck3LSyN — session.upload_progress UAF root-cause analysis unofficial · contains PoC material 20 Oct 2026
News & reporting
- BleepingComputer — PHP warns admins of two critical flaws news 20 Oct 2026
- Ars Technica — PHP plans to release 2 emergency patches imminently news 20 Oct 2026
Researcher & social posts
- Kirill Firsov (@k_firsov) — exploit video, credits, and the pre-patch stopgap researcher · exploit video 20 Oct 2026
- J4ck3LSyN (@j4ck3lsyn) — lab reproduction claim & root-cause thread researcher · repro claim 20 Oct 2026
- AGTP Insights (@AGTPinsights) — php2shell post commentary 20 Oct 2026