Zadní vrátka v XZ Utils (CVE-2024-3094) představují útok na dodavatelský řetězec otevřeného softwaru, při němž přispěvatel vystupující pod jménem Jia Tan v průběhu téměř tříletého působení v projektu XZ Utils zavedl do kompresní knihovny liblzma škodlivý kód umožňující vzdálené spuštění kódu prostřednictvím SSH serveru. Útočník využil kombinaci sociálního inženýrství, loutkových účtů a důmyslných krycích technik k získání důvěry a přístupových práv v projektu.

Zadní vrátka odhalil 29. března 2024 německý softwarový vývojář Andres Freund, inženýr společnosti Microsoft a vývojář PostgreSQL, který si při výkonnostním testování všiml neobvyklého zpomalení SSH přihlašování o přibližně 500 milisekund a zvýšeného zatížení procesoru procesem sshd. Postižené verze 5.6.0 a 5.6.1 byly v době odhalení přítomny pouze v testovacích a vývojových větvích hlavních distribucí, nikoli v produkčních systémech.

Zranitelnost obdržela označení CVE-2024-3094 a nejvyšší možné hodnocení nebezpečnosti CVSS 10,0. Bezpečnostní expert Filippo Valsorda označil útok za „nejlépe provedenou kompromitaci dodavatelského řetězce, jakou kdy viděl", a bývalý šéf analytického týmu GReAT společnosti Kaspersky Costin Raiu jej přirovnal k útoku SolarWinds a označil za dílo státem sponzorované skupiny.

Projekt XZ Utils XZ Utils (dříve LZMA Utils) je sada open-source nástrojů pro bezztrátovou kompresi dat v operačních systémech typu Unix. Obsahuje kompresní knihovnu liblzma, příkazový nástroj xz, dekompresní nástroj xzdec a několik pomocných shellových skriptů. Nativní formát .xz využívá algoritmus LZMA2 (založený na algoritmu Igora Pavlova ze 7-Zipu) a dosahuje přibližně o 30 % menších souborů než gzip.

XZ Utils je v Linuxovém ekosystému prakticky všudypřítomný: komprimuje balíčky .deb a RPM, obrazy linuxového jádra, initramfs/initrd a většinu zdrojových archivů otevřeného softwaru (.tar.xz). Specializovaná varianta XZ Embedded je přímo součástí jádra Linuxu pro dekompresní operace při zavádění systému. Analýzy zpětných závislostí odhadují, že knihovnu liblzma přímo či nepřímo používají desítky tisíc balíčků v repozitářích Debian/Ubuntu.

Projekt Tukaani a Lasse Collin Projekt Tukaani (tukaani.org) sídlí ve Finsku – slovo „tukaani" je finsky „tukan". Původně vznikl kolem let 2005–2007 jako linuxová distribuce založená na Slackware, než se zaměřil na kompresní nástroje. Lasse Collin (přezdívka Larhzu), finský softwarový inženýr, vytvořil a spravoval XZ Utils jako neplacený hobby projekt od přibližně roku 2009 – byl tedy jediným správcem kritické globální infrastruktury (tzv. „bus factor" roven jedné).

Infrastruktura projektu zahrnovala repozitáře na git.tukaani.org (vlastní hostování) a GitHubu (github.com/tukaani-project/xz). Zdrojový kód je od verze 5.5.2beta uvolněn převážně pod licencí 0BSD; starší verze byly označeny jako public domain a některé části podléhají licencím GPL/LGPL.

Infiltrace projektu

Příchod Jia Tana (2021) Účet „JiaT75" (zobrazované jméno „Jia Tan") na GitHubu byl vytvořen 26. ledna 2021. Během roku 2021 Jia Tan vytvořil kopie (fork) několika projektů souvisejících s kompresí – ZipArchive, lz4, zstd, seatest a libarchive – čímž cíleně budoval reputaci v oblasti kompresních nástrojů.

Dne 29. října 2021 odeslal Jia Tan na vývojový e-mailový konferenci xz-devel svůj první neškodný příspěvek – přidání konfiguračního souboru .editorconfig. Dne 2. listopadu 2021 odeslal žádost o začlenění kódu (pull request) do projektu libarchive (#1609), v níž nahradil bezpečnou funkci safe_fprintf() nebezpečnou funkcí fprintf(), čímž potenciálně zavedl zranitelnost – kód byl bez diskuse začleněn 16. listopadu 2021 (po odhalení zadních vrátek v XZ byl tento příspěvek odstraněn).

Nátlaková kampaň loutkových účtů (2022) Od dubna 2022 začaly koordinované loutkové účty vyvíjet na Lasse Collina na e-mailové konferenci [email protected] systematický tlak, aby předal správu projektu:

„Jigar Kumar" (poprvé se objevil 22. dubna 2022) odeslal šest zpráv ve dvou diskusních vláknech, v nichž kritizoval pomalý vývoj projektu. Dne 7. června 2022 napsal: „Pokrok nenastane, dokud nebude nový správce." Dne 22. června vyzval přímo Jia Tana: „Proč nemůžeš commitovat sám?" Po červnu 2022 se Jigar Kumar na internetu nikdy znovu neobjevil.

„Dennis Ens" (poprvé se objevil 19. května 2022) zneužil Collinovy dříve zveřejněné psychické problémy. Dne 21. června 2022 napsal: „Je mi líto vašich zdravotních problémů, ale je důležité si uvědomovat vlastní hranice… Proč nepředáte správu XZ pro C, abyste se mohl věnovat XZ pro Javu?"

Collin pod tlakem odpověděl 19. května 2022: „Jia Tan mi pomáhal mimo konferenci s XZ Utils a v budoucnu by mohl mít větší roli." Dne 8. června přiznal: „Neztratil jsem zájem, ale moje schopnost se starat byla omezená, hlavně kvůli dlouhodobým problémům s duševním zdravím… Mějte na paměti, že jde o neplacený hobby projekt." A 29. června dodal: „Jia Tan může mít v budoucnu v projektu větší roli. Hodně pomáhá mimo konferenci a prakticky je už teď spolusprávcem. :-)"

Získání důvěry a přístupu (2022–2023) Klíčové milníky postupného pronikání Jia Tana do projektu:

Říjen 2022 – přidán do organizace Tukaani na GitHubu Listopad 2022 – kontaktní e-mail pro hlášení chyb změněn na [email protected] (společný alias pro Collina i Jia Tana); README aktualizován – oba uvedeni jako „správci projektu" Prosinec 2022 – Jia Tan začal přímo začleňovat příspěvky (merge commits), čímž potvrdil přímý přístup k repozitáři. V jednom commitu jedinečně použil celé jméno „Jia Cheong Tan" Leden 2023 – Lasse Collin označil svou poslední verzi (v5.4.1) Březen 2023 – Jia Tan označil a sestavil v5.4.2 – svou první vydanou verzi, čímž potvrdil právo podepisovat vydání. Současně aktualizoval Google oss-fuzz, aby se hlášení zranitelností přesměrovávala na jeho e-mail ([email protected]) místo na Collina Leden 2024 – Jia Tan přesunul webové stránky XZ Utils na GitHub Pages (xz.tukaani.org), čímž získal kontrolu nad webovou prezentací projektu

Příprava infrastruktury pro zadní vrátka (2023) V červnu 2023 odeslal „Hans Jansen" ([email protected], další podezřelý loutkový účet) záplaty přidávající podporu pro GNU IFUNC (Indirect Function) do funkcí pro výpočet kontrolních součtů – klíčový mechanismus, který zadní vrátka později zneužila. Dne 7. července 2023 Jia Tan odeslal požadavek na změnu do projektu oss-fuzz (#10667), kterým vypnul fuzzing IFUNC funkcí v XZ – tím zabránil automatickému odhalení škodlivých změn.

Podezřelé loutkové účty Účet Role Aktivní období Poznámka Jia Tan / JiaT75 Primární útočník leden 2021 – březen 2024 [email protected] Jigar Kumar Nátlaková kampaň (6 zpráv) duben–červen 2022 Nikde jinde na internetu neexistuje Dennis Ens Nátlaková kampaň (zneužití psychických problémů) květen–červen 2022, znovu únor 2024 Nikde jinde na internetu neexistuje Hans Jansen Příspěvek IFUNC kódu, tlak na aktualizaci v Debianu červen 2023, březen 2024 [email protected] krygorin4545 Tlak na přijetí verze 5.6.1 v Debianu březen 2024 PGP klíč vytvořen 2 dny předem misoeater91 Tlak na přijetí verze 5.6.1 březen 2024 Žádná jiná internetová přítomnost Všechny účty sdílely společné znaky: formáty e-mailových adres jméno+číslo, žádnou předchozí internetovou přítomnost a geografické rozptýlení (singapurské/malajsijské, indické, severoevropské a germánské/nizozemské prvky).

Škodlivá vydání (únor–březen 2024) 23. února 2024 – binární kód zadních vrátek začleněn do repozitáře, obfuskován uvnitř binárních testovacích souborů 24. února 2024 – vydána XZ Utils 5.6.0 s aktivními zadními vrátky. Škodlivý soubor build-to-host.m4 byl obsažen pouze v distribučních archivech (tarball), nikoli v git repozitáři 26. února 2024 – Debian přidal xz-utils 5.6.0-0.1 do větve unstable 28. února 2024 – Jia Tan sabotoval detekci sandboxu Landlock záměrným umístěním chybné tečky v souboru CMakeLists.txt 9. března 2024 – vydána XZ Utils 5.6.1 s vylepšeným backdoorem a tzv. „rozšiřovacím systémem" umožňujícím budoucí načítání dalších škodlivých modulů 28. března 2024 – Jia Tan podal požadavek na aktualizaci xz v Ubuntu

Technický mechanismus

Manipulace sestavovacího systému Obfuskovaná binární data zadních vrátek byla začleněna do git repozitáře jako zdánlivě neškodné testovací soubory, ale spouštěcí mechanismus – upravený skript m4/build-to-host.m4 – se nacházel výhradně v distribučních archivech (tarball), nikoli v git repozitáři, čímž využíval běžnou praxi zahrnování předgenerovaných souborů Autotools do těchto archivů. Tento soubor byl 15. února 2024 přidán do .gitignore, aby nevzbuzoval podezření.

Dva binární testovací soubory ukrývaly škodlivý obsah: tests/files/bad-3-corrupt_lzma2.xz – zdánlivě poškozený XZ soubor, ve skutečnosti platný XZ proud s prohozenými bajty (0x20↔0x09, 0x2d↔0x5f) tests/files/good-large_compressed.lzma – obsahoval jak skript druhé fáze, tak binární backdoor (přibližně 86 KB), s prokládanými daty: 1024 bajtů výplně (znak „A") střídavě s 2048 bajty skutečného obsahu

Vícefázová extrakce Extrakce škodlivého kódu probíhala ve více fázích:

Fáze 0 (build-to-host.m4): Obfuskovaný řetězec příkazů – sed "r\n" (obfuskovaný cat) přesměrovaný přes tr (prohození bajtů pro „opravu" poškozeného souboru) a poté xz -d (dekomprese) – výsledkem je skript fáze 1.

Fáze 1: Shellový skript začínající řetězcem ####Hello####, který ověřil přítomnost Linuxu (opakovaně pětkrát ve verzi 5.6.1), definoval extrakční funkci využívající zřetězené příkazy head pro přeskakování prokládaných dat, aplikoval substituční šifru pomocí příkazu tr a poté dekomprimoval pomocí xz -F raw --lzma1 -dc.

Fáze 2: Delší skript ověřující sestavovací prostředí (x86_64, linux-gnu, GCC, GNU linker, dpkg nebo rpm), extrahující binární backdoor a šifrující jej pomocí varianty RC4 implementované v AWK. Výsledkem byl soubor liblzma_la-crc64-fast.o (přibližně 86 KB ELF přemístitelný objekt), připojený ke knihovně liblzma během kompilace.

Verze 5.6.1 přidala tzv. rozšiřovací systém (extension system), který mohl načítat budoucí škodlivé moduly z nových testovacích souborů bez úpravy stávajících. V době odhalení žádné odpovídající soubory neexistovaly – jak poznamenal bezpečnostní výzkumník Gynvael Coldwind: „Věci neměly skončit tady."

Mechanismus IFUNC Zadní vrátka zneužívala GNU Indirect Function (IFUNC) – mechanismus knihovny glibc, který spouští tzv. resolver funkce během dynamického linkování. Resolvery pro funkce crc32_resolve a crc64_resolve byly legitimně zavedeny v červnu 2023 „Hansem Jansenem". Tyto resolvery volaly funkci __get_cpuid pro zjištění vlastností procesoru. Injekční skript zadních vrátek odstranil jedno podtržítko a změnil __get_cpuid na _get_cpuid – odpovídající exportovanému symbolu backdooru. Protože IFUNC resolvery běží velmi brzy během inicializace procesu, byly tabulky GOT/PLT stále zapisovatelné, což umožnilo modifikaci ukazatelů na funkce.

Řetězec závislostí OpenSSH–systemd Původní OpenSSH knihovnu liblzma nepoužívá. Spojení bylo zcela umělé: několik distribucí (Debian, Fedora, Red Hat) upravuje sshd tak, aby podporovalo notifikace systemd (sd_notify()). Tím se sshd propojí s knihovnou libsystemd, která závisí na liblzma pro kompresi žurnálu. Vznikl tak řetězec: sshd → libsystemd → liblzma, který zavedl záškodnickou knihovnu do adresního prostoru SSH serveru.

Injekční skript navíc omezoval cílení na: architekturu x86_64, linux-gnu (glibc), překladač GCC, GNU linker a správce balíčků dpkg nebo rpm – specificky tedy mířil na distribuce rodiny Debian a Red Hat.

Autentizace Ed448 a vzdálené spuštění kódu Zadní vrátka implementovala asymetrickou autentizační bránu využívající kryptografii eliptické křivky Ed448, čímž zajistila, že je mohl aktivovat pouze držitel odpovídajícího soukromého klíče. Veřejný klíč Ed448 byl zakódován v binárním obsahu (payload) a ukryt pomocí steganografie v strojovém kódu x86, šifrován algoritmem ChaCha20.

Postup zneužití: