15 juillet 2025

Ransomware SafePay : la menace en plein essor qui cible les MSP

Résumé

  • Au 1er trimestre 2025, un groupe de ransomware est rapidement sorti de l'obscurité au point de devenir l'un des acteurs les plus actifs et les plus dangereux du paysage mondial des menaces : il s'agit de SafePay. Il a pris de l'ampleur aussi discrètement qu'agressivement, faisant plus de 200 victimes dans le monde entier, y compris des fournisseurs de services managés (MSP) et des PME de tous les secteurs.
  • Acronis Threat Research Unit a analysé plusieurs échantillons de SafePay et a confirmé l'utilisation par le groupe de tactiques recyclées, mais très efficaces, notamment la désactivation de la protection des terminaux, la suppression des clichés instantanés et l'effacement des journaux pour annihiler la détection et la réponse.
  • Contrairement à de nombreux groupes de ransomwares qui s'appuient sur des affiliés selon un modèle RaaS (ransomware-as-a-service), SafePay semble fonctionner avec une gestion centralisée, gérant ses propres opérations, son infrastructure et ses négociations.
  • Le groupe utilise des techniques classiques mais efficaces : intrusion basée sur RDP et VPN, vol d'identifiants, élévation de privilèges et codes binaires « living off the land » pour se déplacer discrètement à travers les réseaux des victimes, exfiltrer des données sensibles, puis crypter des fichiers.
  • Plus récemment, SafePay a été lié à l'attaque de ransomware qui a perturbé Ingram Micro, un distributeur mondial au service de milliers de partenaires et de MSP.

Ransomware SafePay : une scission de Lockbit ?

SafePay est apparu pour la première fois en 2024. Au cours de sa première année d'activité, il a fait plus de 20 victimes. Bien que l'on ne sache pas si SafePay est un nouvel acteur ou une variante d'un précédent, leurs échantillons partagent de nombreuses similitudes avec la famille de ransomwares LockBit, un créateur de ransomware bien connu. En 2022, le code source du créateur de LockBit 3.0 a été divulgué. Après la fuite, une variété de nouveaux ransomwares est apparue. La version 3.0 du créateur est également connue sous le nom de LockBit Black du fait de similitudes avec le ransomware BlackByte.

L'échantillon de ransomware SafePay analysé par TRU est une DLL PE32 avec un faux horodatage de compilation.

Acronis
Acronis

Présentation

L’échantillon de ransomware SafePay est une DLL PE32 avec un faux horodatage de compilation. La première similitude avec LockBit est une fonction factice qui comporte un certain nombre d’appels d’API Windows séquentiels. Écrire des appels de cette manière n’a aucun sens car aucun argument n'est passé à ces fonctions, ce qui risque de provoquer des erreurs. Dans les deux cas, ces fonctions ne seront jamais appelées, car l’exécution sera close avant que l’échantillon ne puisse entrer dans cette section.

 Autres similitudes avec LockBit :

●      Mot de passe nécessaire pour l'exécution complète.

●      Tous les threads sont encodés.

●      Toutes les adresses WinAPI sont résolues lors de l’exécution.

●      Évitement des langues système similaires.

●      Abus de l’interface CMSTPLUA COM pour l’élévation de privilèges.

●      Les threads créés ont l’indicateur « ThreadHideFromDebugger ».

●      La liste des processus et services qui doivent être arrêtés.

 

Bien que l’échantillon ne soit pas une copie complète de LockBit 3.0 et présente quelques différences, il est courant que les acteurs malveillants modifient le code source pour rendre leur malware unique et, plus important encore, pour ajouter de nouvelles fonctionnalités et éviter la détection.

Livraison et exfiltration

Le ransomware SafePay a été livré aux victimes via des connexions RDP. Bien que l’on ne sache pas comment les cybercriminels ont obtenu des identifiants, cette technique leur a permis de désactiver Windows Defender et de transférer des fichiers sur le serveur C2 avant de les chiffrer. Avant d’exfiltrer les fichiers, les attaquants ont exécuté le script « ShareFinder.ps1 », qui trouve tous les partages réseau disponibles dans le domaine local. Ceci vient du projet open source :

https://github.com/darkoperator/Veil-PowerView/blob/master/PowerView/functions/Invoke-ShareFinder.ps1

Ce script recherche les partages de mise en réseau sur les hôtes du domaine local. Il a déjà été repéré dans les attaques d’Emotet, ainsi que lors de la campagne C0015, que le ransomware Conti a été déployé.

Pour collecter des fichiers sur le système, le programme WinRar a été utilisé avec la commande suivante :

 WinRAR.exe a -v5g -ed -r -tn1000d -m0 -mt5 -x*.rar -x*.JPEG -x*.RAW -x*.PSD -x*.TIFF -x*.BMP -x*.GIF -x*.JPG -x*.MOV -x*.pst -x*.FIT -x*.FIL -x*.mp4 -x*.avi -x*.mov -x*.mdb -x*.iso -x*.exe -x*.dll -x*.bak -x*.msg -x*.png -x*.zip -x*.ai -x*.7z -x*.DPM -x*.log -x*.dxf -x*.insp -x*.upd -x*.db -x*.dwg -x*.nc1 -x*.metadata -x*.dg -x*.inp -x*.dat -x*.TIFF -x*.tiger -x*.pcp -x*.rvt -x*.rws -x*.nwc -x*.tif -x*.frx -x*.dyf -x*.rcs -x*.diff C:\[redacted].rar \\[redacted]\C$\Users\

Après l’archivage des fichiers, un client FileZilla a été déployé pour exfiltrer les fichiers vers le serveur C2. Une fois le processus terminé, WinRar et FileZilla ont été supprimés des cibles.

Acronis

Exécution

Au début de l’exécution, SafePay déchiffre les chaînes. Selon une boucle, il effectue une opération XOR trois fois sur chaque octet. Chaque opération utilise une touche différente. La première utilise la valeur de l'index actuel. La seconde utilise le premier symbole de « kernel32.dll », qui est toujours « M ». La dernière clé est une valeur constante, qui est différente pour chaque chaîne chiffrée. Cette routine de déchiffrement n’est pas implémentée en tant que fonction distincte, mais utilisée pour déchiffrer chaque chaîne contenue dans l’échantillon. Les chaînes de l'échantillon sont uniquement au format chiffré.

Acronis

L'échantillon ne contient pas non plus la table des fonctions d’importation. Il déchiffre les noms de bibliothèques et les charge à l’aide de l’importation 'LoadLibrary', les adresses de fonction d’exportation sont ainsi résolues et enregistrées à l’aide de 'GetProcAddress'. Voici la liste des noms de bibliothèques que SafePay stocke dans un format chiffré :

advapi32.dll, rstrtmgr.dll, ole32.dll, shell32.dll, ntdll.dll, mpr.dll, user32.dll

Après avoir obtenu des importations supplémentaires, l’échantillon SafePay obtient la date/heure actuelle et la langue de l’interface utilisateur Windows. Ensuite, il vérifie si l'identifiant de la langue du système est plus grand ou plus petit que ceux enregistrés. L’échantillon passera ensuite à une section particulière avec une comparaison d’autres chiffres.

Acronis

À l’aide de l’instruction 'switch-case', SafePay peut poursuivre l’exécution ou décider de sortir lorsque la valeur obtenue correspond à l’un des numéros suivants :

Code
Description
Code BCP 47
1049
Russe
ru-RU
1058
Ukrainien
uk-UA
1059
Biélorusse
be-BY
1064
Tajik
tg-Cyrl-TJ
1067
Arménien – Arménie
hy-AM
1068
Azerbaïdjanais (latin)
az-Latn-AZ
1079
Géorgien
ka-GE

Ensuite, l’exemple SafePay récupère les arguments de ligne de commande et décode les chaînes supplémentaires. Ces chaînes sont supportées :

Argument
Description
<-uac>
Indicateur de contournement UAC
<-network>
Propagation réseau
<-selfdelete>
Auto-suppression après exécution
<-log>
Activer la journalisation
<-netdrive>
Chiffrer les lecteurs réseau
<-pass=>
Fournir un mot de passe
<-path=>
Fournir un chemin d’accès au chiffrement
<-enc=>
Fournir le niveau de chiffrement

Pour analyser les arguments, l’exemple SafePay récupère la ligne de commande qui a été utilisée pour exécuter l’échantillon et la stocke sous la forme d’un tableau d’arguments, qui dans la boucle sera comparée à la liste enregistrée. Lorsqu’un élément d’un tableau est comparé à une liste enregistrée, l’exemple ajoute « 1 » à la valeur d’index du tableau. Lorsqu’un argument est mis en correspondance, il définit la valeur appropriée à « 1 ».

Acronis

Alors que certains arguments ne sont définis que par défaut, d’autres doivent contenir des informations supplémentaires. Par exemple, un argument mot de passe doit être composé de 38 symboles, y compris la sous-chaîne '-pass='. Sinon, il quittera le programme. La longueur du mot de passe doit être de 32 octets pour décoder des informations supplémentaires dans le code. Si le mot de passe est inconnu, le processus d’exécution ne peut pas être effectué.

Acronis

L’argument de niveau de chiffrement doit être composé de six symboles, y compris une sous-chaîne '-enc='. Les nombres de '1' à '9' sont acceptés. Cette valeur sera multipliée par 10 et servira de pourcentage de chiffrement de fichier. Par exemple, si vous fournissez la valeur « 5 », l'échantillon sera chiffré à 50 % du fichier.

Acronis

Une fois les arguments analysés, l’exemple SafePay crée une nouvelle liste d'accès (ACL) et ajoute une entrée de contrôle d’accès (ICA) à accès refusé. Cette liste est utilisée dans la fonction 'SetSecurityInfo'.

Acronis

Ensuite, l’échantillon tente d’obtenir « SeDebugPrivilege »

Acronis

Le cas échéant, l'échantillon crée un instantané de tous les processus en cours d’exécution dans le système. Il compare ensuite leurs noms avec sa propre liste enregistrée, qui est également stockée dans un format codé. Lorsque le processus approprié est trouvé, il y sera mis fin.

Voici une liste des processus qui doivent être clos 

sql, oracle, ocssd, dbsnmp, synctime, agntsvc, isqlplussvc, xfssvccon, mydesktopservice, ocautoupds, encsvc, firefox, tbirdconfig, mydesktopqos, ocomm, dbeng50, sqbcoreservice, excel, infopath, msaccess, mspub, far, onenote, outlook, powerpnt, steam, thebat, thunderbird, visio, winword, wordpad, notepad, wuauclt, onedrive, sqlmangr

Outre les processus, l’échantillon met également fin à certains services. Tout d’abord, il ouvre le gestionnaire de services managés, puis recommence à rechercher les noms de service qui correspondent à sa propre liste. Ensuite, il sera mis fin aux services à l’aide de la fonction « ControlService » et de la valeur « 1 » dans l’argument « dwControl ».

Acronis

La liste des services résiliés :

vss, sqlsvc, memtas, mepocs, msexchange, Sophos, Veeam, backup, GxVss, GxBlr, GxFWD, GxCVD, GxCIMgr

Après avoir vidé la corbeille à l’aide de la fonction « SHEmptyRecycleBinW », l’échantillon active le registre « Software\Microsoft\Windows\CurrentVersion\Run » et crée une nouvelle clé avec une commande utilisée pour exécuter l’échantillon, y compris tous les arguments exécutables. Ce faisant, SafePay s'exécutera à chaque démarrage de Windows.

Si l’indicateur '-uac' est transmis, l’échantillon contourne l’interface COM CMSTPLUA pour exécuter des commandes avec des autorisations élevées via la fonction API 'ShellExecuteW' :

/c vssadmin delete shadows /all /quiet

/c wmic shadowcopy delete

/c bcdedit / set{default} bootstatuspolicy ignoreallfailures

/c bcdedit / set{default} recoveryenabled no

Si l’argument '-log' est fourni, l’exemple créera un fichier journal : 'C :\ProgramData\auto.log'. Il contient le PID (identifiant de processus), l’heure et la description de l’opération effectuée.

Chiffrement des fichiers

Avant de démarrer la routine de chiffrement, l'échantillon SafePay active le fournisseur de services de chiffrement par défaut du système avec RSA_AES type.

Acronis

Chaque thread de chiffrement sera créé en mode suspendu. Après la création du thread, l’exemple définit l’indicateur « ThreadHideFromDebugger » pour éviter son débogage et définit les informations de jeton précédemment dupliquées.

Pour rechercher des lecteurs sur le système, l’échantillon utilise les importations « GetVolumePathNamesForVolumeNameW » et « GetLogicalDrive ». Le type de chaque lecteur est vérifié. L’échantillon SafePay ne chiffrera le lecteur que s’il est de type 2 (DRIVE_REMOVABLE) ou 3 (DRIVE_FIXED). Pour obtenir des informations supplémentaires sur le disque, consultez 'DeviceIoControl' avec le code 'IOCTL_DISK_GET_PARTITION_INFO'. S’il trouve un lecteur non monté, l’échantillon le monte à l’aide de la fonction « SetVolumeMountPoint ».

Acronis

Pour rechercher des fichiers sur le système, l’échantillon charge les noms de lecteur trouvés et utilise les fonctions 'FindFirstFile' et 'FindNextFile'. Pour chaque fichier, il vérifie le paramètre 'dwFileAttributes'. Si le paramètre correspond à 16, qui est un répertoire, l'échantillon appellera la même fonction selon le chemin d’accès au dossier trouvé.

Acronis

Lorsque l’exemple ouvre un fichier à l’aide de « CreateFileW », il définit la valeur « dwFlagsAndAttributes » sur « 0x04000000 », qui est l’indicateur FILE_FLAG_DELETE_ON_CLOSE. L’échantillon supprimera ensuite le fichier ouvert juste après la fermeture de son descripteur.

Acronis

L’exemple génère 32 octets aléatoires pour chaque fichier, qui est utilisé comme clé AES. Ensuite, la clé AES sera chiffrée à l’aide de l’algorithme RSA.

Acronis

Après avoir chiffré chaque fichier du répertoire, l’échantillon utilise les API « CreateIOCompletionPort » et « ostQueuedCompletionStatus » pour gérer le chiffrement multithread en toute sécurité. Enfin, l'exemple renomme le fichier en y ajoutant l'extension « safepay ».

Acronis

Conclusion

Le ransomware SafePay utilise la double extorsion pour s’assurer que les victimes paient leurs rançons. Exfiltrant d'abord les fichiers, les attaquants déploient des malwares pour chiffrer les fichiers des utilisateurs à l'aide d'une forte combinaison de chiffrements AES et RSA. L’échantillon SafePay est un fichier DLL dont l’exécution nécessite les utilitaires « regsvr32.exe » ou « rundll32.exécutable ». L’échantillon accepte plusieurs arguments, mais nécessite toujours l’option '-pass=' ; ce mot de passe étant utilisé pour décoder des informations supplémentaires dans le code. Toutes les chaînes enregistrées et les noms d’importation sont stockés dans un format de chiffrement, ce qui rend SafePay difficile à détecter avant d’être exécuté.

Détecté par Acronis

Acronis

Indicateurs de compromission (IoC)

Fichiers

SHA256

a0dc80a37eb7e2716c02a94adc8df9baedec192a77bde31669faed228d9ff526

Indicateurs réseau

URL
http://nz4z6ruzcekriti5cjjiiylzvrmysyqwibxztk6voem4trtx7gstpjid.onion
VanessaCooke94@protonmail.com