WebAssembly pentru începători Partea 3: Cum funcționează portabilitatea și securitatea WASM
Publicat: 2023-01-05Vedeți cum funcționează modelele de portabilitate și securitate WebAssembly (WASM) în acest ghid pentru începători.
Ambele sunt subiecte avansate WebAssembly (WASM). Vă recomandăm să citiți cele două subiecte anterioare din seria noastră WebAssembly for Beginner.
- WebAssembly pentru începători – Partea 1: O introducere în WASM
- WebAssembly pentru începători – Partea 2: Obiective, concepte cheie și cazuri de utilizare
Să începem.
Portabilitate WebAssembly
Portabilitatea WebAssembly îl face pregătit pentru Web. De fapt, puteți defini WASM ca o platformă portabilă cu nisip.
În plus, formatul său binar îi permite să se execute în diferite arhitecturi de seturi de instrucțiuni și sisteme de operare. Aceasta înseamnă că puteți utiliza WASM nu numai pe Web, ci și în afara Webului.
Pentru a înțelege portabilitatea WASM, vom discuta următoarele:
- Mediu local, limitat și nedeterminist.
- Caracteristici specifice mediului de execuție
- Portabilitate web și non-web WASM
Local, limitat și nedeterminist
WASM are nevoie de o execuție eficientă și de medii adecvate care sunt locale, limitate și nedeterminism. Nondeterminismul este calculul care specifică faptul că un algoritm/compilator/mediu produce comportamente sau rezultate diferite chiar și pentru aceeași intrare. Este opusul unui algoritm determinist.
Celelalte două aspecte, limitate și locale , sunt asociate cu execuția nedeterministă. Pentru a face execuția nedeterministă să funcționeze, aveți nevoie de cazuri de utilizare bine definite, care sunt „ limitate ”.
De asemenea, aceste execuții sunt „ locale ”, fără efect în afara mediului. Citiți nondeterminismul lor oficial în documentul WebAssembly pentru a afla mai multe despre acesta.
Caracteristici specifice mediului de execuție
Pentru a face WebAssembly portabil, se presupune că mediul de execuție oferă următoarele caracteristici:
- Adresabilitate de granularitate a memoriei de octeți și octeți de 8 biți.
- Numerele întregi cu semn complement pe 32 de biți. Opțional 64 de biți.
- Emularea software-ului este posibilă prin accesări de memorie nealiniate sau prin captare fiabilă.
- Suport pentru puncte flotante pe 32 de biți și 64 de biți, așa cum este definit în IEEE 754-2008.
- Garanție pentru a executa toate firele cu progres înainte.
- Pentru acces pe 64 de biți, wasm64 ar trebui să ofere operatori de memorie atomică fără blocare.
- Operatorii de memorie atomică fără blocare includ accese pe 8, 16 și 32 de biți.
- wasm64 acceptă memorie liniară mai mare de 4 GiB cu indici sau pointeri pe 64 de biți.
- Ordinea octetilor Little-endian.
Toate browserele majore, inclusiv Chrome, Edge, Firefox și WebKit, acceptă toate aceste cerințe de mediu.
Mai mult, WebAssembly evoluează într-un ritm rapid. Grupul comunitar WASM și Grupul de lucru W3C WebAssembly lucrează la standardizarea acestuia. Asta înseamnă că oricare dintre aceste cerințe se poate schimba în viitor.
Portabilitate web și non-web WASM
Scopul principal al WebAssembly este de a oferi portabilitate și performanță nativă pe Web și non-web. În această secțiune, ne vom uita la modul în care WASM îl realizează.
#1. Încorporarea Web
WASM se integrează bine cu ecosistemul web, inclusiv cu modelul de securitate web, portabilitatea web și API-urile web. Mai mult, trebuie să aibă suficient spațiu pentru dezvoltarea creativă pe parcurs (citiți WebAssembly for Beginners – Partea 2 pentru a-și înțelege obiectivele)
Deci, cum realizează WASM compatibilitatea cu Web-ul? Utilizează API-uri JavaScript, permițând dezvoltatorilor să utilizeze cu ușurință JavaScript pentru compilarea modulelor WebAssembly. De asemenea, are grijă de stocarea și preluarea modulelor compilatorului, gestionarea importurilor din modulele compilatorului, gestionarea memoriei și așa mai departe.
Pentru a afla mai multe despre modul în care WASM atinge compatibilitatea Web la nivel înalt, citiți acest lucru: Web Embedding – WebAssembly.
#2. Încorporare non-Web
După cum am menționat mai devreme, WASM funcționează și cu medii non-web. În calitate de dezvoltator sau de companie, puteți crea aplicații de înaltă performanță sau puteți scrie secțiuni ale aplicației dvs. care necesită reglarea performanței. De exemplu, îl puteți folosi pe dispozitive IoT, servere de centre de date și aplicații desktop/mobile.
Deoarece aplicațiile non-web nu pot folosi API-uri web, ele se bazează pe legătura dinamică a WASM. De asemenea, trebuie să utilizați testarea caracteristicilor, un proces de dezvoltare software care testează variațiile multiple ale caracteristicilor pentru a vedea ce este cel mai bun pentru experiența utilizatorului. În plus, dezvoltatorii pot folosi VM JavaScript pentru a simplifica încorporarea non-web sau pentru a-și dezvolta aplicațiile fără aceasta.
Pentru a afla mai multe, citiți Încorporare non-Web – WebAssembly.
WebAssembly Security
WebAssembly este o soluție în format binar care oferă performanțe native. Funcționează grozav pe Web, dar poate fi, de asemenea, reglat pentru a funcționa pe înglobări non-web. Acest lucru face ca WASM să fie disponibil pe scară largă prin servicii, soluții și procese. Cu toate acestea, aceasta înseamnă mai multe provocări de securitate.
Provocări și riscuri de securitate WASM
Chiar dacă WebAssembly este considerat sigur și eficient, vine cu mai multe riscuri de securitate, inclusiv:
- WebAssembly sandbox
- Gestionarea memoriei
- Obscurcarea codului
- Verificări de integritate
#1. WebAssembly Sandbox
WASM se execută în browserul web, la fel ca JavaScript. Utilizează aceeași mașină virtuală (VM) ca și JavaScript. Cutia de nisip oferă în mod eficient un mediu de execuție sigur și împiedică ceea ce rulează sub capotă.
Deci, dacă codul JavaScript/WebAssembly conține cod rău intenționat, este greu de detectat deoarece este o cutie neagră. De asemenea, codul WASM este în format binar gata de rulat; rulează mai repede, ceea ce face dificil pentru soluțiile antivirus să caute orice cod rău intenționat. De exemplu, codul poate conține reclame nedorite sau capacitatea de a redirecționa utilizatorii către site-uri de malware nedorite.
În plus, dependența excesivă a WebAssembly de JavaScript pentru a rula pe Web înseamnă, de asemenea, că moștenește vulnerabilități JavaScript. De aceea, în calitate de dezvoltator, trebuie să urmați măsurile de siguranță și măsurile JavaScript la codificarea WASM.
#2. Gestionarea memoriei
Gestionarea memoriei în WASM este dificilă. În primul rând, nu accesează direct memoria fizică, deoarece se execută în VM. De aceea folosește memoria mașinii gazdă.
În al doilea rând, curățarea memoriei în WASM necesită un proces explicit, în timp ce, în comparație, JavaScript se curăță singur.
În plus, atunci când o funcție WASM returnează ieșire la JavaScript, returnează un pointer către poziția din spațiul de memorie WASM alocat. Deci, dacă memoria declarată devine plină, programul WASM se poate bloca, stricând experiența utilizatorului. Pentru a preveni acest lucru, programatorii trebuie să folosească dezinfectante pentru a-și depana codul sau să folosească lanțuri de instrumente precum emscripten.
#3. Obscurcarea codului
Execuția sandbox-ului WASM face codul obscurcat. În plus, formatul binar WASM nu este, de asemenea, citibil de om, ceea ce face dificilă inginerie inversă, care este necesară pentru a identifica codul rău intenționat.
Acestea fac codul WebAssembly greu de depanat din cauza lipsei de format care poate fi citit de om. Acest lucru deschide multe lacune de securitate, inclusiv capacitatea hackerilor de a ascunde codul care fură informații sensibile sau injectează cod pentru a prelua mașina gazdă.
#4. Verificări de integritate
Orice date transferate prin Web sunt vulnerabile la temperarea datelor. De exemplu, hackerii pot efectua un atac man-in-the-middle pentru a schimba valorile datelor. Este o problemă pentru WASM, având în vedere că nu are o modalitate adecvată de a face verificări de integritate.
Cu toate acestea, poate funcționa cu JavaScript pentru a efectua verificări de integritate. O altă modalitate de a identifica potențialele vulnerabilități ale codului WASM este utilizarea instrumentelor de integrare precum Jit. Se asigură că codul este lipsit de actori răi și nu poate afecta aplicațiile sau infrastructura cloud din jur.
Înțelegerea modelului de securitate WASM
WebAssembly ia în serios securitatea. De aceea, în documentele oficiale WASM, ei au menționat că modelul lor de securitate are grijă de două obiective importante:
- Asigurați-vă că nu există erori sau module rău intenționate să afecteze utilizatorii
- Asigurați-vă că dezvoltatorii pot atenua orice riscuri de securitate și pot crea aplicații sigure, asigurându-vă în același timp că punctul 1 este întotdeauna menținut.
Modelul de securitate WASM știe că aplicațiile WebAssembly se execută independent, fără a putea scăpa din mediul său sandbox. Cu toate acestea, API-urile pot deschide o modalitate de a ataca mediul gazdă.
O altă tehnică tolerantă la erori include executarea de aplicații în mod determinist, cu așteptări limitate. Asigurând ambele condiții, majoritatea execuțiilor aplicațiilor sunt considerate sigure.
Pentru a îmbunătăți securitatea, dezvoltatorii ar trebui să aplice politica de aceeași origine pentru fluxul de informații. Dacă dezvoltați pentru non-web, trebuie să utilizați modelul de securitate POSIX. Dacă doriți să citiți mai multe despre modelul său de securitate, consultați: Security – WebAssembly.
Interfața sistemului WebAssembly (WASI)
WASI (Interfața sistemului WebAssembly) joacă, de asemenea, un rol crucial în încorporarea non-web WASM, deoarece îmbunătățește securitatea. Este o interfață de sistem modulară care oferă caracteristici de securitate interesante și portabilitate.
De fapt, acum face parte din Carta subgrupului WebAssembly System Interface și, prin urmare, este standardizat. Datorită WASI, WASM este adoptat pe scară largă în diferite zone de calcul edge/server. De asemenea, WASI simplifică securitatea atunci când treceți la o încorporare non-web dintr-un mediu de încorporare web.
Cuvinte finale
Portabilitatea și securitatea WebAssembly sunt două subiecte mari. În partea a 3-a a WebAssembly pentru începători, am încercat să o simplificăm și să o descompunem, în special pentru începători.
Apoi, puteți consulta fișele JavaScript pentru dezvoltatori și cursanți.