V tomto průvodci pro nováčky se podíváme, jak fungují mechanismy přenositelnosti a zabezpečení technologie WebAssembly (WASM).
Obě tyto oblasti představují pokročilejší témata spojená s WebAssembly (WASM). Doporučujeme, abyste se seznámili s předchozími dvěma články z našeho seriálu o WebAssembly pro začátečníky.
Pojďme tedy na to.
Přenositelnost WebAssembly
Díky své přenositelnosti je WebAssembly skvěle připraven pro webové prostředí. WASM lze vlastně charakterizovat jako přenositelnou platformu s izolovaným prostředím (sandbox).
Navíc, díky binárnímu formátu je možné spouštění na různých architekturách instrukčních sad a operačních systémech. To znamená, že WASM se dá využít nejen v rámci webových prohlížečů, ale i v jiných prostředích.
Pro lepší pochopení přenositelnosti WASM se zaměříme na následující aspekty:
- Lokální, omezené a nedeterministické prostředí.
- Specifické charakteristiky prováděcího prostředí
- Přenositelnost WASM ve webovém i newebovém kontextu
Lokální, omezené a nedeterministické
WASM vyžaduje pro efektivní provádění prostředí, která jsou lokální, omezená a nedeterministická. Nedeterminismus v tomto kontextu znamená, že algoritmus, kompilátor nebo prostředí mohou generovat odlišné chování nebo výsledky, a to i pro stejný vstup. Je to tedy opak deterministického algoritmu.
Další dva aspekty, omezenost a lokálnost, jsou propojeny s nedeterministickým prováděním. Aby nedeterministické spouštění fungovalo, jsou nutné jasně definované případy použití, které jsou „omezené“.
Tato spouštění jsou také „lokální“, což znamená, že nemají vliv mimo dané prostředí. Více informací o nedeterminismu si můžete přečíst v oficiální dokumentaci WebAssembly.
Specifické charakteristiky prováděcího prostředí
Pro zajištění přenositelnosti WebAssembly se předpokládá, že prováděcí prostředí bude splňovat následující:
- Adresovatelnost paměti na úrovni jednotlivých bajtů, s 8bitovými bajty.
- Podpora 32bitových celých čísel se znaménkem. Volitelně i 64bitových.
- Možnost softwarové emulace pro nezarovnané přístupy do paměti nebo spolehlivé zachytávání.
- Podpora 32bitových a 64bitových čísel s plovoucí desetinnou čárkou podle standardu IEEE 754-2008.
- Zaručení, že všechna vlákna budou postupovat vpřed.
- Pro 64bitový přístup by wasm64 měl podporovat atomické paměťové operace bez zámku.
- Tyto atomické paměťové operace bez zámku zahrnují přístupy o velikostech 8, 16 a 32 bitů.
- wasm64 podporuje lineární paměť o velikosti větší než 4 GiB s 64bitovými indexy nebo ukazateli.
- Uspořádání bajtů je little-endian.
Všechny hlavní prohlížeče, včetně Chrome, Edge, Firefox a WebKit, tyto požadavky na prostředí splňují.
Navíc, WebAssembly se neustále vyvíjí. Skupina WASM Community Group a pracovní skupina W3C WebAssembly pracují na jeho standardizaci. To znamená, že se některé z těchto požadavků mohou v budoucnu změnit.
Přenositelnost WASM ve webovém i newebovém kontextu
Primárním cílem WebAssembly je nabídnout přenositelnost a výkon srovnatelný s nativním kódem, a to jak ve webovém, tak i v jiných prostředích. V této části se podíváme, jak WASM tohoto cíle dosahuje.
#1. Integrace ve webovém prostředí
WASM se dobře začleňuje do webového ekosystému, zahrnujícího webový bezpečnostní model, přenositelnost a webová API. Má také dostatečný prostor pro kreativní rozvoj (pro pochopení jeho cílů si přečtěte článek WebAssembly pro začátečníky – část 2).
Jak tedy WASM dosahuje kompatibility s webovým prostředím? Využívá JavaScript API, což umožňuje vývojářům snadno používat JavaScript pro kompilaci modulů WebAssembly. Dále zajišťuje ukládání a načítání modulů kompilátoru, správu importů z modulů kompilátoru, správu paměti a další.
Chcete-li se dozvědět více o tom, jak WASM dosahuje vysoké úrovně webové kompatibility, podívejte se na: Web Embedding – WebAssembly.
#2. Integrace v newebových prostředích
Jak již bylo zmíněno, WASM funguje i v prostředích mimo webový prohlížeč. Vývojáři nebo firmy mohou vytvářet vysoce výkonné aplikace nebo psát části aplikací, které vyžadují optimalizaci výkonu. Lze jej použít například v zařízeních IoT, serverech datových center a v aplikacích pro stolní počítače či mobilní zařízení.
Protože aplikace mimo webové prohlížeče nemohou využívat webová API, spoléhají se na dynamické propojení WASM. Je také nutné provádět testování funkcí, což je proces vývoje softwaru, který testuje různé varianty funkcí, aby zjistil, co je pro uživatele nejlepší. Kromě toho mohou vývojáři využívat virtuální stroje s JavaScriptem pro zjednodušení newebového vkládání, případně vyvíjet aplikace i bez něj.
Více se dozvíte na Newebové vkládání – WebAssembly.
Zabezpečení WebAssembly
WebAssembly je řešení v binárním formátu, které nabízí výkon srovnatelný s nativním kódem. Je velmi efektivní ve webovém prostředí, ale lze jej přizpůsobit i pro použití v jiných prostředích. Díky tomu je WASM široce dostupný v různých službách, řešeních a procesech. To ale také přináší nové výzvy v oblasti zabezpečení.
Bezpečnostní výzvy a rizika WASM
I když je WebAssembly považován za bezpečný a efektivní, existuje několik bezpečnostních rizik, která je nutné brát v úvahu, včetně:
- Izolované prostředí (sandbox) WebAssembly
- Správa paměti
- Zatemňování kódu
- Kontroly integrity
#1. Izolované prostředí (sandbox) WebAssembly
WASM se spouští ve webovém prohlížeči, podobně jako JavaScript. Využívá stejný virtuální stroj (VM) jako JavaScript. Sandbox efektivně poskytuje bezpečné prostředí pro provádění a brání tomu, aby se to, co se děje pod pokličkou, dostalo ven.
Pokud tedy kód JavaScriptu nebo WebAssembly obsahuje škodlivý kód, je těžké ho odhalit, protože se jedná o černou skříňku. Kód WASM je navíc v binárním formátu připraveném ke spuštění; běží rychleji, takže antivirová řešení mají ztíženou detekci škodlivého kódu. Kód může například obsahovat nevyžádané reklamy nebo možnost přesměrovat uživatele na stránky s malwarem.
Navíc přílišné spoléhání WebAssembly na JavaScript v rámci webového prostředí také znamená, že zdědí jeho zranitelnosti. Proto by vývojáři měli při kódování WASM dodržovat stejná bezpečnostní opatření jako u JavaScriptu.
#2. Správa paměti
Správa paměti ve WASM je komplexní. Za prvé, nemá přímý přístup k fyzické paměti, protože se spouští ve virtuálním stroji. Proto využívá paměť hostitelského počítače.
Za druhé, uvolňování paměti ve WASM vyžaduje explicitní proces, zatímco JavaScript se v porovnání s tím uvolňuje automaticky.
Navíc, když funkce WASM vrací výstup do JavaScriptu, vrací ukazatel na pozici v rámci alokované paměti WASM. Pokud se tedy přidělená paměť zaplní, program WASM může selhat a negativně tak ovlivnit uživatelský zážitek. Aby tomu vývojáři předešli, potřebují pro odladění kódu používat dezinfekční prostředky nebo nástroje jako je emscripten.
#3. Zatemňování kódu
Díky sandboxovému provádění WASM je jeho kód těžko čitelný. Binární formát WASM je navíc také nečitelný pro člověka, což ztěžuje zpětné inženýrství, které je nezbytné pro identifikaci škodlivého kódu.
Kvůli tomu je ladění kódu WebAssembly obtížné, protože chybí formát čitelný pro člověka. To otevírá dveře mnoha bezpečnostním mezerám, včetně možnosti hackerů skrývat kód, který krade citlivé informace nebo provádí vkládání kódu za účelem převzetí hostitelského počítače.
#4. Kontroly integrity
Všechna data přenášená přes web jsou zranitelná vůči úpravám. Hackeři mohou například provést útok typu „man-in-the-middle“ za účelem změny datových hodnot. Pro WASM je to problém, protože nemá standardní mechanismus pro provádění kontrol integrity.
Může však při provádění kontrol integrity spolupracovat s JavaScriptem. Dalším způsobem, jak identifikovat potenciální zranitelnosti kódu WASM, je použití integračních nástrojů jako je Jit. To zajistí, že kód neobsahuje škodlivé prvky a nemůže ovlivnit aplikace nebo okolní cloudovou infrastrukturu.
Pochopení bezpečnostního modelu WASM
WebAssembly bere zabezpečení velmi vážně. Proto v oficiální dokumentaci WASM uvádí, že jejich bezpečnostní model sleduje dva důležité cíle:
Bezpečnostní model WASM zohledňuje, že aplikace WebAssembly se spouštějí nezávisle, aniž by mohly uniknout ze svého izolovaného prostředí. API však mohou otevřít cestu k útoku na hostitelské prostředí.
Další technikou pro odolnost vůči chybám je deterministické spouštění aplikací s jasnými omezeními. Díky zajištění těchto dvou podmínek se většina spouštění aplikací považuje za bezpečnou.
Pro posílení zabezpečení by vývojáři měli dodržovat zásadu stejného původu pro tok informací. Při vývoji pro prostředí mimo web je nutné používat bezpečnostní model POSIX. Pokud se chcete dozvědět více o bezpečnostním modelu WASM, přečtěte si Zabezpečení – WebAssembly.
Systémové rozhraní WebAssembly (WASI)
WASI (WebAssembly System Interface) také hraje zásadní roli při newebovém začleňování WASM, protože zlepšuje zabezpečení. Jedná se o modulární systémové rozhraní, které nabízí zajímavé bezpečnostní vlastnosti a přenositelnost.
Ve skutečnosti je nyní součástí podskupiny WebAssembly System Interface Subgroup Charter, a proto je standardizováno. Díky WASI je WASM široce využitelný v různých okrajových/serverových prostředích. WASI také zjednodušuje zabezpečení při přechodu z webového do newebového prostředí.
Závěrem
Přenositelnost a zabezpečení WebAssembly jsou dvě rozsáhlá témata. Ve třetí části seriálu WebAssembly pro začátečníky jsme se je snažili zjednodušit a rozebrat, zejména pro začínající vývojáře.
Dále si můžete prohlédnout taháky JavaScriptu pro vývojáře a studenty.