Objavljene su ispravke za PHP 8.5.12, 8.4.27, 8.3.36 i 8.2.35, kao i zakrpe za već nepodržane verzije PHP 7.4, PHP 8.0 i PHP 8.1 (ranjive verzije od 5.4 do 7.3 ostaju bez zakrpa), u kojima su ispravljene dvije kritične ranjivosti:
- CVE-2026-109618 — daljinsko izvršavanje koda izazvano time što ispunjenje dostupne slobodne memorije za proces može uzrokovati prekid PHP interpreter-a u stanju kada su inicijalizirane samo neke od unutarnjih struktura povezanih s obradom zahtjeva, kroz izvršavanje funkcije longjmp(). U sljedećoj obradi zahtjeva, funkcija koja završava obradu zahtjeva obraća se tim strukturama kao već inicijaliziranim, iako memorija za njih nije dodijeljena.
Glavni vektor napada je manipulacija multipart zahtjevima kako bi se stvorili uvjeti za ispunjenje dostupne memorije za proces. Da bi se izbjegla granica post_max_size, može se izostaviti Content-Length zaglavlje i poslati ogromna količina HTTP zaglavlja. Moguće su i točkovne napade na specifične operacije u php aplikacijama koje pretjerano troše memoriju. Potvrđeno je postojanje exploit-a za mod_php, budući da poziva funkciju shutdown() čak i u slučaju greške. PHP-FPM u slučaju greške završava dijete proces, što otežava izvođenje napada, ali ga teoretski ne isključuje.
- CVE-2026-109619 — daljinsko izvršavanje koda uzrokovano pristupom memoriji nakon njenog oslobađanja zbog nepravilnog čišćenja globalnog stanja vezanog uz određeni zahtjev. U slučaju prekida zahtjeva zbog fatalne greške, isteka vremena ili nedostatka memorije, globalno stanje može ostati neresetirano, a pokazivači će ostati aktivni, iako je memorija na koju se odnose oslobođena. Prilikom obrade sljedećeg zahtjeva u istom procesu može doći do pristupa preostalom pokazivaču na staro globalno stanje.
Za rad može biti korištena stvaranje uvjeta za iscrpljenje dostupne memorije prilikom obrade multipart zahtjeva u kodu za indikaciju napretka učitavanja (session.upload_progress). U tom slučaju kao glavni i potvrđeni vektor napada spominje se obrada fatal_error_backtraces u PHP 8.5, koja ne resetira stanje praćenja pri završetku. U prvom slučaju napad je moguć na mod_php i PHP-FPM, a u drugom samo na mod_php. Također se spominje nepotvrđena mogućnost provođenja napada u konfiguracijama u kojima su u postavkama prisutne direktive koje dovode do ispisivanja upozorenja u ranom stadiju obrade zahtjeva (na primjer, upozorenja o korištenju zastarjelih parametara).
Izjavljuje se da je potpuno blokiranje ranjivosti moguće samo kroz instalaciju ažuriranja. Sljedeće mjere omogućuju smanjenje vjerojatnosti uspješnog provođenja napada, ali ne čine sustav potpuno sigurnim:
- Postavljanje u php.ini parametra „memory_limit=-1“, što otežava mogućnost napadaču da kontrolira iscrpljenje limita na memoriju.
- Postavljanje parametra „post_max_size = 8M“, ako nije potrebna učitavanja velikih datoteka. Vrijednost parametra „upload_max_filesize“ trebala bi biti manja od parametra „post_max_size“.
- Postavljanje limita na dopuštenu potrošnju memorije na sustavnom nivou, putem cgroup memory.max ili parametara potrošnje memorije kontejnerom, ali ne kroz sustavne limite RLIMIT_AS i RLIMIT_DATA, koji samo provociraju problematičan poziv longjmp().
- Ako performanse nisu važne, može se ograničiti broj zahtjeva koje obrađuje jedan radni proces putem pm.max_requests=1 u PHP-FPM i MaxRequestsPerChild u Apache httpd.
- Postavljanje na razini php.ini ili konfiguracije poslužitelja (ne putem ini_set() ili FPM .user.ini, jer parametar mora djelovati prije početka obrade zahtjeva) parametra „session.upload_progress.enabled=0.
- Pri korištenju izdanja PHP 8.5 potrebno je postaviti parametar „fatal_error_backtraces=0”.
- Uklanjanje povezanih s pojedinim zahtjevima zastarjelih ili pogrešnih postavki (tipa assert.* i netočnih putanja u open_basedir), što dovodi do ispisivanja dijagnostičkih poruka prije inicijalizacije.
- Otklanjanje u PHP kodu situacija koje dovode do postizanja vremenskih ograničenja i fatalnih grešaka, na primjer, vezanih uz kvarove u callback obradi i obradi učitavanja.
- Da biste blokirali prvu ranjivost u kodu starih verzija PHP-a, možete zamijeniti poziv longjmp() u handleru za iscrpljivanje slobodne memorije s _exit().
- Dodatno, možete smanjiti vrijednost parametra max_input_nesting_level u php.ini i blokirati multipart upite, kao što je prikazano u prethodnom najavi.
Status uklanjanja ranjivosti u distribucijama možete ocijeniti na ovim stranicama: Debian, Ubuntu, SUSE, RHEL, Gentoo, Arch,
Fedora, FreeBSD.
Dodatak 1: Ranjivosti su otkrivene pomoću AI modela GPT‑5.6 i Gemini 4 Argon. Tvrtka OpenAI objavila je alat php2shell-checker za provjeru izloženosti ranjivostima web stranica i lokalnih izvršnih datoteka, no ovaj alat samo provjerava verziju PHP-a koju vraća HTTP poslužitelj ili naredba 'php -v', bez detaljne analize.
Dodatak 2: Autor prototipa eksploitnog alata koji koristi ranjivost uzrokovanu dvostrukim oslobađanjem memorije (double-free) izvijestio je da problem ostaje neispravljen u izdanju PHP 8.5.12 i eksploit i dalje funkcionira. Ranije su predstavnici PHP-a izjavili da ova ranjivost nije povezana s pripremljenim ispravcima i nije stvarni problem. Autor eksploitnog alata tvrdio je da je riječ o sasvim drugačijoj ranjivosti.
Izvor: opennet.ru
