CHC-based Automated Verification of WebAssembly Programs
Questo articolo propone un metodo di verifica statica automatizzata per un sottoinsieme di WebAssembly utilizzando clausole di Horn vincolate, il quale gestisce efficacemente le chiamate a funzione indirette attraverso il filtraggio basato sui tipi e gestisce i grandi gestori di panico tramite la sintesi dell'analisi del flusso di controllo.
Articolo originale sotto licenza CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Questa è una spiegazione generata dall'IA dell'articolo qui sotto. Non è stata scritta né approvata dagli autori. Per precisione tecnica, consulta l'articolo originale. Leggi il disclaimer completo
Immaginate Internet come una città gigante e frenetica dove ogni edificio è un sito web. Per anni, questi edifici sono stati costruiti con un insieme di progetti specifico e pesante che li rendeva sicuri ma talvolta lenti da costruire. Poi, è arrivato WebAssembly, un nuovo linguaggio super-efficiente. È come un sistema di droni per le consegne universale e ad alta velocità che può volare ovunque sul web, trasportando carichi pesanti di codice per eseguire giochi, strumenti e app direttamente nel vostro browser. Poiché questi droni sono così veloci e potenti, dobbiamo assicurarci che non si schiantino mai contro un edificio o che non perdano il loro carico nel posto sbagliato. Questo è il compito della "verifica" (verification): una parola altisonante per indicare la dimostrazione matematica che un programma sia sicuro prima ancora che venga eseguito.
Per fare questo, gli scienziati dell'informatica utilizzano spesso uno strumento chiamato "Satisfiability Solver". Pensate a questo solver come a un detective super intelligente che può guardare un insieme di regole e dirvi istantaneamente se uno scenario è possibile o impossibile. Se le regole dicono "Il drone deve essere nel cielo" e "Il drone deve essere a terra" contemporaneamente, il detective sa che si tratta di una contraddizione e che il piano non è sicuro. Questo articolo prende quel detective e gli insegna come comprendere le regole specifiche e complicate di WebAssembly, specialmente quelle che riguardano la chiamata di altre funzioni in modo indiretto e la gestione di enormi messaggi di errore.
Il mistero della chiamata mutaforma
Gli autori, Akihisa Yagi, Ken Sakayori e Naoki Kobayashi dell'Università di Tokyo, hanno affrontato un puzzle complicato. I programmi WebAssembly sono come una biblioteca enorme dove i libri (funzioni) possono essere prelevati dagli scaffali in modo dinamico. A volte, il codice non dice "Apri il Libro A"; invece, dice "Apri il libro allo scaffale numero 5". Questa è chiamata una chiamata di funzione indiretta (indirect function call).
Il problema è che se provate a controllare ogni singolo libro nella biblioteca per vedere cosa potrebbe esserci sullo scaffale numero 5, il detective (il solver) viene sopraffatto. È come cercare di controllare ogni singola combinazione possibile di un milione di serrature per trovare la chiave giusta. L'approccio ingenuo sarebbe quello di elencare ogni singola possibilità, ma questo crea una montagna di scartoffie che nessun computer può risolvere in un tempo ragionevole.
La soluzione degli autori è stata quella di agire come un bibliotecario molto severo. Si sono resi conto che WebAssembly ha una regola: puoi estrarre un libro dallo scaffale solo se corrisponde al "genere" (tipo) che stai cercando. Quindi, invece di controllare ogni libro nella biblioteca, il loro metodo guarda al "genere" richiesto nel punto della chiamata e filtra tutti i libri che non corrispondono. Questo riduce drasticamente la lista dei candidati, rendendo il lavoro del detective molto più facile. Hanno aggiunto anche un secondo trucco: se gli scaffali della biblioteca sono bloccati e non cambiano mai (sola lettura), possono pre-calcolare esattamente quale libro si trova dove, trasformando un puzzle complesso in una semplice lista di regole "se questo, allora quello".
Il gigantesco pulsante di panico
La seconda sfida era il "gestore di panico" (panic handler). Immaginate un programma che, quando commette un errore, non si limita a fermarsi; lancia un massiccio discorso di 10.000 passaggi spiegando esattamente cosa è andato storto, completo di grafici diagnostici e codici di errore, prima di arrendersi definitivamente. In WebAssembly, questi gestori di panico sono enormi blocchi di codice che vengono attivati quando le cose vanno male.
Per il controllore di sicurezza, questi discorsi massicci sono una distrazione. L'unica cosa che conta è che il programma alla fine smetta di girare in modo sicuro (raggiunga un'istruzione "unreachable"). Il lungo e tortuoso percorso di costruzione del messaggio di errore non cambia realmente il fatto che il programma stia andando in crash. Tuttavia, se il detective prova a tracciare ogni singolo passaggio di quel discorso di 10.000 passaggi, rimane bloccato.
Gli autori hanno introdotto una tecnica di "riassunto" (summarization). Si sono resi conto che se un blocco di codice sta solo portando a un crash, possono eliminare l'intermediario. Hanno utilizzato un'analisi del flusso di controllo per identificare questi percorsi lunghi e tortuosi e li hanno sostituiti con una scorciatoia semplice: "Se entri in questa stanza, alla fine andrai in crash". È come dire a una guida turistica: "Salta la lezione di storia di 50 minuti sulla hall; dicci solo che l'uscita è bloccata". Questo mantiene la verifica concentrata sui problemi critici di sicurezza senza perdersi nel rumore del messaggio di errore.
I risultati: un lavoro in corso
Per testare le loro idee, il team ha costruito uno strumento prototipo chiamato WASMVERIFIER. Hanno nutrito lo strumento con 90 programmi diversi, inclusi alcuni scritti in Rust e C, e hanno chiesto di dimostrare che fossero sicuri.
I risultati sono promettenti ma non perfetti. Utilizzando due diversi solver per detective (Z3 Spacer ed Eldarica), lo strumento ha verificato con successo o ha smentito la sicurezza di circa 54-56 programmi. Tuttavia, si è scontrato con un muro su circa 20-22 programmi, esaurendo il tempo (un "timeout") o la memoria. In circa 11-12 casi, ha generato un "falso allarme", pensando che un programma fosse insicuro quando in realtà era a posto. Gli autori spiegano che questi falsi allarmi sono avvenuti perché il loro strumento ha dovuto sostituire alcune istruzioni non supportate con un segnaposto di "crash", rendendo il controllo di sicurezza troppo cauto.
L'articolo suggerisce che, sebbene questo approccio sia un passo avanti significativo verso controlli di sicurezza completamente automatizzati, non è ancora una bacchetta magica. Gli autori notano che il metodo è ancora in fase di perfezionamento, in particolare nel modo in cui gestisce la matematica complessa sui bit (bit-vectors) e nel modo in cui gestisce le istruzioni che non comprendono ancora appieno. Sospettano che il metodo sia "sound" (corretto) e "complete" (completo), ma non hanno ancora scritto la prova matematica formale per questo, lasciandolo come compito per il futuro.
In breve, l'articolo mostra che, essendo più intelligenti nel modo in cui filtriamo le chiamate indirette e riassumendo le parti disordinate della gestione degli errori, possiamo rendere i controlli di sicurezza automatizzati per WebAssembly molto più pratici. È una solida base, ma il detective ha ancora bisogno di più addestramento per risolvere ogni caso.
Sommerso dagli articoli nel tuo campo?
Ricevi digest giornalieri degli articoli più recenti corrispondenti alle tue parole chiave di ricerca — con riassunti tecnici, nella tua lingua.