PHP2Shell: emergency patching across 500+ servers

Two unauthenticated PHP remote-code-execution flaws went public with attacks already running. We closed them across more than 500 customer servers: load-balanced clusters, cPanel, Plesk and ISPConfig. Some servers ran PHP versions with no official fix. No customer site went down.

October 2026  ·  3 min read

SECTOR

Managed hosting and support customers

SCALE

500+ servers

PLATFORM

Load-balanced PHP clusters, cPanel, Plesk, ISPConfig

ENGAGEMENT

Emergency security response

500+

Servers patched or mitigated

0

Minutes of customer downtime

3

Control panels: cPanel, Plesk, ISPConfig

Environment

Rolling PHP update behind a load balancerOne node at a time is drained at the load balancer, patched, checked directly and returned to the pool, while the other nodes keep serving traffic.One node out at a time; the others carry the trafficLoad balancerNode 1patched, verifiedNode 2patched, verifiedNode 3drained, patchingNode 4waiting, mitigatedDrain, patch, verify, return, and stop on the first failureA node goes back into the pool only after a direct check shows the fixed PHP running in PHP-FPM.If a check fails, the rollout stops and the node stays drained, so capacity never drops below N-1.

Scroll the diagram sideways to see all of it →

Clusters were patched node by node. Panel servers, which have no load balancer, got a graceful PHP-FPM reload instead.

The problem

Critical, unauthenticated and already exploited. PHP2Shell (CVE-2026-109618 and CVE-2026-109619) lets an attacker run code on a PHP server with one crafted upload request, before any application code runs. Details leaked a day early and attacks started before the fixed releases were out. Our customers had more than 500 internet-facing PHP servers, and some ran PHP versions that would never get an official patch.

Approach

Mitigate everywhere first, then patch in waves. Within the first hours, every server received an interim mitigation: session upload progress switched off in every PHP-FPM pool, which closes the path used by CVE-2026-109618. It does not fix CVE-2026-109619, but it bought time while patching ran. Custom scripts handled the inventory, the rollout and the checks, so 500+ servers could be worked through in parallel without anyone logging in to each one.

The fix was already in the PHP source, so we built the packages ourselves rather than wait for them.

The hard cases

No official package for every server. On release day Remi and several OS vendors had not yet shipped fixed packages. For servers that could not wait, we built our own RPMs from the fixed PHP source, keeping the vendor’s file layout so that nothing else changed. They are versioned so that the official packages replace them automatically. For PHP branches upstream no longer supports, we backported the fix wherever the code allowed it.

At a glance

Challenge

Two critical PHP RCEs, exploited before release, across 500+ servers on clusters and three control panels.

Approach

Interim mitigation fleet-wide, rolling updates behind the load balancers, in-house RPMs and backports where packages lagged.

Result

Every server patched or mitigated, with no customer downtime.

The rollout

  1. Inventory: every PHP binary, FPM pool and package source on every server, plus its load-balancer pool
  2. Mitigate: session upload progress off in every pool, checked through live web requests rather than the CLI
  3. Clusters: one node drained at a time, patched, checked directly, returned to the pool
  4. cPanel, Plesk, ISPConfig: each PHP version updated from its own source, followed by a graceful FPM reload
  5. Gaps: our own RPMs where repos lagged, and backports for unsupported PHP branches

Outcome

Patched without a maintenance window. More than 500 servers were brought to a fixed or backported PHP, or left mitigated with a dated upgrade plan where no safe backport existed. No customer site went down. The in-house builds are replaced by the official packages through normal updates as they arrive.

More case studies

Hypervisor I/O Stalls

40 VMs returned to stable I/O

Mail Reputation Containment

18 h To confirmed blacklist removal

InnoDB Crash Recovery

0 Data loss identified

The next critical CVE will not wait for a maintenance window

We patch fleets the same day: mitigation first, then rolling updates without taking your sites down.