Tech15 min read

php2shell Needs the PHP Patch, Not Just session.upload_progress=0

IkesanContents

TL;DR

Last updated October 21, 2026, 23:40 JST (14:40 UTC), after the PHP release
Fixed versions 8.5.12, 8.4.27, 8.3.36, 8.2.35. No official release for 8.1 and older; only minimal source patches for 7.4, 8.0, and 8.1
What changed PHP itself says settings other than updating only cut off some attack paths. session.upload_progress.enabled=0 blocks only the confirmed paths
Distribution status Ubuntu has fixed packages. Remi’s repository will not update on October 21. No Docker images or Debian packages yet
What to do

  1. Shared hosting: wait for your host’s notice, then check the PHP version in phpinfo()
  2. Self-managed servers: update through the channel you installed PHP from (apt, dnf, Remi, Ondřej Surý’s PPA, Docker image)
  3. Restart PHP-FPM or Apache after updating

Who went offline 19 Japanese organizations, including BASE, CoDMON, and the Xserver control panel, announced full or partial shutdowns or emergency maintenance (piyolog’s count). BambooHR, addy.io, and the GrapheneOS forum did the same


php2shell is the nickname for two critical PHP vulnerabilities that can allow remote code execution (RCE).
In the previous post I covered turning off session.upload_progress.enabled as a stopgap until PHP’s official fix.
Since then, GMO Flatt Security, the firm that first suggested that setting, has revised its view and now expects the attack to remain possible with the setting alone.
A PHP core developer has also posted that updating PHP is the only mitigation.
Sites that turned the setting off still need to update.

The official fix and the two vulnerabilities

PHP released 8.5.12, 8.4.27, 8.3.36, and 8.2.35 at 14:00 UTC (23:00 JST) on October 21 (official security advisory).
The CVE IDs are CVE-2026-109618 and CVE-2026-109619, and both can allow unauthenticated remote code execution.
Every PHP installation that serves web requests is affected, and the advisory lists PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP, and LiteSpeed.
PHP rates mod_php as the highest risk, and says a demonstrated exploit lets a single unauthenticated request start the attack before any application code runs.

CVEOfficial nameWhat it is
CVE-2026-109618 (GHSA-w8hw-w9fx-j79w)RCE via OOM corruptionOut-of-memory handling can interrupt PHP while internal request data is only partly initialized. Request cleanup may then treat that half-built data as valid
CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp)RCE via stale global statePer-request internal state can outlive the memory behind it. The next request handled by the same worker may use that stale state before initialization resets it

The session.upload_progress.enabled setting the previous post suggested turning off appears in the advisory as one of the mitigations for CVE-2026-109619.
CVE-2026-109618 is a separate path that this setting does not block.

Source patches for PHP 8.1 and older

Official fixed releases cover 8.2 through 8.5, and the PHP project does not update 8.1 or older.
Because these bugs are so severe, though, the PHP security team published minimal source patches for 7.4, 8.0, and 8.1.
They are meant for people who build from source or have no LTS vendor.
These are not numbered releases, and there are no tarballs or Windows binaries.
The patches live in php/php-src on GitHub as one branch per series, each with a single fix commit on top of that series’ last commit.
If you only want the fix, you can download that commit as a .patch file.

SeriesBranchFix only
7.4PHP-7.4-CVE-2026-109618-109619712e60f9.patch
8.0PHP-8.0-CVE-2026-109618-10961982f8f31b.patch
8.1PHP-8.1-CVE-2026-109618-1096191d7dec17.patch

The commit message reads “Minimal mitigation for EOL version.”, and the advisory calls them “minimal source-backports.”
Nothing was published for 7.3 or older, and PHP installed through shared hosting or packages will not pick these patches up on its own.
On 8.1 or older, the options are a backport (only the fix, carried into an older version) from your distribution or LTS vendor, or moving to a branch that has a fixed release.
Ubuntu’s USN-8948-1 also ships a fixed package for the 8.1 in Ubuntu 22.04 (Ubuntu Security Notice).

If you use Remi’s repository

The advisory says the volunteer-maintained Remi repository (rpms.remirepo.net) will not have updates on October 21.
It urges people who rely on it to switch to distribution packages or build from source so they can update right away.
As of 23:20 JST, Remi’s blog had no post about the fixed versions.

PHP’s mitigations if you cannot update yet

PHP says only an update is a complete fix, then lists settings that block specific attack paths for those who cannot update right away. It also states that none of them make an installation safe.

TargetSettingPHP’s caveat
CVE-2026-109618Set memory_limit=-1 in a way applications cannot override, such as php_admin_value in the FPM pool (the per-pool PHP-FPM worker config) or Apache configRemoves the PHP memory-limit failure, but an underlying allocation failure can still reach the vulnerable code
CVE-2026-109618Lower post_max_size: 8M if you do not need uploads, 32M if you do. Keep upload_max_filesize below itNone
CVE-2026-109618Limit request size, input field count, multipart part count, header count, and nesting depth at the web server or proxyThe limits must also apply to requests without a usable Content-Length
CVE-2026-109619Set session.upload_progress.enabled=0 and restart every workerPut it in php.ini, the FPM pool, or server config. Do not rely on ini_set() or FPM .user.ini. Blocks only the confirmed session paths
CVE-2026-109619On PHP 8.5, set fatal_error_backtraces=0 and restart every workerBlocks only the confirmed fatal backtrace path

With memory_limit=-1 PHP has no memory cap of its own, so PHP recommends a container or cgroup memory limit as a separate boundary, ideally one that kills only the affected worker.
It also lists removing invalid or deprecated per-request settings that emit diagnostics, and fixing fatal errors and timeouts an attacker can trigger.

The previous post showed how to turn the setting off with .user.ini where php.ini cannot be changed, but PHP says not to rely on FPM .user.ini, so servers that used that method still need the update.

Why turning off session.upload_progress does not stop php2shell

The first version of GMO Flatt Security’s write-up, published around 11:00 JST on October 21, said disabling session.upload_progress.enabled had a certain chance of helping.
At 11:13 JST the same day, PHP core developer Gina Peter Banyard replied to a post suggesting the setting might stop the bug (Mastodon post):

The only thing I can say is that the only mitigation is patching / upgrading PHP. I sadly know too much.

Banyard posted this personally. PHP’s official announcement does not list a configuration workaround either.

In an update at 14:00 JST, Flatt Security rewrote that section to say disabling the setting only mitigates the issue and is not expected to prevent the attack. The updated text says it “may help, but the attack is still possible.”
The same update asks readers to apply the patch as soon as it is released, and says code claiming to exploit the bug has started circulating online.

Some projects turned the setting off and took their service down anyway.
GrapheneOS, which develops an Android-based OS, says it applied three measures, session.upload_progress.enabled = Off, blocking requests with multipart/form-data, and Zend memory manager debug settings, and still decided to take its forum offline (GrapheneOS post).

As the previous post explained, turning the setting off only removes the upload progress display, so it is fine to leave it off until you apply the fix.

Where the fix is published

Where you get the fix depends on how PHP was installed on your server.

How PHP was installedWhere the fix comes fromWho applies it
Shared hosting, managed hostingYour hosting providerThe provider. Check their notice and phpinfo()
Built from php.net sourcephp.net downloads, php/php-src on GitHubYou
Windows buildsphp.net Windows downloadsYou
Ubuntu, Debian distribution packagesThe distribution’s security updatesYou (apt)
RHEL, AlmaLinux, Rocky LinuxThe distribution’s errata (fix advisories)You (dnf)
Ondřej Surý’s PPA, Remi’s repositoryEach repositoryYou
Official Docker php imagesDocker HubYou (rebuild and redeploy)

Distribution packages such as Ubuntu’s and Debian’s usually backport only the fix, so the PHP version number often stays the same (Patchmon’s write-up).
php -v alone will not tell you whether a package is fixed, so check the package changelog for CVE-2026-109618 and CVE-2026-109619.

According to PHP’s supported versions page, 8.2 through 8.5 are supported, and 8.2 receives security fixes only until December 31, 2026.
Huntress cites the view that fixes will ship only for supported 8.x branches, and says environments on PHP 5, 7, 8.0, or 8.1 will need to upgrade or isolate.

The fixed versions are 8.5.12, 8.4.27, 8.3.36, and 8.2.35; the earlier 8.5.11, 8.4.26, 8.3.35, and 8.2.34 do not contain this fix (php.net ChangeLog).

How to apply the PHP fix in each environment

Shared hosting

On shared hosting the provider manages the PHP binary, and you cannot install the fix yourself.
Wait for your provider’s notice, then check that “PHP Version” in phpinfo() shows the fixed release.
If your control panel lets you choose a PHP version and you are on 8.1 or older, there is no official PHP fix for it, so move to a branch that gets the fix.
Before switching, check that your CMS and plugins run on that branch.

Ubuntu, Debian

sudo apt update
# replace 8.3 with the branch you use
sudo apt install --only-upgrade 'php8.3-*'
apt changelog php8.3-fpm | grep -E 'CVE-2026-10961(8|9)'

If the apt changelog output shows CVE-2026-109618 and CVE-2026-109619, the package includes the fix.
If the fix has not reached your distribution yet, the command prints nothing.
You can follow the status in Ubuntu Security Notices and the Debian Security Tracker.

RHEL, AlmaLinux, Rocky Linux

On RHEL-family systems PHP ships as AppStream modules, which let RHEL offer several versions side by side, so servers on the same OS can run different branches.
Before updating, check which stream is enabled with dnf module list php.

dnf module list php
sudo dnf upgrade 'php*'
rpm -q --changelog php-fpm | grep -E 'CVE-2026-10961(8|9)'

Docker

Running containers do not switch over just because you pulled a new image.
If you build your own image on top of the official one, rebuild that too, then recreate the containers.

docker pull php:8.3-fpm
docker compose build --pull
docker compose up -d

Restart after updating

Updating the package leaves running PHP-FPM or Apache processes on the old PHP.
The “Server API” line in phpinfo() tells you which one you run: FPM/FastCGI or Apache 2.0 Handler.
PHP-FPM, which runs PHP in its own processes, is restarted with sudo systemctl restart php8.3-fpm (php-fpm on RHEL-family systems).
If PHP runs inside Apache as mod_php, restart Apache.
php -v and php -i on the command line show the CLI PHP, so they cannot tell you whether the web server’s PHP has been updated.
After restarting, check the version with phpinfo() opened in a browser.
A phpinfo() file exposes the full server configuration, so delete it once you are done.

Services taken offline as a precaution

Organizations have been taking services offline ahead of the release.
For Japan, piyolog has tallied company announcements and counts 19 organizations that have either already shut down or scheduled emergency maintenance around 23:00 JST.
In the table below, entries whose window starts after 21:30 JST were not yet offline at the time of writing.

OrganizationWhat is offlineWindow (JST)
BASEWeb service, PAY ID app, APIOct 21 15:50 to Oct 22 07:00 (planned)
CoDMONAll services, including the parent appPhased from Oct 21. Expected back early Oct 22
GMW (pictSQUARE, MXentry)All features of its online event and entry management servicesFrom Oct 21. Aiming to resume on Oct 22
AlphaPolisAll websites and apps it runsFrom an announcement in the 17:00 hour on Oct 21. Back after a safety check
TechBowlAll features of TechTrain and DirecTrainFrom Oct 21 17:00. No restart date
JCSezbloxOct 21 19:00 to Oct 22 09:00 (planned)
CygamesShadowverse: Worlds Beyond game and official siteFrom Oct 21 23:00. End not announced
CygamesGranblue FantasyOct 21 23:00 to Oct 22 07:00 (planned)
root ipIP management systemOct 21 22:30 to Oct 22 01:00 (planned)
XserverService website, account management panel, new sign-ups, renewals, payments. Customer servers keep runningFrom Oct 21 16:00. Expected back late Oct 21 to early Oct 22
ShifterSome dashboard features. Live sites unaffectedOct 21 15:00 to Oct 22 10:00
InfiniCLOUDNew storage upgrades, account registrationFrom Oct 21. Planned to resume mid next week
ToppingNew plugin downloads, contact formFrom an announcement in the 18:00 hour on Oct 21, until the fix is in place
GrowthArtsBuyback formFrom an announcement in the 16:00 hour on Oct 21. Back after the fix is confirmed
HID-LabsAll related websites and new ordersSites down by Oct 21 23:00
YASUDAOfficial site and online store. Shipping continues as usualAround Oct 21 16:30 to the morning of Oct 22 (planned)
KimbleHomepageFrom an announcement in the 16:00 hour on Oct 21. No restart date
INGAGECompany websiteFrom an announcement in the 17:00 hour on Oct 21. Back in stages after the 23:00 release
Spell FragmentsDeveloper website. Gameplay unaffectedFrom an announcement in the 17:00 hour on Oct 21. Back after the security update
Bunfree (Bungaku Free Market) officeOfficial site. Web catalog and entries continueFrom Oct 21 16:00. Back after the fix is applied

Links for the organizations without one here are in piyolog’s post.
CoDMON, Xserver, and AlphaPolis only cite a software vulnerability and do not name PHP.
Xserver has also taken its service website down, and when I opened it in the 21:00 hour JST it returned 503.
Sakura Internet announced maintenance on part of its shared hosting from 13:00 on Oct 21 to 08:00 on Oct 22, but piyolog says any link to this issue is unclear.

piyolog’s tally also lists organizations that announced a response without shutting down.
Six Apart plans maintenance to update PHP on the cloud edition of Movable Type after the fix is released, and Alfasado is asking PowerCMS users to consider temporarily taking affected sites offline.
Kagoya Japan says it is investigating the impact.

Outside Japan, status pages and posts also announced shutdowns.

OrganizationWhat is offline
BambooHR (HR software)Web app and website
addy.io (email forwarding)Web system. Email delivery continues
GrapheneOS (Android-based OS)Forum (described as its only PHP software)

Status per distribution channel

Distribution packages and official Docker images come separately from each provider, so check each channel on its own.
The table reflects the status as of 23:20 JST (14:20 UTC) on October 21.

ChannelStatus
php.netSource and Windows builds of 8.5.12, 8.4.27, 8.3.36, 8.2.35 are out
UbuntuReleased in USN-8948-1. 22.04: 8.1.2-1ubuntu2.28, 24.04: 8.3.6-0ubuntu0.24.04.13, 26.04: 8.5.4-0ubuntu1.5
DebianNot yet in the Security Tracker
Ondřej Surý’s PPA8.3 still at September’s 8.3.35
RemiNo update on October 21 (per PHP’s advisory)
Official Docker php imagesNo 8.5.12 or other fixed tags yet
RHELNot yet in Red Hat’s CVE database

Ubuntu’s version numbers carry only the backported fix and do not match php.net’s numbers.
On Ubuntu or RHEL-family systems, use the commands in Ubuntu, Debian and RHEL, AlmaLinux, Rocky Linux to check that the changelog lists the CVE IDs.