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.

  1. Een enkele snelle multipart POST activeert beide caches.
  2. Een tweede update() leest het sessiebestand opnieuw, waarna zendhashupdate de vorige gedecodeerde tree vernietigt via de HashTable-destructor zvalptrdtor.
  3. 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:

  1. 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.
  2. 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.

  1. 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.
  2. 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)