PHP2Shell: két kritikus PHP-sérülékenység, és hogyan csökkenthető a kockázat a frissítésig

CVE-2026-109618 és CVE-2026-109619 – mit jelent, kit érint, mit kell azonnal megtenni, és mit tud addig a WAF

Sérülékenységek: CVE-2026-109618, CVE-2026-109619 („PHP2Shell”)

Súlyosság: CVSS 9.2 – kritikus, mindkettő

Típus: hitelesítés nélküli távoli kódfuttatás (RCE) a PHP motorban

Javítás: 2026. október 21. – PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35

Érintett: minden PHP-telepítés, amely webes kéréseket szolgál ki – a webszervertől függetlenül

Október 20-án kiszivárogtak a részletek. Október 21-én a PHP sürgősségi javítást adott ki. Mire a frissítés megjelent, már támadási kísérleteket is láttak. Ilyenkor nincs idő hosszan gondolkodni – de pánikolni sem érdemes.

2005 óta üzemeltetek IT-infrastruktúrát egészségügyi szolgáltatóknak Magyarországon, ahol a WAF mindig ott volt minden internet felé nyitott rendszer előtt. Az elmúlt két napban sokan kérdezték tőlem, mit jelent ez a hiba a gyakorlatban, és mit kell csinálni. Ezen az oldalon összefoglalom a tényeket és a teendőket. Hogy pontosan mit jelent ez egy WordPress-oldalnak, egy webshopnak vagy egy Kubernetesben futó API-nak, azt egy külön kockázati kézikönyvben írtam le.

Mi a két hiba – emberi nyelven

Mindkét hiba magában a PHP motorban van, nem egy bővítményben vagy keretrendszerben. Ezért mindegy, hogy WordPress, Laravel, Magento vagy saját fejlesztésű alkalmazás fut rajta, és az is mindegy, hogy Apache, Nginx vagy IIS áll előtte.

CVE-2026-109618 – amikor elfogy a memória

Ha a PHP egy kérés feldolgozása közben kifut a memóriából, félúton kilép, miközben a kérés adatai még csak félig vannak felépítve. A takarító kód ezután megbízik ezekben a félkész adatokban – és ebből kódfuttatás lesz. Speciálisan összeállított multipart kérésekkel kiváltható.

CVE-2026-109619 – a „beragadt” mutató

A PHP egy globális mutatót tart egy olyan memóriaterületre, amely egy adott kéréshez tartozik. Ha ez a mutató nem nullázódik, ugyanannak a workernek a következő kérése már felszabadított memóriát használ – ez is kódfuttatáshoz vezet. A hosszú életű workerek, például a PHP-FPM esetében ez különösen kedvező a támadónak.

Mit jelent a „hitelesítés nélküli távoli kódfuttatás”? Azt, hogy a támadónak nem kell belépnie, nem kell jelszót tudnia, és a felhasználónak sem kell semmire kattintania. Egy jól összerakott HTTP-kérés elég ahhoz, hogy a támadó a webszerver jogosultságaival kódot futtasson – és ezzel elérje mindazt, amit maga a weboldal is elér, az adatbázist is beleértve.

Mely szerverkörnyezetek érintettek?

Webszerver / PHP módCVE-2026-109618CVE-2026-109619Megjegyzés
Apache + mod_phpÉrintettÉrintettLegmagasabb kockázat: már az alkalmazáskód futása előtt kiváltható
Apache + PHP-FPM (proxy_fcgi)ÉrintettÉrintettA hosszú életű FPM-workerek kedveznek a 109619-nek
Nginx + PHP-FPMÉrintettÉrintettUgyanaz, mint fent
IIS + FastCGI (php-cgi.exe)ÉrintettÉrintettA php-cgi kifejezetten a hatókörben van; a workerek sok kérést szolgálnak ki (instanceMaxRequests); az alkalmazás előtti útvonal csak mod_php esetén igazolt
LiteSpeed (lsphp)ÉrintettÉrintettA közleményben név szerint szerepel
FrankenPHPÉrintettÉrintettA közleményben név szerint szerepel
PHP CLI (cron, szkriptek)Nem kitettNem kitettNem szolgál ki webes kéréseket

Egy gyakran elfelejtett eset: sok Windows/IIS szerver több oldalt is kiszolgál, és valamelyikhez telepítve van egy PHP FastCGI handler. Ilyenkor a szerver érintett akkor is, ha a te oldalad nem PHP-s. Mindig szerverszinten ellenőrizd, ne csak oldalszinten.

Mely verziók érintettek, és hol a javítás?

PHP ágSérülékenyJavítvaÁllapot
8.5< 8.5.128.5.12Hivatalos kiadás
8.4< 8.4.278.4.27Hivatalos kiadás
8.3< 8.3.368.3.36Hivatalos kiadás
8.2< 8.2.358.2.35Hivatalos kiadás
8.1 / 8.0 / 7.4MindNincs hivatalos kiadásCsak forráskódos backport, vagy disztribúciós / LTS-szállítói csomag
7.3 és régebbi (5.4-től)MindNincs javításSérülékenynek kell tekinteni – frissíteni kell
A frissítés után minden PHP-workert újra kell indítani, különben a régi kód fut tovább a memóriában: PHP-FPM esetén systemctl restart php-fpm, mod_php esetén az Apache újraindítása, IIS-en az application pool újrahasznosítása vagy iisreset. Konténereknél az image-et kell újraépíteni és újratelepíteni – a futó podok a régi image-dzsel sérülékenyek maradnak.

„Akkor miért nem frissítünk azonnal mindenhol?”

Ezt kérdezte tőlem az egyik kollégám, és jogos a kérdés. Frissíteni kell, ezen nincs vita. De éles környezetben – főleg egészségügyben, pénzügyben, vagy ahol egy szerveren tucatnyi alkalmazás fut – egy PHP-frissítés nem úgy megy, hogy kijön, és másnap fent van.

  • Kompatibilitás és függőségek: a bővítmények, a keretrendszer és a saját kód is működjön az új patch-verzióval.
  • Change management: jóváhagyás, karbantartási ablak, kommunikáció az érintettek felé.
  • Visszaállási terv: ha valami mégsem működik, pontosan tudni kell, hogyan és mennyi idő alatt állunk vissza.
  • Régi ágak: a PHP 8.1 vagy régebbi rendszereknél nincs egyszerű patch – ott verzióváltás kell, ami már projekt.

A frissítésig eltelt időben valaminek védenie kell a rendszert. Ezért van a WAF, a tűzfal és a szegmentálás. Ez nem kifogás a halogatásra, hanem a felelős üzemeltetés része.

Hogy egy szervezet mennyi ideig engedheti meg magának a kockázatot, és ki dönt a leállításról, azt nem a sérülékenység dönti el, hanem a BCDR. Erről, és arról, milyen három opciót adok ilyenkor, egy külön oldalon írtam.

Mitigáció lépésről lépésre

1. Leltár – hol fut PHP?

Minden szervert és konténert fel kell térképezni, ahol PHP fut: megosztott IIS-hosztok, régi „elfelejtett” rendszerek, tesztkörnyezetek, amelyek véletlenül kint vannak az interneten. Amiről nem tudsz, azt nem tudod frissíteni.

2. Frissítés és workerek újraindítása

PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 – tesztelve, majd minden worker újraindítása vagy a konténerek újratelepítése. A legkritikusabb rendszerekkel kezdve: ahol személyes adat, fizetés vagy egészségügyi adat van.

3. PHP-konfiguráció megerősítése

; Upload-progress funkció kikapcsolása (CVE-2026-109619 útvonal)
session.upload_progress.enabled = 0

; Alacsony POST-méret – az alkalmazás tényleges igényéhez igazítva
post_max_size = 10M

; Csak PHP 8.5 esetén
fatal_error_backtraces = 0

4. Ideiglenesen szigorú WAF-szabályok

Mivel memóriakezelési hibákról van szó, nincs egyetlen tiszta támadási minta, amit le lehetne tiltani. A WAF-szabályok a támadási útvonalakat szűkítik:

  • multipart/form-data tiltása minden olyan végponton, amely nem fogad legitim fájlfeltöltést;
  • a kérés törzsének, a POST-mezők és fájlok számának, valamint a paraméterek beágyazási mélységének korlátozása;
  • a PHP session upload-progress mező tiltása – ez az egyik ismert támadási útvonal;
  • a hibás formátumú multipart kérések elutasítása.

A konkrét ModSecurity- és IIS-szabályokat, a saját tudásbázisomból összeszedve, a WAF-ról szóló oldalon találod. Először detekciós módban teszteld őket.

5. Kompromittálódás jeleinek keresése

  • új, ismeretlen admin-fiókok;
  • ismeretlen PHP-fájlok (web shellek) a webkönyvtárban;
  • módosított fizetési (checkout) szkriptek;
  • szokatlan kimenő forgalom vagy nagy adatbázis-exportok.

Ha bármelyikre utaló jelet találsz: incidenskezelés, és ha személyes adat érintett, GDPR szerinti adatvédelmi incidenskezelés.

A PHP fejlesztői egyértelműen fogalmaznak: erre a hibára nincs teljes körű mitigáció, a frissítés az egyetlen biztos megoldás. A WAF-szabályok és a php.ini beállítások időt nyernek – nem helyettesítik a javítást.

Mit tapasztaltam az elmúlt két napban?

Több helyen leteszteltük: ahol az általam üzemeltetett WAF a javasolt beállításokkal fut, ott a sérülékenység nem volt kihasználható. A szabályokat azóta is folyamatosan finomhangoljuk, mert minden alkalmazás másképp viselkedik.

Ez a hiba nem az első, és nem az utolsó. Ahogy az OpenSSL-nél, úgy a PHP-nál is rendszeresen jönnek majd hasonlók. A jól felépített környezet – tűzfal, WAF, szegmentálás, rendszeres penteszt – nem teszi feleslegessé a frissítést, de időt ad arra, hogy azt rendesen, tesztelve csináljuk meg.

A lényeg egy mondatban: a webmesternek minden esetben frissítenie kell a PHP-motort – a WAF pedig addig is megvédi azt, amit a frissítés még nem tudott.

Kapcsolódó oldalak

Az oldal a 2026. október 23-án nyilvánosan elérhető információkat tükrözi, és új részletek esetén frissítem.