Byly vydány opravy 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), ve kterých byly opraveny 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 obslužná rutina nedostatku paměti voláním funkce longjmp() přerušit PHP interpretátor ve stavu, kdy jsou inicializovány pouze některé interní struktury související se zpracováním požadavku. V následující fázi funkce ukončení zpracování požadavku přistupuje k těmto strukturám, jako by byly již inicializovány, přestože pro ně není přidělena paměť.
Hlavním vektorem útoku je manipulace s multipart požadavky za účelem vytvoření podmínek pro vyčerpání dostupné paměti procesu. Pro obcházení limitu post_max_size nemusí být uvedený hlavička Content-Length a může být odesláno obrovské množství HTTP hlaviček. Je možné provádět i cílené útoky na konkrétní operace v php aplikacích, které zbytečně 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čí podproces, což ztěžuje provedení útoku, ale teoreticky ho nevylučuje.
- CVE-2026-109619 — vzdálené spuštění kódu způsobené přístupem k paměti po jejím uvolnění v důsledku nesprávného vyčištění globálního stavu přidruženého ke konkrétnímu požadavku. V případě přerušení požadavku z důvodu fatální chyby, vypršení času nebo nedostatku paměti může globální stav zůstat neobnovený a ukazatele zůstanou aktivní, navzdory uvolnění paměti, na kterou se odkazují. Při zpracování dalšího požadavku ve stejném procesu může dojít k přístupu pomocí zůstávajícího ukazatele ke starému globálnímu stavu.
Pro provoz může být využito vytváření podmínek k vyčerpání dostupné paměti při zpracování multipart žádosti v kódu pro indikaci postupu nahrávání (session.upload_progress). Přitom je jako hlavní a potvrzený vektor útoku zmíněna zpracovatel fatal_error_backtraces v PHP 8.5, který neobnovuje stav trasy při ukončení. V prvním případě je útok možný na mod_php a PHP-FPM, v druhém pouze na mod_php. Je také zmíněna nepotvrzená možnost provedení útoku v konfiguracích, v jejichž nastaveních jsou direktivy, které vedou k výstupu varování v rané fázi zpracování žádosti (například varování o používání zastaralých parametrů).
Je uvedeno, že úplné zablokování zranitelností je možné pouze prostřednictvím instalace aktualizace. Následující opatření umožňují snížit pravděpodobnost úspěšného provedení útoků, ale systém zcela bezpečným nezčiní:
- Nastavení v php.ini parametru „memory_limit=-1“, což ztěžuje útočníkovi kontrolu vyčerpání limitů paměti.
- 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 povolenou spotřebu paměti na systémové úrovni prostřednictvím cgroup memory.max nebo parametrů spotřeby paměti kontejnerem, ale ne prostřednictvím systémových limitů RLIMIT_AS a RLIMIT_DATA, které pouze provokují problémové vyvolání longjmp().
- Pokud výkon není důležitý, je možné omezit počet žádostí zpracovávaných jedním pracovníkem prostřednictvím pm.max_requests=1 v PHP-FPM a MaxRequestsPerChild v Apache httpd.
- Nastavení na úrovni php.ini nebo konfigurace serveru (ne prostřednictvím ini_set() nebo FPM .user.ini, protože parametr by měl platit před zahájením zpracování žádosti) parametru „session.upload_progress.enabled=0.
- Při použití verze PHP 8.5 by měl být nastaven parametr „fatal_error_backtraces=0“.
- Odstranění zpřísněných k jednotlivým žádostem zastaralých nebo chybných nastavení (typy assert.* a nesprávné cesty v open_basedir), které vedou k výstupu 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, na příklad souvisejících s poruchami v callback zpracovatelích a zpracováním nahrávání.
- Pro zablokování první zranitelnosti ve starších verzích PHP je možné nahradit volání longjmp() ve zpracovatelském modulu vyčerpání volné paměti příkazem _exit().
- Dále lze snížit hodnotu parametru max_input_nesting_level v php.ini a blokovat multipart požadavky, jak bylo ukázáno v předběžném oznámení.
Stav odstranění zranitelností ve vydáních lze vyhodnotit na následujících 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 místních spouštitelných souborů, avšak tento nástroj pouze kontroluje číslo verze PHP, které vrací HTTP server nebo příkaz ‚php -v‘, bez podrobné analýzy.
Dodatek 2: Autor prototypu exploitujícího zranitelnost způsobenou dvojnásobným uvolněním paměti (double-free) uvedl, že problém zůstává neopraven v vydání PHP 8.5.12 a exploit nadále funguje. Dříve zástupci PHP prohlásili, že tato zranitelnost není spojena s připravovanými opravami a není skutečným problémem. Autor exploitu však tvrdil, že se jedná o zcela jinou zranitelnost.
Zdroj: opennet.ru
