- L’auteur a réussi à récupérer les données d’une entreprise infectée par le rançongiciel Akira sans payer la rançon
- Le code source utilisé pendant la récupération est disponible sur GitHub
- Il existe plusieurs variantes du rançongiciel Akira, et cette variante est active depuis la fin de 2023
- Une version antérieure (avant mi-2023) contenait un bug qui avait permis à Avast de développer un outil de déchiffrement, mais après la publication de cette information, les attaquants ont mis à jour le chiffrement
- Les hachages des échantillons du rançongiciel peuvent être consultés sur GitHub
Résumé de la méthode de récupération de fichiers pour le rançongiciel Akira (variante Linux/ESXI 2024)
Approche de résolution
Analyse initiale
- Le rançongiciel utilise l’heure actuelle à la nanoseconde près comme seed
- Comme l’heure de modification des fichiers sous Linux a une résolution à la nanoseconde, l’auteur a identifié la possibilité de reconstituer la seed
- Tentative d’une approche par brute force à partir de l’horodatage des fichiers modifiés
Processus de chiffrement complexe
- Le rançongiciel utilise 4 valeurs de seed (des horodatages à la nanoseconde)
- La génération de clé applique 1500 itérations du hash SHA-256
- Le système de fichiers VMware VMFS ne stocke l’heure de modification qu’à la seconde près
- Le chiffrement multithread rend difficile la reconstitution précise du timing
Reverse engineering
- Le code était écrit en C++, ce qui a compliqué l’analyse, mais il n’était pas obfusqué
- Les messages d’erreur ont permis d’identifier l’usage de la bibliothèque Nettle
- Le générateur pseudo-aléatoire est basé sur l’algorithme Yarrow256 et utilise le code suivant
void generate_random(char *buffer, int size)
{
uint64_t t = get_current_time_nanosecond();
char seed[32];
snprintf(seed, sizeof(seed), "%lld", t);
struct yarrow256_ctx ctx;
yarrow256_init(&ctx, 0, NULL);
yarrow256_seed(&ctx, strlen(seed), seed);
yarrow256_random(&ctx, size, buffer);
}
- Lors de la génération de clé,
generate_random() est appelé 4 fois
- chacha8_key (32 octets)
- chacha8_nonce (16 octets)
- kcipher2_key (16 octets) × 2
Évaluation de la faisabilité du brute force
Stratégie principale
- Générer deux horodatages (t3, t4), les convertir en seeds, puis produire les nombres aléatoires
- Utiliser ces nombres aléatoires comme clé KCipher2 et IV, chiffrer, puis comparer le résultat avec le fichier chiffré
Analyse des performances
- La conversion de 100 millions d’horodatages prend 3 heures (sur CPU)
- Avec un GPU, ce temps tombe à moins de 6 minutes
- Le nombre de paires possibles sur une fenêtre d’une seconde est d’environ 500 billions
- Après optimisation GPU, une RTX 3090 peut effectuer 1,5 milliard d’opérations de chiffrement par seconde
Types de fichiers VMware et stratégie de récupération
FLAT-VMDK
- Les 8 premiers octets d’un VMDK peuvent être récupérés depuis le bootloader
- Les informations sur l’OS peuvent être vérifiées dans le fichier VMX, ce qui permet d’installer le même OS
SESPARSE
- Le motif de l’en-tête du fichier a été identifié dans le code source de QEMU
- L’en-tête commence par
0x00000000cafebabe
Autres fichiers
- Les fichiers NVRAM, VMX, les fichiers de logs, etc. peuvent permettre d’identifier les horodatages initiaux
Récupération des horodatages
Logs ESXi
- Les logs ESXi enregistrent le temps d’exécution avec une précision à la milliseconde
- En l’absence de logs à la milliseconde, une estimation à partir d’une heure à la seconde près reste possible
Heure de modification du système de fichiers
- Dans le cas d’ESXi, la résolution à la seconde rend l’estimation du temps exact difficile
Chiffrement multithread
- Le chiffrement des fichiers est traité en parallèle selon le nombre de cœurs CPU
- L’heure de modification d’un fichier est proche du moment où son chiffrement s’achève
Implémentation de l’outil de brute force
Algorithme KCipher2
- Utilisation d’une version modifiée de KCipher2 plutôt que de la version standard (y compris le traitement de l’endianess)
- Optimisation GPU réalisée avec CUDA
Améliorations des performances
- Amélioration des performances via la mémoire partagée
- Gain de vitesse grâce à la suppression des copies mémoire
- Mise en œuvre d’un traitement parallèle des fichiers → environ 1,5 milliard d’opérations par seconde
RTX 3090 vs RTX 4090
- La RTX 4090 est environ 2,3 fois plus rapide → environ 7 jours
- RTX 3090 → environ 16 jours
Étapes de récupération
1. Extraction des horodatages
- Vérifier l’heure de modification avec la commande
stat
- Extraire l’heure de début d’exécution depuis les logs ESXi
2. Extraction des données chiffrées
- Extraire les blocs chiffrés depuis les VMDK, SESPARSE, etc.
3. Mesure de la vitesse du serveur
- Utiliser l’outil
timing-patch disponible sur GitHub
4. Découpage du travail
- Créer et fractionner le fichier de configuration
- Régler l’exécution pour permettre un traitement parallèle sur GPU
5. Location de GPU et exécution
- Runpod → environ 116 dollars pour 7 jours
- Vast.ai → moins cher, mais la vitesse peut varier selon l’état de la machine
6. Exécution du brute force KCipher2
./akira-bruteforce run2 config.json
7. Exécution du brute force Chacha8
- Nécessaire dans le cas de gros fichiers
8. Exécution du déchiffrement
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
Résultats de performance
- RTX 3090 → 1,5 milliard d’opérations par seconde
- RTX 4090 → 3,5 milliards d’opérations par seconde
- Avec 16 RTX 4090 → récupération possible en moins de 10 heures
Probabilité de récupération et limites
- La probabilité de réussite de la récupération est inférieure à 0,1 %
- Une récupération reste possible si certaines conditions sont réunies
- La méthode de chiffrement peut changer selon la variante du rançongiciel
Conclusion
- La récupération après rançongiciel est extrêmement difficile, mais peut réussir dans certaines conditions
- Le brute force basé sur GPU est l’outil clé
- L’auteur a publié le code de récupération en open source, mais il lui est difficile de fournir une aide supplémentaire
Remarques complémentaires
- Voir le fichier
README.md sur GitHub
- Le code a été écrit pour la situation spécifique d’un client → ce n’est pas un outil générique
- La création du fichier de configuration, l’ajustement du timing, etc. exigent des compétences de niveau administrateur système
1 commentaires
Commentaires sur Hacker News
Quelqu’un a mentionné la « durée de vie limitée » du rançongiciel. Cela a conduit à la suppression d’un commentaire affirmant que cela n’affecterait pas d’autres victimes, mais une réponse a été publiée à ce sujet
Une question a été posée sur la raison de l’utilisation des horodatages
Cet article était agréable à lire et contenait juste assez de détails pour satisfaire la curiosité sur le processus
Si les applications étaient sandboxées par défaut, le problème des rançongiciels diminuerait
« J’ai estimé que sur le CPU de mon mini PC, je pouvais calculer 100 000 horodatages par seconde en octets aléatoires (en utilisant tous les cœurs) »
Je me demande pourquoi les 65 premiers ko sont chiffrés avec KCipher2 et le reste avec autre chose. Cela paraît étrange
« Je m’attends à ce qu’après la publication de ceci, les attaquants modifient à nouveau le chiffrement »
« Chaque fois que j’écris sur les rançongiciels sur mon blog indonésien, beaucoup de gens demandent de l’aide à propos des rançongiciels »