Dit artikel beschrijft een kritieke heap use-after-free (UAF) kwetsbaarheid in de session.upload_progress functionaliteit van PHP.
Technische Details
De kwetsbaarheid ontstaat doordat PHP raw zval * bucket pointers cached in actieve HashTables. Wanneer deze pointers naar arrays wijzen die tijdens de request-lifecycle worden vrijgegeven, kan een aanvaller deze hergebruiken om zendcallfunction aan te roepen, wat in theorie kan leiden tot het uitvoeren van willekeurige commando's (zoals system()).
Validatie en Tooling
De analyse is geverifieerd op PHP-versies 8.4.4 en 8.2.34. Er is een Python-framework (php-up-2026) beschikbaar dat Proof-of-Concept (PoC) scripts bevat voor zowel CVE-2026-109618 als CVE-2026-109619, inclusief specifieke offsets voor LiteSpeed lsphp-builds.
Mitigatie
Om het risico te beperken voordat officiële patches beschikbaar zijn, wordt het volgende geadviseerd:
- Schakel de functie uit via
session.upload_progress.enabled = Off in de PHP-configuratie.
- Beperk
multipart/form-data POST-requests via een WAF of reverse proxy.
- Update PHP naar de nieuwste stabiele versies zodra beschikbaar.
PHP session.upload_progress UAF (CVE-2026-109618 / CVE-2026-109619)
- Status: Weaponized (lab)
- Auteur: J4ck3LSyN (ATLAS)
- Onderzoekers: Andrew Dorman (@acd421), Arch&Yuki (@ArchKnight23)
- Taal: Python
Overzicht
Er is sprake van een heap use-after-free (UAF) in session.uploadprogress die zendcall_function bereikt. De kwetsbaarheid ontstaat door twee gecachte bucket-pointers en één vrijgegeven tree.
De handler van PHP's session.uploadprogress (phpsessionrfc1867callback in ext/session/session.c) cached twee raw zval * bucket pointers in actieve HashTables: postbytesprocessed and currentfilebytes_processed. Beiden wijzen naar arrays die tijdens de request-lifecycle worden vrijgegeven terwijl de aanvaller hiermee kan interageren.
Technische werking
Een standaardconfiguratie is voldoende voor de exploit: session.uploadprogress.enabled=1 met de standaardnaam, prefix, freq=1% en minfreq=1.
- Een enkele snelle multipart POST activeert beide caches.
- Een tweede
update() leest het sessiebestand opnieuw, waarna zendhashupdate de vorige gedecodeerde tree vernietigt via de HashTable-destructor zvalptrdtor.
- De vrijgegeven bucket wordt vervolgens hergebruikt. De verouderde pointer landt op een door de aanvaller gecontroleerde
zendfcallinfo / zendinternalfunction die zendcallfunction aanroept (bijvoorbeeld system()).
Validatie en offsets
Deze analyse is geverifieerd tegen echte php-src (8.4.4 en 8.2.34), inclusief:
- Elke referentie in de oorspronkelijke write-up.
- De
ZVALCOPYVALUE no-addref moves.
- De re-decode/track_init free.
- Struct-offsets:
zendfcallinfo (64B met paramcount op +48), zendinternalfunction.handler op +88, ISSTRINGEX 0x106, ISOBJECT_EX 0x308.
Het framework in deze publicatie bevat per-build delta-extractie (--syms), omdat de offset tussen zvalptrdtor en zendcallfunction per build verschilt. Voor de officiële LiteSpeed lsphp82 8.2.34 debug-symbolen zijn de exacte waarden voor de drie distributie-sub-builds als volgt:
- Bookworm:
0xc930
- Noble:
0xcef0
- Jammy:
0xd060
Bestandsstructuur (php-up-2026 bundle)
Het pakket php-up-2026 bevat de volgende bestanden:
phpupframework.py: Het hoofdframework.
poc0_109618.py: Proof of Concept voor CVE-2026-109618.
poc1_109619.py: Proof of Concept voor CVE-2026-109619.
poc_trigger.py: De trigger voor de exploit.
DELTAS_LSphp.md: Documentatie over de offsets voor LiteSpeed PHP.
README_FRAMEWORK.md: Instructies voor het framework.
REPORT_VALIDATION.md: Validatierapport.
RATING.md: Beoordeling van de kwetsbaarheid.
VALIDATION.md: Validatiegegevens.
README.md: Algemene informatie.
Gebruik
Instructies voor het valideren, extraheren en leveren van de chain:
# Controleer de forge en body layout
$ python3 php_up_framework.py --selftest
# Extraheer dtor / call / delta uit een specifiek binair bestand
$ python3 php_up_framework.py --syms --binary /path/to/lsphp
# Bouw de body.bin met een specifieke bug en leak
$ python3 php_up_framework.py --build --bug 619 --dtor <leak> -o body.bin
# Delivery in een php-fpm lab-omgeving
$ python3 php_up_framework.py --lab --bug 618 --dtor <leak>
# Delivery tegen een live target-url
$ python3 php_up_framework.py --live <target-url> --bug 619 --dtor <leak>
Mitigatie (vóór officiële patch)
Ondernemingen kunnen de volgende stappen ondernemen voordat de officiële advisory is gepubliceerd:
- Inventarisatie van PHP: Stel vast welke hosts en versies in gebruik zijn (
php -v). Versies PHP 7.x of ouder worden niet meer ondersteund; plan een upgrade.
- Pas de stopgap toe: Schakel de betreffende functie uit in
php.ini, .user.ini of .htaccess:
``ini session.upload_progress.enabled = Off `` Herstart PHP-FPM of de webserver. Volgens de analyse sluit dit één van de twee waarschijnlijke aanvalspaden.
- Beperk multipart uploads aan de edge: Het tweede aanvalspad bevindt zich in de multipart-parser zelf, die actief is voor elke
multipart/form-data POST, ongeacht de bovenstaande instelling. Gebruik een WAF of reverse proxy om inspectie aan te scherpen of rate-limiting toe te passen op multipart POSTs naar endpoints die geen uploads nodig hebben.
- Patchen zodra beschikbaar: De huidige stabiele versies zijn 8.5.11 / 8.4.26 / 8.3.35 / 8.2.34. Controleer bij managed hosting de tijdlijn voor updates.
Motivatie voor gratis publicatie
Mitigatie voorafgaand aan een patch zou geen betaald abonnement mogen zijn. Kleine teams zonder enterprise threat intel-contracten lopen het grootste risico in de periode tussen het lekken van een kwetsbaarheid en de officiële patch. De bovenstaande stappen zijn kosteloos; het is beter om nu risico's te verminderen dan morgen incident response te moeten doen.
Updates volgen zodra de officiële advisory is gepubliceerd, waarbij de root cause wordt bevestigd in samenwerking met Andrew Dorman (@acd421) en Arch&Yuki (@ArchKnight23).
Download
De signed release is verkrijgbaar via: wget http://jackalsyn.com/posts/phpupAssets/php-up-2026.tar.gz tar -xzf php-up-2026.tar.gz
Hash (SHA-256): a29d640e0481ff64a39541faeeeec0f998ecd18fb692816e75a6bcfa0f683017
Credits:
- Auteur: @J4ck3LSyN
- Onderzoek: Andrew Dorman (@acd421)
- Onderzoek: Arch&Yuki (@ArchKnight23)
- Status: Weaponized (dev)
PHP session.upload_progress UAF (CVE-2026-109618 / CVE-2026-109619)
- Status: Weaponized (lab)
- Auteur: J4ck3LSyN (ATLAS)
- Onderzoekers: Andrew Dorman (@acd421), Arch&Yuki (@ArchKnight23)
- Taal: Python
Overzicht
Er is sprake van een heap use-after-free (UAF) in session.uploadprogress die zendcall_function bereikt. De kwetsbaarheid ontstaat door twee gecachte bucket-pointers en één vrijgegeven tree.
De handler van PHP's session.uploadprogress (phpsessionrfc1867callback in ext/session/session.c) cached twee raw zval * bucket pointers in actieve HashTables: postbytesprocessed and currentfilebytes_processed. Beiden wijzen naar arrays die tijdens de request-lifecycle worden vrijgegeven terwijl de aanvaller hiermee kan interageren.
Technische werking
Een standaardconfiguratie is voldoende voor de exploit: session.uploadprogress.enabled=1 met de standaardnaam, prefix, freq=1% en minfreq=1.
- Een enkele snelle multipart POST activeert beide caches.
- Een tweede
update() leest het sessiebestand opnieuw, waarna zendhashupdate de vorige gedecodeerde tree vernietigt via de HashTable-destructor zvalptrdtor.
- De vrijgegeven bucket wordt vervolgens hergebruikt. De verouderde pointer landt op een door de aanvaller gecontroleerde
zendfcallinfo / zendinternalfunction die zendcallfunction aanroept (bijvoorbeeld system()).
Validatie en offsets
Deze analyse is geverifieerd tegen echte php-src (8.4.4 en 8.2.34), inclusief:
- Elke referentie in de oorspronkelijke write-up.
- De
ZVALCOPYVALUE no-addref moves.
- De re-decode/track_init free.
- Struct-offsets:
zendfcallinfo (64B met paramcount op +48), zendinternalfunction.handler op +88, ISSTRINGEX 0x106, ISOBJECT_EX 0x308.
Het framework in deze publicatie bevat per-build delta-extractie (--syms), omdat de offset tussen zvalptrdtor en zendcallfunction per build verschilt. Voor de officiële LiteSpeed lsphp82 8.2.34 debug-symbolen zijn de exacte waarden voor de drie distributie-sub-builds als volgt:
- Bookworm:
0xc930
- Noble:
0xcef0
- Jammy:
0xd060
Bestandsstructuur (php-up-2026 bundle)
Het pakket php-up-2026 bevat de volgende bestanden:
phpupframework.py: Het hoofdframework.
poc0_109618.py: Proof of Concept voor CVE-2026-109618.
poc1_109619.py: Proof of Concept voor CVE-2026-109619.
poc_trigger.py: De trigger voor de exploit.
DELTAS_LSphp.md: Documentatie over de offsets voor LiteSpeed PHP.
README_FRAMEWORK.md: Instructies voor het framework.
REPORT_VALIDATION.md: Validatierapport.
RATING.md: Beoordeling van de kwetsbaarheid.
VALIDATION.md: Validatiegegevens.
README.md: Algemene informatie.
Gebruik
Instructies voor het valideren, extraheren en leveren van de chain:
# Controleer de forge en body layout
$ python3 php_up_framework.py --selftest
# Extraheer dtor / call / delta uit een specifiek binair bestand
$ python3 php_up_framework.py --syms --binary /path/to/lsphp
# Bouw de body.bin met een specifieke bug en leak
$ python3 php_up_framework.py --build --bug 619 --dtor <leak> -o body.bin
# Delivery in een php-fpm lab-omgeving
$ python3 php_up_framework.py --lab --bug 618 --dtor <leak>
# Delivery tegen een live target-url
$ python3 php_up_framework.py --live <target-url> --bug 619 --dtor <leak>
Mitigatie (vóór officiële patch)
Ondernemingen kunnen de volgende stappen ondernemen voordat de officiële advisory is gepubliceerd:
- Inventarisatie van PHP: Stel vast welke hosts en versies in gebruik zijn (
php -v). Versies PHP 7.x of ouder worden niet meer ondersteund; plan een upgrade.
- Pas de stopgap toe: Schakel de betreffende functie uit in
php.ini, .user.ini of .htaccess:
``ini session.upload_progress.enabled = Off `` Herstart PHP-FPM of de webserver. Volgens de analyse sluit dit één van de twee waarschijnlijke aanvalspaden.
- Beperk multipart uploads aan de edge: Het tweede aanvalspad bevindt zich in de multipart-parser zelf, die actief is voor elke
multipart/form-data POST, ongeacht de bovenstaande instelling. Gebruik een WAF of reverse proxy om inspectie aan te scherpen of rate-limiting toe te passen op multipart POSTs naar endpoints die geen uploads nodig hebben.
- Patchen zodra beschikbaar: De huidige stabiele versies zijn 8.5.11 / 8.4.26 / 8.3.35 / 8.2.34. Controleer bij managed hosting de tijdlijn voor updates.
Motivatie voor gratis publicatie
Mitigatie voorafgaand aan een patch zou geen betaald abonnement mogen zijn. Kleine teams zonder enterprise threat intel-contracten lopen het grootste risico in de periode tussen het lekken van een kwetsbaarheid en de officiële patch. De bovenstaande stappen zijn kosteloos; het is beter om nu risico's te verminderen dan morgen incident response te moeten doen.
Updates volgen zodra de officiële advisory is gepubliceerd, waarbij de root cause wordt bevestigd in samenwerking met Andrew Dorman (@acd421) en Arch&Yuki (@ArchKnight23).
Download
De signed release is verkrijgbaar via: wget http://jackalsyn.com/posts/phpupAssets/php-up-2026.tar.gz tar -xzf php-up-2026.tar.gz
Hash (SHA-256): a29d640e0481ff64a39541faeeeec0f998ecd18fb692816e75a6bcfa0f683017
Credits:
- Auteur: @J4ck3LSyN
- Onderzoek: Andrew Dorman (@acd421)
- Onderzoek: Arch&Yuki (@ArchKnight23)
- Status: Weaponized (dev)