CVE-2026-109619 · GHSA-6wmf-4rv5-p3rp

CVE-2026-109619: RCE via achtergebleven globale state tussen requests

De request-overschrijdende helft van PHP2Shell: na een fatale fout laat PHP globale pointers achter die naar al vrijgegeven geheugen wijzen. De volgende request op dezelfde worker gebruikt ze — en lekt geheugen of geeft een aanvaller code-uitvoering.

Laatst gecontroleerd 2026-10-22

Ernst

Critical · CVSS 4.0 9.2

Authenticatie

Niet nodig

Opgelost in

8.5.12 · 8.4.27 · 8.3.36 · 8.2.35

Onderdeel van

PHP2Shell (met CVE-2026-109618)

Samenvatting

Een fatale fout (ook OOM) kan de reset per request overslaan, waardoor globale error-, sessie-, object- of extensie-state blijft wijzen naar geheugen dat aan het einde van de request is vrijgegeven. De volgende request op dezelfde worker kan dat vrijgegeven geheugen gebruiken vóór de normale initialisatie.

Impact: Use-after-free die leidt tot het lekken van workergeheugen of code-uitvoering. Gedemonstreerd: Pre-auth RCE op WordPress en Drupal; applicatie-onafhankelijk geheugenlek op afstand.

Oorzaak

PHP bewaart sommige state in globals per request — error-, sessie-, object- en extensie-state. Normaal wordt die aan het einde van elke request gereset. Een fatale fout, ook out-of-memory, kan die reset overslaan, en waarschuwingen tijdens de shutdown kunnen de error-state opnieuw vullen nadat die al was gewist.

Het geheugen waar die globals naar wijzen, wordt vrijgegeven als de request eindigt. Voert dezelfde worker daarna code uit vóór de normale request-initialisatie — INI-diagnostiek of upload-progress-afhandeling — dan gebruikt hij vrijgegeven geheugen. Workers die veel requests achter elkaar afhandelen (PHP-FPM, mod_php-childs) maken dit bereikbaar.

Bekende aanvalspaden

Use-after-free in de fatal-error-backtrace

EG(last_fatal_error_backtrace) overleeft een OOM die de request-heap vernietigt. Vroege diagnostiek in de volgende request volgt de losse pointer. Sterkst gedemonstreerd: PHP 8.5 met fatal_error_backtraces, RCE op mod_php.

Levenscyclus van session upload progress

Sessie-state die is achtergebleven van een afgebroken request wordt in de volgende request door de upload-progress-afhandeling gebruikt. RCE bevestigd op zowel mod_php als PHP-FPM.

Type confusion in het gedeelde geheugen van OPcache

Een mislukte allocatie tussen het ophogen van CG(map_ptr_last) en het publiceren van de gedeelde grens laat slots achter waarover workers het oneens zijn, zodat een worker een slot kan hergebruiken voor een ander objecttype.

Overige state per request

Object- en extensie-state worden in de advisory als onder voorwaarden misbruikbaar beschreven. De fix dekt het patroon, niet alleen deze paden.

De PHP-advisory en het artikel van Wiz groeperen sommige paden anders. De patch lost het gedeelde foutpatroon op, dus de indeling verandert niets aan wat je moet doen.

Kwetsbare en gepatchte versies

BranchKwetsbaarOpgelost in
8.5< 8.5.128.5.12
8.4< 8.4.278.4.27
8.3< 8.3.368.3.36
8.2< 8.2.358.2.35
8.1 · 8.0 · 7.4alleAlleen source-backport
5.4 – 7.3alleGeen fix

Blootstelling per serveropstelling

Opstelling…109619Toelichting
Apache + mod_phpRCE bevestigdBeide CVE’s bevestigd tot RCE met standaardlimieten. Opstelling met het hoogste risico.
PHP-FPM (nginx, Apache, Caddy…)RCE bevestigdRCE via de sessielevenscyclus bevestigd op FPM. Het OOM-pad is bevestigd via codepaden op applicatieniveau; er is geen generieke FPM-exploit gepubliceerd.
FrankenPHP / LiteSpeed LSAPIWaarschijnlijkDe advisory noemt ze waarschijnlijk vatbaar. Langlevende workers maken achtergebleven state tussen requests juist relevanter.
CLI (cron, queue-workers, artisan)Niet behandeldNiet behandeld in de advisories en bij normaal gebruik niet bereikbaar via HTTP-requests. Upgrade toch — het is hetzelfde pakket.

CVSS 4.0-score: 9.2

Vector: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

MetriekBetekenis hierEffect

AV:N

Attack Vector: Network

Bereikbaar via internet met gewone HTTP-requests.Verhoogt score

AC:H

Attack Complexity: High

De exploit moet worden afgestemd op de geheugenindeling van elk doelwit; het is geen kant-en-klare request.Verlaagt score

AT:P

Attack Requirements: Present

Succes hangt af van de inrichting (SAPI, limieten, hergebruik van workers) waar de aanvaller geen invloed op heeft.Verlaagt score

PR:N

Privileges Required: None

Geen account, geen login.Verhoogt score

UI:N

User Interaction: None

Niemand hoeft ergens op te klikken.Verhoogt score

VC:H / VI:H / VA:H

Impact op kwetsbaar systeem: High

Volledig verlies van vertrouwelijkheid, integriteit en beschikbaarheid op de PHP-server.Verhoogt score

SC:N / SI:N / SA:N

Impact op vervolgsystemen: None

De score telt doorstoten naar andere systemen niet mee — in de praktijk maken gestolen inloggegevens dat vaak wel mogelijk.Verlaagt score

Oplossing en mitigaties

De oplossing is een PHP-update

Installeer een gepatchte release en herstart elke PHP-worker. Patchgids →

Kun je niet direct updaten, dan noemt php.net deze gedeeltelijke maatregelen:

  • session.upload_progress.enabled = 0 in php.ini, de FPM-pool of de serverconfig, en daarna elke worker herstarten. Details →
  • PHP 8.5: fatal_error_backtraces = 0 en herstarten. Dit blokkeert alleen het bevestigde backtrace-pad.
  • Verwijder ongeldige of verouderde instellingen per request die vóór de initialisatie diagnostiek geven. Ze verbergen met error_reporting, display_errors of @ helpt niet.
  • Los door aanvallers bereikbare fatale fouten en timeouts op (callbacks, upload- en importverwerking, opruimcode).
  • Overweeg pm.max_requests = 1 waar de prestaties dat toelaten.

Referenties

Vragen

Kan CVE-2026-109619 data lekken zonder code-uitvoering?+

Ja. Een use-after-free tussen requests kan workergeheugen blootgeven — wachtwoorden, API-sleutels, sessietokens van andere gebruikers — zonder dat de aanvaller ooit code uitvoert, wat het lastiger te detecteren maakt.

Lost session.upload_progress.enabled = 0 CVE-2026-109619 op?+

Gedeeltelijk. Het blokkeert de bevestigde sessiepaden maar niet andere varianten, en werkt alleen in php.ini, de FPM-pool of serverconfig — niet in .user.ini of via ini_set() — gevolgd door een herstart van elke worker.

Is PHP-FPM kwetsbaar voor CVE-2026-109619?+

Ja. De RCE via de sessielevenscyclus is bevestigd op zowel mod_php als PHP-FPM. FPM-workers handelen veel requests achter elkaar af, precies wat achtergebleven state tussen requests nodig heeft.

Helpt een lagere pm.max_requests?+

Het verkort hoe lang corrupte state blijft bestaan, en pm.max_requests = 1 schakelt hergebruik van workers helemaal uit, tegen hoge prestatiekosten. Het helpt niet tegen paden die maar één request nodig hebben.

Gerelateerd