Velké trable s malými knihovnami
Obsah dostupný jen pro předplatitele.
Přihlásit se můžete
zde.
Pokud nemáte předplatné, nebo vám vypršelo, objednat si ho můžete .
Obsah dostupný jen pro předplatitele.
Předplatné můžete objednat
zde.
Pokud nemáte předplatné, nebo vám vypršelo, objednat si ho můžete zde.
Slavný inženýrský komiks XKCD v jednom svém díle ukazuje složitou stavbu z kostek, popsanou slovy „celá moderní digitální infrastruktura“. Úplně dole je malá, vratká kostička, která celou stavbu podpírá. Její popis zní: „Projekt, který od roku 2003 udržuje nějaký člověk v Nebrasce, aniž by mu za to kdokoli poděkoval.“
Komiksová nadsázka nemá moc daleko k realitě. Zejména v oblasti open-source softwaru, který je k dispozici zadarmo, jsou programátorské týmy jen velmi nepočetné, protože početný tým by se jednoduše neuživil. Vývoj open-source bývá sponzorován velkými firmami, které jej rády využívají ve své praxi, ale ani ony nejsou při rozdávání grantů nijak zvlášť štědré. Právě open-source představuje jednu z opor dnešního internetu, protože většina serverů dnes běží na nějaké formě Linuxu. A to znamená, že jeho personální i finanční podinvestovanost se někdy projeví až explozivně.
Například tehdy, najde-li se v důležitém projektu bezpečnostní chyba.
Víc očí víc vidí, ale ne všechno
„Given enough eyeballs, all bugs are shallow,“ řekl svého času Linus Torvalds, otec dnešního Linuxu. Jeho tvrzení by se dalo přeložit jako S dostatkem pozorných lidí se dá snadno spravit každá závada.
Slova zakladatele Linuxu měla ilustrovat výhodu, kterou open-source software proti svým komerčním konkurentům má. Tím, že jeho zdrojový kód není utajovaný, ale je dostupný celému světu, vidí do jeho fungování víc lidí. A tím zároveň roste pravděpodobnost, že si někdo všimne chyby, pochopí její příčinu a dokáže ji opravit. U chyb, které se projevují zjevnou dysfunkcí (například spadnutí aplikace), funguje Linusův princip skvěle. Už v devadesátých letech byl Linux daleko stabilnější než komerční Windows, a proto je dodnes tak rozšířen v serverovém světě.
Software je ale sužován i jinými chybami, podstatně zákeřnějšího rázu: chybami, které na první pohled nic zlého nedělají, a jsou tudíž prakticky neviditelné. Takové chyby se dají přirovnat k tiše hlodající rakovině nebo pomalému ucpávání cév, stavům ohrožujícím člověka i bez zjevných příznaků, nenápadným, ale kritickým hrozbám. Na rozdíl od biologických nemocí nemají softwarové chyby aspoň tendenci ke spontánnímu zhoršování, ale to je jen slabá útěcha; takové chyby, odhalené až se zpožděním, se ukázaly být nesmírně nebezpečnými.
A nikdo si jich přitom nevšiml, někdy i celá leta. Čtení zdrojového kódu, o kterém hovořil Linus Torvalds, je totiž nesmírně nezáživná činnost. Typický programátor má rád jinou, zábavnější práci, což ve světě softwaru znamená tvořit nové dílo nebo aspoň doplňovat do existujících programů nové funkce. A z toho plyne, že kontrole už existujících zdrojových kódů se věnuje jen málo lidí. Určitý kus této nezáživné práce dokážou zastat i roboti, protože některé chyby lze odhalit automatickým testováním, ale robotické testy nepokryjí ani zdaleka všechny případy, které mohou v praxi nastat.
Situace je komplikována tím, že na nejhlubší úrovni softwarového světa – v jádrech operačních systémů, ovladačích pro hardware atd. – se stále ještě hojně používá C, jazyk ze sedmdesátých let dvacátého století. „Céčko“ je nesmírně efektivní a přeložené programy napsané v něm běží extrémně rychle, což bylo v 70. letech důležitější než dnes, protože tehdejší počítače byly ve srovnání s těmi dnešními přímo dýchavičné. Ale tato rychlost je v případě jazyka C zaplacena menším množstvím „sebekontroly“, kterou program sám nad sebou (a nad svým programátorem) vykonává. Za určitých okolností může například nechtěně přepsat nějaký kus paměti, který přepsat neměl, což může mít různé následky: od žádných až po fatální kompromitaci systému a jeho ovládnutí útočníkem (hackerem), který takovou díru využije. A aby toho nebylo málo, zdrojové kódy v jazyce C jsou mnohdy špatně čitelné, zejména pokud se jejich autor vyžívá v nějakých komplikovaných konstrukcích. Což je v případě „céčkařů“, kteří často patří k elitě programátorského řemesla, dost běžné.
V posledních deseti letech se čím dál víc důležitých kusů softwaru přepisuje do jiných jazyků, jako je třeba velmi bezpečný Rust. Tento proces je ale zdlouhavý a v případě Linuxu teprve pozvolna začíná. Do doby, než bude ukončen, musíme žít s tím, co máme – a to, co máme, je software plný obtížně odhalitelných chyb.
Krvácející srdce
Exemplárním příkladem toho, jak vážné situace mohou kolem chyb v důležitých knihovnách vzniknout, byla závada, pro kterou se vžilo označení Heartbleed čili krvácející srdce. Svoje jméno získala podle zdánlivě benigní funkcionality zvané Heartbeat, jež měla v rámci síťového spojení jen ujišťovat jednu stranu, že protistrana nezmizela.
Heartbleed byl do důležité bezpečnostní knihovny openSSL zavlečen, patrně nechtěně, postgraduálním studentem Robinem Seggelmannem koncem roku 2011. Do světa se rozletěl v březnu 2012, když tým pečující o knihovnu openSSL vydal novou verzi knihovny pro široké užití. Knihovna je psána v jazyce C a její zdrojový kód byl před deseti lety chronicky nečitelný: jednak se na něj nabalila řada historických pozůstatků z dřívějších dob, jednak se na něm v průběhu mnoha let vývoje podílelo příliš mnoho lidí, každý se svým specifickým a pro ostatní těžko srozumitelným stylem. Tak se stalo, že Heartbleed „žil“ v knihovně celé dva roky, než si jej všiml jeden zaměstnanec firmy Google. Aby toho nebylo málo, příslušná problémová funkcionalita byla ve výchozím stavu zapnuta, takže zranitelné byly miliony serverů. Jen málokdo si totiž své knihovny „šteluje“ dopodrobna, většina správců systémů se spoléhá na výchozí hodnoty od autorů.
Z bezpečnostního hlediska bylo „krvácející srdce“ naprosto devastující. Překročení mezí paměťového pole – typická slabina programů v jazyce C – umožňovala útočníkovi z opačného konce planety číst rozsáhlé kusy paměti na cizích strojích, až 64 kB na jeden pokus. V podvodně exfiltrované paměti se mohly skrývat šifrovací klíče, hesla, tajné osobní údaje, cokoli. Navíc se ani zpětně, když se na problém konečně přišlo, nedalo vystopovat, zda závady někdo zneužil. Útoky takto vedené po sobě totiž nezanechávaly žádnou stopu v systémovém logu, který jinak správci serverů rádi používají k odhalení nežádoucí aktivity.
Heartbleed dodnes drží pomyslnou první příčku v seznamu nejzávažnějších počítačových chyb historie. K jeho vítězství přispěla i skutečnost, že knihovna openSSL byla (a zůstává) zdarma, takže desítky tisíc firem po celém světě ji nasadily ve svých vlastních systémech. Počet uživatelů těchto systémů šel nejspíš do miliard.
Repríza, která nebyla
Koncem října 2022 se po softwarovém světě rozletěla zneklidňující zpráva, že v knihovně openSSL se našla další kritická bezpečnostní chyba. Tentokrát mělo jít o nějaký problém na úrovni certifikátů, důležitých prvků pro identifikaci vzdálených strojů. S nespolehlivými certifikáty by do utajované komunikace mohli vstupovat nežádoucí prostředníci – špioni, zločinci, obchodní konkurence – a získávat informace, po kterých jim správně nic není.
Poté, co detaily závady vyšly najevo, si programátoři a administrátoři mohli oddechnout. Ačkoli šlo o velmi podobný problém s přetečením paměťového pole jako v případě Heartbleedu, drobné rozdíly způsobily, že ve valné většině případů dokázal zlým následkům zabránit samotný operační systém. Nedalo se sice vyloučit vyřazení napadeného serveru z provozu, ale ve srovnání s únikem tajných dat je zhroucení služby ještě relativně malý problém, který se dá řešit rychlou instalací aktualizované knihovny. Závažnost bugu byla tedy snížena z „kritické“ na „vysokou“ a počítačový svět si otřel pomyslný pot z čela.
Přesto celá epizoda ukázala, že podhoubí pro vznik potenciálních nových Heartbleedů stále ještě existuje. Programátorů pracujících na životně důležitých knihovnách je příliš málo, finanční prostředky dostupné opensourcové komunitě nestačí na systematickou kontrolu všech důležitých kusů kódu, příliš mnoho zásadní funkcionality je stále ještě zajišťováno starým kódem v jazyce C, jehož hlavní autor už třeba odešel někam jinam a stávající vývojářský tým se v jeho kódu tak dobře nevyzná.
Z této směsice faktorů vzejdou jednoho dne nové chyby, svým kalibrem snad i srovnatelné s Heartbleedem. Linus Torvalds totiž měl i neměl pravdu. Ano, dostatek pozorných očí umí odhalit leccos. Ale dokud programátory víc baví psát než číst – a v tomto směru se žádná změna očekávat nedá –, bude těch pozorných očí příliš málo na to, aby stihly přečíst všechen kód, na kterém dnes spočívá tíha digitální infrastruktury světa.
Změnit by to jednoho dne mohla umělá inteligence, ale zatím na tom tak dobře není. A hlavně: umělá inteligence je dvojsečná zbraň. Tytéž metody, které budou schopny odhalit a opravit chybu v široce používaném softwaru, se budou moci použít k hledání takových chyb za cílem jejich zneužití.