Byly vydány opravy pro PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35, stejně jako záplaty pro již nepodporované verze PHP 7.4, PHP 8.0 a PHP 8.1 (zranitelné verze od 5.4 do 7.3 zůstávají bez záplat), které opravují dvě kritické zranitelnosti:
- CVE-2026-109618 — vzdálené spuštění kódu způsobené tím, že při vyčerpání dostupné paměti pro proces může obsluha nedostatku paměti pomocí funkce longjmp() přerušit PHP interpreter v okamžiku, kdy je inicializována pouze část vnitřních struktur spojených se zpracováním požadavku. Následně se funkce ukončení zpracování požadavku snaží přistupovat k těmto strukturám jako k již inicializovaným, ačkoliv paměť pro ně nebyla přidělena.
Hlavním vektorem útoku je manipulace s multipart požadavky, aby se vytvořily podmínky pro vyčerpání dostupné paměti procesu. Aby se obešel limit post_max_size, nemusí být specifikován hlavička Content-Length a může být odesláno obrovské množství HTTP hlaviček. Je možné provádět cílené útoky na konkrétní operace v PHP aplikacích, které nadměrně spotřebovávají paměť. Přítomnost exploitu byla potvrzena pro mod_php, protože vyvolává funkci shutdown() i při selhání. PHP-FPM při selhání ukončuje podproces, což ztěžuje provedení útoku, ale teoreticky to nevylučuje.
- CVE-2026-109619 — vzdálené spuštění kódu způsobené přístupem k paměti po jejím uvolnění kvůli nesprávnému vyčištění globálního stavu vázaného na konkrétní požadavek. V případě přerušení požadavku kvůli fatální chybě, timeoutu nebo nedostatku paměti může globální stav zůstat nevyresetován a ukazatele zůstanou aktivní, přestože paměť, na kterou odkazují, byla uvolněna. Při zpracování dalšího požadavku ve stejném procesu může dojít k přístupu k starému globálnímu stavu prostřednictvím zbývajícího ukazatele.
Pro prevádzku lze využít vytvoření podmínek pro vyčerpání dostupné paměti při zpracování multipart požadavku v kódu pro indikaci pokroku nahrávání (session.upload_progress). Přitom jako hlavní a potvrzený vektor útoku se zmiňuje zpracovatel fatal_error_backtraces v PHP 8.5, který neobnovuje stav trasování při ukončení. V prvním případě je útok možný na mod_php a PHP-FPM, v druhém případě pouze na mod_php. Dále se zmiňuje nepotvrzená možnost provedení útoku v konfiguracích, ve kterých jsou nastavení směrnic, vedoucí k vypsání varování na počátečním stupni zpracování požadavku (například varování o používání zastaralých parametrů).
Bylo uvedeno, že úplné zablokování zranitelností je možné pouze instalací aktualizace. Následující opatření mohou snížit pravděpodobnost úspěšného provedení útoků, ale systém úplně nezabezpečí:
- Nastavení v php.ini parametru „memory_limit=-1“, což ztěžuje možnost útočníka kontrolovat vyčerpání limitů na paměť.
- Nastavení parametru „post_max_size = 8M“, pokud není potřeba nahrávat velké soubory. Hodnota parametru „upload_max_filesize“ by měla být menší než hodnota parametru „post_max_size“.
- Stanovení limitu na přípustnou spotřebu paměti na systémové úrovni, prostřednictvím cgroup memory.max nebo parametrů spotřebované paměti kontejnerem, ale nikoliv prostřednictvím systémových limitů RLIMIT_AS a RLIMIT_DATA, které pouze vyvolávají problematický vyvolání longjmp().
- Pokud výkon není důležitý, je možné omezit počet požadavků zpracovávaných jedním pracovním procesem prostřednictvím pm.max_requests=1 v PHP-FPM a MaxRequestsPerChild v Apache httpd.
- Nastavení na úrovni php.ini nebo konfigurace serveru (ne přes ini_set() nebo FPM .user.ini, protože parametr by měl platit před zahájením zpracování požadavku) parametru „session.upload_progress.enabled=0.
- Při použití vydání PHP 8.5 je třeba nastavit parametr „fatal_error_backtraces=0“.
- Odstranění přiřazených k jednotlivým požadavkům zastaralých nebo chybných nastavení (například assert.* a nesprávné cesty v open_basedir), vedoucích k vypsání diagnostických zpráv před inicializací.
- Odstranění v PHP kódu situací, které vedou k dosažení časových limitů a fatálních chyb, například souvisejících s chybami v callback zpracovatelích a zpracováním nahrávání.
- Pro blokování první zranitelnosti v kódu starších verzí PHP je možné nahradit volání longjmp() v handleru vyčerpání volné paměti _exit().
- Dále je možné snížit hodnotu parametru max_input_nesting_level v php.ini a blokovat multipartové požadavky, jak bylo ukázáno v předběžném oznámení.
Stav odstraňování zranitelností v distribucích lze posoudit na těchto stránkách: Debian, Ubuntu, SUSE, RHEL, Gentoo, Arch,
Fedora, FreeBSD.
Dodatek 1: Zranitelnosti byly odhaleny pomocí AI modelů GPT‑5.6 a Gemini 4 Argon. Společnost OpenAI zveřejnila nástroj php2shell-checker pro kontrolu zranitelnosti webových stránek a lokálních spustitelných souborů, avšak tento nástroj pouze kontroluje číslo verze PHP vrácené HTTP serverem nebo příkazem „php -v“, bez podrobné analýzy.
Dodatek 2: Autor prototypu exploitů, které využívají zranitelnost způsobenou dvojitým uvolněním paměti (double-free), uvedl, že problém zůstává neopravený ve vydání PHP 8.5.12 a exploit nadále funguje. Dříve zástupci PHP tvrdili, že tato zranitelnost není spojena s plánovanými opravami a není skutečným problémem. Autor exploitu však tvrdil, že se jedná o zcela jinou zranitelnost.
Zdroj: opennet.ru
