Milí čtenáři, pokud chodíte s železnou pravidelností číst tento blog, jistě jste si ve středu 21. října všimli, že najednou jaksi nebyl – nedalo se na něj připojit. To mělo dobrý důvod. I řada dalších služeb byla nedostupná, od soukromých stránek přes e-shopy až po různé úřední portál. (Článek.) Povězme si tedy proč.


Kořenem problému byly hned dva závažné problémy v programovacím jazyce PHP. Kdo má blíže k počítačům, nejspíš o něm už slyšel. Jedná se o velice oblíbený jazyk pro psaní webových stránek, jehož popularita je dána mimo jiné tím, že dobře „škáluje“ – celkem jednoduše jej použije amatér s malým serverem, ale funguje i pro velké systémy. V PHP byl například napsán i Facebook.

PHP je původně dílo dánského programátora Rasmuse Lerdorfa z hlubokých devadesátek, ale během více než třiceti let své existence se velmi zásadně vyvinulo. Pokud někdo viděl PHP naposledy v roce 2006 a zkusí se k němu vrátit po dvaceti letech, nepozná jej. Tehdy to byla skriptovací pomůcka, jejíž styl se dal popsat slovy „rychle a prasácky“, dnes jde o sofistikovaný objektový jazyk s obrovským ekosystémem knihoven a pluginů, a s patrně nejlepším manažerem závislostí vůbec, jehož jméno je Composer.

Několik opravdu velkých a široce rozšířených softwarových balíků, jako je WordPress, Drupal, Joomla nebo Laravel, je založeno právě na PHP. No, zkrátka, PHP potkáte všude. Ten můj blog je také poháněn WordPressem, už nějakých jedenáct let. Kdykoliv si tu čtete článek nebo kupujete Zapomenuté příběhy, obsloužil vás jazyk PHP, aniž by to bylo na první pohled zjevné.

Co může být pro laika překvapením, je, že vevnitř jednoho programovacího jazyka se může skrývat druhý, a to je také případ PHP. PHP je totiž takzvaně interpretovaný jazyk, který nesahá „přímo na dřeň“ počítače, na kterém běží. Vnitřně je psáno v jazyce C, který už na tu dřeň sáhnout umí, je velmi rychlý a efektivní. A to byl právě zdroj včerejších problémů.

(Pokud vám to připadá překombinované a kladete si otázku, proč tedy autoři webů používají nějaké PHP a nepíšou rovnou v C-čku: protože PHP je podstatně příjemnější a jednodušší na použití a obsahuje funkce, které tomu použití na webu nahrávají. Je to asi stejný rozdíl jako hrát na klavír pomocí kláves versus pobíhat kolem něj se dvěma kladivy a mlátit do těch strun sám.)

Jazyk C totiž zachází s pamětí velice specifickým způsobem, který je dobrým zdrojem bezpečnostních chyb, a navíc jde o takový typ chyby, že se jí občas z přehlédnutí nebo únavy dopustí i velmi dobrý programátor. Modernější jazyky jako Rust tímto problémem netrpí, ale v době, kdy PHP vznikalo, žádný Rust ještě ani nebyl. Je tedy psáno v C-čku a táhne si s sebou příslušné problémy a rizika.

(Zajímavá otázka: vyplatilo by se interně přepsat PHP do Rustu? Ještě před pár lety by bylo jednoznačnou odpovědí ne, tolik živých programátorů prostě není k dispozici. V době agentického vývoje, prováděného pomocí LLM, už to možná začíná být realistické. Některé důležité softwarové balíky už se z C do Rustu převádějí, například linuxové coreutils.)


Nu, a právě dvě takové chyby spočívající v nesprávném uvolnění paměti na konci výkonu nějaké funkce vedly k dírám, které bylo možné zneužít k ovládnutí vzdáleného serveru. Tím se miliony serverů naráz staly zranitelnými.

Autoři PHP oznámili, že této chybě se nedá nijak jednoduše bránit (mitigace), a že nejlepší způsob, jak zabránit ovládnutí serveru do doby, než oni sami publikují opravu, je prostě vypnout jej. Samozřejmě, ne všechny služby jde vypnout, jejich provozovatelé tak byli ve značné nejistotě, co přesně dělat. Kolovaly různé návody, jak snížit riziko, ale autoři PHP varovali, že to úplná řešení nejsou.

Výsledkem byl „dlouhý den“, kdy PHP uvolnilo své opravy v 16:00 středočeského letního času, ale to ani neznamenalo, že jste mohli svoje stroje hned zazáplatovat. Řada serverů totiž neběží přímo na „holém“ PHP, ale na takzvaném Dockeru, a pro ten bylo nutno připravit aktualizované vydání, což zabralo další 2-3 hodiny. Samozřejmě, miliony lidí stahujících aktualizace také vytížily servery, takže opravy se táhly hluboko do noci.

(Autor těchto řádek skončil se svými úkoly kolem 23:00 a byl rád, že je rád. Jeden známý měl na krku aktualizaci hned 400 serverů. Další známý pokračuje ještě v pátek.)


Celá epizoda zajímavě ukázala, co nás v nejbližších pár letech ještě očekává. Chyba byla vytažena na světlo denní – inu, kým jiným než umělou inteligencí. Ta ji ale asi identifikovala nikoliv přímým čtením zdrojáků, ale na základě nastudování nějaké obskurní diskuse mezi programátory před 2-3 lety. (V tomto se názory různí, úplně jistě to nevíme.) Mezi několika zasvěcenými lidmi už se o ní vědělo v srpnu, ale tým, který pečuje o PHP, reagoval pomalu, protože po delší dobu nikdo úplně nedocenil její závažnost. Teprve když AI opět ukázala, jak se tato chyba dá v praxi zneužít, nastal „poprask na laguně“ a závod o to, jak co nejrychleji zazáplatovat miliony zranitelných serverů.

Podobné incidenty se v nejbližších letech budou vyskytovat znovu. Systémů s otevřeným zdrojovým kódem, jako je PHP, je všude plno, a ty zdrojové kódy jsou natolik rozsáhlé – miliony a miliony řádků – že se v nich nutně skrývají závažné chyby, kterých si až dosud nikdo nevšiml. Lidská pozornost je omezená, lidé musejí jíst a spát a něčím se živit. Umělá inteligence „žere“ jenom elektřinu a běžet dokáže 24 hodin denně, 7 dní v týdnu, takže bude postupně tyto chyby odhalovat a nacházet i způsoby, jakými je lze v praxi zneužít. A v každém konkrétním případě bude dost záležet na tom, kdo tu AI má v rukou; někdo má motivaci tu chybu opravit a ohlásit, někdo jiný zase tiše zneužívat, dokud to jde.

Toto potrvá minimálně pár let, do doby, než bude všechno takové „problémové ovoce“ otrháno. A ono navíc nikdy nebude otrháno kompletně – v tom smyslu, že spousta zařízení v našem okolí (například různé routery a wi-fi vysílače) nikdo nikdy opravovat nebude, protože jejich výrobci se na ně dávno vykašlali. (Zdvořile se tomu říká end-of-life produktu, a ten bývá někdy zatraceně krátký, třeba jen dva nebo tři roky.) Ty budou „děravé“ už napořád, respektive do chvíle, než je někdo nahradí něčím novějším.

Zábava, což?

Diskusní fórum ke článku najdete zde.

Poznámka: minulý týden jsem byl v Echu na diskusi o umělé inteligenci v matematice. První polovina debaty je dostupná zde, druhá je jen pro předplatitele.


Hudební epilog

Pohybu bylo věru dost 🙂

P.S. Tento web funguje bez všelijakých vyskakovacích reklam, placené propagace apod. Důvody jsou mnohé, ale snaha o nezávislost na velkých hráčích je jedním z těch nejpodstatnějších. Až příliš mnoho lidí spoléhá na Facebook a pak se diví.

Zdejším základním principem je dobrovolná podpora od čtenářů. Nejjednodušším způsobem, jak tento blog můžete, milí čtenáři, podpořit, je koupit si knihy od jeho autora. Tento podzim vyšly Zapomenuté příběhy 8.

Můžete si pořídit také Zapomenuté příběhy, Zapomenuté příběhy 2 či Zapomenuté příběhy 3, Zapomenuté příběhy 4, Zapomenuté příběhy 5, Zapomenuté příběhy 6, Zapomenuté příběhy 7 a sbírku textů “To nejlepší z blogu 2015-2020” pro sebe nebo pro někoho jiného. Nebo knihu dystopických povídek Krvavé levandule… K dispozici jsou už také znovu USB disky s nahranými audioknihami.

A pokud jsi sem, milý čtenáři, dorazil z Facebooku nebo Twitteru, zvaž registraci k odběru novinek e-mailem. Opravdu a vážně, však vidíš ten vývoj.

Loading