Sintesi
· Nel primo trimestre del 2025, un gruppo ransomware è emerso dall'oscurità per diventare uno degli attori più attivi e pericolosi nel panorama delle minacce globali: SafePay. Ha preso piede in modo silenzioso ma aggressivo, colpendo oltre 200 vittime in tutto il mondo, tra cui Managed Service Provider (MSP) e aziende di piccole e medie dimensioni (PMI), di ogni settore.
· Le analisi condotte da Acronis Threat Research Unit (TRU) su diversi esemplari di SafePay hanno confermato l'utilizzo da parte del gruppo di tattiche riciclate ma altamente efficaci, come la disattivazione della protezione degli endpoint, l'eliminazione delle copie shadow e la cancellazione dei registri per impedire il rilevamento e la risposta.
· Diversamente dai gruppi ransomware che adottano un modello Ransomware-as-a-service (RaaS) tramite affiliati, SafePay sembra operare con una forma di controllo centralizzato, gestendo in autonomia le proprie operazioni, infrastrutture e negoziazioni.
· Il gruppo sfrutta tecniche classiche ma efficaci: intrusione basata su RDP e VPN, furto di credenziali, escalation dei privilegi e codici binari LotL (Living off the Land) per muoversi in sordina nella rete delle vittime, esfiltrare dati sensibili e quindi crittografare i file.
· Di recente SafePay è stato associato all'attacco ransomware sferrato contro Ingram Micro, un distributore globale che serve migliaia di partner e MSP.
SafePay: uno spin-off del ransomware Lockbit?
SafePay fa la sua prima apparizione nel 2024. Nel primo anno di attività il gruppo ha dichiarato oltre 20 vittime. Sebbene non sia chiaro se SafePay sia solo il nuovo nome di un altro ransomware, i suoi esemplari presentano molte somiglianze con la famiglia LockBit, un noto builder di ransomware. Nel 2022 è stato divulgato il codice sorgente del builder LockBit 3.0. Dopo la diffusione, sono emersi alcuni nuovi ransomware. La versione 3.0 del builder è nota anche come LockBit Black, perché presenta molte somiglianze con il ransomware BlackByte.
L'esemplare del ransomware SafePay analizzato da Acronis TRU è una DLL PE32 con un timestamp di compilazione falso.


Panoramica
L'esemplare del ransomware SafePay è una DLL PE32 con un timestamp di compilazione falso. La prima somiglianza con LockBit è una funzione fittizia che presenta una serie di chiamate sequenziali all'API di Windows. Le chiamate scritte in questo modo non hanno senso perché non presentano argomenti da passare alle funzioni, il che è causa di errori. Di fatto, in entrambi i casi le funzioni non verranno mai chiamate, perché l'esecuzione termina prima che l'esemplare possa accedere a questa sezione.
Altre somiglianze con LockBit:
● Richiede password per l'esecuzione completa.
● Tutte le stringhe sono codificate.
● Tutti gli indirizzi WinAPI vengono risolti durante l'esecuzione.
● Elude gli stessi linguaggi di sistema.
● Abusa dell'interfaccia COM CMSTPLUA per l'escalation dei privilegi.
● I thread creati presentano il flag 'ThreadHideFromDebugger'.
● Crea l'elenco dei processi e dei servizi che devono essere terminati.
Sebbene l'esemplare non sia una copia completa di LockBit 3.0 e presenti alcune differenze, è frequente che gli autori della minaccia modifichino il codice sorgente per rendere il proprio malware esclusivo, aggiungano nuove funzionalità e migliorino la capacità di eludere il rilevamento.
Consegna ed esfiltrazione
La distribuzione del ransomware SafePay alle vittime avviene tramite connessioni RDP. Sebbene non sia noto come il gruppo abbia ottenuto le credenziali, la tecnica utilizzata ha consentito di disattivare Windows Defender e di caricare i file sul server C2 prima di crittografarli. Prima di esfiltrare i file, gli aggressori hanno eseguito lo script 'ShareFinder.ps1' che individua tutte le condivisioni di rete disponibili nel dominio locale e proviene dal progetto open source:
Lo script individua le condivisioni di rete sugli host nel dominio locale. Era già stato segnalato negli attacchi Emotet e durante la campagna C0015, utilizzata per distribuire il ransomware Conti.
Per raccogliere i file sul sistema, è stato utilizzato il programma WinRar con il seguente comando:
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\
Dopo l'archiviazione dei file, è stato distribuito un client FileZilla per esfiltrare i file sul server C2. Completato il processo, sia WinRar che FileZilla vengono rimossi dalle destinazioni.

Esecuzione
L'esecuzione inizia con SafePay che decrittografa le stringhe. Utilizza un loop che prevede l'esecuzione dell'operazione XOR tre volte su ogni byte. Ogni operazione utilizza una chiave diversa. La prima utilizza il valore dell'indice corrente. La seconda utilizza il primo simbolo di 'kernel32.dll', che è sempre 'M'. L'ultima chiave è un valore costante, diverso per ogni stringa crittografata. La routine di decrittografia non è implementata come funzione distinta, ma viene utilizzata per decrittografare ogni stringa contenuta nell'esemplare. L'esemplare contiene stringhe solo in formato crittografato.

Inoltre, non contiene la tabella delle funzioni di importazione. Esegue la decrittografia dei nomi delle librerie e le carica utilizzando il comando di importazione 'LoadLibrary', mentre gli indirizzi delle rispettive funzioni di esportazione vengono risolti e salvati utilizzando 'GetProcAddress'. Di seguito un elenco dei nomi delle librerie che SafePay archivia in formato crittografato.
advapi32.dll, rstrtmgr.dll, ole32.dll, shell32.dll, ntdll.dll, mpr.dll, user32.dll
Dopo aver ottenuto importazioni aggiuntive, l'esemplare SafePay acquisisce la data e l'ora correnti e la lingua dell'interfaccia utente di Windows. Quindi controlla se il numero ID della lingua di sistema è maggiore o minore rispetto a quelli salvati. L'esemplare passa poi a una sezione particolare con il confronto di altri numeri.

Utilizzando l'istruzione 'switch-case', SafePay può continuare l'esecuzione o passare alla funzione exit quando il valore ottenuto corrisponde a uno dei numeri seguenti:
L'esemplare SafePay ottiene quindi gli argomenti della riga di comando e decodifica stringhe aggiuntive che costituiscono argomenti supportati:
Per analizzare gli argomenti, questa versione di SafePay acquisisce la riga di comando utilizzata per eseguire l'esemplare e la archivia come un array di argomenti, che durante il loop viene confrontato con l'elenco salvato. Quando un elemento dell'array viene confrontato con un elenco salvato, l'esemplare aggiunge '1' al valore dell'indice dell'array. Se un argomento corrisponde, imposta il valore appropriato su '1'.

Alcuni argomenti sono semplicemente dei flag impostati, mentre altri devono contenere informazioni aggiuntive. Ad esempio, un argomento password deve essere composto da 38 simboli, inclusa la stringa secondaria '-pass='. Qualsiasi altra condizione causa l'uscita dal programma. La password deve essere lunga 32 byte e viene utilizzata per decodificare le informazioni aggiuntive presenti nel codice. Se la password è sconosciuta, non è possibile eseguire l'intero processo di esecuzione.

L'argomento del livello di crittografia deve essere composto da sei simboli, inclusa una stringa secondaria '-enc='. Per questo argomento vengono accettati numeri da '1' a '9'. Questo valore viene moltiplicato per 10 e rappresenta la percentuale di crittografia del file. Ad esempio, specificando il valore '5', l'esemplare crittografa il 50% del file.

Dopo l'analisi degli argomenti, questo esemplare di SafePay crea un nuovo elenco di controllo degli accessi (ACL) e aggiunge una voce di controllo di accesso negato (ACE). L'elenco viene utilizzato nella funzione 'SetSecurityInfo'.

L'esemplare tenta quindi di ottenere il privilegio 'SeDebugPrivilege'

e poi crea uno snapshot di tutti i processi in esecuzione nel sistema. Quindi confronta i nomi dei processi con l'elenco salvato, anch'esso archiviato in formato codificato. Una volta individuato il processo appropriato, questo viene terminato.
Di seguito l'elenco dei processi che devono essere terminati:
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
Oltre ai processi, l'esemplare arresta anche alcuni servizi. Per farlo, apre innanzitutto il gestore dei servizi e poi avvia la ricerca dei nomi dei servizi che corrispondono all'elenco salvato. I servizi vengono terminati tramite la funzione 'ControlService' e il valore '1' nell'argomento 'dwControl'.

Elenco dei servizi che verranno terminati:
vss, sqlsvc, memtas, mepocs, msexchange, Sophos, Veeam, backup, GxVss, GxBlr, GxFWD, GxCVD, GxCIMgr
Utilizzando la funzione 'SHEmptyRecycleBinW', il malware svuota il cestino e quindi carica il percorso del Registro di sistema 'Software\Microsoft\Windows\CurrentVersion\Run' e crea una nuova chiave con il comando già utilizzato per eseguire l'esemplare, inclusi tutti gli argomenti. In questo modo SafePay viene eseguito a ogni avvio di Windows.
Se viene fornito il flag '-uac', l'esemplare sfrutta in modo improprio l'interfaccia CMSTPLUA COM per eseguire comandi con autorizzazioni elevate tramite la funzione API 'ShellExecuteW':
/c vssadmin delete shadows /all /quiet
/c wmic shadowcopy delete
/c bcdedit / set{default} bootstatuspolicy ignoreallfailures
/c bcdedit / set{default} recoveryenabled no
Se viene fornito l'argomento '-log', l'esemplare crea il file di registro: 'C:\ProgramData\auto.log'. Il file contiene il PID (ID processo), l'ora e una descrizione del processo eseguito.
Crittografia dei file
Prima di avviare la routine di crittografia, SafePay apre l'handle del service provider di crittografia predefinito del sistema, con tipo RSA_AES.

Ogni thread di crittografia viene creato in modalità sospesa. Una volta creato il thread, viene impostato il flag 'ThreadHideFromDebugger' per evitare il debug del thread stesso; vengono quindi impostate le informazioni sul token duplicate in precedenza.
Per trovare le unità presenti nel sistema, l'esemplare utilizza le importazioni 'GetVolumePathNamesForVolumeNameW' e 'GetLogicalDrives' e controlla il tipo di ogni unità. SafePay crittografa l'unità solo se è di tipo 2 (DRIVE_REMOVABLE) o 3 (DRIVE_FIXED). Informazioni aggiuntive sul disco vengono ottenute utilizzando 'DeviceIoControl' con codice di controllo 'IOCTL_DISK_GET_PARTITION_INFO'. Se viene individuata un'unità non montata, l'esemplare la monta utilizzando la funzione 'SetVolumeMountPoint'.

Per cercare i file nel sistema, il malware carica i nomi delle unità trovate e utilizza le funzioni 'FindFirstFile' e 'FindNextFile'. Per ogni file, controlla quindi il parametro 'dwFileAttributes'. Se il parametro corrisponde a 16, che è una directory, viene chiamata la stessa funzione con il percorso della cartella trovata.

Quando l'esemplare apre un file tramite 'CreateFileW', imposta il valore di 'dwFlagsAndAttributes' su '0x04000000', ovvero il flag 'FILE_FLAG_DELETE_ON_CLOSE'. L'esemplare elimina quindi il file aperto subito dopo aver chiuso il relativo handle.

Per ogni file vengono generati 32 byte casuali, poi utilizzati come chiave AES. La chiave AES viene quindi crittografata utilizzando l'algoritmo RSA.

Dopo aver crittografato ogni file nella directory, il malware utilizza le API 'CreateIOCompletionPort' e 'PostQueuedCompletionStatus' per gestire in modo sicuro la crittografia multithread. Infine, l'esempio rinomina il file, aggiungendo l'estensione '.safepay'.

Conclusioni
Il ransomware SafePay ricorre alla doppia estorsione per assicurarsi che le vittime paghino il riscatto. Gli aggressori per prima cosa esfiltrano i file, quindi distribuiscono un malware che crittografa i file degli utenti utilizzando un'efficace combinazione di cifrari AES e RSA. L'esemplare di SafePay è un file DLL che, per essere eseguito, richiede le utilità 'regsvr32.exe' o 'rundll32.dll'. L'esemplare accetta più argomenti ma ne richiede sempre uno di tipo '-pass=', poiché questa password viene utilizzata per decodificare informazioni aggiuntive nel codice. Tutte le stringhe salvate e i nomi delle importazioni vengono archiviati in un formato crittografato, il che rende SafePay difficile da rilevare prima della sua esecuzione.
Rilevato da Acronis

IoC
File
SHA256
a0dc80a37eb7e2716c02a94adc8df9baedec192a77bde31669faed228d9ff526