WebAssembly per principianti Parte 3: come funzionano la portabilità e la sicurezza di WASM

Pubblicato: 2023-01-05

Scopri come funzionano i modelli di portabilità e sicurezza WebAssembly (WASM) in questa guida per principianti.

Entrambi sono argomenti WebAssembly avanzati (WASM). Ti consigliamo di leggere i due argomenti precedenti nella nostra serie WebAssembly per principianti.

  • WebAssembly per principianti - Parte 1: Introduzione a WASM
  • WebAssembly per principianti - Parte 2: obiettivi, concetti chiave e casi d'uso

Iniziamo.

Portabilità WebAssembly

La portabilità di WebAssembly lo rende pronto per il Web. In effetti, puoi definire WASM come una piattaforma sandbox portatile.

Inoltre, il suo formato binario gli consente di essere eseguito su varie architetture di set di istruzioni e sistemi operativi. Ciò significa che puoi utilizzare WASM non solo sul Web ma anche fuori dal Web.

Per comprendere la portabilità di WASM, discuteremo quanto segue:

  • Ambiente locale, limitato e non deterministico.
  • Caratteristiche specifiche dell'ambiente di esecuzione
  • Portabilità web e non web di WASM

Locale, limitato e non deterministico

WASM necessita di un'esecuzione efficiente e di ambienti adeguati che siano locali, limitati e non deterministici. Il non determinismo è il calcolo che specifica che un algoritmo/compilatore/ambiente genera comportamenti o risultati diversi anche per lo stesso input. È l'opposto di un algoritmo deterministico.

Gli altri due aspetti, limited e local , sono associati all'esecuzione non deterministica. Per far funzionare l'esecuzione non deterministica, sono necessari casi d'uso ben definiti che siano " limitati ".

Inoltre, queste esecuzioni sono " locali " senza alcun effetto al di fuori dell'ambiente. Leggi il loro non determinismo ufficiale nel documento WebAssembly per saperne di più.

Caratteristiche specifiche dell'ambiente di esecuzione

Per rendere portatile WebAssembly, si presuppone che l'ambiente di esecuzione offra le seguenti caratteristiche:

  • Indirizzabilità della granularità della memoria a byte e byte a 8 bit.
  • Interi con segno in complemento a due a 32 bit. Facoltativamente 64 bit.
  • L'emulazione del software è possibile tramite accessi di memoria non allineati o trappole affidabili.
  • Supporto per virgola mobile a 32 e 64 bit come definito in IEEE 754-2008.
  • Garantire l'esecuzione di tutti i thread con avanzamento in avanti.
  • Per l'accesso a 64 bit, wasm64 dovrebbe fornire operatori di memoria atomica senza blocco.
  • Gli operatori di memoria atomica senza blocco includono accessi a 8, 16 e 32 bit.
  • wasm64 supporta una memoria lineare superiore a 4 GiB con indici o puntatori a 64 bit.
  • Ordinamento dei byte little-endian.

Tutti i principali browser, inclusi Chrome, Edge, Firefox e WebKit, supportano tutti questi requisiti ambientali.

Inoltre, WebAssembly si sta evolvendo a un ritmo rapido. Il WASM Community Group e il W3C WebAssembly Working Group stanno lavorando alla sua standardizzazione. Ciò significa che ognuno di questi requisiti può cambiare in futuro.

Portabilità Web e non Web di WASM

Lo scopo principale di WebAssembly è fornire portabilità e prestazioni native sul Web e non Web. In questa sezione, vedremo come WASM lo raggiunge.

#1. Incorporamento web

WASM si integra bene con l'ecosistema Web, inclusi il modello di sicurezza Web, la portabilità Web e le API Web. Inoltre, deve avere spazio sufficiente per lo sviluppo creativo lungo la strada (leggi WebAssembly per principianti - Parte 2 per comprenderne gli obiettivi)

Quindi, in che modo WASM raggiunge la compatibilità con il Web? Utilizza le API JavaScript, consentendo agli sviluppatori di utilizzare facilmente JavaScript per la compilazione dei moduli WebAssembly. Si occupa anche dell'archiviazione e del recupero dei moduli del compilatore, della gestione delle importazioni dai moduli del compilatore, della gestione della memoria e così via.

Per saperne di più su come WASM raggiunge la compatibilità Web di alto livello, leggi questo: Web Embedding - WebAssembly.

#2. Incorporamento non Web

Come accennato in precedenza, WASM funziona anche con ambienti non web. In qualità di sviluppatore o azienda, puoi creare applicazioni ad alte prestazioni o scrivere sezioni della tua app che richiedono l'ottimizzazione delle prestazioni. Ad esempio, puoi usarlo su dispositivi IoT, server di data center e app desktop/mobili.

Poiché le applicazioni non Web non possono utilizzare le API Web, si basano sul collegamento dinamico di WASM. È inoltre necessario utilizzare il test delle funzionalità, un processo di sviluppo del software che testa le molteplici varianti delle funzionalità per vedere cosa è meglio per l'esperienza dell'utente. Inoltre, gli sviluppatori possono utilizzare le macchine virtuali JavaScript per semplificare l'incorporamento non Web o sviluppare le proprie app senza di essa.

Per saperne di più, leggi Incorporamenti non Web – WebAssembly.

Sicurezza WebAssembly

WebAssembly è una soluzione in formato binario che offre prestazioni simili a quelle native. Funziona alla grande sul Web, ma può anche essere ottimizzato per funzionare su incorporamenti non Web. Ciò rende WASM ampiamente disponibile attraverso servizi, soluzioni e processi. Tuttavia, questo significa più problemi di sicurezza.

Sfide e rischi per la sicurezza di WASM

Anche se WebAssembly è considerato sicuro ed efficiente, presenta molteplici rischi per la sicurezza, tra cui:

  • Sandbox WebAssembly
  • Gestione della memoria
  • Offuscamento del codice
  • Controlli di integrità

#1. Sandbox WebAssembly

WASM viene eseguito all'interno del browser Web, proprio come JavaScript. Utilizza la stessa macchina virtuale (VM) di JavaScript. La sandbox fornisce efficacemente un ambiente di esecuzione sicuro e ostacola ciò che è in esecuzione sotto il cofano.

Pertanto, se il codice JavaScript/WebAssembly contiene codice dannoso, è difficile da rilevare poiché si tratta di una scatola nera. Inoltre, il codice WASM è in formato binario pronto per l'esecuzione; funziona più velocemente, rendendo difficile per le soluzioni antivirus cercare qualsiasi codice dannoso. Ad esempio, il codice può contenere pubblicità indesiderate o la possibilità di reindirizzare gli utenti a siti di malware indesiderati.

infettare-browser-crypto-mining-WASM

Inoltre, l'eccessivo affidamento di WebAssembly su JavaScript per l'esecuzione sul Web significa anche che eredita le vulnerabilità JavaScript. Ecco perché, come sviluppatore, devi seguire le precauzioni e le misure di sicurezza di JavaScript durante la codifica di WASM.

#2. Gestione della memoria

La gestione della memoria in WASM è complicata. In primo luogo, non accede direttamente alla memoria fisica poiché viene eseguita all'interno della VM. Ecco perché utilizza la memoria della macchina host.

In secondo luogo, la pulizia della memoria in WASM richiede un processo esplicito, mentre, in confronto, JavaScript si pulisce da solo.

Inoltre, quando una funzione WASM restituisce l'output a JavaScript, restituisce un puntatore alla posizione all'interno dello spazio di memoria WASM allocato. Quindi, se la memoria dichiarata si esaurisce, il programma WASM può bloccarsi, rovinando l'esperienza dell'utente. Per prevenirlo, i programmatori devono utilizzare disinfettanti per eseguire il debug del loro codice o utilizzare toolchain come emscripten.

wasm-memoria-lineare

#3. Offuscamento del codice

L'esecuzione sandbox di WASM rende il suo codice offuscato. Inoltre, anche il formato binario WASM non è leggibile dall'uomo, rendendo difficile il reverse engineering, necessario per identificare il codice dannoso.

Questi rendono difficile eseguire il debug del codice WebAssembly a causa della mancanza di un formato leggibile dall'uomo. Ciò apre molte falle nella sicurezza, inclusa la capacità degli hacker di nascondere il codice che ruba informazioni sensibili o esegue l'iniezione di codice per assumere il controllo della macchina host.

#4. Controlli di integrità

Qualsiasi dato trasferito attraverso il Web è vulnerabile al data tempering. Ad esempio, gli hacker possono eseguire un attacco man-in-the-middle per modificare i valori dei dati. È un problema per WASM, considerando che non ha un modo adeguato per eseguire controlli di integrità.

Tuttavia, può funzionare con JavaScript per eseguire controlli di integrità. Un altro modo per identificare potenziali vulnerabilità del codice WASM consiste nell'utilizzare strumenti di integrazione come Jit. Garantisce che il codice sia privo di malintenzionati e non possa influire sulle app o sull'infrastruttura cloud circostante.

attacco man-in-the-middle

Comprensione del modello di sicurezza WASM

WebAssembly prende sul serio la sicurezza. Ecco perché, nei documenti ufficiali di WASM, hanno affermato che il loro modello di sicurezza si prende cura di due obiettivi importanti:

  1. Assicurati che nessun modulo difettoso o dannoso colpisca gli utenti
  2. Assicurati che gli sviluppatori possano mitigare eventuali rischi per la sicurezza e creare applicazioni sicure, assicurandoti che il punto 1 sia sempre mantenuto.

Il modello di sicurezza WASM sa che le app WebAssembly vengono eseguite in modo indipendente pur non essendo in grado di sfuggire al suo ambiente sandbox. Tuttavia, le API possono aprire un modo per attaccare l'ambiente host.

Un'altra tecnica a tolleranza d'errore include l'esecuzione di app in modo deterministico con aspettative limitate. Garantendo entrambe le condizioni, la maggior parte delle esecuzioni delle app sono ritenute sicure.

Per migliorare la sicurezza, gli sviluppatori dovrebbero applicare la stessa politica di origine per il flusso di informazioni. Se stai sviluppando per non Web, devi utilizzare il modello di sicurezza POSIX. Se vuoi saperne di più sul suo modello di sicurezza, dai un'occhiata a: Sicurezza – WebAssembly.

L'interfaccia del sistema WebAssembly (WASI)

Anche WASI (The WebAssembly System Interface) svolge un ruolo cruciale nell'incorporamento non Web di WASM in quanto migliora la sicurezza. È un'interfaccia di sistema modulare che offre interessanti caratteristiche di sicurezza e portabilità.

In effetti, ora fa parte della Carta del sottogruppo dell'interfaccia del sistema WebAssembly e quindi standardizzata. Grazie a WASI, WASM è ampiamente adottato in diverse aree informatiche edge/server. Inoltre, WASI semplifica la sicurezza quando si passa a un incorporamento non web da un ambiente di incorporamento web.

Parole finali

La portabilità e la sicurezza di WebAssembly sono due argomenti importanti. Nella parte 3 del WebAssembly per principianti, abbiamo cercato di semplificarlo e scomporlo, specialmente per i principianti.

Successivamente, puoi consultare i cheat sheet di JavaScript per sviluppatori e studenti.