Comprendere i malware, a basso livello, passa sempre per l’analisi del loro codice. E sebbene occorra effettuare del reverse engineering per venire a capo del loro funzionamento, in molti casi è utile conoscere il linguaggio di programmazione coi quali sono stati realizzati. Per svariati motivi: uno dei principali è che il linguaggio, spesso, definisce il modo in cui un software gestisce la memoria, sfrutta o meno delle librerie e, in genere, come si comporta e come potrà essere aggiornato e potenziato.
La sicurezza passa dal linguaggio di programmazione: regole per un coding a prova di attacco
Indice degli argomenti
I malware come videogame
Il linguaggio di programmazione, proprio come avviene con qualsiasi altro software, ci può raccontare passato, presente e futuro di un malware. E ci offre anche una panoramica sulle tendenze nel mondo dello sviluppo dei software malevoli, quanto mai utile per definire le strategie di difesa e prevenzione. È per questa ragione che, nel settore della malware analysis, e giocoforza di tutta la cyber security, si tiene d’occhio da un po’ di tempo il linguaggio Rust.
Si parta dal presupposto che non esiste un linguaggio d’elezione, per sviluppare malware. Un tempo venivano scritti in assembly, che poi è stato mano a mano ridotto e utilizzato come chiamata esterna da codice C. Poi, il C++ e via via linguaggi sempre più astratti che consentissero di realizzare software malevoli molto più complessi e in meno tempo. Quando si parla di sviluppo di malware, non è raro trovare similitudini con quello dei videogame. Passando dal prodotto di nicchia a produzione industriale, è chiaro che si è cambiato anche l’approccio alla programmazione.
La scelta di un linguaggio di programmazione moderno
E così come oggi, nei videogame, studi da centinaia di professionisti sfruttano librerie e motori prefatti perché un titolo è un’opera mastodontica da realizzare comunque in un arco temporale ristretto, così i malware sono diventati software realizzati da team strutturati e nei quali serve condivisione e organizzazione professionale del codice. Motivo per il quale si tende sempre più a sfruttare linguaggi di programmazione meno “istintivi”, come appunto assembly e C, e puntare su quelli che consentono di concentrarsi su funzioni di alto livello senza doversi sobbarcare questioni più tecnologiche.
Non stupisce, per questo, vedere ransomware realizzati anche in Python, a volte semplici e sviluppati per fini educativi, in altri casi di stampo professionale: nel marzo 2022, per esempio, Team Nautilus ha rilevato e descritto un attacco basato su un ransomware scritto in Python. L’obiettivo, in questo caso, era la piattaforma open source Jupyter Notebook. I criminali informatici hanno avuto accesso al server di una honeypot sfruttando una vulnerabilità da misconfiguration, per poi scaricarvi le librerie e, infine, creare del semplice codice Python che in poche decine di righe si è occupato di avviare tutta la ben nota filiera di questa tipologia di malware.
Hacker: chi sono, come funzionano le organizzazioni di criminal hacking, gli attacchi più comuni
Rust: il compromesso ideale tra semplicità e prestazioni
Python, tuttavia, ha dei limiti evidenti, tra i quali il fatto di essere un linguaggio interpretato e di livello un po’ troppo elevato, che porta a problemi di prestazioni e di tracciabilità degli sviluppatori, oltre ad avere la necessità di soddisfare requisiti che mal si sposano con l’azione di un malware. È per questa ragione che gli sviluppatori di software malevoli puntano, ormai da qualche tempo, su linguaggi che garantiscano il giusto compromesso tra semplicità e potenza, specie a basso livello.
E così ecco l’utilizzo di Go e, soprattutto, di Rust. Quest’ultimo, in particolare, vista la vocazione a prestazioni, “system programming” e realizzazione di codice sicuro (che può essere ironico ma, in questo caso, consente di gestire la memoria senza incorrere in alcune tipologie di bug), è visto come linguaggio di programmazione prediletto anche dagli sviluppatori di malware.
Perché Hive è stato riscritto in Rust
Quanto scoperto di recente dai ricercatori Microsoft, del resto, mostra una chiara tendenza nel settore della cyber-criminalità. Nel giugno del 2021 viene scoperto il ransomware Hive, una tipologia di malware piuttosto aggressiva, veloce e molto espandibile. Hive, infatti, è una piattaforma RaaS (Ransomware as a Service), il cui payload predefinito è scritto in Golang e si occupa di effettuare buona parte delle attività malevole: disattivare i prodotti di sicurezza, cancellare i log di Windows che lasciano tracce, agevolare il processo di crittografia.
Nel luglio del 2022, Microsoft scopre che si è diffusa una variante di Hive scritta in Rust. I ricercatori si sono spesi molto per comprendere il perché di questa totale riscrittura, visto che non è così comune migrare, nell’arco di appena un anno, verso un nuovo linguaggio.
E le conclusioni evidenziano quanto i cybercriminali siano alla continua ricerca della perfezione nello sviluppo dei loro software.
Rust: una questione di prestazioni e semplicità
In sintesi, la nuova versione di Hive, scritta in Rust, mostra un codice molto più stabile e sicuro nella gestione di memoria e variabili, e questo significa che diventa più complesso trovare punti deboli per disattivarlo o mitigarlo. Inoltre, le prestazioni sono molto più elevate, la sintassi di Rust è più funzionale a uno sviluppo di questo tipo e, quindi, di più veloce implementazione.
La differenza più evidente, tra la versione Golang e quella Rust di Hive, sempre secondo i ricercatori Microsoft, è una migliore gestione del multi-threading, che si riflette in un netto aumento della velocità delle funzioni crittografiche.
Più velocità, più stabilità, più semplicità di programmazione: questi, in sintesi, i motivi che hanno portato alla conversione di Hive a codice Rust.
Quello spunto preso da BlackCat
Del resto, Hive non è stato il primo e non sarà l’ultimo malware, ad abbracciare il linguaggio creato in origine dalla Mozilla Foundation. C’è il sospetto, per esempio, che proprio gli autori di Hive abbiano preso spunto da BlackCat, di fatto il primo ransomware censito a utilizzare Rust. Un software così micidiale da costringere la FBI a emanare un’allerta sulla sua pericolosità, visto che in pochi mesi ha colpito, e affondato, più di 60 multinazionali. Anche allora, si sottolineava l’estrema velocità delle attività di diffusione e crittografiche, unita alla difficoltà di effettuare un reverse engineering efficace per analizzare e combattere il codice malevolo.
L’utilizzo di Rust nel settore dei malware ha dunque delle profonde ragioni tecnologiche, ma non bisogna dimenticare anche quelle di opportunità. Rust, non a caso, è stato eletto dalla popolosa comunità di Stack Overflow, come il linguaggio più amato a partire dal 2016, ogni anno, aggiudicandosi il primato anche nel 2022 e aumentando il distacco dai concorrenti. Più successo, più diffusione, più disponibilità di programmatori da ingaggiare anche nel settore della cybercriminalità. Il tutto condito da caratteristiche tecnologiche all’avanguardia.
Impariamo una lezione, e una bonus
Cosa ha da imparare il mondo della cybersecurity da queste considerazioni? La banalità del male, ma fin troppo ignorata: che si approcci alla sicurezza nelle prime fasi di un percorso educativo, o che si vogliano ampliare le proprie conoscenze, consiglio sempre di imparare a programmare, bene, in almeno un paio di linguaggi di programmazione.
Se poi si prende la strada, complessa ma fascinosa, della malware analysis, da oggi sappiamo che Rust diventa un ingrediente quasi imprescindibile. Oltretutto, è un linguaggio in grado di fare davvero di tutto e col quale si stanno sviluppando sempre più progetti open source dedicati a software di sicurezza.
Lezione bonus: la criminalità informatica ragione sempre più come qualsiasi altra industria, e quindi segue mode e tendenze, spesso anticipandole. La cybercriminalità, per prima, ci insegna che arroccarsi su poche e vecchie posizioni non è mai una buona idea.
Ai dinosauri, del resto, non è andata benissimo.