Objavljene su ispravke za PHP 8.5.12, 8.4.27, 8.3.36 i 8.2.35, kao i zakrpe za verzije PHP 7.4, PHP 8.0 i PHP 8.1 koje više nisu podržane (ranjive verzije od 5.4 do 7.3 ostaju bez zakrpa), u kojima su ispravljene dve kritične ranjivosti:
- CVE-2026-109618 — udaljeno izvršavanje koda, uzrokovano time što pri iscrpljenju raspoložive slobodne memorije, handler za nedostatak memorije preko izvršenja funkcije longjmp() može prekinuti PHP interpreter u stanju kada su samo delimično inicijalizovane interne strukture povezane sa obradom zahteva. U nastavku, funkcija za završavanje obrade zahteva se obraća tim strukturama kao da su već inicijalizovane, iako memorija za njih nije dodeljena.
Glavni vektor napada je manipulacija sa multipart zahtevima kako bi se stvorili uslovi za iscrpljenje raspoložive memorije. Da bi se zaobišao limit post_max_size, može se izostaviti Content-Length header i poslati ogroman broj HTTP headera. Takođe, mogu se izvesti i ciljani napadi na konkretne operacije u PHP aplikacijama koje prekomerno troše memoriju. Eksploitacija je potvrđena za mod_php, jer poziva funkciju shutdown() čak i u slučaju greške. PHP-FPM će prekinuti podproces pri grešci, što otežava izvršenje napada, ali teoretski to ne isključuje.
- CVE-2026-109619 — udaljeno izvršavanje koda, uzrokovano pristupom memoriji nakon što je oslobođena zbog nepravilnog čišćenja globalnog stanja vezanog za konkretan zahtev. U slučaju prekida zahteva zbog fatalne greške, isteka vremena ili nedostatka memorije, globalno stanje može ostati neponišteno, a pokazivači će ostati aktivni uprkos oslobađanju memorije na koju se odnose. Prilikom obrade sledećeg zahteva u istom procesu, može doći do pristupa starom globalnom stanju preko preostalog pokazivača.
Za delovanje se lahko ustvari situacija, kjer se zmanjša razpoložljiva pomnilniška kapaciteta pri obdelavi multipart poizvedb v kodi za indikacijo napredka nalaganja (session.upload_progress). V tem primeru se kot glavni in potrjen vektor napada omenja obdelovalec fatal_error_backtraces v PHP 8.5, ki ne ponastavi stanja sledi pri končanju. V prvem primeru je napad mogoč na mod_php in PHP-FPM, medtem ko je v drugem primeru mogoč le na mod_php. Omemba je tudi nepotrjene možnosti izvajanja napada v konfiguracijah, kjer so nastavitve, ki vodijo do prikazovanja opozoril v zgodnji fazi obdelave poizvedbe (na primer opozorila o uporabi zastarelih parametrov).
Trdi se, da je popolna blokada ranljivosti mogoča le z namestitvijo posodobitve. Naslednje ukrepe lahko zmanjšajo verjetnost uspešnega napada, ne zagotavljajo pa popolne varnosti sistema:
- Nastavitev v php.ini parametra „memory_limit=-1“, kar oteži napadalcu nadzor nad izčrpavanjem pomnilniških omejitev.
- Nastavitev parametra „post_max_size = 8M“, če ni potrebe po nalaganju velikih datotek. Vrednost parametra „upload_max_filesize“ mora biti manjša od vrednosti „post_max_size“.
- Nastavitev omejitve na dovoljeno porabo pomnilnika na ravni sistema, preko cgroup memory.max ali parametrov porabe pomnilnika v kontejnerju, vendar ne preko sistemskih omejitev RLIMIT_AS in RLIMIT_DATA, ki le provokativno izzovejo problematičen klic longjmp().
- Če zmogljivost ni pomembna, je možno omejiti število poizvedb, ki jih obdeluje en delovni proces preko pm.max_requests=1 v PHP-FPM in MaxRequestsPerChild v Apache httpd.
- Nastavitev na ravni php.ini ali konfiguracije strežnika (ne preko ini_set() ali FPM .user.ini, saj mora parameter veljati pred začetkom obdelave poizvedbe) parametra „session.upload_progress.enabled=0.
- Ob uporabi PHP 8.5 je potrebno nastaviti parameter „fatal_error_backtraces=0“.
- Odprava staležnih ali napačnih nastavitev, povezanih z posameznimi poizvedbami (kot so assert.* in napačne poti v open_basedir), ki vodijo do prikazovanja diagnostičnih sporočil pred inicializacijo.
- Odprava v PHP kodi situacij, ki vodijo do doseganja časovnih omejitev in usodnih napak, na primer, povezanih s napakami v povratnih obdelovalcih in obdelavi nalaganj.
- Za blokiranje prve ranjivosti u kodu starih verzija PHP može se zamijeniti poziv longjmp() u handleru za istrošenost slobodne memorije s _exit().
- Dodatno, moguće je smanjiti vrijednost parametra max_input_nesting_level u php.ini i blokirati multipart zahtjeve, kao što je prikazano u prethodnom najavi.
Status ispravka ranjivosti u distribucijama može se procijeniti na sljedećim stranicama: Debian, Ubuntu, SUSE, RHEL, Gentoo, Arch,
Fedora, FreeBSD.
Dodatek 1: Ranjivosti su otkrivene pomoću AI modela GPT‑5.6 i Gemini 4 Argon. Tvrtka OpenAI objavila je alat php2shell-checker za provjeru ranjivosti web stranica i lokalnih izvršnih datoteka, no ovaj alat samo provjerava verziju PHP-a koju poslužitelj HTTP vraća ili naredbom „php -v”, bez detaljne analize.
Dodatek 2: Autor prototipa eksploitera koji koristi ranjivost uzrokovanu dvostrukim oslobađanjem memorije (double-free) izvijestio je da problem ostaje neispravljen u izdanju PHP 8.5.12, a eksploatacija i dalje radi. Ranije su predstavnici PHP-a tvrdili da ova ranjivost nije povezana s planiranim ispravkama i da nije stvarni problem. Autor eksploita tvrdio je da je to potpuno drugačija ranjivost.
Izvor: opennet.ru
