Onlangs is de collectie Nemty-ransomware ontdekt en door FortiGuard Labs in detail beschreven. Tesorion-onderzoekers hebben dezelfde binary onderzocht en hebben een aantal kleine maar cruciale afwijkingen gevonden van het standaard AES-CBC encryptie-algoritme dat in de beschrijving van FortiGuard wordt genoemd. Deze afwijkingen maken het onmogelijk om standaard cryptografische bibliotheken te gebruiken om een door Nemty versleuteld bestand te ontsleutelen, zelfs wanneer de AES-sleutel en ‘initialisation vector’ (IV) bekend zijn.
Op basis van onze analyse van de Nemty-ransomware zijn wij erin geslaagd een proces te ontwikkelen dat in sommige gevallen de oorspronkelijke bestanden die door Nemty geïnfecteerd zijn geraakt kan herstellen zonder daar de cybercrimineel bij te betrekken, en dus zonder losgeld (‘ransom’) te betalen. Wij zullen de details van ons onderzoek niet publiceren omdat wij de auteurs van de ransomware geen ideeën voor eventuele verbeteringen willen geven. Ben je slachtoffer geworden van de Nemty-ransomware, neem dan contact op met Tesorion CERT en wij stellen onze decryptor gratis ter beschikking.
Update: Onze decryptor is te downloaden via de website van NoMoreRansom.
Inleiding
Onlangs heeft FortiGuard Labs een blogpost geplaatst waarin de nieuw ontdekte Nemty-ransomware wordt beschreven. Hun blog beschrijft veel aspecten van de ransomware zeer goed, inclusief het proces dat wordt gebruikt voor het versleutelen van de bestanden van het slachtoffer. Tesorion heeft dezelfde Nemty-binary geanalyseerd als de onderzoekers van FortiGuard en wij kunnen veel van hun bevindingen bevestigen. Tijdens onze analyse hebben wij de malware in een sandbox en een debugger laten runnen om zo meer inzicht te verkrijgen en om naar gegevens te kunnen kijken die later worden versleuteld, zoals AES-sleutels en IV’s. Wij waren echter niet succesvol toen wij een combinatie van een AES-sleutel en een IV voor een bestand namen en het overeenkomstige bestand met AES-128-CBC (het algoritme dat in de beschrijving van FortiGuard genoemd wordt) probeerden te ontsleutelen. Toen wij de daadwerkelijke versleutelingscode van het bestand nader bestudeerden, kwamen we enkele kleine (maar belangrijke) verschillen tegen tussen de daadwerkelijke code en de beschrijving van de werking daarvan door FortiGuard. Deze verschillen betreffen de grootte van de AES-sleutel, de sleutelprogrammeringsfase van het AES-algoritme en de werkwijze van de CBC voor het AES-algoritme. Zoals we zullen laten zien, gebruikt Nemty geen standaard AES-implementatie en de code die voor Nemty gebruikt is, is niet compatibel met het standaard AES-algoritme. Dit betekent dat zelfs als de AES-sleutel en IV voor een bestand bekend zijn, wij nog steeds rekening moeten houden met deze verschillen om een door Nemty versleuteld bestand succesvol te kunnen ontsleutelen.
Cryptography 101
Laten we beginnen met een korte opfrisser over cryptografie. De te versleutelen gegevens worden gebruikelijk aangeduid als de ‘plaintext’ en de overeenkomstige versleutelde gegevens als de ‘ciphertext’. Encryptie algoritmes, ook wel ‘ciphers’ genoemd, kunnen grofweg in twee algemene categorieën worden ingedeeld: symmetrische en asymmetrische cryptografie. Bij symmetrische cryptografie wordt dezelfde sleutel gebruikt voor de versleuteling en de ontsleuteling. Asymmetrische cryptografie maakt gebruik van twee verschillende sleutels: een publieke sleutel die voor de versleuteling wordt gebruikt en een geheime sleutel die voor de ontsleuteling wordt gebruikt. Symmetrische cryptografie wordt doorgaans gebruikt om informatie uit te wisselen tussen twee partijen die toegang hebben tot een gedeelde maar verder geheime sleutel. Asymmetrische cryptografie wordt doorgaans gebruikt wanneer meerdere partijen dezelfde publieke sleutel hebben en gegevens moeten kunnen versleutelen die vervolgens uitsluitend door één enkele partij in het bezit van de persoonlijke sleutel kunnen worden ontsleuteld.
Als kijken naar de cryptografie die momenteel het meest wordt gebruikt en (voldoende) veilig wordt geacht, dan zijn is symmetrische cryptografie gewoonlijk veel sneller dan asymmetrische. Een gebruikelijk patroon is dan ook om een sleutel te genereren voor een symmetrische cryptografie (zoals AES), deze te gebruiken om veel gegevens mee te versleutelen, vervolgens asymmetrische cryptografie (zoals RSA) te gebruiken om de sleutel zelf te versleutelen aan de hand van de publieke sleutel van de beoogde ontvanger, en dan de combinatie van de versleutelde gegevens en de versleutelde sleutel naar deze ontvanger te sturen. Dit patroon profiteert van de snelheid waarmee symmetrische cryptografie het grote aantal gegevens versleuteld, terwijl de eigenschappen van de asymmetrische cryptografie worden gebruikt om de sleutel uitsluitend met de beoogde ontvanger te delen.
Symmetrische cryptografie is onder te verdelen in ‘stroomvercijfering’ en ‘blokvercijfering’. Wij zullen hier alleen de blokvercijfering bespreken omdat deze door Nemty worden gebruikt voor de versleuteling van bestanden.
Bij blokvercijfering wordt de data opgedeeld in blokken van een bepaalde grootte, bijv. 128 bits (16 bytes), en vervolgens worden deze blok voor blok versleuteld. Als de blokken stuk voor stuk versleuteld worden zonder daarbij rekening te houden met de andere blokken van de plaintext, dan wordt er gebruikgemaakt van de ECB-methode (‘electronic code book’). Er zijn echter ook andere zogenaamde uitvoeringsmethodes voor blokvercijfering. Eén van de meest gebruikte is CBC (‘cipher block chaining’). Als CBC wordt gebruikt, dan wordt er voor iedere versleuteling een willekeurige ‘initialisation vector’ (IV) gegenereerd. Deze IV wordt dan geXORed met het eerste plaintext blok voordat de blokvercijfering wordt toegepast. De output van de blokvercijfering vormt het eerste blok van de ciphertext. Het eerste blok van de ciphertext wordt dan geXORed met het tweede blok van de plaintext voordat de blokvercijfering wordt toegepast op het tweede blok, enzovoorts. De IV wordt normaal gesproken samen met de ciphertext gedistribueerd en hoeft niet noodzakelijkerwijs geheim te worden gehouden omdat het alleen gebruikt kan worden als de versleutelingssleutel zelf ook bekend is.
AES: sleutels en sleutelprogrammering
AES is een blokvercijfering die gebaseerd is op de Rijndael blokvercijfering. AES heeft een vaste blokgrootte van 128 bits (16 bytes) en ondersteunt drie verschillende soorten sleutelgroottes: 128-bits, 192-bits en 256-bits. Binnen cryptografie kunnen we grofweg stellen dat grotere sleutelgroottes binnen hetzelfde algoritme vaak veiliger zijn, maar deze vereisen ook vaak meer rekentijd voor versleuteling en ontsleuteling.
In tegenstelling tot de oorspronkelijke beschrijving door het team van FortiGuard, dat AES-128 noemt, hebben wij in onze analyse vastgesteld dat Nemty een 256-bits (32 bytes) sleutel voor AES gebruikt. Dit is de grootst mogelijke sleutelgrootte voor AES en kan voor de versleuteling van bestanden binnen ransomware als ‘overkill’ worden bestempeld, zeker omdat dit het versleutelingsproces vertraagt.
AES-versleuteling of -ontsleuteling bestaat grofweg uit twee fases: eerst wordt de versleutelingssleutel (256-bits bij Nemty) uitgebreid tot een set van zogenaamde rondesleutels die van de versleutelingssleutel zelf worden afgeleid. Dit proces wordt vaak ‘sleutelexpansie’ genoemd. (Lezers geïnteresseerd zijn in de details van het AES-sleutelexpansieproces kunnen op de Engelstalige pagina van Wikipedia een diepgaande beschrijving vinden.) Na de sleutelexpansie vindt de daadwerkelijke versleuteling of ontsleuteling van een 128-bits blok plaats over een aantal iteraties, of ‘rondes’, door gebruik te maken van de rondesleutels. Het aantal rondes dat AES doorloopt, is afhankelijk van de sleutelgrootte: 10 rondes voor 128-bits sleutels, 12 rondes voor 192-bits sleutels en 14 rondes voor 256-bits sleutels. Omdat iedere ronde een andere set rondesleutels vereist, hangt het aantal rondesleutels dat tijdens het sleutelexpansieproces wordt gegenereerd ook af van de sleutelgrootte. Het algoritme voor de sleutelexpansie werkt ook voor elke sleutelgrootte net iets anders. In het bijzonder bevat het proces in het geval van een 256-bits sleutel een aanvullende berekening voor sommige rondesleutels die niet in de 128 en 192 bits variant voorkomt.
Het is duidelijk uit de bestandsversleutelingscode van Nemty dat er 14 AES-rondes worden doorlopen, wat het gebruik van een 256-bits sleutel suggereert. Dit wordt bevestigd door het feit dat de AES-sleutel bestaat uit een willekeurige reeks van 32 karakters, zoals door FortiGuard beschreven. De implementatie van het algoritme voor de AES-sleutelexpansie in Nemty bevat echter een bug: de speciale aanvullende berekening die noodzakelijk is voor 256-bits sleutels ontbreekt in hun implementatie, die meer lijkt op een 128/192-bits algoritme dat uitgebreid is met het aantal rondesleutels vereist voor 256-bits. Wij denken dat dit de reden is waarom het team van FortiGuard in zijn beschrijving 128-bits noemt als de sleutelgrootte: zonder de speciale aanvullende berekening voor 256-bits sleutels ziet de code er simpelweg meer uit als de 128-bits of 192-bits variant.
Als wij een malware-binary onderzoeken, maken we vaak gebruik van virtual machines, sandboxes en debuggers om de werking te achterhalen en toegang te verkrijgen tot gegevens die anderszins onbereikbaar zijn, zoals de AES-versleutelingssleutels en IV’s. Maar ondanks dat wij er zeker van waren dat wij de juiste AES-sleutel en IV hadden, waren wij nog steeds niet in staat om de door Nemty versleutelde bestanden te ontsleutelen. Pas nadat wij deze bug in hun AES-sleutelexpansie hadden gevonden, begrepen wij waarom onze pogingen gedoemd waren te mislukken: standaard AES-implementaties, zoals die van de cryptografische serviceprovider van Windows of OpenSSL, zijn door deze bug niet compatibel met de AES-variant die gebruikt wordt in Nemty! Pas nadat wij onze eigen AES-implementatie met dezelfde bug in de sleutelexpansie hadden ontwikkeld waren wij in staat om de eerste blokken van door Nemty versleutelde bestanden te ontsleutelen.
AES: werkingsmethode
De bug in de AES-sleutelexpansie is niet het enige gedrag in de AES-implementatie van Nemty dat afwijkt van de standaard; de werkmodus, of ‘mode of operation’, is ook niet standaard. Volgens de blogpost van FortiGuard maakt Nemty gebruik van de CBC-modus voor AES. Tijdens het uitgebreid bestuderen van de code merkten wij echter op dat dit niet het geval is. Nemty genereert inderdaad een 128-bits IV voor ieder individueel bestand. Maar deze IV wordt voorafgaand aan de AES-versleuteling met alle blokken geXORed, terwijl in CBC de IV uitsluitend wordt gebruikt in de versleuteling van het eerste blok en de volgende plaintext blokken worden geXORed met de voorgaande ciphertext blokken.
Effectief wordt in Nemty ieder plaintext blok individueel geXORed met dezelfde bestand-specifieke IV en dan AES-versleuteld volgens de ECB-modus.
Nadat we onze standaard Nemty AES-implementatie hadden uitgebreid met deze ‘ECB met IV’ methode waren we eindelijk in staat om een versleuteld bestand met de overeenkomstige AES-sleutel en IV te ontsleutelen!
Beschikbaarheid van een decryptor en (niet) helpen van malwareauteurs
Door gebruik te maken van de kennis die wij tijdens ons uitvoerige onderzoek van de Nemty-ransomware hebben opgedaan, waren wij in staat om een proces te ontwikkelen dat in veel gevallen bestanden uit een Nemty-geïnfecteerd systeem kan ontsleutelen zonder contact op te nemen met de ontwikkelaars van Nemty en hen de ‘ransom’, oftewel het losgeld, te betalen. Dit stelde ons voor het volgende (alhoewel minder technische) probleem: wat gaan wij met deze tools doen? Aan de ene kant willen wij onze decryptor gratis aan ieder slachtoffer van Nemty ter beschikking stellen, aan de andere kant willen wij malwareauteurs niet helpen bij het oplossen van hun fouten.
Laat één ding duidelijk zijn: ondanks dat wij een commerciële onderneming zijn, willen wij slachtoffers niet in een positie plaatsen waar zij moeten kiezen tussen het betalen van het losgeld of ons betalen voor een decryptor die al ontwikkeld is.
Tesorion gelooft in het NoMoreRansom-initiatief waar decryptors voor verschillende bekende ransomware-collecties voor iedereen online te downloaden zijnen wij hadden onze decryptor graag ten behoeve van alle slachtoffers willen bijdragen. Vaak zijn deze decryptors gebaseerd op dingen als geheime RSA-sleutels die gelekt zijn of gegevens van in beslag genomen servers. Als de auteurs van de malware nog actief zijn nadat dergelijke gegevens zijn gelekt dan zullen zij een nieuwe versie van de malware ontwikkelen met bijvoorbeeld andere sleutels en begint het hele spel weer van voor af aan. Onze decryptor is echter niet gebaseerd op dergelijke gelekte gegevens, maar op een aantal fouten in de Nemty-code. En als wij onze tools publiekelijk beschikbaar stellen dan geven wij de auteurs van Nemty en andere ransomware-collecties de mogelijkheid om ons proces te analyseren en van deze fouten te leren, wat het ons en anderen vervolgens moeilijker, of zelfs onmogelijk, zou kunnen maken om decryptors voor toekomstige ransomware-varianten te ontwikkelen.
Wij hebben daarom besloten om onze tools op dit moment niet publiekelijk beschikbaar te stellen maar om een andere aanpak te kiezen om te zien of we de periode totdat de auteurs hun bugs hebben hersteld kunnen verlengen terwijl we tegelijkertijd gratis de slachtoffers helpen. Wij stellen een gratis, op maat gemaakte decryptor ter beschikking aan legitieme slachtoffers van de Nemty-ransomware om hen te helpen bij het terugkrijgen van hun bestanden. Deze op maat gemaakte decryptor is vaak in staat om veel belangrijke bestanden, zoals foto’s of zakelijke documenten, terug te krijgen. Ben je slachtoffer geworden van de Nemty-ransomware, neem dan contact op met het Tesorion CSIRT om een op maat gemaakte decryptor te verkrijgen.
Update: Toen we eenmaal een manier hadden gevonden om onze decryptor werkend te krijgen en deze blogpost hadden gepubliceerd, namen we contact op met Europol omtrent hun project NoMoreRansom. In het begin waren we terughoudend in het beschikbaar stellen van onze decryptor via de website van NoMoreRansom omdat we de auteurs van Nemty niet wilden laten zien hoe zij de bugs, aan de hand waarvan wij gegevens konden ontsleutelen, konden oplossen. Tijdens de ontwikkeling van de decryptor voor Nemty 1.5 en 1.6 zijn we het gesprek met Europol aangegaan en samen bedachten we een manier waarop het ‘kraken van de code’ op onze servers kon worden uitgevoerd. Op deze manier konden we een simpele decryptor-binary distribueren die met behulp van de resultaten op onze server gebruikt kon worden om de bestanden op het apparaat van het slachtoffer te ontsleutelen. Onze decryptor is nu te downloaden via de website van NoMoreRansom.
Conclusie
In deze blogpost beschrijven wij een aantal bijzondere details van de AES-implementatie in de Nemty-ransomware waardoor het zich anders gedraagt dan een standaard AES-256-CBC-implementatie. Deze verschillen zijn belangrijk voor iedereen die een decryptor wilt ontwikkelen om bestanden die door Nemty zijn versleuteld te ontsleutelen. Tesorion heeft een dergelijke decryptor ontwikkeld die in veel gevallen in staat is om bestanden te ontsleutelen zonder de criminelen te betalen.
Indicators of compromise
SHA256 of the Nemty binary used in this research 267a9dcf77c33a1af362e2080aaacc01a7ca075658beb002ab41e0712ffe066e