ThunderX ransomware: analysis and a free decryptor!

By 21 september 2020 oktober 2nd, 2020 Blog
ThunderX-ransomware
Sharing is caring

Inleiding

Ransomware is voor zowel bedrijven als consumenten nog altijd een van de grootste bedreigingen voor de cyberveiligheid. En hoewel veel van de grotere incidenten te herleiden zijn naar grote namen binnen ransomware, zoals NetWalker, Clop of Maze, duiken er steeds vaker nieuwe ransomwarefamilies op.

In deze blogpost beschrijven we onze bevindingen over de recent ontdekte nieuwe ransomwarefamilie ThunderX. Daarnaast stellen we een gratis decryptor ter beschikking, zodat mensen die ten prooi zijn gevallen aan deze ransomware zonder kosten geholpen kunnen worden. De decryptor is beschikbaar via het platform ‘NoMoreRansom’ of via het Tesorion CERT-team. Afgezien van een enkele tweet (in het bijzonder die van Michael Gillespie waarin hij zegt dat bestanden kunnen worden ontsleuteld lijkt er tot nu toe weinig informatie te zijn over deze ransomware. Daarom hebben we besloten een blogpost te schrijven waarin we onze interne analyse beschrijven. We geven een algemene omschrijving van de malware en wijzen op een aantal kenmerken ervan. Vervolgens duiken we dieper in de materie en vertellen we hoe de bestanden worden versleuteld. Als laatste vestigen we de aandacht op een probleem dat ervoor kan zorgen dat de door de ransomware versleutelde bestanden worden gecorrumpeerd, waardoor het herstellen van de data wordt bemoeilijkt of zelfs onmogelijk is.

Algemene omschrijving

ThunderX is ransomware die gericht bestanden versleutelt en waarvan de werking in basis niet veel verschilt van andere ransomware voor gerichte bestandsversleuteling. Net als met veel andere ransomwares wordt er eerst gezocht naar een Mutex of er wordt er een gecreëerd om te voorkomen dat meerdere instances parallel lopen. Vervolgens zoekt de ransomware naar een gekoppelde debugger en slaat de rest van zijn functionaliteit over als er een wordt gevonden. Als er geen debugger wordt gevonden, worden sommige versleutelde strings uit de bronbestanden geladen en ontsleuteld. Deze strings bevatten onder andere lijsten met processen en services die worden beëindigd als ze op dat moment actief zijn. Vervolgens worden enkele opdrachten uitgevoerd om schaduwkopieën te verwijderen en enkele wijzigingen aan te brengen in de opstartconfiguratie.

Zodra dit allemaal is gebeurd, begint de eigenlijke versleuteling. De cryptografie wordt geïnitialiseerd, de losgeldbrief wordt gegenereerd en als laatste worden voor elke schijf en elk gedeeld netwerk afzonderlijke threads gestart om bestanden te vinden die kunnen worden versleuteld. De sample die wij hebben geanalyseerd, bevat een ‘-nolan’ opdrachtregeloptie om de versleuteling van gedeelde netwerken over te slaan. Er zijn geen andere runtime opties.

Een specifiek detail van ThunderX dat het vermelden waard is, is het feit dat de ransomware specifieke bestanden kan overschrijven met nullen, in plaats van ze te versleutelen. Dit betekent dat ThunderX een functionaliteit bevat om bepaalde gegevens onherroepelijk en doelgericht te vernietigen. De doelbestandsnamen voor dit destructieve overschrijven zitten in de ingesloten configuratie in de bronbestanden.

De sample waarop wij deze beschrijving hebben gebaseerd, bevat een vorm van verduistering om de analyse te dwarsbomen. Een aantal strings zijn hex-encoded in de binary, zodat ze minder opvallen. Dit is bijvoorbeeld het geval voor de opdrachtregels die worden gebruikt om schaduwkopieën te verwijderen. Enkele andere strings worden via een eenvoudige single byte XOR-encryptie opgeslagen in de bronbestanden. Bijvoorbeeld de losgeldbrief en de lijst met processen en services die beëindigd moeten worden.

Bestandsversleuteling

ThunderX maakt, net als de meeste andere ransomware, gebruik van een combinatie van asymmetrische en symmetrische cryptografie. Voor de asymmetrische versleuteling gebruikt het een 2048-bits RSA met een openbare sleutel die is ingesloten in de ransomware. De minder bekende Salsa20-versleuteling wordt gebruikt als symmetrische code voor het versleutelen van bestandsgegevens.

Salsa20 ondersteunt verschillende sleutelgroottes, maar 256-bits en 128-bits zijn de meest voorkomende. Op het eerste gezicht gebruikt ThunderX de betrouwbaardere 256-bits variant. Maar ondanks dat er 256-bits sleutels worden gegenereerd, heeft ThunderX een bug in de configuratie van de setupcode die ervoor zorgt dat het in de 128-bits sleutelmodus van Salsa werkt, waarbij alleen de eerste 128 bits van de 256-bits sleutel worden gebruikt!

De delen van het bestand die worden versleuteld, worden bepaald aan de hand van de grootte van het oorspronkelijke bestand. Bij kleinere bestanden wordt alleen het eerste deel versleuteld. Bij grotere bestanden worden vier delen verspreid over het bestand versleuteld. Binnen de ransomware zijn dat respectievelijk de modi 1 en 2. De code heeft ook een modus 3, maar in onze sample lijkt deze modus nooit te worden gebruikt (er lijkt ook wel een bug te zitten in modus 3, dus is het maar goed ook dat deze niet wordt gebruikt).

Binnen de code is er ook een modus 4, maar via deze modus worden de bestandsgegevens niet versleuteld, maar overschreven met nullen. Hierdoor kan het bestand niet meer worden hersteld.

Net als met de meeste ransomware wordt er bij de versleutelde bestanden een voettekst voor de decryptor geplaatst waarin informatie staat over hoe het bestand kan worden ontsleuteld. Deze voettekst bevat de met RSA gecodeerde Salsa20-sleutel en nonce, evenals de oorspronkelijke bestandsgrootte en de versleutelmodus. Ten slotte bevat de voettekst de speciale waarde 0xB0E0E0F0 die kan worden gebruikt om te verifiëren dat het bestand inderdaad is versleuteld door deze ransomware. In onze sample krijgen de versleutelde bestanden de extensie ‘.tx_locked’, maar dit is aan te passen en kan dus anders zijn voor andere binaire bestanden.

De voettekst die door sommige van de ‘grote jongens in de ransomware’, bijv. Netwalker, worden toegevoegd aan de versleutelde bestanden bevat een overzicht van de oorspronkelijke data of soms het complete oorspronkelijke bestand. Hierdoor kan de ransomware-auteur de juistheid van de ontsleuteling controleren. Helaas hebben de schrijvers van ThunderX niet zo’n overzicht bijgevoegd. Dit maakt het voor hun decryptor onmogelijk om op betrouwbare wijze bestandscorruptie tijdens de ontsleuteling op te sporen.

Als laatste valt te melden dat ThunderX op zo’n manier gestructureerd is dat enkele parameters voor de bestandsversleuteling, bijv. de grootte van de versleutelde delen, of de bestandsgroottedrempel tussen een en vier versleutelde delen, aan te passen lijken te zijn bij het bouwen van een ransomware binary. Bij andere ransomwares waar deze parameters ook aan te passen zijn, zien we vaak dat deze waarden zijn opgeslagen in de voetteksten van de versleutelde bestanden, waardoor de decryptor ze kan gebruiken. Op deze manier kan één decryptor-codebasis worden gebruikt om meerdere ransomware binaries met verschillende parameters te bedienen. Alleen is dit bij ThunderX niet het geval. Dus wanneer er in een toekomstige versie een van deze parameters verandert, moeten de schrijvers de bijbehorende aanpassingen ook doorvoeren in de decryptor.

Multithreading

Zoals we in de algemene omschrijving al hebben vermeld, creëert ThunderX een aparte thread voor elke schijf en elk gedeeld netwerk om bestanden te zoeken die het kan versleutelen. Dit is vrij gebruikelijk bij ransomwarefamilies. Bij sommige ransomware wordt de bestandsversleuteling gedaan door de thread die op zoek is naar bestanden om te versleutelen. Bij andere, bijv. Clop, wordt er voor elk bestand een aparte thread gestart. ThunderX werkt net iets anders: door het IoCompletionPort-mechanisme in Windows te gebruiken, creëert het een wachtrij voor bestanden die versleuteld moeten worden. Vervolgens wordt er een pool van threads opgestart om de daadwerkelijke versleuteling uit te voeren. Het aantal threads in deze pool is gelijk aan het dubbele aantal processors dat wordt teruggezonden tijdens een aanroep naar GetSystemInfo(). De versleutel-threads delen een deel van het globale geheugen dat wordt gebruikt voor de Salsa-configuratie. Hierdoor ontstaat er een kleine mogelijkheid voor een bug (zoals hieronder beschreven) die de correcte ontsleuteling van bestanden kan voorkomen. De makkelijkste oplossing hiervoor zou zijn om elke thread een eigen kopie te geven.

 

screenshot ThunderX ransomware note

Bugs in ThunderX

Tijdens onze analyse zijn we een aantal interessante bugs tegengekomen. We zullen de twee interessantste nader beschrijven.

De meest voor de hand liggende bug die we in ThunderX tegenkwamen, is de bug in de sleutelmodus van Salsa: hoewel er 256-bits sleutels worden gegenereerd, gebruikt de ransomware alleen de eerste 128 bits. Omdat elke extra bit in de sleutel gewoonlijk de ‘ruimte’ van alle mogelijke sleutels (en dus ruwweg de betrouwbaarheid van de code) met een factor van twee verhoogt, impliceert dit een aanzienlijke vermindering in de beveiliging van de cryptografie die wordt gebruikt voor bestandsversleuteling.

Een van de minder voor de hand liggende bugs die we tegenkwamen, is een mogelijke ‘race condition’ tussen de versleutel-threads. Deze threads delen een deel van het globale geheugen voor het Salsa20-algoritme. Aan het begin van de versleuteling van een deel wordt deze status geïnitialiseerd en vervolgens gelezen door de encryptiecode. Wanneer de versleuteling van een deel is voltooid, wordt het globale geheugen bijgewerkt om de uiteindelijke interne status weer te geven van de thread die net de ontsleuteling heeft voltooid. Wanneer deze update plaatsvindt tussen de initialisatie voor een nieuw blok in een andere thread en het lezen van de geïnitialiseerde status door diezelfde thread, kan de beginstatus van de versleuteling onjuist zijn. Dit leidt tot data die niet kan worden ontsleuteld. Bovendien is het onmogelijk om erachter te komen wanneer dit gebeurt, aangezien de voettekst van ThunderX geen overzicht van de oorspronkelijke data bevat. Dus zelfs wanneer het losgeld wordt betaald, is er volgens ons een kleine kans dat niet alle bestanden kunnen worden hersteld. De kans dat deze ‘race condition’ optreedt, lijkt voor ThunderX-slachtoffers gelukkig erg klein. We hebben dit tijdens onze tests niet teruggezien.

Gratis decryptor

We zijn op basis van onze analyse van deze ransomware tot de conclusie gekomen dat het mogelijk is om alle (niet-gecorrumpeerde) getroffen bestanden te ontsleutelen zonder het losgeld te hoeven betalen. Tesorion heeft een decryptor gebouwd die we gratis ter beschikking stellen aan slachtoffers van ThunderX-ransomware. Deze decryptor is gratis beschikbaar via ‘NoMoreRansom’ of je kan contact opnemen met ons CERT-team en onze decryptor kostenloos ontvangen..

Indicators of Compromise

– SHA256 van de ThunderX-binary gebruikt in dit onderzoek: 0fbfdb8340108fafaca4c5ff4d3c9f9a2296efeb9ae89fcd9210e3d4c7239666