Projekt XZ Utils znal před koncem letošního března jen málokdo. Pozornost si získal až kvůli bezpečnostnímu incidentu, který ukazuje limity open source softwaru, jak ho dneska známe. S jistotou lze říci, že nejde o poslední incident tohoto typu, a můžeme jenom doufat, že je nejenom prvním odhaleným, ale i prvním svého druhu vůbec. Abychom mohli posoudit, jaké důsledky může právě odhalený problém mít pro svět open source, musíme se podívat docela daleko do historie.

Když před padesáti lety vznikal systém Unix, vycházel z filozofie, že operační systém by měl sestávat z množství poměrně jednoduchých programů, které dělají jednu věc, ale dělají ji dobře. Tu převzaly i současné operační systémy, které z Unixu více či méně vycházejí, jako jsou různé distribuce Linuxu a BSD a v menší míře třeba i Android, iOS a MacOS. Tyto systémy jsou dnes z velké části kolekcí utilit a knihoven, které spravují a udržují různí autoři.

Nedávno jste již předplatné aktivoval

Je nám líto, ale nabídku na váš účet v tomto případě nemůžete uplatnit.

Pokračovat na článek

Tento článek pro vás někdo odemknul

Obvykle jsou naše články jen pro předplatitele. Dejte nám na sebe e-mail a staňte se na den zdarma předplatitelem HN i vy!

Navíc pro vás chystáme pravidelný výběr nejlepších článků a pohled do backstage Hospodářských novin.

Zdá se, že už se známe

Pod vámi uvedenou e-mailovou adresou již evidujeme uživatelský účet.

Děkujeme, teď už si užijte váš článek zdarma

Na váš e-mail jsme odeslali bližší informace o vašem předplatném.

Od tohoto okamžiku můžete číst neomezeně HN na den zdarma. Začít můžete s článkem, který pro vás někdo odemknul.

Na váš e-mail jsme odeslali informace k registraci.

V e-mailu máte odkaz k nastavení hesla a dokončení registrace. Je to jen pár kliků, po kterých můžete číst neomezeně HN na den zdarma. Ale to klidně počká, zatím si můžete přečíst článek, který pro vás někdo odemknul.

Pokračovat na článek

Operační systém Windows se historicky vydal jinou cestou, Microsoft si prakticky všechno psal sám znovu, ale poslední dobou se také přiklání k využívání už existujících řešení. Současná Windows a platforma .NET tak obsahují řadu open source knihoven třetích stran, i když zdaleka ne v takové míře, jako je tomu třeba u různých distribucí Linuxu.

Ty sestávají ze stovek až tisíců balíčků, knihoven a utilit, které jsou jednotlivě relativně jednoduché, každá dělá to svoje a spolupracují dohromady. Některé komponenty jsou velké, mají hodně vývojářů, sponzory, jsou předmětem veřejného zájmu. A pak tam jsou ty druhé, které jsou relativně malé a jednoduché a stará se o ně třeba jediný člověk. V době svého volna, bez nároku na jakoukoliv odměnu a většinou zcela v anonymitě. Jeho jméno se svět dozví teprve ve chvíli, kdy nastane nějaký průšvih.

Třeba takový projekt Dnsmasq je téměř všudypřítomný. Je ve většině distribucí Linuxu, na Androidu, MacOS, nemohla by bez něj existovat většina domácích routerů a spousta dalších zařízení. Stará se o překlad DNS jmen, přidělování IP adres pomocí DHCP a pár dalších věcí. Jeho autorem a správcem je už třiadvacet let jednotlivec Simon Kelley.

Náš příběh se ovšem týká komponenty o něco málo mladší, jejíž historie se začala psát teprve před devatenácti lety, v roce 2005. Implementuje (tehdy) nový kompresní algoritmus LZMA, který je podstatně efektivnější než starší formát GZIP. Jmenuje se XZ Utils (.xz je obvyklá přípona souborů zkomprimovaných tímto způsobem) a vlastní knihovna (soubor procedur a funkcí, který může být využíván více počítačovými programy) se jmenuje liblzma. Jejím principiálním autorem a správcem je Lasse Collin a hned u první zmínky o něm je nutné říct, že mu nelze za vzniklé problémy dávat vinu, neudělal nic špatně ani o zlé vůli.

Komprimační knihovna je dospělý software, není to něco, co by se dynamicky rozvíjelo a procházelo zásadními změnami. Samozřejmě vyžaduje jistou péči, ale není to high-profile projekt, kterému by prospěly desítky vývojářů a miliony dolarů na vývoj. Stačí jeden člověk, kterému občas někdo pomůže.

Časová osa událostí

Takto 29. října 2021 pomohl Collinovi jistý Jia Tan. Dnes již víme, že se jedná o neexistující osobu a kromě účasti v projektu XZ Utils nejsou žádné stopy o jeho existenci. To samo o sobě nemusí být podezřelé, ne každý člověk je veřejně činný a nechává za sebou digitální stopu. První příspěvek Jia Tana k projektu spočíval v přidání souboru .editorconfig, který pomáhá v jednotném formátování zdrojových kódů. V průběhu následujících několika let udělal Tan takových drobných (a i ze zpětného pohledu zcela nevinných a objektivně užitečných) příspěvků desítky, možná nízké stovky.

Přibližně za rok, někdy ve druhé polovině roku 2022, Lasse Collin učinil Jiu Tana jedním ze správců (maintainerů) projektu XZ Utils. Což znamená, že Tan dostal přímý přístup ke změnám zdrojového kódu projektu a Collin nemusel jednotlivě každý jeho commit (změnu) schvalovat a slučovat. Změně napomohlo i to, že uživatelé Dennis Ens a Jugar Kumar opakovaně v mailing listu projektu vyjadřovali nespokojenost s tím, že změny jsou aplikovány se zpožděním. Dnes je zřejmé, že i tyto identity jsou virtuální a pravděpodobně jde o falešné účty „Jia Tana“. Nicméně ve své době to nebylo nic podezřelého.

XZ Utils byly pro svého tehdejšího správce jednou z hobby aktivit, na které nikdy nezbývá dost času. V rámci open source je celkem běžné (a vítané), že se k projektu přidá mladá krev. Někdo, koho zajímá a kdo na něm začne pracovat a původního správce doplní a později třeba i nahradí. Stejně tak je běžné, že se programátoři pracující na jednom projektu neznají osobně, že spolu komunikují jenom přes internet a často jenom o záležitostech týkajících se tohoto projektu.

To mohu potvrdit jako autor nemalého množství open source kódu a účastník několika projektů. Open source je – přes občasné snahy woke aktivistů do toho tahat politiku – většinově ultimátní meritokracie: nikoho nezajímá, kdo, co nebo odkud jste, pokud dodáváte kvalitní kód. Z tohoto pohledu je tedy zcela přirozené, že Jia Tan získal pozici správce.

Dlouho se to vyplácelo, protože tempo vývoje XZ Utils zrychlilo. Jia Tan byl dobrý programátor a dobrý správce. Až do 23. února letošního roku. V tento den Tan nahrál do repozitáře pár binárních souborů, na nichž se knihovna testuje. Automatické testy mají ověřit, že funguje správně, a to třeba i v případě souborů nějak poškozených nebo jinak divných. Výhodou těchto souborů – z pohledu útočníka – je, že je zpravidla nikdo detailně nezkoumá. Je to totiž velice těžké – nemají žádné čitelné „zdrojové kódy“, často vznikají ruční manipulací s binárními daty, která má simulovat poškození souboru nebo chyby. V nově přidaných souborech byl ale skrytý payload, „náklad“, použitý při pozdějším útoku.

O den později, 24. února, vydal Jia Tan novou verzi XZ Utils 5.6.0. Ta ve svém instalačním balíčku (ne ve zveřejněném zdrojovém kódu) obsahovala skript, který do systému oběti vložil zranitelnost. Přesný rozsah a způsob útoku je v této chvíli předmětem zkoumání, ale předběžně to vypadá, že nová verze učinila systém napadnutelný chybou Remote Code Execution (RCE). Tedy možností, aby útočník vykonal svůj vlastní kód na systému oběti bez jejího vědomí. Jedná se o jeden z nejnebezpečnějších typů chyb, protože umožňuje celou řadu nepříjemných věcí, od DoS (denial of service – snaha znepřístupnit službu ostatním uživatelům) útoků po získání úplné kontroly nad systémem.

Krátce poté byla nakažená verze knihovny přidána do distribuce Debian, která je základem mnoha dalších populárních distribucí Linuxu. Knihovnu liblzma využívá jiná knihovna nazvaná libsystemd. Systemd je komponenta linuxových distribucí, která se stará o běh daemonů, služeb běžících na pozadí systému. Jedná se o velice důležitou a bezpečnostně kritickou součást systému.

Shodou okolností v poslední únorový den poslal Matteo Croce návrh na změnu systemd tak, že by knihovnu liblzma načítal jiným způsobem, který by útok znemožnil. Jedná se ovšem skutečně o shodu okolností, v té době nebylo známo, že by knihovna liblzma obsahovala cokoliv nekalého.

V následujících dnech Jia Tan udělal několik dalších změn, včetně opravy jedné (nejspíše skutečné) chyby. Zároveň ale pravděpodobně záměrně vytvořil jinou chybu, která měla zabránit detekci problému nástrojem Valgrind. Dne 9. března 2024 pak Tan vydal XZ Utils ve verzi 5.6.1.

Ta byla 27. března skutečně přidána do distribuce Debian. Den nato pak Hans Jansen, pravděpodobně další z falešných účtů, žádá o vložení verze 5.6.1 do Ubuntu. To je patrně nejpopulárnější distribuce Linuxu v současnosti, která vychází z Debianu. Zároveň je nakažená verze převzata do dalších distribucí.

Tentýž den, 28. března 2024, se ovšem Andresu Freundovi zdálo, že se přihlášení na jeho server pomocí SSH (vzdálená příkazová řádka) poněkud zpomalilo. To, co běžně trvalo kolem 300 milisekund, zabralo najednou 800 milisekund.

Freund s celou věcí nemá dohromady nic společného, není bezpečnostní výzkumník, zaměstnává ho Microsoft a je to jeden z programátorů databázového systému PostgreSQL. Nicméně je zvídavý, a proto se v celé věci začal rýpat, až odhalil celý problém a popsal ho nejprve soukromě ve zprávě správcům distribucí a o den později ve veřejné zprávě do e-mailové konference o bezpečnosti open source.

V reakci na to začaly různé distribuce nakaženou knihovnu odstraňovat a přijímat opatření. Podrobnější informace o časové ose událostí najdete v článku Timeline of the xz open source attack od Russe Coxe.

Co to znamená pro open source?

Tento typ útoku ukazuje na dva zásadní problémy, které má současný model open source všeobecně, a to zejména pro Linux:

  1. Je často závislý na malých knihovnách, o které se stará jediný vývojář, který je spravuje i desítky let.
  2. Předpokládá principiálně, že kdo se chce zapojit do vývoje, činí tak s dobrými úmysly.

Ochutnávku těchto problémů jsme zažili už v roce 2016, když Azer Koculu po rozepři se správci NPM (Node Package Manager, repozitář komponent pro Node.js) smazal ze systému všechen svůj kód. Mimo jiné i balíček jménem left-pad, který sestával z jedenácti řádků zdrojového kódu a nedělal nic jiného, než že řetězec zarovnal doprava a doplnil zleva na požadovanou délku mezerami nebo nulami. Čímž rozbil internet. Ne úplně, ale protože na balíčku left-pad závisely další balíčky a na nich další, nebylo najednou obrovské množství projektů možné zkompilovat, včetně třeba frameworku React, na kterém závisí velké množství webů. Vše naštěstí trvalo jen dvě hodiny, protože správce NPM sáhl k bezprecedentnímu kroku a smazaný balíček obnovil.

Další knihovnou, která hrozí rozbít internet, je core-js. Jde o dosti rozsáhlou knihovnu, která slouží k detekci schopností webového prohlížeče a nahrání polyfillů, tedy kódů, které dokážou nahradit chybějící funkčnost. Tuto knihovnu používá obrovské množství webů, včetně zhruba osmdesáti ze stovky těch vůbec nejnavštěvovanějších. Jejím autorem je Rus jménem Denis Puškarev. Ten zhruba před rokem vydal na GitHubu dlouhý článek o potížích, které mu správa projektu přináší, existenčních finančních problémech, které ještě prohloubily sankce uvalené na Rusko po útoku na Ukrajinu. Ty prý Puškarevovi znemožnily získávat alespoň to málo financí, které dostával předtím. Další vývoj knihovny stávajícím způsobem je tak podle něj neudržitelný.

Podobných případů se dá najít celá řada. Internet tak, jak ho známe, v mnoha případech závisí na softwarových projektech, které spravuje jediný člověk, nebo v lepším případě malá skupinka lidí, ve svém volném čase, zdarma.

Někdy je řešení zdánlivě jednoduché: spočívá v tom, nalít do open source projektů více peněz. To by mohlo umožnit jejich správcům pečovat o ty důležité kousky internetu na full-time a zároveň neřešit, jak uživí rodinu. O tomto problému se v posledních letech živě diskutuje a existují různé mechanismy podpory. Velké společnosti jako Google, Microsoft, Apple nebo Facebook často platí lidi, kteří pomáhají při vývoji open source projektů, jež jsou pro danou firmu nějak důležité.

Jenomže jenom peníze nestačí a někdy o ně ani nejde, jako v případě knihovny left-pad, kterou autor odstranil z důvodu ideového sporu (o jiný balíček) se správci projektu NPM. Někdy je problém v politice, jako třeba u zmíněného ruského autora core-js. A někde prostě není práce tolik, aby dávalo smysl vydržovat tým, který bude knihovnu opečovávat, jako v případě XZ Utils. Dobrovolníci na to prostě stačí.

Čímž se dostáváme k druhému problému, kterým jsou ne nutně čisté úmysly dobrovolníků.

Open source projekty jsou často pokládány za bezpečnější než ty komerční, s uzavřeným kódem. Důvodem má být právě otevřenost zdrojového kódu, jeho dostupnost pro každého ke kontrole a možnostem opravy.

Já s tímto názorem nesouhlasím, což ostatně již léta píšu v různých článcích a příspěvcích na konferencích. Důvodů je několik. Prvním je, že možnost kontroly ještě neznamená, že ji někdo reálně provede. Druhým pak snadná proveditelnost přesně toho typu útoku, jehož obětí se stal projekt XZ.

Může za to již dříve zmíněná meritokracie open source projektů. Každý open source projekt přivítá schopného vývojáře s otevřenou náručí. A umožní mu – poměrně rychle – získat důležité postavení. Čím menší a „zanedbanější“ projekt, tím rychleji, protože tím spíš bude hlavní správce rád, že po desítkách let může nevděčnou práci předat někomu dalšímu, nebo se o ni alespoň podělit.

Pokud jste tedy v pozici zločinecké skupiny – lhostejno, zda ze soukromého sektoru, nebo státního, z tajné služby – lze se do open source projektu tohoto typu zakousnout docela snadno. Prostě stačí zaplatit schopného vývojáře, který bude projektu věnovat „nezištně“ svůj čas a energii, a chvíli počkat. V případě XZ Utils stačil necelý rok, aby se Jia Tan stal jedním ze správců.

Rizikovější cesta spočívá v záměrném zavlečení chyb do zdrojového kódu. To je ale náročné, a aby to dlouhodobě fungovalo, potřebujete „plausible deniability“, tedy možnost popřít, že se jedná o záměr. Pokud totiž takových chyb bude příliš mnoho, nastrčený „krtek“ o pracně získanou kredibilitu přijde. „Krtek“ v pozici správce má ovšem podstatně širší možnosti.

Z mechanismu útoku na XZ Utils je jasné, že se útočník nesnažil nic zastřít, jen nepočítal s bezprostředním odhalením. Rychlé objevení bezpečnostního rizika pak není zásluhou nějakých funkčních kontrolních mechanismů, ale pouhé náhody. Útočník udělal blbou chybu a jeden rýpavý programátor si všiml půlsekundového zpoždění v reakcích systému.

Jak z toho ven?

Má tento problém řešení? Ne, prakticky, a pro dohlednou budoucnost, nemá.

U nových velkých projektů možná řešení je. Řada open source projektů dneška nevychází v základu od programátorů dobrovolníků, ale z velkých firem, které hlavní vývojáře zaměstnávají a projekt financují. Tyto projekty stále fungují jako open source, a kdokoliv se může zapojit do jejich vývoje. Samotný projekt ale na dobrovolnících nezávisí. Kdokoliv si může udělat vlastní fork (kopii, odnož) a pokračovat ve vývoji nezávisle. Ale kdo a proč by to dělal?

Typickým příkladem tohoto přístupu je Microsoft a jeho projekt .NET (dříve .NET Core). To je vývojový framework, který je plně open source. Hlavními tahouny projektu jsou lidé, které Microsoft zaměstnává na plný úvazek a odpovídajícím způsobem platí. Existuje řada důležitých a populárních knihoven pro .NET, které jsou často „jednohlavé“ nebo závisí na malém množství lidí. Ty se ale Microsoft snaží hned v základu podchytit pomocí své nadace .NET Foundation a podporovat je, aby nedošlo k problémům, které popisuji výše. Podobně se o „své“ open source projekty často starají ostatní technologičtí giganti.

Jenomže to neřeší problém již existujících systémů, které vznikly ve „staré době“, kdy počítače byly dřevěné a šlapací a lidé – nebo aspoň programátoři – si navzájem věřili a předpokládala se dobrá vůle. Jenom těžko lze očekávat, že Linux zahodí desítky let své historie a někdo ho napíše znovu od základu, bez závislosti na starých, osvědčených knihovnách. Ostatně, bezprostředně a krátkodobě by to přineslo víc problémů (a chyb) nežli užitku.

Baví vás moderní technologie? To byste si neměli nechat ujít newsletter Týden s technologiemi, díky kterému dostanete do téměř pravidelného pátečního e-mailu to nejzajímavější dění a produktové novinky za celý týden.