1.3.2024 | Svátek má Bedřich


SOFTWARE: Velká díra v malém programu

17.10.2023

Autor: Hil, zdroj: Flickr, CC BY NC SA 2.0

Milí čtenáři, dostal jsem poslední dobou několik dotazů, kdy už zase napíšu něco o počítačové (nebo jiné) technice. Zdá se, že by si aspoň někteří z vás chtěli od současné šílené geopolitické situace odpočinout.

Tak tedy budiž a staň se, zde máte něco technického. Není to text pro každého. Pokud ve vás počítače vzbuzují chlad či přímo odpor, asi raději běžte číst něco jiného. Ale pokud rádi posloucháte šum běžícího PC a barevná hra LEDek na jeho krytu vám vždycky zlepší náladu, tento článek je určen pro vás. I když jste třeba nikdy nenaprogramovali ani řádku.

Dlouhé čtení – pohodlně se usaďte, prosím. Jo, mimochodem: kousek od konce tohoto textu, který je kompletně o softwaru a programování, se najednou vyskytuje slovo „těhotenský“. Sto bodů pro každého, kdo dokáže předem odhadnout, v jakém kontextu to bude.

Programy, které dnes běhají v počítačích a mobilech, mají spoustu stavebních kamenů. Jednou z těch nejzákladnějších cihel jsou takzvané knihovny (libraries).

Knihovna je balíček kódu, který někdo připravil dopředu a který něco umí. Dejme tomu kreslit na obrazovku, počítat nějaké rovnice, ukládat data do databáze nebo určit, kolik je zrovna hodin v Praze a kolik v Tokiu. Většina knihoven je úzce specializovaná a snaží se dělat jen jednu věc, zato ale dobře, rychle a spolehlivě. To se považuje za ideál. Naopak „nafouknuté“ knihovny, které se toho snaží dělat příliš mnoho naráz, jsou spíš brány jako problematické.

Programujete-li nějakou svoji aplikaci, vždycky přitom používáte cizí knihovny, někdy dokonce desítky cizích knihoven. Šetří to práci, a to velmi zásadním způsobem. Můžete se soustředit jenom na to, co potřebujete opravdu udělat sami, a všechny podružné záležitosti přenechat existujícím knihovnám.

Toto je normální a všudypřítomný postup, bez kterého by se softwarový svět zastavil. Některé ty knihovny jsou placené, jiné jsou dokonce zadarmo. Asi moc nepřekvapí, že ty knihovny zadarmo se používají daleko častěji než ty placené. Knihovnu zadarmo si může dovolit každý.

Tahle situace má dva zajímavé důsledky.

Za prvé, skoro vždycky je to tak, že jedna knihovna daného typu je ta jednoznačně nejlepší, nejdokonalejší, nejrychlejší, nejlépe použitelná … a tu pak používají skoro všichni, protože proč byste opovrhli tím nejlepším a sáhli po něčem, co je horší? Tím pádem vznikají monopoly, monokultury: tatáž dobrá knihovna je rozeseta po stamilionech počítačů v celém světě, kdežto její konkurenti někde skomírají na úbytě. Není to prostě jako u aut nebo u minerálek, kde se stačí rozhlédnout a uvidíte kolem sebe desítky různých značek na prodej. Tyhle monopoly, i když třeba nechtěné (popravdě se o to málokdo snaží úmyslně, zvlášť když je ta knihovna poskytovaná zdarma), jsou všude.

Za druhé, na rozdíl od jiných průmyslových odvětví je celkem běžné, že o jednu konkrétní knihovnu se stará jen extrémně malý tým odborníků. Není až tak vzácný případ, že ten důležitý člověk je opravdu jen jeden, fanatik svého oboru. Hle, komiks XKCD, který se tímto tématem zabývá:

Zdroj

Yup, takových nenápadných nožiček, o které se opírá celá světová digitální infrastruktura, je docela dost.

Čímž pak nastávají velice veselé situace, kdykoliv se v takové knihovně najde chyba, zejména pak bezpečnostní chyba, kterou by mohli využít hackeři ku vlámání do cizích systémů. Najednou jsou ohroženy stamiliony počítačů, přičemž člověk, který to dokáže opravit, třeba není po ruce.

Konec obecného úvodu, následuje představení hlavních hrdinů. Na scénu vstupuje CURL.

CURL je knihovna, která je „programátorovým snem“. Chtěl bych někdy v životě něco takového napsat, ale reálně je to vzácnější událost než vyhrát jackpot; takhle úspěšných knihoven je jen pár desítek v celém softwarovém světě. Hlavní autor CURLu – přesně podle toho komiksu nahoře – je jen jeden (jmenuje se Daniel Stenberg a je to Švéd), ale jeho dílo běží v hromadě strojů od Antarktidy až po Kamčatku, ba i mimo planetu Zemi. Nejvzdálenější CURL se používá na Marsu.

Dokonce i ty, milý čtenáři, se můžeš s CURLem nenápadně setkat na mém e-shopu, aniž bys to věděl. Když si totiž ode mne objednáš knihy a přispěješ mi tak na nezbytný čaj ku psaní (děkuji všem, kdo tak učinili nebo učiní! Máte zásadní zásluhu na tom, že tenhle blog ještě stále existuje), proběhne při tvé objednávce v pozadí malý kus kódu, který jsem si sám naprogramoval, a který používá knihovnu CURL.

Příliš mnoho lidí totiž při nákupu knih zadávalo špatně svoji adresu, třeba s neplatným PSČ (extra často to dělali držitelé vysokoškolských titulů…), a tak jsem si raději napsal v jazyce PHP kus kódu, který tu vámi zadanou adresu zkontroluje proti veřejně dostupnému registru nemovitostí (Rúian). Významně to snížilo počet nedoručených zásilek.

Interně se tento mechanismus opírá právě o knihovnu CURL, pomocí níž se celé to spojení na registr nemovitostí realizuje. Já si pak už „u sebe“ jen proberu ta zaslaná data a poznám z nich, jestli ta vámi zadaná adresa byla dobře nebo ne. No, a takových drobných aplikací CURLu jsou na světě kvanta a kvanta.

CURL je geniálně jednoduchý na použití, dělá velmi užitečnou věc (zprostředkovává komunikaci) a přitom běží na spoustě systémů, od Windows až po nějaké obskurní specializované kusy hardwaru. Proto je všudypřítomný, i když o něm neodborníci většinou nevědí.

Těžko odhadnout, kolik kopií této knihovny ve světě existuje, ale skoro určitě je jich více, než samotných lidí, a to je nás přitom osm miliard. No, a to znamená, že najde-li se v CURLu bezpečnostní chyba, je to opět problém pro celé lidstvo. Robota na Marsu snad nikdo hackovat nebude, ale v tom každodenním IT životě znamená jakákoliv slabina v CURLu okamžitý globální poplach.

Tudíž v momentě, kdy Daniel Stenberg začátkem října ohlásil, že v CURLu se našla nejvážnější bezpečnostní chyba za několik let, celý počítačový svět znervózněl. Klidu nijak nepomohla ani skutečnost, že Stenberg nechtěl prozradit, o jakou chybu se přesně jedná, ani to, které verze knihovny jsou zranitelné. Tvářil se jako tajemný hrad v Karpatech. On to tedy nedělal kvůli show, ale proto, že někde v pozadí připravoval společně s jinými důležitými lidmi opravu, takzvaný patch (záplatu). A dokud nebude oprava hotova a připravena k celosvětovému nasazení, nechtěl dát hackerům šanci tu chybu zneužívat – kteroužto šanci by jejím konkrétním popisem získali.

Datum vydání záplaty bylo stanoveno na 11. října. Administrátoři celého světa si podle toho naplánovali šichty, aby stihli opravit své systémy co nejdříve. I tak v nich hlodala nervozita, jestli to bude včas. „Černé klobouky“, zlovolní hackeři, jsou totiž taky rychlí. Souboj mezi obranou a útokem je v kyberprostoru nepřetržitý a nemilosrdný.

Nastal den D, pánové Stenberg a spol. zveřejnili záplatu, a tím zároveň vyšla najevo technická podstata ohlášené chyby. Uf, digitální Armageddon se zase jednou nekonal. Chyba sice byla vážná, ale obtížně využitelná. Můžete si ji představit jako díru v brnění, do které se pohodlně vejde i dlouhý nůž a kterou byste probodli nešťastného rytíře skrz naskrz. Ale nejdřív se do ní musíte trefit, a ona je umístěná tak „blbě“, že se do ní skoro trefit nedá.

Také jsem tu situaci sledoval a podařilo se mi přitom vyhrát sázku sám se sebou. Ona tedy ta sázka tak obtížná nebyla. Vsadil jsem se o balíček Halls, že příčinou tohoto problému bude takzvané přetečení paměti. A taky, že bylo.

Přetečení paměti (buffer overflow) znamená zhruba to, že ve svém programu zapíšete nějaká data tam, kam byste správně neměli, a narušíte tak stav systému. Někdy dost fatálně, takže to může vést k ovládnutí počítače nějakým útočníkem. Většinou je to chyba z nepozornosti (programátora), a nepozornost je něco, co se vymýtit nedá.

Moderní programovací jazyky vám vesměs takové psí kusy vůbec nedovolí, a to ani náhodou (natož úmyslně). Hlavním problémem CURLu a kromě něj asi tak milionu jiných široce používaných programů je ale to, že je psán v poměrně starém jazyce C. Jazyk C, zvaný mezi programátory „céčko“, je totiž opravdovým darem z pekel. Teď se tedy pouštím na poněkud tenký led, jsa si vědom toho, že tento blog čte i známý céčkový guru Pavel H.; ale ten jazyk je opravdu darem z pekel.

Dary z pekel jsou zlé právě tím, že jsou krásné a svůdné, kdežto jejich záporné stránky nejsou tak vidět. C-čko je syntakticky celkem jednoduché a dá se poměrně rychle naučit, přitom je neuvěřitelně mocné a efektivní. Dá se zkompilovat na všech možných kusech hardwaru. Není to tak dávno, co nějaký borec dokázal spustit Doom, klasickou hru z roku 1993, na těhotenském testu. Yup, zde je video místo slibů. Samozřejmě ta obrazovka za moc nestojí, ale je to běžící Doom na tyčince s těhotenským testem. I takové věci lze dělat pomocí jazyka C, protože Doom je samozřejmě napsaný v céčku.

Bohužel je jazyk C zároveň něco jako komnata plná otevřených břitev, které se povalují všude možně a mají na sobě nápisy PODŘÍZNI SE. Způsob, jakým se v céčku zachází s pamětí, je zdrojem nekonečné série těžkých bezpečnostních chyb, ze kterých mají radost jedině podvodníci, špioni a hackeři. Součástí C-čka je také takzvané nedefinované chování, které má sice svoji logiku, ale jeho následky můžou být hrozné. Příslušný kus specifikace říká, že napíšete-li do svého programu něco, co je nedefinovaným chováním, může počítač udělat cokoliv. Třeba začít chrlit démony z uživatelova nosu (oblíbený vtípek mezi odborníky; ano, my programátoři jsme trochu divní.)

No, démony jsem ještě neviděl, ale všelijaká zhroucení a anomálie ano. A to je ještě ta lepší varianta, protože toho si aspoň všimnete. Nejhorší je, když se zdánlivě neděje vůbec nic.

Vždycky se najdou nafoukanci, kteří v takové situaci začnou vykládat, že špatný řemeslník nadává na své nástroje atd., a že nic jako špatný nástroj vlastně není, že je to vždycky chyba rukou, které jej používají. Takovým lidem doporučuji, aby si zkusili zavést 230 voltů do vany, samozřejmě bez proudového jističe, a užili si to bublání. Céčko ve své syrové podobě je nebezpečný nástroj a řadu těch vážných chyb v něm napáchali excelentní programátoři, elita oboru. Excelentní člověk je totiž pořád jenom člověk a vždycky bude dělat chyby. Pak jde o to, aby aspoň následky těch chyb byly snesitelné, což v C leckdy nejsou.

Je v podstatě jen jeden způsob, jak definitivně zabezpečit programy v C proti tomu, aby dělaly podobné nechtěné prasárny: přepsat je pěkně ručně do jiného jazyka, například do daleko bezpečnějšího Rustu, který vám prostě určité kejkle nedovolí. Jenže těch existujících programů je hodně a představují desítky let práce mnoha lidí. Takový linuxový kernel má 30 milionů řádků a jeho kompletní přepis by trval možná i pár desetiletí.

Zapeklitá situace. Všichni (resp. všichni programátoři, administrátoři atd.) vědí docela přesně, v čem spočívá problém, a všichni také vědí, jak by se dal vyřešit. Bohužel by to zároveň stálo neskutečné biliony dolarů a miliony hodin práce kvalifikovaných lidí. Sice by se tím zavřely asi tak 3/4 všech vrátek, kterými lezou do cizích systémů zlovolní hackeři, takže nakonec by se to mohlo i vyplatit – jenže problém je v tom, že tyhle škody jsou různě rozptýlené po světě a nesou je „po kouskách“ miliony různých organizací a lidí, kdežto tenhle titánský úkol by asi musela zaplatit nějaká jedna instituce a všichni ostatní by se rádi svezli na jejím hřbetě zadarmo.

Pročež se to jen tak nestane. První verze C-čka vznikla roku 1972, před půl stoletím. A osobně bych tipoval, že roku 2072 pořád ještě někde poběží nějaké historické programy v C-čku, které se nikomu nezachtělo modernizovat.

Jo, a pokud se teprve chcete naučit programovat, ruce pryč od C-čka. Je nebezpečné právě tím, jak je zdánlivě jednoduché, a brzy se stanete součástí onoho celosvětového problému. Apage, Satanas, a koukejte zaprodat svoji duši nějakému jinému, bezpečnějšímu programovacímu jazyku. Jsou jich na výběr celé zástupy.

Hudební epilog

I ten Pachelbel měl dost rozumu na to, aby svůj kánon napsal v D, a ne v C

*****************************************************************************************
ZAPOMENUTÉ PŘÍBĚHY 6
Šesté pokračování série Zapomenutých příběhů, dalších třináct kapitol na různá témata. Dozvíte se něco o padajících Kometách, válce s červy nebo o řešení životně důležité otázky „Kde probůh jsem?“. Jeden příběh za druhým je fascinujícím dílkem skládačky v obraze světa, ve kterém žijeme v blahoslavené nevědomosti. Kniha je jako vždy doprovázena rozsáhlou obrázkovou přílohou.
Zapomenuté příběhy 6 si můžete objednat na této adrese.
Všechny knihy autora lze získat ve zvýhodněném balíčku zde.