Tudásbázis · Frissítve: 2026. október 25. · WebPot DEV

PHP2Shell: így javítsa a kritikus PHP-hibát tárhelyen és VPS-en

A PHP hivatalos logója sötét háttéren, alatta pajzs és a javított PHP-verziók: 8.5.12, 8.4.27, 8.3.36, 8.2.35

A rövid válasz: 2026. október 21-én a PHP fejlesztői két kritikus hibát javítottak (CVE-2026-109618 és CVE-2026-109619, CVSS 9,2), amelyekkel belépés nélkül, egy ügyesen összerakott kéréssel kódot lehet futtatni szinte bármelyik webes PHP-telepítésen. Egyetlen valódi javítás van: a PHP frissítése a 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra (vagy a disztribúció javított csomagjára), utána a PHP-folyamatok újraindítása. Tárhelyen ezt a szolgáltató végzi, Önnek ellenőriznie kell. VPS-en az Ön dolga. A saját szerverünkön a hivatalos kiadás után hét órával már a javított PHP futott.

Ahol az oldala futMi a teendőKi végzi
Osztott tárhely (cPanel, Plesk, DirectAdmin)Ellenőrizze a PHP-verziót és kérjen írásos megerősítést a szolgáltatótólA szolgáltató frissít, Ön ellenőriz
Menedzselt WordPress tárhelyNézze meg a szolgáltató közleményét, többnyire nincs teendőA szolgáltató
Saját VPS (Ubuntu, Debian, AlmaLinux)Csomagfrissítés, a PHP-FPM és az Apache újraindítása, naplók átnézéseÖn vagy az üzemeltetője
Docker konténerA kép újraépítése friss alapképből, a konténerek cseréjeA fejlesztő vagy az üzemeltető
PHP 8.1 vagy régebbiVáltás 8.3-ra vagy 8.4-re, amíg ez nincs meg, a szolgáltató javított csomagjaKözösen: a váltás előtt tesztelni kell

Mi a PHP2Shell és miért ilyen veszélyes?

A PHP2Shell két, egymással rokon hiba közös neve a PHP értelmezőjében, nem egy bővítményben vagy egy keretrendszerben. Mindkettő ugyanarra a mintára épül: ha egy kérés feldolgozása félúton megszakad (elfogy a memória vagy végzetes hiba lép fel), a PHP egy félkész belső állapotot később érvényesnek tekint. Egy támadó ezt a félkész állapotot a saját adataival tudja feltölteni, a takarítás pedig végül az ő parancsát futtatja le.

  • CVE-2026-109618. Ha a PHP az űrlapadatok feldolgozása közben kifut a memóriából, egy bejegyzés számlálója már frissül, maga a bejegyzés viszont nem jön létre. A kérés végi takarítás ezt a szemetet valódi PHP-értékként kezeli.
  • CVE-2026-109619. A PHP-folyamat egymás után sok kérést szolgál ki. Egy megszakadt kérés után a folyamatban olyan mutató maradhat, amely már felszabadított memóriára mutat. A következő kérés ezt használja tovább (szakszóval use-after-free). A PHP hivatalos leírása szerint így a memória tartalma is kiolvasható lehet, benne más kérések adataival.
Folyamatábra: egy POST-kérés, a memória kimerülése, félkész bejegyzés, majd parancsfuttatás, mindez a PHP értelmezőjében, az alkalmazás indulása előttFolyamatábra: egy POST-kérés, a memória kimerülése, félkész bejegyzés, majd parancsfuttatás, mindez a PHP értelmezőjében, az alkalmazás indulása előtt
A CVE-2026-109618 támadási lánca egyszerűsítve. A CVE-2026-109619 más úton, egy korábbi kérés után felszabadított memórián át jut el ugyanoda.

Miért nem véd a WordPress-frissítés vagy a biztonsági bővítmény?

Mert a támadó kérését a PHP még az alkalmazás első kódsora előtt feldolgozza. A hiba a POST-kérés törzsének értelmezésekor jön elő, ezért mindegy, hogy WordPress, Magento, Drupal vagy egy saját fejlesztésű rendszer fut a szerveren: bármelyik PHP-fájl elérhetősége elég, akár egy egyszerű kapcsolatfelvételi oldalé is. A belépési védelem, a captcha és a biztonsági bővítmény ilyenkor még el sem indult.

Fontos: egy sikeres támadás nem feltétlenül okoz hibaüzenetet vagy összeomlást. Egy 200-as HTTP-válasz a naplóban semmit nem bizonyít, a kérés ettől még lehetett ártalmas.

Kit érint: verziók és futtatási módok

Minden olyan PHP-telepítést, amely webes kéréseket szolgál ki: PHP-FPM, Apache mod_php, php-cgi, FrankenPHP és LiteSpeed. A PHP csapata szerint a legnagyobb kockázatot a mod_php jelenti. A parancssori PHP (CLI, cron) kívülről nem támadható ezen az úton, de ugyanabból a csomagból frissül.

PHP-ágJavított verzióMegjegyzés
8.58.5.12Itt a végzetes hibák visszakövetése is támadási út (lásd az ideiglenes enyhítést)
8.48.4.27Támogatott ág, ide érdemes váltani a régebbiekről
8.38.3.36Csak biztonsági javításokat kap
8.28.2.352026. december 31-én kifut, utána nincs több javítás
7.4–8.1Nincs hivatalos kiadásA PHP csapata minimális forráskód-javítást tett közzé, a disztribúciók és a szolgáltatók ebből készítenek csomagot
5.4–7.3Nincs javításA hibás kódrész a kutatók szerint a PHP 5.4 óta létezik, ezeket az ágakat csak cserélni lehet

A Linux-disztribúciók (Ubuntu, Debian, Red Hat) és a CloudLinux a javítást gyakran a verziószám változtatása nélkül, visszaportolva adják ki. Ilyenkor egy régebbinek látszó verziószám is lehet már javított, ezért a csomag változásnaplója a mérvadó.

Mi történt október 17. és 23. között?

Október 17.Első kísérlet

Az Amazon csapdahálózata (honeypot) kihasználási kísérletet észlelt, négy nappal a nyilvánosságra hozatal előtt. Az Amazon azt javasolja, hogy a naplók átnézése innen induljon, ne a kiadás napjától.

Október 20.Kiszivárgás

A hibák azonosítói felbukkantak a közösségi oldalakon. A PHP bejelentette a másnapi biztonsági kiadást, egy nappal korábbra hozva az eredeti tervhez képest. A CERT-EU külön figyelmeztetést adott ki.

Október 21., 16:00Javított kiadások

Megjelent a 8.5.12, 8.4.27, 8.3.36 és 8.2.35, a 7.4, 8.0 és 8.1 ágra pedig forráskód-javítás. Aznap a Cloudflare korai támadásokról számolt be és mindenkinek, az ingyenes csomagban is, védelmi szabályokat élesített. Az amerikai CISA azonnali frissítést kért.

Október 22–23.Tömeges pásztázás

Több biztonsági cég megerősítette a szélesebb körű, célzatlan pásztázást és a nyilvánosan terjedő támadókódokat. Ezek egy része maga is kártevőt tartalmazhat, ezért kipróbálni sem érdemes.

Október 23.Harmadik, kisebb hiba

A PHP egy újabb figyelmeztetést tett közzé (CVE-2026-115560). Ez csak ritka beállításnál veszélyes, de a javasolt teendő mindenkinek egyszerű, ezért külön leírjuk.

Idővonal 2026. október 21-ről magyar idő szerint: 04:29 kiszivárgás, 09:34 támadások tárhelycégeknél, 11:45 finn leállás, 16:00 javítás, 22:58 a mi szerverünk frissítéseIdővonal 2026. október 21-ről magyar idő szerint: 04:29 kiszivárgás, 09:34 támadások tárhelycégeknél, 11:45 finn leállás, 16:00 javítás, 22:58 a mi szerverünk frissítése
A kritikus nap óráról órára, magyar idő szerint. Az időpontok a Recorded Future, a Sansec, a Helsinki Times és a php.net közléseiből valók, a 22:58-as sor a saját szerverünk naplójából.

A harmadik hiba: CVE-2026-115560

Ez a hiba akkor használható ki, ha az alkalmazás a session.serialize_handler értékét a konfigurációban php_binary vagy php_serialize értékre állítja, futás közben ini_set()-tel php-re váltja, miközben a feltöltésjelző (session upload progress) be van kapcsolva. A PHP szerint ez valószínűtlen helyzet. A javítás a következő rendes kiadásban érkezik, addig a PHP azt javasolja, hogy a session.upload_progress.enabled legyen kikapcsolva. A legtöbb oldal ezt a funkciót nem használja, a kikapcsolás tehát semmit nem ront el.

Kiket érintett a támadás és hogyan?

A PHP2Shell legnagyobb, mindenki által látható kárát nem a feltörések okozták, hanem az óvatosságból elrendelt leállások. A nyilvános források szerint október 25-ig egyetlen nagy szervezet sem jelentett be igazolt behatolást. A kormányok és a nagy szolgáltatók egy része viszont inkább lekapcsolta a PHP-s oldalait, amíg a javítás meg nem jelent és fel nem került.

KiMi történtMegjegyzés
MagyarországElővigyázatosságból leállt a magyarorszag.hu és több más kormányzati oldal. A bejelentés szerint a portálon keresztüli ügyintézés várhatóan 48 órán át szünetelt.A kormány közlése szerint támadásra utaló jelet nem találtak. A nemzeti kiberbiztonsági intézet (NKI) október 21-én kritikus riasztást adott ki.
HollandiaA CERT-EU figyelmeztetése után a holland nemzeti kiberbiztonsági központ (NCSC) a PHP-s oldalak lekapcsolását javasolta. Leállt többek között a DigiD, a MijnOverheid, az Overheid.nl, a parlament oldala, az RTL hírportálja és a Tweakers.A DigiD és a MijnOverheid a javítás után visszatért. A lekapcsolásról parlamenti kérdések születtek.
FinnországAz állami informatikai központ (Valtori) helyi idő szerint 12:45-kor korlátozta a kormányzati oldalak nyilvános forgalmát. Leállt vagy akadozott a finn földmérési hivatal oldala, az Yle több szolgáltatása és a Helsinki Egyetem rendszerei.A Valtori szerint megelőző lépés volt, nem egy igazolt támadásra adott válasz. A belső kormányzati hálózat zavartalanul működött.
Franciaország, Belgium, DániaLeálltak a francia belügyminisztérium oldalai, belga kormányzati oldalak és a dán országos iskolai kommunikációs platform.Óvintézkedés, igazolt támadásról nincs hír.
WikimediaTöbb kiszolgáló rendszert lekapcsoltak, a Wikipédia egyes részei egy időre nem voltak elérhetők.A MediaWiki, a Wikipédia motorja is PHP-ban készült.
BBC, Internet Archive, 4chan, DeviantArtEgyes oldalak és szolgáltatások rövid időre elérhetetlenek lettek vagy csak olvasható módba váltottak, amíg a javítás felkerült.A források a leállásokról szólnak, adatlopásról nem.

A kitettség becslései nagyon eltérnek: a Palo Alto Networks 22,6 millió potenciálisan sebezhető példányt mért, egy független kutató 1,3 millió, egy Shodan-alapú számolás 1,9 millió internetről elérhető PHP-s gépet. A különbség a mérési módszerből adódik. A W3Techs szerint az ismert szerveroldali nyelvű weboldalak 69 százaléka PHP-n fut.

Hogyan próbálták kihasználni?

  • Csapdahálózatok és pásztázás. Az Amazon már október 17-én, a watchTowr és más biztonsági cégek október 21-től rögzítettek kísérleteket a csapdagépeiken (honeypot). A Cloudflare október 21-én reggel korai támadásokat jelzett, még a javítás megjelenése előtt.
  • Tárhelyszolgáltatók. A Patchstack október 21-én reggel arról számolt be, hogy a tárhelypartnerei több aktív kihasználási esetet láttak. A szolgáltatókat nem nevezte meg.
  • Kiszivárgott és hamis támadókódok. A hibák leírása már a javítás előtt felkerült a VirusTotalra. A PHP biztonsági csapata az utána terjedő bemutató kódok (PoC) között a kiadás idején működőt nem talált. A biztonsági cégek szerint ezek egy része maga is kártevőt rejthet.
  • Miért nem lett belőle (eddig) tömeges feltörés? A Sansec szerint nincs olyan egyetlen kérés, amely minden szerveren működne, mint a Log4Shellnél: a támadónak ismernie kell a célszerver beállításait. A nyilvános kódok többsége alapértelmezett PHP-n nem működik, sokuk egy külön fájlbeillesztési (LFI) hibát is igényel. A Rapid7 szerint minden bemutatott támadás csak egy adott operációs rendszer, PHP-verzió és webszerver párosításon működött. A VulnCheck viszont szabványos, éles PHP 8.4-es beállításon is működő támadást épített, igaz, csak az ügyfeleinek adta ki. A javítatlan szerver tehát egy felkészült támadó ellen továbbra is védtelen.

Mit veszít, akit eltalálnak?

  • Kódfuttatás a webszerver nevében. A támadó webshellt vagy kártevőt telepíthet, hozzáférhet a fájlokhoz és az adatbázishoz, onnan pedig továbbléphet más rendszerekre.
  • Kiszivárgó titkok. A hibák memóriakiolvasási útján a Sansec szerint jelszavak, munkamenet-azonosítók, API-kulcsok és akár a TLS privát kulcs is kikerülhet, akkor is, ha az alkalmazás nem használ munkamenetet. Ha egy szerver napokig javítatlanul volt elérhető, a kulcsok és a jelszavak cseréje is indokolt lehet.
  • Kiesés. A lekapcsolás maga is kár: Magyarországon és Hollandiában az online ügyintézés is szünetelt. Ezért számít, hogy egy szerver órák alatt frissíthető legyen, ne napok alatt.

Javítás osztott tárhelyen

Osztott tárhelyen a PHP-t a szolgáltató telepíti és frissíti, Ön nem fér hozzá a szerverhez. A dolga ezért az ellenőrzés: tudnia kell, hogy a javítás valóban felkerült.

  1. Nézze meg a PHP-verziót. cPanelen a „PHP verzió kiválasztása” vagy a MultiPHP Manager, Pleskben a domain „PHP beállítások” oldala mutatja. WordPressben: Eszközök › Webhely egészsége › Információ › Szerver.
  2. Ne csak a számot nézze. Ha 8.5.12, 8.4.27, 8.3.36, 8.2.35 vagy újabb, rendben van. Ha alacsonyabb, még lehet javított (a szolgáltató visszaportolhatta a javítást), de ezt csak ő tudja megerősíteni.
  3. Kérjen írásos választ. Az alábbi levelet egy az egyben elküldheti az ügyfélszolgálatnak.
  4. PHP 8.1 vagy régebbi esetén váltson. Készítsen mentést, ha lehet, próbálja ki tesztoldalon, majd a panelen állítsa 8.3-ra vagy 8.4-re. A régi sablonok és bővítmények új PHP-n hibázhatnak, ezért utána nézze végig a fontos oldalakat, webáruháznál a pénztárat is.
  5. Ha az oldal Cloudflare mögött van, a Cloudflare a PHP2Shell elleni szabályait az ingyenes csomagban is élesítette. Pro vagy magasabb csomagnál a felügyelt szabályok blokkoljanak, ne csak naplózzanak. Ez kiegészítő réteg, nem javítás: a szerver közvetlen IP-címén át a szűrő megkerülhető.
Mintalevél a tárhelyszolgáltatónak

Tárgy: PHP biztonsági frissítés (CVE-2026-109618, CVE-2026-109619)

Tisztelt Ügyfélszolgálat! Milyen PHP-verzió fut a(z) [domain] tárhelyen? Telepítették már a 2026. október 21-i PHP biztonsági kiadást (CVE-2026-109618, CVE-2026-109619)? Ha a javítás a verziószám változása nélkül került fel, kérem, írásban erősítsék meg, melyik csomagváltozat tartalmazza. Köszönöm!

Ami tárhelyen nem segít: a WordPress, a sablon vagy a bővítmények frissítése (jó dolog, de ezt a hibát nem javítja), egy biztonsági bővítmény telepítése, illetve a session.upload_progress.enabled kikapcsolása .user.ini fájlban vagy ini_set()-tel. A PHP leírása szerint ezek a beállítások túl későn hatnak, a támadó kérése addigra feldolgozódik.

Javítás VPS-en és konténerben

Saját szerveren a teljes lánc az Öné: a csomag frissítése, a futó folyamatok cseréje és az ellenőrzés. Az újraindítás kimaradása a leggyakoribb hiba: a lemezen már a javított PHP van, a memóriában viszont még a régi fut.

Ubuntu és Debian

Először derítse ki, melyik PHP szolgálja ki a webet. A php -v csak a parancssori változatot mutatja, a weboldalak gyakran egy másik ágon futnak.

# Mely PHP-FPM ágak futnak? (a socket nevéből látszik)
ls /run/php/
php-fpm8.3 -v

# Frissítés (az ondrej/sury tárolóból és az Ubuntu vagy Debian biztonsági tárolójából egyaránt)
sudo apt update
apt list --upgradable 2>/dev/null | grep php
sudo apt upgrade

# Újraindítás: minden futó PHP-ág és az Apache (ha mod_php-t használ)
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2

# Ellenőrzés: a verzió és az indulás ideje (a frissítés utáni legyen)
php-fpm8.3 -v
systemctl show -p ActiveEnterTimestamp php8.3-fpm

Ha a disztribúció saját PHP-csomagját használja (például Ubuntu 24.04 alapból 8.3-at hoz), a verziószám nem ugrik 8.3.36-ra, a javítás visszaportolva érkezik. Ilyenkor a csomag változásnaplójában keresse a CVE-számot:

zgrep -c "CVE-2026-109618" /usr/share/doc/php8.3-common/changelog.Debian.gz

Ha az eredmény 0, a javítás még nincs fent: nézze meg, engedélyezve van-e a biztonsági tároló, vagy várja meg a disztribúció közleményét.

AlmaLinux, Rocky Linux, RHEL

sudo dnf upgrade 'php*'
sudo systemctl restart php-fpm httpd
php-fpm -v

Remi tárolónál a php83-php-fpm jellegű csomag- és szolgáltatásnevekkel ugyanez a menet.

Docker és konténerek

A konténerben futó PHP nem frissül a gazdagéppel együtt. A képet friss alapképből kell újraépíteni, a régi konténereket pedig lecserélni. Ha a Dockerfile pontos verziót rögzít (például php:8.3.35-fpm), azt is írja át.

docker compose build --pull
docker compose up -d
docker compose exec app php -v   # az „app” helyére a saját szolgáltatása neve kerül

Ha ma nem tud frissíteni: ideiglenes enyhítés

A PHP csapata néhány beállítást javasol arra az időre, amíg a frissítés nem fér bele. Ezek csökkentik a kockázatot, de nem szüntetik meg. A php.ini-be vagy a PHP-FPM pool fájljába kerülnek, utána minden PHP-folyamatot újra kell indítani.

; php.ini (a .user.ini és az ini_set() itt nem hat)
session.upload_progress.enabled = 0
fatal_error_backtraces = 0        ; csak PHP 8.5
post_max_size = 8M                ; 32M, ha az oldalon van fájlfeltöltés
upload_max_filesize = 6M          ; mindig kisebb, mint a post_max_size

; PHP-FPM pool, például /etc/php/8.3/fpm/pool.d/www.conf
php_admin_value[memory_limit] = -1

A memory_limit = -1 a CVE-2026-109618 kiváltó okát (a memóriakorlát elérését) zárja ki, cserébe egyetlen kérés is elviheti a szerver teljes memóriáját. Csak akkor alkalmazza, ha a PHP-folyamatok memóriáját más is korlátozza (konténer- vagy cgroup-limit) és a webszerver is szűri a kérések méretét (nginxben client_max_body_size). A CERT-EU azt javasolja, hogy ami nem frissíthető, azt átmenetileg vegye le a nyilvános internetről, a CISA pedig a PHP 8.1-es és régebbi rendszereket kapcsoltatná le a javításig.

Feltörték? Így ellenőrizze

A frissítés a jövőbeli támadást zárja ki, a múltbelit nem. Mivel az első kísérlet október 17-én történt, a naplókat ettől a naptól érdemes átnézni. A jelek külön-külön lehetnek ártalmatlanok is, együtt viszont gyanúsak.

  • Memóriahiba a kérés indulásakor: „Allowed memory size … exhausted” hibaüzenet, amely a kód helyett „Unknown on line 0”-t ír, főleg sorozatban, egy folyamaton.
  • Összeomló PHP-folyamatok: SIGSEGV (signal 11) a PHP-FPM naplójában.
  • Szokatlan kérések: nagy, darabolt POST-kérések, sok vagy mélyen egymásba ágyazott űrlapmezővel, hosszú vagy bináris PHPSESSID süti.
  • Shell a webszerver nevében: ha a www-data felhasználó sh, bash, curl vagy wget parancsot futtat, az a legerősebb jel.
  • Új PHP-fájlok a feltöltési és gyorsítótár-mappákban, ahol PHP-nak nem volna szabad lennie.
# Memóriahiba a kérés indulásakor
sudo zgrep -h "Allowed memory size" /var/log/php*-fpm.log* /var/log/nginx/error.log* | grep -c "Unknown on line 0"

# Összeomló PHP-folyamatok
sudo zgrep -h "SIGSEGV" /var/log/php*-fpm.log*

# A webszerver felhasználója shellt vagy letöltőt futtat?
ps -u www-data -o pid,lstart,cmd | grep -E "sh -c|bash|curl|wget"

# Október 17. óta létrehozott PHP-fájlok a feltöltési mappákban
sudo find /var/www -path "*upload*" -name "*.php" -newermt 2026-10-17

Ha bármelyikre gyanús találat van, ne takarítson azonnal, mert a nyomokkal a bizonyítékot is eltünteti. Mentse le a naplókat, cserélje le az összes jelszót és kulcsot (adatbázis, levelezés, fizetési és API-kulcsok), az oldalt pedig egy október 17. előtti, tiszta mentésből állítsa helyre. Ehhez érdemes szakembert hívni.

Hogyan vészeltük át mi?

A saját és ügyfeleink WebPotCMS oldalai egy általunk üzemeltetett Ubuntu LTS szerveren futnak: a tesztkörnyezetekkel és az adminfelületekkel együtt harmincegy nginx-webhely, előttük Cloudflare, mögöttük PHP-FPM 8.5 és 8.3. Az alábbi időpontok nem becslések, hanem a szerver csomagkezelő- és szolgáltatásnaplójából valók.

7 óraa hivatalos kiadástól a javított PHP élesítéséig
18 mpalatt indult újra mindkét PHP-FPM és az Apache
0összeomlás és támadásra utaló memóriahiba október 17. óta
Október 21., 16:00Megjelenik a javítás

A PHP kiadja a 8.5.12-t és a 8.3.36-ot. A szerverünk a PHP-t az ondrej/sury tárolóból kapja, ahol a javított csomagok még aznap elérhetők lettek.

Október 21., 22:58Frissítés

Mindhárom telepített PHP-ág megkapta a javított csomagot: a weboldalakat kiszolgáló 8.5 és 8.3, valamint a 8.1 is, amelyet már csak parancssori feladatokra használunk.

Október 21., 23:00Újraindítás

23:00:19 és 23:00:37 között újraindult a két PHP-FPM szolgáltatás és az Apache. Ettől kezdve a memóriában sem futott régi PHP. A csomagnapló és a szolgáltatások indulási ideje ugyanazt mutatja, így ez ellenőrzött tény, nem feltételezés.

Október 21.Automatikus frissítés

A PHP-csomagok tárolóját felvettük az automatikus biztonsági frissítések közé. A következő hasonló javítás már magától felkerül, nem azon múlik, ki ér rá aznap este.

Október 22., reggelTakarítás

Eltávolítottuk a régi, már nem használt PHP 8.0-s csomagokat. Ami nincs telepítve, azt nem kell frissíteni és nem is lehet megtámadni.

Október 22.Átvilágítás

Előrehoztuk a szerver teljes biztonsági és teljesítmény-átvilágítását: belépések, naplók, tanúsítványok, futó szolgáltatások. Egy elavult belső eszközt a legfrissebb kiadásra hoztunk, a memória felosztását pedig úgy hangoltuk át, hogy a szabad memória 2,6 GB-ról 6,5 GB-ra nőtt. Egy memóriakimerítésre épülő támadásnál a tartalék nem árt.

Október 25.Visszamenőleges ellenőrzés

Átnéztük a PHP-FPM naplóit augusztus 2-ig, az nginx hibanaplóit augusztus 16-ig visszamenőleg. Az utolsó PHP-összeomlás (SIGSEGV) szeptember 15-i, október 17. óta egy sincs, a kérés indulásakor fellépő „Unknown on line 0” memóriahiba pedig a teljes időszakban egyszer sem fordult elő. A szerver saját behatolás-ellenőrzője sem talált nyomot: nincs webshell-minta, rejtett folyamat, csomaghoz nem tartozó SUID-fájl vagy gyanús kimenő kapcsolat, a verziókezelt éles kódban pedig egyetlen fájl sem tér el a tárolóétól.

Terminálrészlet a szerver naplóiból: PHP-csomagok frissítése 22:57 és 22:58 között, a PHP-FPM és az Apache újraindulása 23:00-kor, az utolsó PHP-összeomlás szeptember 15-énTerminálrészlet a szerver naplóiból: PHP-csomagok frissítése 22:57 és 22:58 között, a PHP-FPM és az Apache újraindulása 23:00-kor, az utolsó PHP-összeomlás szeptember 15-én
Részlet a csomag-, a szolgáltatás- és a PHP-FPM naplóból, lekérdezve október 25-én. A gépnevet, a rendszer-előtagokat és a csomagverziók hosszú utótagját rövidítettük, az időpontok változatlanok.

Miért nem kellett pánikba esni?

A gyors frissítés volt a döntő lépés, de nem ez volt az egyetlen. A szerveren a frissítés előtt is több réteg állt a PHP előtt. Ezek pont egy ilyen, belépés előtt kihasználható hibánál érik meg az árukat.

Ábra a védelmi rétegekről: nyilvános oldalnál a Cloudflare, az nginx és a javított PHP-FPM, adminfelületnél az nginx basic auth állítja meg a kérést, mellettük a fail2banÁbra a védelmi rétegekről: nyilvános oldalnál a Cloudflare, az nginx és a javított PHP-FPM, adminfelületnél az nginx basic auth állítja meg a kérést, mellettük a fail2ban
Egyszerűsített ábra a szerverünk valós beállításai alapján: hol akad el egy PHP2Shell-kérés a nyilvános oldalakon és az adminfelületeken.
  • nginx basic auth az adminfelületeken. Az adminisztrációs eszközöket és a tesztoldalakat jelszó védi, amelyet az nginx kér el, még mielőtt a kérés a PHP-hoz jutna. Jelszó nélkül a támadó POST-kérése el sem éri a hibás kódrészt. A legkockázatosabb futtatási mód, az Apache mod_php nálunk csak ilyen belső eszközök mögött fut, a portját a tűzfal kívülről nem engedi.
  • Minden PHP előtt nginx áll. A PHP-folyamatok kívülről közvetlenül nem érhetők el, a kérések méretét az nginx korlátozza, mielőtt a PHP egyáltalán látná őket.
  • Cloudflare a nyilvános oldalak előtt. Október 21-én a Cloudflare élesítette a PHP2Shell-szabályait, így a nyilvános oldalaink forgalma ezen a szűrőn is átment. Erre nem építettünk, mert szűrő, nem javítás.
  • fail2ban hét figyelővel. SSH, levelezés és két nginx-figyelő fut: az egyik a sebezhetőséget kereső robotokat, a másik a basic auth jelszópróbálgatóit tiltja ki, egyszerre a szerver tűzfalán és a Cloudflare-en. A tiltás egy napig tart, ismétlésnél egyre tovább, legfeljebb egy hétig. Egyetlen, jól célzott kérést a fail2ban nem állít meg, de a tömeges pásztázás zaját jelentősen csökkenti: október 22. óta csak az SSH-figyelő közel hatszáz címet tiltott ki.

Amit ebből megtanultunk

  1. A gyors kézi frissítés nem terv. Aznap este ráértünk, máskor talán nem. Ezért került a PHP tárolója az automatikus frissítések közé.
  2. A frissítés csak az újraindítással együtt ér valamit. Azt, hogy a szolgáltatások valóban újraindultak, nem feltételeztük, hanem a csomagnapló és az indulási idő összevetésével ellenőriztük.
  3. A nem használt szoftver is kockázat. Minden régi PHP-ág, felejtett adminfelület és tesztoldal egy újabb hely, amit frissíteni kell.
  4. A jelszavas előszűrés olcsó és működik. Ami nem a nyilvánosságnak szól, az ne is legyen nyilvános: egy basic auth sor az nginxben egy belépés előtti hibát is kivéd.

Megelőzés a következő hibára

A PHP2Shell nem az utolsó ilyen hiba lesz. A kutatók szerint ez egy hibaminta, nem egyetlen elírás. Az ilyen hibákat ráadásul egyre több csapat keresi mesterséges intelligenciával. A cél tehát nem az, hogy a következőt kitaláljuk, hanem hogy amikor jön, órák alatt lezárható legyen.

Automatikus biztonsági frissítés, a PHP tárolójával együtt

Ubuntun az unattended-upgrades alapból csak a disztribúció biztonsági tárolóját frissíti. Ha a PHP egy külön tárolóból jön (például ondrej/php), azt külön fel kell venni, különben a PHP kimarad.

// /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "LP-PPA-ondrej-php:${distro_codename}";
};

Mellé érdemes a needrestart csomagot is telepíteni: frissítés után kijelzi, illetve beállítástól függően újra is indítja azokat a szolgáltatásokat, amelyek még a régi könyvtárakat használják.

Ami nem nyilvános, kerüljön jelszó vagy IP-szűrés mögé

Adatbázis-kezelő, levelezési admin, tesztoldal, fejlesztői másolat: ezek egyike sem a látogatóknak szól. Az nginx basic auth a server blokk szintjén minden útvonalat véd, a PHP-hoz vezetőt is.

# jelszófájl létrehozása (apache2-utils csomag)
sudo htpasswd -c /etc/nginx/.htpasswd admin
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd

# /etc/nginx/sites-available/admin.example.hu.conf
server {
    server_name admin.example.hu;
    auth_basic           "Belépés szükséges";
    auth_basic_user_file /etc/nginx/.htpasswd;
    # IP-szűrés helyette vagy mellette:
    # allow 203.0.113.10;
    # deny  all;
    ...
}

Cloudflare mögött az IP-szűréshez az nginxnek a látogató valódi címét kell látnia (real_ip_header CF-Connecting-IP), különben a Cloudflare címeit szűri. Kényelmesebb, naplózott alternatíva a Cloudflare Access vagy a VPN.

fail2ban az nginxre is, ne csak az SSH-ra

A legtöbb telepítésen a fail2ban csak az SSH-t figyeli. Két nginx-figyelő bekapcsolása néhány sor. Ezek a basic auth próbálgatóit és a sebezhetőséget kereső robotokat is kitiltják.

# /etc/fail2ban/jail.local
[DEFAULT]
bantime           = 1d
bantime.increment = true
bantime.maxtime   = 1w

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

Cloudflare mögött a tűzfalon tiltott IP-cím nem ér semmit, mert a kérés a Cloudflare címéről érkezik. Ilyenkor a fail2ban a Cloudflare API-n át is tud tiltani (a gyári cloudflare action), mi mindkét helyen tiltunk.

A többi réteg röviden

  • Támogatott PHP-ág. A 8.2 2026. december 31-én kifut. Aki most frissít, rögtön a 8.4-re vagy a 8.5-re lépjen, így a következő hibánál nem a verzióváltással kell küzdenie.
  • Kérésméret és memória korlátja. Az nginxben webhelyenként annyi client_max_body_size, amennyi kell, a PHP-folyamatok memóriája pedig legyen felülről korlátozva (FPM pool, konténer, cgroup).
  • Elszigetelés. Webhelyenként külön PHP-FPM pool és rendszerfelhasználó, open_basedir beállítással. Ha egy oldal el is esik, ne vigye magával a többit.
  • Riasztás. Értesítés, ha a PHP-FPM naplójában összeomlás jelenik meg, vagy ha a webszerver felhasználója shellt indít.
  • Külső mentés, kipróbált visszaállítással. Egy feltörés után ez dönti el, hogy órák vagy napok alatt áll helyre az oldal.

Ha nincs saját rendszergazdája, ezeket a lépéseket a VPS-üzemeltetés keretében mi is elvégezzük, WordPress oldalaknál pedig a WordPress-karbantartás része.

Gyakori kérdések a PHP2Shell hibáról

Igen, ha a szerveren futó PHP még nem kapta meg az október 21-i javítást. A hiba a PHP-ban van, nem a WordPressben, ezért a WordPress, a sablon és a bővítmények frissítése nem javítja. Tárhelyen a szolgáltatónak kell frissítenie, Önnek ellenőriznie.
A nyilvános források szerint október 25-ig egyetlen nagy szervezet sem jelentett be igazolt feltörést. A legtöbb érintett óvatosságból állt le a javítás felkerüléséig, köztük a magyarorszag.hu, a holland DigiD és MijnOverheid, a finn kormányzati oldalak és a Wikimedia egyes rendszerei.
Ha a verzió 8.5.12, 8.4.27, 8.3.36, 8.2.35 vagy újabb, a javítás fent van. Alacsonyabb verziószám mellett is lehet javított, ha a szolgáltató visszaportolta, ezt viszont csak ő tudja megerősíteni. Kérdezze meg írásban.
Nem. Ez csak a CVE-2026-109619 egyik támadási útját zárja le, a CVE-2026-109618 ellen nem véd. Ideiglenes enyhítésnek jó, de egyedül a PHP frissítése javítja a hibát.
A gépet nem kell, a PHP-FPM szolgáltatást viszont igen, mod_php esetén az Apache-t is. Amíg ez nem történik meg, a memóriában a régi, hibás PHP fut tovább. Konténernél a képet újra kell építeni és a konténert lecserélni.
Csökkenti a kockázatot, de nem javít. Csak a rajta átmenő forgalmat szűri, a szerver közvetlen IP-címén át megkerülhető. A szabályok ráadásul nem látnak bele minden kéréstípusba, például a darabolt küldésű kérésekbe.
Egyetlen jól célzott kérés ellen nem, mert a fail2ban az ismétlődő mintákra tilt. A tömeges pásztázást lassítja, a jelszópróbálgatókat kitiltja, kiegészítő rétegnek ezért hasznos.
Ezek az ágak nem kapnak hivatalos kiadást. Átmenetileg a szolgáltató vagy a disztribúció javított csomagja segít, tartósan a váltás 8.3-ra vagy 8.4-re. Ha egyik sem megoldható, a CISA azt javasolja, hogy a rendszer a javításig ne legyen elérhető az internetről.
Egy október 23-án közzétett, kisebb kockázatú PHP-hiba, amely csak ritka munkamenet-beállításnál használható ki. A javítás a következő rendes kiadásban érkezik, addig a PHP a session.upload_progress.enabled kikapcsolását javasolja a php.ini-ben vagy a PHP-FPM pool fájljában.

Nem biztos benne, hogy a szervere vagy a tárhelye már javított?Átnézzük a PHP-verziót, a futó szolgáltatásokat és a naplókat, utána megmondjuk, mi a teendő.

Kérjen ellenőrzést

Kapcsolódó oldalakUbuntu VPS szerver üzemeltetés, VPS szerver: mire jó és mikor éri meg?, WordPress karbantartás árak.

Források (lekérve: 2026. október 25.)PHP: hivatalos biztonsági közlemények (október 20., 21. és 23.) · Datadog Security Labs: a hiba elemzése és felismerése · Tenable: GYIK és idővonal · Palo Alto Unit 42: fenyegetettségi összefoglaló · Recorded Future: a kihasználás idővonala · Sansec: webáruházak és a tömeges kihasználás esélye · Origo: leállt a magyarorszag.hu · NOS: holland kormányzati oldalak offline · Helsinki Times: finn kormányzati leállás

KépekA borítóképen a PHP hivatalos logója látszik, változtatás nélkül: Colin Viebrock, CC BY-SA 4.0, forrás: php.net. A cikk nem a PHP csapatának hivatalos közleménye. Az ábrák a WebPot DEV saját készítésűek.

Fel az oldal tetejéreAz oldal megosztása

#PHP #Biztonság #VPS szerver #Szerverüzemeltetés #Tárhely