Poznaj nasz przewodnik dla nowicjuszy, który wyjaśnia, jak działają mechanizmy przenośności i ochrony w WebAssembly (WASM).
Obydwa zagadnienia są zaawansowane w kontekście WebAssembly (WASM). Rekomendujemy zapoznanie się z dwoma poprzednimi artykułami z naszego cyklu dla początkujących.
Przejdźmy do sedna.
Przenośność WebAssembly
Przenośność WebAssembly jest kluczowa dla jego zdolności do działania w środowisku sieciowym. Można śmiało stwierdzić, że WASM to przenośna platforma działająca w piaskownicy.
Co więcej, jego binarny format umożliwia uruchamianie na rozmaitych architekturach procesorów oraz systemach operacyjnych. To sprawia, że WASM znajduje zastosowanie nie tylko w przeglądarkach internetowych, ale także poza nimi.
Aby lepiej zrozumieć przenośność WASM, omówimy następujące aspekty:
- Lokalność, ograniczenia i niedeterministyczny charakter środowiska.
- Specyficzne właściwości środowiska wykonawczego.
- Zastosowanie WASM w sieci i poza nią.
Lokalność, Ograniczenia i Niedeterminizm
WASM wymaga efektywnego wykonania w środowiskach, które charakteryzują się lokalnością, ograniczeniami i niedeterminizmem. Niedeterminizm w informatyce odnosi się do sytuacji, w której algorytm, kompilator lub środowisko generuje różne wyniki lub zachowania, nawet przy tych samych danych wejściowych. Jest to przeciwieństwo algorytmów deterministycznych.
Dwa pozostałe aspekty, czyli ograniczenia i lokalność, są powiązane z niedeterministycznym wykonaniem. Aby niedeterministyczne wykonanie działało poprawnie, wymagane są jasno zdefiniowane scenariusze użycia, które są „ograniczone”.
Dodatkowo, te procesy są „lokalne” i nie wywierają wpływu na otoczenie. Więcej informacji na temat niedeterminizmu znajdziesz w oficjalnej dokumentacji WebAssembly.
Specyficzne Cechy Środowiska Wykonawczego
Aby zapewnić przenośność, WebAssembly wymaga od środowiska wykonawczego spełnienia określonych warunków:
- Możliwość adresowania pamięci z dokładnością do bajta oraz 8-bitowe bajty.
- 32-bitowe liczby całkowite ze znakiem w kodzie uzupełnień do dwóch. Opcjonalnie 64 bity.
- Emulacja oprogramowania jest możliwa dzięki nieregularnemu dostępowi do pamięci lub niezawodnemu mechanizmowi pułapkowania.
- Obsługa liczb zmiennoprzecinkowych 32-bitowych i 64-bitowych zgodnie z definicją w standardzie IEEE 754-2008.
- Gwarancja, że wszystkie wątki wykonują się w sposób postępujący.
- Dla dostępu 64-bitowego, wasm64 musi zapewniać operacje pamięci atomowej bez blokad.
- Operacje pamięci atomowej bez blokad obejmują dostęp 8, 16 i 32-bitowy.
- wasm64 obsługuje pamięć liniową większą niż 4 GiB z wykorzystaniem 64-bitowych indeksów lub wskaźników.
- Kolejność bajtów w formacie little-endian.
Wszystkie wiodące przeglądarki, takie jak Chrome, Edge, Firefox i WebKit, wspierają te wymagania środowiskowe.
Ponadto WebAssembly jest w ciągłym rozwoju. Grupa WASM Community oraz Grupa Robocza W3C WebAssembly pracują nad jego standaryzacją. To oznacza, że te wymagania mogą ulec zmianie w przyszłości.
Przenośność WASM w Sieci i Poza Nią
Głównym założeniem WebAssembly jest zapewnienie przenośności i wydajności zbliżonej do natywnej, zarówno w przeglądarkach internetowych, jak i w innych środowiskach. Poniżej zobaczymy, jak WASM osiąga te cele.
#1. Integracja z Siecią
WASM bardzo dobrze współgra z ekosystemem internetowym, włączając w to model zabezpieczeń przeglądarek, przenośność oraz API. Dodatkowo, musi zapewniać przestrzeń dla przyszłego, innowacyjnego rozwoju (przeczytaj WebAssembly dla początkujących – część 2, aby zrozumieć jego założenia).
W jaki sposób WASM osiąga kompatybilność z internetem? Wykorzystuje interfejsy JavaScript API, co umożliwia programistom łatwe używanie JavaScript do kompilacji modułów WebAssembly. Zajmuje się również procesem przechowywania, pobierania modułów kompilatora, zarządzaniem importem z modułów, zarządzaniem pamięcią i innymi aspektami.
Aby dowiedzieć się więcej o tym, jak WASM osiąga wysoki poziom kompatybilności z przeglądarkami, przeczytaj: Osadzanie w Internecie – WebAssembly.
#2. Osadzanie Poza Siecią
Jak wspomnieliśmy wcześniej, WASM może również działać w środowiskach innych niż przeglądarki internetowe. Jako programista lub firma możesz tworzyć aplikacje o wysokiej wydajności lub pisać fragmenty kodu wymagające optymalizacji wydajności. Może być wykorzystywany na urządzeniach IoT, serwerach w centrach danych oraz aplikacjach na komputery stacjonarne i urządzenia mobilne.
Ponieważ aplikacje działające poza siecią nie mogą korzystać z internetowych interfejsów API, polegają na dynamicznym łączeniu WASM. Musisz również użyć testowania funkcji, czyli procesu rozwoju oprogramowania, który testuje wiele wariantów funkcji, aby znaleźć najlepszą opcję dla użytkownika. Dodatkowo, programiści mogą używać maszyn wirtualnych JavaScript, aby ułatwić osadzanie poza siecią lub tworzyć aplikacje bez nich.
Więcej informacji można znaleźć w publikacji: Elementy osadzane poza internetem – WebAssembly.
Bezpieczeństwo WebAssembly
WebAssembly jest binarnym rozwiązaniem, które oferuje wydajność zbliżoną do kodu natywnego. Świetnie sprawdza się w internecie, ale można go również dostosować do osadzania w środowiskach nieinternetowych. Dzięki temu WASM jest powszechnie wykorzystywany w różnych usługach, rozwiązaniach i procesach. To jednak wiąże się z większymi wyzwaniami w zakresie bezpieczeństwa.
Wyzwania i Zagrożenia Bezpieczeństwa WASM
Chociaż WebAssembly jest uważany za bezpieczny i wydajny, wiąże się z pewnymi zagrożeniami, takimi jak:
- Piaskownica WebAssembly
- Zarządzanie pamięcią
- Zaciemnianie kodu
- Kontrola integralności
#1. Piaskownica WebAssembly
WASM, tak jak JavaScript, działa w przeglądarce wewnątrz piaskownicy. Korzysta z tej samej maszyny wirtualnej (VM) co JavaScript. Piaskownica skutecznie zapewnia bezpieczne środowisko wykonawcze, utrudniając wgląd w to, co dzieje się pod spodem.
W związku z tym, jeśli kod JavaScript/WebAssembly zawiera szkodliwy kod, trudno go wykryć, ponieważ jest on „czarną skrzynką”. Co więcej, kod WASM ma binarną formę, gotową do uruchomienia, co przyspiesza jego działanie i utrudnia wykrycie szkodliwego kodu przez programy antywirusowe. Na przykład kod może wyświetlać niechciane reklamy lub przekierowywać użytkowników na niebezpieczne strony.
Ponadto, nadmierne uzależnienie WebAssembly od JavaScript podczas działania w przeglądarkach oznacza, że dziedziczy on jego luki w zabezpieczeniach. Dlatego jako programista musisz stosować się do środków ostrożności i zasad bezpieczeństwa JavaScript podczas pisania kodu WASM.
#2. Zarządzanie Pamięcią
Zarządzanie pamięcią w WASM jest złożone. Po pierwsze, nie ma on bezpośredniego dostępu do fizycznej pamięci, ponieważ działa w maszynie wirtualnej. Dlatego korzysta z pamięci hosta.
Po drugie, zwalnianie pamięci w WASM wymaga explicitnego procesu, podczas gdy JavaScript wykonuje to automatycznie.
Ponadto, gdy funkcja WASM zwraca dane do JavaScript, zwraca wskaźnik do miejsca w przestrzeni pamięci WASM. Jeśli więc zadeklarowana pamięć zostanie zapełniona, program WASM może się zawiesić, co negatywnie wpłynie na komfort użytkownika. Aby temu zapobiec, programiści powinni korzystać z narzędzi do debugowania kodu lub łańcuchów narzędzi takich jak Emscripten.
#3. Zaciemnianie Kodu
Piaskownica WASM sprawia, że kod jest zaciemniony. Dodatkowo, binarny format WASM sprawia, że nie jest on czytelny dla człowieka, co utrudnia inżynierię wsteczną, potrzebną do zidentyfikowania złośliwego kodu.
To sprawia, że debugowanie kodu WebAssembly jest trudne ze względu na brak czytelnego formatu. Stwarza to wiele luk w zabezpieczeniach, w tym możliwość ukrywania kodu, który kradnie poufne informacje lub przeprowadza wstrzykiwanie kodu, aby przejąć kontrolę nad hostem.
#4. Kontrole Integralności
Wszystkie dane przesyłane przez internet są podatne na manipulacje. Przykładowo, hakerzy mogą przeprowadzić atak „man-in-the-middle” w celu zmiany wartości danych. Jest to problem dla WASM, ponieważ nie ma on wbudowanego mechanizmu przeprowadzania kontroli integralności.
Może jednak współpracować z JavaScript w celu weryfikacji integralności. Innym sposobem na wykrycie potencjalnych luk w kodzie WASM jest wykorzystanie narzędzi integracyjnych takich jak Jit. Pozwala to upewnić się, że kod jest wolny od złośliwych elementów i nie zagraża aplikacji ani infrastrukturze chmurowej.
Zrozumienie Modelu Bezpieczeństwa WASM
WebAssembly poważnie traktuje kwestie bezpieczeństwa. W oficjalnej dokumentacji WASM wspomniano, że ich model bezpieczeństwa ma dwa główne cele:
- Zapewnienie, że wadliwe lub złośliwe moduły nie będą wpływać na użytkowników.
- Zapewnienie programistom możliwości ograniczenia zagrożeń bezpieczeństwa i tworzenia bezpiecznych aplikacji przy jednoczesnym zachowaniu warunku z punktu pierwszego.
Model bezpieczeństwa WASM zakłada, że aplikacje WebAssembly działają niezależnie, nie mogąc wyjść poza środowisko piaskownicy. Jednak interfejsy API mogą otworzyć furtkę do ataku na środowisko hosta.
Kolejna technika to deterministyczne uruchamianie aplikacji z ograniczonymi uprawnieniami. Dzięki zapewnieniu obu warunków większość uruchomień aplikacji jest uważana za bezpieczną.
Aby zwiększyć bezpieczeństwo, programiści powinni stosować zasadę tego samego pochodzenia dla przepływu informacji. Jeśli tworzysz aplikacje działające poza przeglądarką, musisz zastosować model zabezpieczeń POSIX. Więcej na temat modelu bezpieczeństwa można przeczytać w dokumentacji: Bezpieczeństwo – WebAssembly.
Interfejs Systemowy WebAssembly (WASI)
WASI (WebAssembly System Interface) odgrywa istotną rolę w osadzaniu WASM poza przeglądarkami, ponieważ podnosi poziom bezpieczeństwa. Jest to modułowy interfejs systemowy oferujący ciekawe funkcje bezpieczeństwa i przenośność.
Obecnie jest częścią grupy interfejsu systemu WebAssembly, a więc jest standaryzowany. Dzięki WASI, WASM jest szeroko wykorzystywany w różnych obszarach przetwarzania brzegowego i serwerowego. Co więcej, WASI upraszcza zabezpieczenia podczas przechodzenia z osadzania w środowiskach sieciowych do nieinternetowych.
Podsumowanie
Przenośność i bezpieczeństwo WebAssembly to dwa obszerne tematy. W trzeciej części cyklu „WebAssembly dla początkujących” staraliśmy się je uprościć i rozłożyć na czynniki pierwsze, zwłaszcza z myślą o osobach początkujących.
Następnie możesz zapoznać się ze ściągawkami JavaScript dla programistów i osób uczących się.