Perché Meta ha portato Rust in WhatsApp: come cambia la sicurezza dell’app

Meta ha introdotto 90.000 righe di codice Rust al posto di 160.000 C++ in WhatsApp per ridurre i rischi legati alla gestione degli allegati, una delle principali superfici di attacco dell’app. Vediamo motivazioni tecniche della migrazione da C++ a Rust e l'impatto sulla sicurezza contro exploit zero-click e vulnerabilità.

L’adozione progressiva del linguaggio Rust all’interno di WhatsApp rappresenta uno dei cambiamenti tecnici più rilevanti e meno visibili introdotti da Meta negli ultimi anni. Si tratta di una decisione strutturale che incide direttamente sul modello di sicurezza dell’applicazione, in particolare sulla gestione dei contenuti multimediali e degli allegati, che storicamente hanno rappresentato una delle superfici di attacco più critiche per WhatsApp e per le altre applicazioni di messaggistica.

WhatsApp opera su una scala senza precedenti: oltre 3 miliardi di utenti, miliardi di file scambiati ogni mese e un insieme di dispositivi client estremamente eterogeneo, che comprende smartphone Android e iOS, desktop, browser, dispositivi indossabili e ambienti embedded.

Partendo da questo scenario, è evidente che ogni componente software chiamata ad elaborare un input non affidabile diventa un potenziale vettore di compromissione. La migrazione a Rust va letta esattamente in questa chiave: ridurre sistematicamente i problemi legati alla sicurezza della memoria (cavallo di battaglia di Rust) e alla gestione dei dati binari.

La gestione dei media (leggasi allegati) come problema di sicurezza

La condivisione di immagini, video, documenti PDF e altri formati complessi richiede la presenza di parser sofisticati, spesso chiamati a interpretare strutture binarie altamente flessibili.

Questo tipo di codice è storicamente scritto in C o C++, linguaggi che offrono controllo diretto sulla memoria ma che, proprio per questo motivo, sono responsabili di una larga percentuale delle vulnerabilità gravi osservate negli ultimi decenni.

WhatsApp ha sperimentato in modo diretto le conseguenze di questa realtà nel 2015, con la vulnerabilità Android nota come Stagefright. In quel caso, file multimediali appositamente costruiti erano in grado di sfruttare bug nei decoder di sistema, consentendo l’esecuzione di codice arbitrario prima ancora che l’utente interagisse con il contenuto. Poiché la vulnerabilità risiedeva nelle librerie del sistema operativo, le applicazioni non avevano la possibilità di applicare patch dirette, e i tempi di aggiornamento dell’intera base di dispositivi Android rendevano il rischio persistente.

Il caso Paragon Graphite, esploso anche in Italia, ha dimostrato come a distanza di 10 anni i problemi legati alla gestione dei media in WhatsApp siano sempre presenti.

Lo spyware in questione sfruttava una vulnerabilità zero-day di WhatsApp, quindi un problema di sicurezza non noto e non risolto da Meta, per innescare comportamenti imprevisti nei componenti di parsing e rendering. Ancora una volta, il punto critico non era tanto l’interfaccia utente quanto il codice che interpreta dati complessi provenienti da fonti non fidate.

Anche qui il problema era di tipo zero-click, nel senso che per l’esecuzione del codice malevolo sul dispositivo dell’utente non era necessaria la benché minima interazione da parte della vittima.

Dalla libreria C++ a una riscrittura in Rust

Sulla scia degli eventi citati in precedenza e di altri incidenti verificatisi negli anni, gli sviluppatori di WhatsApp si sono attivati per ripensare radicalmente l’approccio.

Non limitarsi più a delegare la sicurezza del parsing dei media al sistema operativo sottostante, ma introdurre un livello applicativo capace di intercettare file non conformi agli standard prima del passaggio ai decoder di basso livello del dispositivo destinatario.

La prima risposta tecnica è stata l’estensione di una libreria C++ interna, denominata wamedia, inizialmente progettata per elaborare i file MP4 ed eliminare eventuali anomalie. La stessa libreria fu adattata per rilevare criticità strutturali nei file multimediali, bloccando quelli potenzialmente in grado di innescare vulnerabilità note o future.

Gestione degli allegati in sicurezza con WhatsApp

L’infografica illustra il funzionamento di wamedia, il motore di elaborazione dei contenuti multimediali WhatsApp, evidenziando come l’app riesca a garantire la sicurezza degli utenti pur mantenendo la crittografia end-to-end. Poiché i server di WhatsApp non possono ispezionare i file (essendo questi criptati durante il transito), la protezione risiede sui dispositivi di invio e ricezione (usando un client ufficiale). Fonte: Meta, “Rust at Scale”, gennaio 2026.

I limiti strutturali del C++ nel parsing di input non fidati

Tuttavia, proprio perché wamedia può operare su input non fidati, gli ingegneri di WhatsApp identificarono rapidamente un problema di fondo: un parser scritto in C++ resta intrinsecamente esposto a classi di bug come buffer overflow, use-after-free, double free e integer overflow. Anche con audit accurati e fuzzing aggressivo (esecuzione massiva e sistematica di test automatici che inviano al software input malformati, casuali o deliberatamente estremi, con l’obiettivo di far emergere crash, comportamenti anomali o vulnerabilità latenti), il rischio residuo rimane elevato.

La scelta di Rust nasce da questa considerazione. Rust introduce un modello di sicurezza della memoria basato su ownership, borrowing e controlli statici che eliminano intere categorie di vulnerabilità alla radice, senza ricorrere a garbage collection e mantenendo prestazioni comparabili, se non superiori, al C++.

Piuttosto che procedere con una migrazione incrementale, WhatsApp ha adottato una strategia parallela: sviluppare una versione completa di wamedia in Rust, mantenendo comunque anche l’implementazione originale.

Le due versioni sono state confrontate attraverso tecniche di differential fuzzing, test di integrazione su larga scala e una copertura estensiva di test unitari, con l’obiettivo di garantire un comportamento equivalente.

Il risultato è stato significativo: circa 160.000 linee di codice C++ sono state sostituite da circa 90.000 linee di codice Rust. Oltre alla riduzione della complessità, la versione Rust ha mostrato vantaggi concreti in termini di consumo di memoria e prestazioni a runtime.

Breve guida ai termini utilizzati nel caso di Rust

  • Ownership (proprietà dei dati): ogni valore in memoria ha un “proprietario” unico; quando il proprietario ovvero il programma di riferimento non è più in uso, la memoria viene liberata automaticamente, evitando leak e rilasci doppi.
  • Borrowing (prestito): invece di copiare o “passarsi” la proprietà, una funzione può ricevere un riferimento ai dati per leggerli o modificarli con regole precise. Così si evita che due parti del codice li usino in modo pericoloso.
  • Controlli statici: verifiche fatte a compilazione (dal compilatore) che assicurano il rispetto di ownership/borrowing e di lifetime (intervallo di tempo durante l’esecuzione del programma in cui un dato riferimento è valido, cioè in cui punta a memoria che esiste ancora e può essere usata in sicurezza), impedendo condizioni che in C/C++ portano a bug come use-after-free, data race o accessi fuori limite.
  • Garbage collection (GC): meccanismo (tipico di Java/Go/C#) che libera la memoria “a posteriori” tramite un runtime che individua gli oggetti non più raggiungibili; semplifica la vita al programmatore ma introduce overhead e imprevedibilità, che Rust evita grazie alla gestione deterministica via ownership.

Ostacoli tecnici per l’introduzione di Rust in WhatsApp su scala globale

L’introduzione di Rust in un prodotto distribuito su miliardi di dispositivi non è stata priva di difficoltà, ammettono gli sviluppatori di Meta e WhatsApp.

Uno dei problemi iniziali è stato l’aumento delle dimensioni dei binari, dovuto all’inclusione della libreria standard di Rust. Un altro aspetto critico ha riguardato il sistema di build, che ha dovuto subire un adattamento per supportare un numero estremamente ampio di piattaforme, architetture e toolchain.

Meta ha scelto consapevolmente di affrontare questi costi come un investimento a lungo termine. Il successo del rollout dimostra che Rust è ormai maturo per l’uso client-side su scala globale, smentendo l’idea che sia adatto solo a componenti server o di sistema.

Oggi la libreria Rust per la gestione dei media è distribuita su Android, iOS, macOS, Web, dispositivi indossabili e altri ambienti, rendendo il deployment uno dei più vasti mai realizzati per codice Rust destinato agli utenti finali.

La presa di posizione di Meta/WhatsApp è un po’ una risposta indiretta alle recenti segnalazioni di Google Project Zero che mostrava come un bug in WhatsApp può condurre all’esecuzione di codice dannoso e ciò proprio facendo leva sulla gestione dei media.

Kaleidoscope: difesa applicativa multilivello

Nel tempo, la riscrittura di WhatsApp in Rust – spiegano gli ingegneri software – ha permesso di ampliare il set di controlli applicativi, dando origine a un sistema interno denominato Kaleidoscope. Questo insieme di verifiche non si limita a validare la conformità sintattica dei file, ma analizza indicatori di rischio più sottili.

Il sistema individua discrepanze tra estensione, MIME type e struttura reale del file, tentativi di mascheramento di eseguibili come immagini o documenti ed eventuali caratteristiche pericolose in formati notoriamente sfruttati per la diffusione di malware, come i PDF con contenuti incorporati o script attivi.

È importante sottolineare che questo tipo di controlli non elimina completamente la possibilità di attacchi, ma riduce drasticamente la probabilità di exploit basati su parsing differenziale (un file multimediale è costruito in modo da apparire valido durante i controlli iniziali dell’applicazione, ma da attivare comportamenti anomali o vulnerabilità quando interpretato da decoder o librerie sul dispositivo destinatario) o vulnerabilità zero-day nei decoder di sistema.

Rust nel modello di sicurezza complessivo di WhatsApp

L’adozione di Rust si inserisce in una strategia più ampia di gestione del rischio. Le nuove versioni di WhatsApp combinano la riduzione della superficie d’attacco, il rafforzamento del codice legacy in C e C++ e la scelta predefinita di linguaggi memory-safe per i nuovi componenti.

Dove il C++ resta necessario, gli sviluppatori spiegano di aver applicato mitigazioni avanzate, API più sicure per la gestione dei buffer e analisi automatizzate continue.

Meta aggiunge di conservare un approccio trasparente nella gestione delle vulnerabilità, pubblicando CVE anche in assenza di exploit osservati e investendo in audit indipendenti, fuzzing sistematico e programmi di bug bounty.

Note conclusive

Il caso WhatsApp rappresenta un esempio concreto di come la sicurezza del software moderno non possa più basarsi esclusivamente su patch reattive o controlli a posteriori. La scelta di Rust aiuta certamente a ridurre il rischio strutturale intervenendo sul linguaggio e sul modello di programmazione, soprattutto in componenti critici come i parser di media.

In prospettiva, l’esperienza maturata da Meta suggerisce che l’adozione di linguaggi memory-safe su larga scala non è solo una questione di sicurezza, ma anche di sostenibilità tecnica. Meno vulnerabilità critiche significano meno incidenti, meno patch urgenti e una base di codice più robusta.

Certo, WhatsApp è un obiettivo troppo “goloso” per i criminali informatici quindi andrà verificato, nel tempo, se la strategia implementata sarà sufficiente a contrastare attori dotati di risorse ampie e capacità di ricerca avanzate.

Piattaforme come WhatsApp restano infatti bersagli privilegiati non solo per il valore dei dati trattati, ma anche per l’effetto leva che una singola vulnerabilità può avere su miliardi di dispositivi eterogenei.

Ti consigliamo anche

Link copiato negli appunti