Per la maggior parte della storia dell''informatica, "il binario" sul web era JavaScript — testo leggibile dall''uomo che potevi aprire in devtools e comprendere. WebAssembly ha cambiato questo. Wasm è un formato di istruzioni binarie compatto che viene eseguito a velocità quasi nativa nei browser e sempre più ai margini, nei plugin, nei runtime serverless e all''interno di applicazioni che incorporano una sandbox wasm. Le sue prestazioni e portabilità ne hanno fatto un successo, ma hanno anche creato una nuova realtà per chiunque faccia lavoro di sicurezza: una parte crescente della logica consegnata agli utenti arriva ora come un blob binario opaco piuttosto che come sorgente leggibile. Quando quel blob è un cryptominer contrabbandato in una pagina web, un controllo di licenza offuscato o malware che usa wasm per evitare il rilevamento incentrato su JavaScript, qualcuno deve fare reverse engineering di esso. Nel 2026, quel "qualcuno" è sempre più spesso un analista di sicurezza e la strumentazione si è maturata per soddisfare l''esigenza.
Questa guida è un''introduzione pratica al reverse engineering di WebAssembly. Spiega cosa rende wasm diverso dai binari nativi, percorre la toolchain open-source che è diventata standard — il WebAssembly Binary Toolkit (WABT), il decompiler diswasm, Binaryen e wasm-tools — e delinea un flusso di lavoro per passare da un file .wasm sconosciuto a una comprensione di ciò che fa. L''obiettivo è demistificare un formato che sembra intimidatorio ma che, in modi importanti, è più analizzabile del codice nativo.
Cosa rende wasm diverso
Per fare reverse engineering di wasm in modo efficace, devi capire come differisce dai binari x86 o ARM per cui la maggior parte degli strumenti RE è stata costruita. Le differenze tagliano in entrambi i modi — alcuni rendono wasm più facile da analizzare, altri più difficile.
Il primo tratto definito è che wasm è una stack machine, non una register machine. Il codice nativo manipola un set fisso di registri CPU; le istruzioni wasm spingono e fanno scoppiare i valori su uno stack operando. Questo è non familiare all''inizio, ma è anche strutturato e prevedibile, e significa che non c''è allocazione di registri a cui ragionare. Il secondo, e più utile, tratto è che wasm ha structured control flow. Dove il codice nativo utilizza salti arbitrari che i decompiler devono faticosamente ricostruire in cicli e condizionali, wasm ha costrutti espliciti block, loop e if incorporati nel formato. Il grafico del flusso di controllo è, in un certo senso, già recuperato — una delle parti più difficili della decompilazione nativa ti viene in gran parte data. Il terzo tratto è una clean module structure: un modulo wasm è organizzato in sezioni ben definite (tipi, importazioni, funzioni, codice, dati, esportazioni), quindi sai sempre dove si trovano le funzioni, cosa il modulo importa dal suo host e cosa espone.
Quella struttura di importazione/esportazione è la cosa più preziosa per un analista. Un modulo wasm non può fare nulla al mondo esterno da solo — non ha syscall. Tutto ciò che fa che è importante (accesso alla rete, manipolazione del DOM, I/O su file) accade chiamando funzioni host importate e quelle importazioni sono esplicitamente elencate nel modulo. Leggere la sezione di importazione ti dice le capacità del modulo prima di analizzare una singola istruzione: se non importa nulla che possa raggiungere la rete, non può exfiltrare dati; se importa funzioni per fetch o crypto, è dove guardare. Questo è un livello di approfondimento sulla capacità in primo piano che i binari nativi raramente ti danno.
Il lato più difficile: wasm rimuove i nomi dei simboli per impostazione predefinita (le funzioni diventano func[42]), i tipi sono limitati a una manciata di primitive numeriche in modo che la struttura di livello superiore si perda e le toolchain e gli offuscatori possono produrre codice denso e generato da macchina. Ma il flusso di controllo strutturato e il layout esplicito del modulo più che compensano, motivo per cui la decompilazione di wasm è generalmente considerata più trattabile della decompilazione nativa.
La toolchain
La toolchain RE di wasm open-source è piccola, focalizzata e complementare — nessuno strumento fa tutto, e il flusso di lavoro standard utilizza diversi insieme. Aiuta a sapere per cosa è ciascuno.
WABT, il WebAssembly Binary Toolkit, è la base. Converte tra il formato binario .wasm e il formato testo leggibile dall''uomo .wat (WebAssembly Text) con wasm2wat, scarica sezioni e disassembla il codice con wasm-objdump, convalida i moduli e — importante per RE — produce una decompilazione simile al C con wasm-decompile. WABT è la prima cosa a cui ricorri: trasforma il binario in qualcosa di leggibile e mostra la struttura del modulo. La sua opzione --generate-names sintetizza i nomi per le funzioni senza nome, il che rende l''output molto più facile da seguire.
diswasm fa un passo oltre verso la leggibilità, decompilando il bytecode wasm in pseudocodice di livello superiore piuttosto che il WAT fedele ma basso livello che wasm2wat produce. Dove WABT ti mostra esattamente ciò che dice il modulo, diswasm tenta di mostrarti cosa significa, ricostruendo codice strutturato che legge più come un programma normale. Per comprendere la logica rapidamente durante il triage, questa vista di livello superiore è preziosa.
Binaryen è una toolchain a livello di compilatore la cui rilevanza per RE è leggermente indiretta ma reale. Il suo strumento wasm-opt esegue i pass di ottimizzazione e trasformazione su un modulo, e diversi di quei pass — constant folding, dead-code elimination, semplificazione locale — succedono di pulire il rumore che i compilatori e gli offuscatori lasciano dietro. Un trucco pratico è eseguire un modulo confuso attraverso i pass di semplificazione e quindi decompilare il risultato più pulito. Anche il wasm-dis di Binaryen disassembla e wasm-reduce può rimpicciolire un modulo per l''essenziale che presenta un comportamento di interesse.
wasm-tools, la toolchain Rust di basso livello, completa le cose con validazione, parsing, mutazione e supporto per proposte wasm più recenti (componenti, GC, thread). Quando hai bisogno di ispezionare o manipolare programmaticamente un modulo — o quando un binario utilizza funzioni che gli strumenti più vecchi rifiutano — wasm-tools è l''opzione moderna e attivamente mantenuta. Insieme questi quattro coprono il ciclo di vita di RE: WABT e diswasm per leggere, Binaryen per semplificare, wasm-tools per convalidare e mutare.
Un flusso di lavoro pratico di analisi
Di fronte a un file .wasm sconosciuto — diciamo, uno estratto da una pagina web sospetta — un flusso di lavoro ripetibile ti consente di comprendere velocemente. La sequenza seguente è quella su cui convergono gli analisti esperti.
Inizia con capacità, non codice. Prima di leggere una singola istruzione, scarica le importazioni e le esportazioni: wasm-objdump -x module.wasm (o le sezioni di importazione/esportazione in modo specifico). Le importazioni ti dicono cosa può fare il modulo — quali funzioni host può chiamare — e le esportazioni ti dicono i suoi punti di ingresso, le funzioni che il JavaScript circostante effettivamente richiama. Questo inquadra tutto: un modulo che importa solo funzioni matematiche è una minaccia molto diversa da quella che importa fetch e primitive crypto. Molte analisi terminano effettivamente qui, perché l''elenco delle capacità risponde già alla domanda ("non può raggiungere la rete, quindi non sta exfiltrando nulla").
Successivamente, disassembla con nomi: wasm2wat --generate-names module.wasm. Questo ti dà la struttura fedele con nomi sintetizzati e ti permette di vedere il layout della sezione, la sezione dati (spesso contenente stringhe, URL o costanti incorporate degne di attenzione) e la forma complessiva. Grep la sezione dati e il WAT per stringhe caratteristiche — domini, percorsi API, costanti crypto, messaggi di errore — che frequentemente rivelano l''intenzione senza lettura di codice profonda.
Quindi, se hai bisogno di comprendere una logica specifica, decompila per la leggibilità: esegui wasm-decompile (WABT) o diswasm per ottenere pseudocodice e se l''output è denso o offuscato, semplifica prima con Binaryen (wasm-opt --precompute --simplify-locals --vacuum) prima di decompilare il modulo pulito. Concentra la tua lettura sulle funzioni esportate e qualunque cosa chiami le importazioni interessanti — raramente hai bisogno di leggere il modulo intero. Infine, per un campione veramente ostinato, wasm-reduce può isolare il modulo minimo che riproduce un comportamento, rimpicciolendo la superficie che devi comprendere.
Questa progressione capability-first, then-structure, then-logic rispecchia la buona pratica di RE nativa ma sfrutta i vantaggi di wasm: le importazioni esplicite rendono il passo di capacità insolitamente informativo e il flusso di controllo strutturato rende il passo di decompilazione insolitamente pulito.
Malware Wasm ed evasione
Vale la pena capire perché gli analisti hanno sempre più bisogno di queste competenze, perché forma ciò che cercare. Gli aggressori hanno adottato wasm per ragioni concrete. La più affermata è il cryptomining: la velocità quasi nativa di wasm la rende ideale per l''estrazione di criptovalute nel browser di una vittima e i miner drive-by hanno spedito i loro cicli di hashing come wasm per anni. Più in generale, wasm offre un grado di evasione: un ecosistema di sicurezza che ha trascorso un decennio a imparare ad analizzare e rilevare JavaScript dannoso è meno maturo nell''ispezione di wasm, quindi spostare la logica in un modulo wasm può passare inosservato agli strumenti e ai revisori umani che leggono solo JavaScript. Logica offuscata — controlli di licenza, routine anti-analisi, derivazione delle chiavi — è anche più difficile da sollevare da un binario wasm che da JS leggibile, quindi alcuni fornitori e alcuni malware usano wasm specificamente per resistere al reverse engineering.
L''implicazione difensiva è che "abbiamo revisionato il JavaScript" non è più garanzia sufficiente per il codice consegnato dal web. Se una pagina spedisce un modulo wasm, quel modulo fa parte della superficie di attacco e merita l''analisi capability-first di cui sopra. La buona notizia, reiterando il tema, è che la struttura di importazione esplicita di wasm rende almeno la domanda di capacità veloce a rispondere — puoi determinare se un modulo può fare qualcosa di pericoloso molto più velocemente di quanto tu possa per un binario nativo offuscato. Quell''asimmetria favorisce i difensori disposti ad imparare la toolchain.
Bridging wasm in strumenti RE tradizionali
Una domanda che sorge rapidamente per i reversori esperti è se riescono a usare i loro strumenti esistenti — Ghidra, IDA, Binary Ninja — su wasm piuttosto che imparare un''intera toolchain separata. La risposta nel 2026 è un "sì" qualificato ed è utile comprendere il compromesso. I plugin della comunità portano il supporto wasm nelle principali piattaforme RE: ci sono moduli di processore/loader WebAssembly per Ghidra e altri, permettendoti di caricare un .wasm e usare la vista del grafico familiare, i riferimenti incrociati e il flusso di lavoro del decompiler che già conosci. Per un analista profondamente fluente in uno di questi ambienti, quella familiarità può superare i vantaggi della toolchain dedicata di wasm.
Il compromesso è la maturità e l''adattamento. La toolchain wasm dedicata — WABT, diswasm, Binaryen — è costruita intorno alla struttura effettiva di wasm e tende a produrre risultati più puliti e idiomatici per wasm in modo specifico, mentre le piattaforme RE generali stanno adattando un modello progettato per il codice nativo su una stack machine, che può essere lossy o scomodo ai margini. L''approccio pragmatico che molti analisti si assestano è usare entrambi: gli strumenti CLI leggeri di wasm per il triage capability-first veloce descritto in precedenza (dump importazioni, disassembla, grep stringhe, ottieni pseudocodice veloce) e poi, se un campione richiede un''analisi manuale profonda, caricalo nella piattaforma di tua scelta per il lavoro di reversing più pesante con tutti i suoi feature di navigazione e annotazione.
Questo è anche dove i fondamenti di RE trasferiscono. Il reverse engineering di wasm non è una disciplina del tutto separata — le competenze fondamentali di lettura del disassembly, seguendo il flusso di controllo e dati, identificando funzioni interessanti dai loro chiamanti e chiamati e ragionando su ciò che un binario fa trasferimento diretto. Ciò che cambia sono i dettagli di superficie: una stack machine invece di registri, flusso di controllo strutturato invece di salti grezzi, importazioni host invece di syscall. Un reversore esperto può prendere wasm rapidamente esattamente perché le intuizioni dure guadagnate si applicano ancora; la strumentazione specifica di wasm rimuove semplicemente l''attrito. Quella trasferibilità è rassicurante per chiunque sia riluttante ad investire — stai estendendo le competenze esistenti, non ricominciando da capo.
Il punto di fondo
WebAssembly è diventato un formato binario di prima classe del web moderno, il che significa che leggerlo è ora un''abilità di sicurezza piuttosto che una curiosità. Wasm è genuinamente diverso dal codice nativo — una stack machine con flusso di controllo strutturato, sezioni di modulo pulite e, più utilmente, importazioni host esplicite che rivelano le capacità di un modulo prima di leggere qualsiasi codice. La toolchain open-source corrisponde all''esigenza: WABT per disassemblare e decompilare, diswasm per pseudocodice di livello superiore, Binaryen per semplificare lontano dall''offuscamento e wasm-tools per convalidare e manipolare. Lavora capability-first — importazioni ed esportazioni prima delle istruzioni — quindi disassembla con nomi, quindi decompila le parti che importano, semplificando quando necessario. Fai questo e il nuovo binario del web smette di essere un blob opaco e diventa solo un''altra cosa che puoi leggere.
Riferimenti e Risorse
Strumenti
Background e analisi
- Reverse Engineering WebAssembly — PNF Software
- Analyzing WebAssembly binaries — Forcepoint X-Labs
- A Comprehensive Study of Decompilation Techniques for WebAssembly Binaries
Cheatsheets di 1337skills correlati