Během dvou dnů přišly dvě nezávislé bezpečnostní události. Kritická chyba v PHP nás donutila vypnout všechno, co na PHP běží. Únik klíčů certifikační autority eMudhra se obešel bez vypínání, stačily aktualizace. Teď je vše opravené, nebo se dokončuje.
PHP2Shell: co se stalo
- 10. oznámil PHP tým mimořádný release a detaily předčasně unikly. CERT-EU vydal advisory 2026-018 a doporučil neopravené PHP weby izolovat nebo vypnout. 21. 10. vyšly opravy: PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. PHP 8.1 a starší už opravy od PHP nedostávají.
Jde o dvě chyby, obě s CVSS 9.2 a obě umožňují vzdálené spuštění kódu bez přihlášení:
- CVE-2026-109618: při nedostatku paměti může být PHP přerušeno ve chvíli, kdy jsou interní data požadavku inicializovaná jen částečně, a úklid je pak bere jako platná.
- CVE-2026-109619: interní stav požadavku přežije uvolnění své paměti a další požadavek ve stejném workeru ho může použít dřív, než se vynuluje.
Jak moc je to zlé
Chyba je v samotném PHP, ne v nějaké aplikaci. Zranitelný je i ten nejjednodušší web, na pluginech ani šablonách nezáleží. U Apache s mod_php existuje demonstrovaný exploit, kdy jediný nepřihlášený požadavek spustí útok dřív, než proběhne kód aplikace. Útočník pak může na serveru spouštět vlastní příkazy: číst data, rozesílat spam, server zneužít. Bezpečnostní firmy (např. Cloudflare) hlásily první útoky ještě před vydáním opravy.
Plnou opravou je jen aktualizace PHP. Konfigurační úpravy jsou podle PHP jen částečné.
Na sociálních sítích se objevilo tvrzení, že PoC funguje i na 8.5.12. Nemáme to ověřené, takže jen sledujeme.
Proč jsme vypnuli weby
Oprava se k nám nedostane hned. PHP je součástí obrazu každé aplikace, takže musí nejdřív vyjít nová verze od vývojářů a pak ji nasadit. Do té doby jsme měli na výběr: nechat běžet weby s kritickou, aktivně zneužívanou chybou, nebo je dočasně vypnout.
Vypnuli jsme. Výpadek na pár hodin je levnější než kompromitovaný server, únik dat nebo spam, kvůli kterému by se naše IP adresa dostala na blacklisty. To by pak postihlo e-maily i ostatní služby.
Spadlo všechno postavené na PHP: weby (naše i zákaznické), Nextcloud, FreeScout (podpora), Pixelfed, Castopod, Wallabag, FreshRSS a další. Běžely služby bez PHP: Mastodon, Matrix, PeerTube, Gitea, statické weby a další. Data zůstala celou dobu na serverech netknutá, nic se nemazalo.
Jak jsme zapínali
Priorita byla weby, Nextcloud a podpora. Zapínali jsme postupně, každou aplikaci až po nasazení opravené verze a ověření, že běží PHP 8.5.12.
- 21. 10. cca 18:50: FreeScout
- 21. 10. cca 19:00: Nextcloud
- 21. 10. do cca 21:20: weby
- 22. 10. ráno: Pixelfed
- 22. 10. dopoledne: FreshRSS
Menší služby jsme při tom nestihli včas oznámit. Za to se omlouváme.
Klíče CA eMudhra
- 10. výzkumník nahlásil, že se dají získat soukromé klíče osmi zprostředkujících certifikátů CA eMudhra (emSign). Klíče vygenerované v dubnu 2025 byly zvolené tak slabě, že stačilo vyzkoušet 256 čísel. Šest certifikátů bylo pro TLS, dva pro podepisování kódu.
Proč na tom záleží
Certifikační autorita potvrzuje, že server je opravdu ten, za koho se vydává. Kdo má její klíč, může vystavit důvěryhodně vypadající certifikát pro libovolnou doménu a při zachycení spojení ji odposlouchávat nebo měnit šifrovaný provoz (man-in-the-middle).
eMudhra tvrdí, že z těchto certifikátů nevydala žádné koncové certifikáty, a Google je v CT logech nenašel. Žádné zneužití zatím není známo, ale od dubna 2025 se vyloučit nedalo.
Odvětví zareagovalo rychle: Chrome a Firefox blokují od 17. 10., Apple od 19. 10., Microsoft od 20. 10. eMudhra certifikáty odvolala 19. 10. Mozilla odebrala kořen emSign ECC Root CA - G3, Debian a další distribuce vydaly update ca-certificates a Node.js vydal opravy 21. 10.
Co jsme dělali my
Nic se vypínat nemuselo, šlo o aktualizace. Průběžně jsme během dvou dnů aktualizovali všechny weby a aplikace.
Co si z toho bereme
- U kritických chyb s aktivní exploitací radši vypnout než riskovat. Přesto jsme se naučili, že oznamování musí jít rychleji i u menších služeb.
- Vymyslet způsob, jak v takové situaci rychle rozeslat e-mail všem uživatelům.
Díky všem za trpělivost.
