‹ All news

In depth

php2shell: two flaws in PHP's core force emergency patching and take public websites offline across Europe

PHP shipped emergency fixes on 21 October for CVE-2026-109618 and CVE-2026-109619, two interpreter flaws that allow unauthenticated code execution on any web server running PHP. Several European governments took portals offline as a precaution, and sensors at Amazon, Cloudflare and VulnCheck record exploitation attempts, although no one has yet confirmed a successful intrusion.

In 30 seconds

Two critical vulnerabilities in PHP itself, not in any particular application, let an attacker without credentials execute code or read the web server's memory; the only complete fix is to update the interpreter and restart every worker process.

What happened

On 21 October at 13:30 UTC the PHP security team released versions 8.5.12, 8.4.27, 8.3.36 and 8.2.35 to fix two critical vulnerabilities in the interpreter, now known as php2shell. According to PHP's advisories, both allow unauthenticated remote code execution with the web worker's privileges, and the highest-risk case is Apache with mod_php: PHP demonstrated an exploit in which a single request executes code before any line of the application loads.

CVE-2026-109618 lives in out-of-memory handling. When a request exceeds the memory limit, PHP aborts it with an abrupt jump; if that happens while the request data is half initialised, shutdown treats invalid memory as valid. A crafted multipart request is enough to trigger it while staying within apparent limits. CVE-2026-109619 is stale global state: after a fatal error, a worker process keeps pointers into the previous request's memory, already freed, and a later request can use them before they are reset. The confirmed paths run through session upload progress, enabled by default even when the application never uses sessions, and on PHP 8.5 through fatal-error backtraces.

The memory-disclosure path is what worries analysts most. According to Wiz Research, it can read live worker memory, including passwords, tokens, API keys and certificates from other requests, without executing anything. Wiz and the firm Calif demonstrated unauthenticated code execution against the latest official WordPress, Drupal and Joomla images; Calif adds Magento and MediaWiki. The oldest vulnerable code dates back to PHP 5.4.0, released in 2012.

Two teams found the flaw independently: Calif, within OpenAI's Patch the Planet programme, and Wiz Research, which reported to PHP on 24 August. Both say they used AI models to find the bugs and adapt the exploits to different versions and memory layouts. According to the PHP Foundation, the first signs of CVE-2026-109618 appeared in 2024 during an external audit, but the fix stalled for months, something the Foundation itself describes as a structural failure of decision-making and resourcing.

What is confirmed and what is not

The available data point to exploitation attempts, some of them before disclosure, but as of today no source has confirmed a successful intrusion.

Why it matters

The flaw sits in the layer almost all of the dynamic web shares. Wiz and Cloudflare note that PHP powers close to 70% of websites with a known server-side language. VulnCheck detects PHP on 2.6 million internet-exposed IP addresses and considers almost all of them vulnerable or likely vulnerable; around 42%, more than 1.1 million, run unsupported branches from 3.x to 8.1 with no official release, and only about 403,000 are on the patched 8.2 to 8.5 branches. Other estimates range from 1.3 to 5.1 million servers depending on methodology.

The reaction has been unusual: instead of waiting for the patch, dozens of organisations switched their websites off. According to Reuters, Germany's federal IT provider ITZBund took several sites offline in a "purely preventive" move, France's Interior Ministry took down prefecture websites, Belgium's foreign ministry did the same even though the Belgian national cybersecurity centre recorded no attacks, Finland's state IT centre Valtori shut the government's public web services, the Czech government took its website offline and the Wikimedia Foundation disconnected several systems. In the Netherlands, after the NCSC's advisory, Overheid.nl, the Port of Rotterdam, the KNVB football association, the websites of the five largest parties and numerous hospitals went dark. In Germany, the Charité hospital pulled its entire web presence; the BSI recommended the measure and CISA backs it: anyone who cannot update, or still runs PHP 8.1 or older, should take PHP systems offline until patched.

In Spain, INCIBE-CERT published advisory INCIBE-2026-762 on 21 October with the top rating on its scale. No precautionary shutdown of Spanish websites is on record, nor, at the time of writing, an advisory from CCN-CERT. WordPress, PrestaShop, Drupal, Joomla and Moodle underpin much of the web presence of Spanish SMEs, town councils and online shops, often on shared hosting where the provider is the one who updates PHP.

Precedent weighs here: CVE-2024-4577 (php-cgi) and CVE-2019-11043 (PHP-FPM) entered the KEV catalogue and were used in ransomware campaigns. And the current fix closes the known paths, not the underlying pattern: Datadog and PHP itself warn that variants may appear, including in branches that will remain unpatched.

How to know if you are affected and what to do

Dozens of free URL checkers have appeared, including one published by OpenAI. Almost all of them only read the version the server advertises in its headers, so they see nothing if it is hidden and flag as vulnerable a server whose distribution backported the fix without changing the version number, as Ubuntu 22.04 does. OpenAI acknowledges this in its own tool: an "unknown" result does not mean safe. Besides, sending company domains to a third-party service hands over an inventory of targets.

Assetnote's active scanner does test behaviour by triggering memory exhaustion, but it moves about 29 MiB per path and can crash workers: only against your own systems and outside service hours. The reliable check is local: query the installed package version and compare it with your distribution's fixed one (Debian 13: php8.4 8.4.27-1~deb13u1; Debian 12: php8.2 8.2.35-1~deb12u1; Ubuntu: USN-8948-1 and USN-8948-2 of 21 October for every LTS, including extended-support releases back to PHP 5.5) or look for both CVEs in the package changelog; verify that the version serving the website (mod_php, FPM or container) is the same as the command-line one; and confirm that workers were restarted or the image rebuilt. A new package with the old process still in memory remains vulnerable.

What to watch now

The useful signals sit below the application, so WordPress or Drupal logs will say little. According to Datadog and Wiz, correlate unusually large multipart requests with memory-exhaustion errors at "Unknown on line 0" or repeated HTTP 500 responses, abnormally long or malformed PHPSESSID cookies in responses, worker crashes and, above all, PHP processes spawning shells or download tools. The absence of these signals does not prove a system is clean.

Sources

About the group: Global

Vulnerabilities (4)

CVESeverityActive exploitationPublishedNVD status
CVE-2019-11043Critical (9.8)⚠ Active exploitation10/28/2019Analyzed
CVE-2024-4577Critical (9.8)⚠ Active exploitation6/9/2024Analyzed
CVE-2026-109618Critical (9.2)—10/21/2026Modified
CVE-2026-109619Critical (9.2)—10/21/2026Modified

Claims are published by the criminal groups themselves and are unverified until the organisation or the press confirms them. Names of natural persons (sole traders, individual professionals) are anonymised under the GDPR. We never link to leak sites or stolen data. To request the removal or anonymisation of an entry, contact the site administrator.