Egyedi PHP2Shell exploit kernel LPE-vel láncolva: 25 tűzfal rootolása éles rendszereken
Október 25-én a Dream kutatói olyan nyomokra bukkantak, amelyek egy kínai, mesterséges intelligenciával támogatott kampányra utaltak. A támadók 25 szervert rootoltak, köztük egy amerikai kormányzati kapcsolódású környezet rendszereit is. A támadó a PHP2Shell exploitot kombinálta egy kernel jogosultságkiterjesztő exploittal, és így tört be a kitett rendszerekre.
Az érintett eszközök egy nagy gyártó tűzfal szoftverének bizonyos verzióit futtatják. Biztonsági okokból nem hozzuk nyilvánosságra sem a gyártó nevét, sem az érintett verziókat, a gyártót azonban értesítették.
A támadó ezután az Active Directory ellen indított támadásokat. A visszanyert nyomok igazolják, hogy kiszivárogtatták a hitelesítő adatokat, és feltérképezték a címtárat.
A művelet jól mutatja, hogy egy kitett menedzsment felület hogyan válhat kapuvá egy szervezet identitás-infrastruktúrája felé. Kormányzati védők számára a sebezhetőség felfedezése csak a kezdet. A valódi kihívás onnan indul, hogy nemcsak a sérülékeny rendszereket kell azonosítani, hanem azt is meg kell érteni és korlátozni, milyen hozzáférést tesz lehetővé egy sikeres kompromittálás.
Az alábbi kutatást proaktív fenyegetésvadászat során végezték a Dream autonóm kiberkutató termékével, a Hero-val.
Felfedezés
A Dream kutatói egy teljes támadási műveletet azonosítottak, amelyben egy egyedileg testre szabott PHP2Shell exploitlánc (CVE-2026-109618/CVE-2026-109619) szerepelt, összekapcsolva a Fragnesia kernel jogosultságkiterjesztéssel (CVE-2026-46300), célpontlistákkal, exploit naplókkal és mintegy 40 egyedi, utólagos kihasználást végző script-tel.
Olyan kampány nyomai is előkerültek, amely 25 szervert rootolt az Egyesült Államokban, Japánban, Tajvanon és Dél-Koreában. Miután root jogot szerzett, a támadó három konkrét szerverre összpontosított egy amerikai kormányzati kapcsolódású környezetben.
A felfedezett nyomok alapján a művelet egy laboratóriumi exploitfejlesztéssel indult, és egy amerikai kormányzati szervezet belső Active Directory tartományához fenntartott, tartós hozzáféréssel ért véget.
MI használata a támadásban
A támadási infrastruktúrában az MI-alapú eszközhasználat több jelét is megfigyeltük:
- Telepítették a Claude Code-ot
- Beállítottak egy aiscan nevű, MI-alapú támadó biztonsági platformot a kínai DeepSeek és Kimi LLM-ekkel
- Jelen voltak API kulcsok a kínai FOFA felderítő platformhoz
Bár nincs közvetlen bizonyítékunk arra, hogy az MI-eszközöket kifejezetten az exploit vagy az utólagos kihasználást végző scriptek megírására használták, a kód felépítése, a kommentelés stílusa és a mintegy 40 script közötti következetesség MI-vel támogatott fejlesztésre utal. Ugyanakkor ez a művelet nem tűnik teljesen autonóm, állami hátterű támadásnak.
Az exploit: két sebezhetőség egyetlen kérésbe láncolva
A támadó két külön exploitot fejlesztett, majd összeláncolta őket, így bármelyik, egy nagy gyártó tűzfalszoftverének bizonyos verzióit futtató tűzfalon root jogot tudott szerezni. Minderre egyetlen, hitelesítés nélküli HTTP kérésből volt képes.
PHP2Shell (CVE-2026-109618 / CVE-2026-109619) — távoli kódfuttatás
Az általunk visszafejtett exploit egy egyedi, nem nyilvános build. Nem egyezik egyetlen ismert, nyilvános PHP2Shell exploittal sem. Ugyanarra az alapelvre épül, de láthatóan önállóan fejlesztették, és kifejezetten a célba vett tűzfalplatformra szabták.
A sebezhetőség a PHP session.upload_progress mechanizmusát támadja a tűzfal appweb menedzsment szerverén. A tűzfal operációs rendszere PHP 8.0.30-at használ magas memóriakorláttal, ami lehetővé teszi a támadás memóriakorrupciós fázisait.
A támadás négy, gondosan összehangolt lépésből áll:
- A1 — Memóriakimerítés (~383 MB): A támadó speciálisan összeállított multipart POST kérésekkel árasztja el a szervert. Ezek óriási fájlneveket és session progress adatokat tartalmaznak. Így a PHP memóriakezelője a határáig terhelődik, és a rendszer jól előre jelezhető memórialayoutba kényszerül.
- B1 — Információszivárgás: A második kérés meghamisítja az A1-ből származó, elavult session ID hosszát, és ezzel out-of-bounds olvasást kényszerít ki. A szerver Set-Cookie válaszfejléce hordozza a kiszivárgott mutatóértéket, ami megadja a támadónak a libphp.so báziscímét a futó folyamatban.
- A2 — Elavult referencia előkészítése (~500 MB): Egy újabb memóriaterhelés inicializál egy sessiont, amelyben a http_session_vars élő zend_reference marad. Ezután egy második OOM állapot mod_data=NULL értéket hagy maga után, így jön létre az a „stale” referencia, amelyet a támadó a B2 fázisban meghamisíthat.
- B2 — Kódfuttatás: Az utolsó kérés egy PHP HashTable bejegyzést hamisít meg a felszabadított memóriaterületen. A hamis bejegyzés pDestructor callbackje a zif_systemre (a PHP system() függvénye) mutat, az adatrész pedig egy shell parancssor karakterláncra. Amikor a PHP takarító rutinja bejárja a HashTable-t, meghívja a hamis destruktort, így tetszőleges parancsot futtat a nobody felhasználó nevében.
Fragnesia (CVE-2026-46300) — kernel jogosultságkiterjesztés
Önmagában a nobody felhasználóként elért kódfuttatás nem elég, mert az SELinux httpd_t kontextusban erősen korlátozza a rendszerfájlok módosítását. A root jog megszerzéséhez a támadó egy második exploitot is bevetett: egy Linux kernel sebezhetőséget az XFRM ESP-in-TCP alrendszerben.
A Fragnesia page-cache írásokat használ, hogy felülírja az /etc/pam.d/su fájlt, és az eredeti hitelesítési szabályokat pam_permit.so-ra (mindent elfogad) cserélje. Mivel a PAM fájl mindössze 774 bájtos, az exploit bájtonkénti „splicing” változatot alkalmaz a pontos felülíráshoz. A módosítás után a su root jelszó nélkül is sikerrel jár.
A két exploit egyetlen B2 HTTP kérésen belül fut le. A teljes lánc – a hitelesítés nélküli HTTPS kapcsolattól a tartós root webshellig – kevesebb mint 15 perc alatt végigfut.
A labor: verzióprofilozás nagyban
Az exploit nem egyetlen „eldobható” payload. Pontos memóriaoffsetekre van szüksége, amelyek tűzfal-OS verziónként eltérnek – ilyen például a zval_ptr_dtor címe, a zif_system címe, a HashTable struktúrák mérete, illetve azok a memória-geometriai paraméterek, amelyek az egyes fázisokban a heap elrendezését szabályozzák.
A visszafejtett fájlok között 11 JSON verzióprofilt találtunk – minden egyes, laborban tesztelt tűzfal-OS verzióhoz egyet:
Minden profil tartalmazza az adott verzió libphp.so binárisából kinyert pontos offseteket – a könyvtárak SHA256 hashét, az ELF build ID-ket, valamint a memória-geometriai paramétereket (chunkméretek, feltöltési számok, ürítési számok, spray offsetek), amelyeket laboratóriumi teszteléssel hangoltak be.
Jól látszik a különbség a „kalibrált” és az „ideiglenes” profilok között. A kalibrált azt jelenti, hogy a támadó egy futó VM-en is kipróbálta az adott verziót, és megerősítette, hogy a memória-geometria működik. Az ideiglenes profilnál csak a binárisból számolták ki az offseteket, de élő rendszeren még nem ellenőrizték.
A kampány tölcsére: 19 000 felderített célpontból 25 sikeres exploit
Miután elkészült az exploit, és megvoltak a profilok 9 kihasználható verzióhoz, a támadó egy jól felépített célzókampányt indított:
1. fázis: Globális felderítés (19 000 célpont)
A FOFA – egy, a Shodanhoz hasonló kínai internetes eszközkereső – segítségével a támadó világszerte mintegy 19 000, internet felé nyitott, a célzott gyártótól származó tűzfalat azonosított. Ezek olyan eszközök voltak, amelyeknek a menedzsmentfelülete kilógott az internetre, és tanúsítvány-ujjlenyomatok, illetve HTTP-válaszok jellemzői alapján fel lehetett őket ismerni.
2. fázis: Verzió-ujjlenyomatvétel (5 000 élő)
Egy egyedi verziószkenner 200 párhuzamos szálon futott a 19 000 célponton, és felmérte, mely eszközök érhetők el ténylegesen, illetve pontosan milyen OS-verzió fut rajtuk. Körülbelül 5 000 eszköz válaszolt verzióinformációval.
3. fázis: Földrajzi és verzió szerinti szűrés (240 célpont)
Az 5 000 élő eszköz közül a támadó csak az Egyesült Államokban, Japánban, Tajvanon és Dél-Koreában található szervereket hagyta meg. Ezután tovább szűrt azokra a verziókra, amelyek illeszkedtek az exploit profiljaihoz (az újabb release ágakra, ahol PHP 8.0.30 futott). Így állt össze a végső, 240 tűzfalból álló célpontlista.
Mivel az Egyesült Államok, Japán, Tajvan és Dél-Korea a kínai állami hátterű kiberműveletek elsődleges stratégiai ellenfelei és hírszerzési célpontjai a csendes-óceáni térségben, ez erősen utal egy potenciális állami szereplőre.
4. fázis: Automatizált kihasználás (24 rootolt)
A 240 célpontot egy automatizált batch futtató kapta meg, amely egyszerre öt eszközt támadott, célpontonként 1800 másodperces (30 perces) timeouttal. Minden sikeres támadásnál a batch a következőket hajtotta végre:
- Végigfuttatta a teljes PHP2Shell + Fragnesia láncot
- Elhelyezett egy 103 bájtos PHP root webshellt a tűzfal egy nyilvánosan elérhető könyvtárában
- Root jogosultságot ellenőrzött az id parancs webshellen keresztüli futtatásával
Rögzítette a célpont hostnevét és IP-címét egy sikeres találatokat tartalmazó CSV-ben
Tovább lépett a következő célpontra
Ezen a ponton 24 tűzfalat rootolt sikeresen.
5. fázis: Triage (2 tűzfal kapott prioritást)
A 24 rootolt tűzfalból 22 esetében a támadó nem tett semmit azon túl, hogy elhelyezte a webshellt. Nem épített ki perzisztenciát, nem hozott létre alagutakat, nem telepített utólagos kihasználást segítő eszközöket. A szerverek gyakorlatilag a birtokában voltak, de „parkolta” őket, így bármikor vissza tudott térni a webshellen keresztül.
Két szerver, amelyek láthatóan ugyanahhoz a célponthoz tartoztak, túljutott ezen a fázison. Úgy tűnt, mindkettő egy amerikai kormányzati kapcsolódású környezet része.
6. fázis: A pivot (váltás a tűzfalról a tartományra)
A 24 rootolt tűzfal közül kettő egy amerikai kormányzati kapcsolódású szervezethez tartozott. Az első tűzfalról kinyert futó konfiguráció olyan jellemzőket mutatott, amelyek kormányzati kötődésre utaltak: CAC (Common Access Card) alapú hitelesítés, egy jellegzetes névprefix, valamint szabványos, kormányzati stílusú eszköznév-séma. A konfigurációs fájl tartalmazta a szervezet teljes belső hálózati topológiáját: tartományvezérlőket, egy központi tűzfalmenedzsment szervert, egy Keycloak SSO szervert, egy GitLab példányt, VPN átjárókat és az Active Directory tartományt.
Az első tűzfalat október 23-án 18:14 UTC-kor rootolta az automatizált batch futtatás közben. Röviddel ezután azonban összeomlott – feltehetően a ~900 MB-nyi exploit forgalom miatt – és soha nem állt helyre. A támadó két órán át 240 automatizált próbával figyelte, hogy visszatér-e. Nem tért vissza. A második tűzfal, amelynek tanúsítványadatai egyértelműen a célzott szervezethez kötötték, az eredeti batch során timeoutba futott.
Miután az első tűzfal konfigurációjából felmérte a szervezet értékét, a támadó egy külön, dedikált kampányt indított, és október 24-én 10:09 UTC-kor sikeresen kihasználta a sebezhetőséget.
Néhány órán belül a támadó:
Tartós alagutat épített ki a belső hálózat felé.
Egy 8 portot használó reverse SSH alagút kötötte össze a kompromittált tűzfalat az üzemeltető infrastruktúrájával, és továbbította az elérést az alábbiakhoz:
- Tartományvezérlők (LDAP, LDAPS, RDP)
- A belső tűzfalmenedzsment szerver
- VPN infrastruktúra
- Egy SOCKS5 proxy tetszőleges belső hálózati eléréshez
Az alagutat egy systemd szolgáltatás és egy rc.local boot hook csomagolta körbe – túléli az újraindításokat, és automatikusan újracsatlakozik.
A menedzsment szerver kihasználása az alagúton keresztül. 11:35 UTC-kor, kevesebb mint 90 perccel a második tűzfal rootolása után a támadó az újonnan szerzett szerverhozzáférést, valamint ugyanazt a PHP2Shell + Fragnesia láncot használta egy harmadik kormányzati szerver ellen – a belső tűzfalmenedzsment szerver ellen, amely csak az alagúton át volt elérhető. Ez a szerver központilag kezeli a szervezet összes tűzfalát. A kompromittálásával a támadó hozzáférést szerzett az összes menedzselt tűzfal konfigurációjához, hitelesítő adataihoz és hálózati beállításaihoz. Ezzel a kihasznált szerverek száma 25-re nőtt.
AD támadókampány indítása a menedzsment szerverről. Mivel a menedzsment szerver már rendelkezett LDAP kapcsolattal az Active Directoryhoz (erre van szüksége a VPN-felhasználók hitelesítéséhez), a támadó ezt használta kiindulópontként a tartomány elleni támadásokhoz:
- Visszafejtette az LDAP szolgáltatásfiók jelszavát – az eszköz konfigurációja titkosítva tárolja, de root jogosultsággal a támadó hozzáfér a mesterkulcshoz. A jelszót kiolvasta tiszta szövegként, és beégette minden további scriptbe.
- LDAP lekérdezésekkel felsorolta a tartomány összes felhasználóját és csoportját.
- Jelszószórást indított minden felhasználói fiók ellen, a szervezetre jellemző jelszavakkal. A tartományban lockoutThreshold=0 volt beállítva, vagyis nem volt fiókzárolás, így korlátlan számú próbálkozást tehetett.
- Megpróbált hátsó ajtóként szolgáló AD fiókokat létrehozni – egy felhasználói fiókot (minden OU-ban próbálkozott), valamint egy gépfiókot (a MachineAccountQuota alapértelmezett beállítását kihasználva).
- Elemezte az AD ACL láncokat jogosultságnövelési útvonalak után kutatva.
- Megpróbálta kinyerni a SAML aláíró kulcsot a Keycloak IdP konfigurációjából.
- Próbálkozott a Keycloak SSO hitelesítésének megkerülésével.
A támadás eredményei – hogy a jelszószórás talált-e érvényes hitelesítő adatokat, létrejöttek-e a hátsó ajtós fiókok, vagy sikerült-e SAML kulcsokat kinyerni – a menedzsment szerver helyi fájlrendszerén maradtak, és nem tartoztak azok közé az artefaktumok közé, amelyeket sikerült begyűjtenünk. Emiatt nem tudjuk pontosan megállapítani a kompromittálás teljes mértékét.
Menedzsment szerver → Active Directory
Mi van most a támadó kezében?
A visszanyert artefaktumok alapján biztosan állíthatjuk, hogy a támadó rendelkezik a következőkkel:
- Tartós, távoli hozzáférés a szervezet belső hálózatához egy újraindítást túlélő reverse alagúton és SOCKS proxy-n keresztül – nagy valószínűséggel még mindig aktív
- Root webshell két tűzfalon és a tűzfalmenedzsment szerveren – nagy valószínűséggel még mindig aktív
- Az Active Directory teljes felhasználói és csoportlistája – a szervezet teljes felépítésének térképe
- Visszafejtett LDAP szolgáltatásfiók hitelesítő adatok – bármikor lehetővé teszik a közvetlen AD lekérdezéseket
- A tűzfal fájlrendszeréről begyűjtött privát kulcsok – HA replikációs kulcsok, SSL/TLS tanúsítványkulcsok és eszközhitelesítési kulcsok
- Teljes hálózati topológia – minden IP-cím, hostnév, alhálózat, szerver szerepkör és VPN gateway
- SAML IdP konfiguráció gyenge biztonsági beállításokkal (validate-idp-certificate: no)
22 további, az USA-ban, Japánban, Tajvanon és Dél-Koreában található „parkolt” tűzfal – bármikor bevethetők egy újabb támadáshoz
Nem tudjuk megállapítani, hogy a jelszószórás, a hátsó ajtós fiókok létrehozása vagy a SAML kulcsok kinyerése sikerrel járt-e. Ha bármelyik támadás működött, a kompromittálás messze túlnyúlik a peremvédelmi tűzfalakon, és eléri a szervezet teljes identitáskezelő infrastruktúráját.
Összegzés
A művelet előkészítése és kivitelezése messze meghaladja az alkalmi, „adódó lehetőségeket” kihasználó támadások szintjét. A támadó komoly munkát fektetett a sebezhetőség kutatásába: megszerezte a gyártó firmware-ét, visszafejtette, kinyerte a PHP könyvtárakat, pontos memóriaprofilokat épített 9 különböző szoftververzióhoz, és laborban finomhangolta az exploit geometriáját. Maga a kihasználás automatizált és hatékony volt: egyetlen körben 240 célpontot támadott, a rendszer pedig automatikusan választotta ki a verzióspecifikus profilokat.
A célpontválasztás egyértelműen a kormányzati rendszerekre koncentrált.
A támadó 19 000 tűzfalat szkennelt, 24-et rootolt, és azonnal kiszúrta azt a kettőt, amely igazán számított. Néhány órával azután, hogy kompromittált egy amerikai kormányzati kapcsolódású tűzfalat, már be is alagútazott a belső hálózatba, ugyanazzal a PHP2Shell exploittal feltört egy harmadik szervert, és teljes körű Active Directory támadási kampányt indított – mindezt egy olyan láncon keresztül, amely egyetlen, hitelesítés nélküli HTTPS kérésből indult ki egy menedzsment felület felé, amelyet eleve nem lett volna szabad az internetre kitenni.
A másik 22 rootolt tűzfal továbbra is „parkol”, aktív webshell-lel. Az amerikai kormányzati szervezet felé kiépített tartós alagút nagy valószínűséggel még mindig működik. A támadó pedig továbbra is rendelkezik 19 000 ujjlenyomatozott célponttal, amelyekhez bármikor visszatérhet, ahogy újabb operációs rendszer verziókhoz készít profilokat.
Ahogy mindig, most is azt javasoljuk, hogy a szervezetek minél gyorsabban telepítsék a vonatkozó javítócsomagokat. További részletekért kövessék a gyártó útmutatását ezzel a problémával kapcsolatban.
A felfedezés és védekezés közötti rés szűkítése
Kormányzati és kritikus infrastruktúrák esetében egy sebezhetőség megtalálása csak a kezdet. A védőknek fel kell deríteniük a kitett rendszereket, meg kell érteniük, mit tudnak a támadók ténylegesen kihasználni, és lépniük kell, mielőtt a kezdeti lábnyom szélesebb körű kompromittálássá válik.
A Dream ezt a kihívást két, egymást kiegészítő kiberbiztonsági platformmal kezeli:
- A Sphere országos szintre méretezi a kibervédelmet. Feltérképezi a kitettséget, rangsorolja a kockázatokat, és észleli, illetve kezeli a támadásokat a kormányzati hálózatokon, az adott ország fenyegetéseihez és infrastruktúrájához igazítva.
- A Hero a kiberkutatást méretezi fel. Autonóm kutatóügynökei segítik a szakértőket a fenyegetések vizsgálatában, a sebezhetőségek felderítésében és megerősítésében – még forráskód nélküli szoftverekben is –, valamint az elhárítási útmutatók és javítócsomagok kidolgozásában. Ezt az eszközt használták a Dream kutatói a jelen bejegyzésben ismertetett vizsgálat során.
Együtt hidat képeznek a mélyebb vizsgálat és a védekezés között a teljes nemzeti támadási felületen.

