Jak działa przenośność i bezpieczeństwo WASM

Zapoznaj się z tym przewodnikiem dla początkujących, jak działają modele przenośności i zabezpieczeń WebAssembly (WASM).

Oba są zaawansowanymi tematami WebAssembly (WASM). Zalecamy przeczytanie poprzednich dwóch tematów w naszej serii WebAssembly dla początkujących.

Zacznijmy.

Przenośność WebAssembly

Przenośność WebAssembly sprawia, że ​​jest on gotowy do pracy w sieci. W rzeczywistości można zdefiniować WASM jako przenośną platformę piaskownicy.

Ponadto jego format binarny umożliwia wykonywanie w różnych architekturach zestawów instrukcji i systemach operacyjnych. Oznacza to, że możesz używać WASM nie tylko w sieci, ale także poza nią.

Aby zrozumieć przenośność WASM, omówimy następujące kwestie:

  • Środowisko lokalne, ograniczone i niedeterministyczne.
  • Specyficzne cechy środowiska wykonawczego
  • Przenośność WASM w sieci i poza nią

Lokalne, ograniczone i niedeterministyczne

WASM wymaga wydajnego wykonania i odpowiednich środowisk, które są lokalne, ograniczone i niedeterministyczne. Niedeterminizm to obliczenia, które określają, że algorytm/kompilator/środowisko generuje różne zachowania lub wyniki nawet dla tego samego wejścia. Jest przeciwieństwem algorytmu deterministycznego.

Dwa pozostałe aspekty, ograniczony i lokalny, są związane z wykonaniem niedeterministycznym. Aby wykonanie niedeterministyczne działało, potrzebujesz dobrze zdefiniowanych przypadków użycia, które są „ograniczone”.

Ponadto te egzekucje są „lokalne” i nie mają wpływu na środowisko. Przeczytaj ich oficjalny nondeterminism w dokumencie WebAssembly, aby dowiedzieć się więcej na ten temat.

Specyficzna charakterystyka środowiska wykonawczego

Aby WebAssembly był przenośny, zakłada się, że środowisko wykonawcze oferuje następujące cechy:

  • Adresowalność ziarnistości pamięci bajtów i 8-bitowe bajty.
  • 32-bitowe liczby całkowite ze znakiem uzupełnienia do dwóch. Opcjonalnie 64 bity.
  • Emulacja oprogramowania jest możliwa dzięki niewyrównanemu dostępowi do pamięci lub niezawodnemu pułapkowaniu.
  • Obsługa 32-bitowych i 64-bitowych zmiennoprzecinkowych zgodnie z definicją w IEEE 754-2008.
  • Gwarancja wykonania wszystkich wątków z postępem naprzód.
  • W przypadku dostępu 64-bitowego wasm64 powinien zapewniać operatorów pamięci atomowej bez blokad.
  • Operatory pamięci atomowej bez blokad obejmują dostępy 8, 16 i 32-bitowe.
  • wasm64 obsługuje pamięć liniową wyższą niż 4 GiB z 64-bitowymi indeksami lub wskaźnikami.
  • Porządkowanie bajtów metodą little-endian.

Wszystkie główne przeglądarki, w tym Chrome, Edge, Firefox i WebKit, obsługują wszystkie te wymagania środowiskowe.

Co więcej, WebAssembly ewoluuje w szybkim tempie. WASM Community Group i W3C WebAssembly Working Group pracują nad jego standaryzacją. Oznacza to, że każde z tych wymagań może ulec zmianie w przyszłości.

WASM Przenośność sieciowa i pozainternetowa

Głównym celem WebAssembly jest zapewnienie przenośności i natywnej wydajności w sieci Web i poza nią. W tej sekcji przyjrzymy się, jak WASM to osiąga.

# 1. Osadzanie w Internecie

WASM dobrze integruje się z ekosystemem internetowym, w tym z modelem bezpieczeństwa sieci, przenośnością sieci i interfejsami API sieci. Ponadto musi mieć wystarczająco dużo miejsca na kreatywny rozwój w przyszłości (przeczytaj WebAssembly dla początkujących – część 2, aby zrozumieć jego cele)

Jak zatem WASM osiąga kompatybilność z Internetem? Wykorzystuje interfejsy API JavaScript, umożliwiając programistom łatwe używanie JavaScript do kompilacji modułów WebAssembly. Zajmuje się również przechowywaniem i pobieraniem modułów kompilatora, zarządzaniem importem z modułów kompilatora, zarządzaniem pamięcią i tak dalej.

Aby dowiedzieć się więcej o tym, jak WASM osiąga wysoki poziom kompatybilności z Internetem, przeczytaj to: Web Embedding – WebAssembly.

#2. Osadzanie poza Internetem

Jak wspomniano wcześniej, WASM działa również w środowiskach innych niż sieciowe. Jako programista lub firma możesz tworzyć aplikacje o wysokiej wydajności lub pisać sekcje aplikacji, które wymagają dostrojenia wydajności. Można go na przykład używać na urządzeniach IoT, serwerach centrów danych oraz aplikacjach stacjonarnych/mobilnych.

Ponieważ aplikacje inne niż sieciowe nie mogą korzystać z internetowych interfejsów API, polegają na dynamicznym łączeniu WASM. Musisz także użyć testowania funkcji, procesu tworzenia oprogramowania, który testuje wiele odmian funkcji, aby zobaczyć, co jest najlepsze dla wygody użytkownika. Co więcej, programiści mogą używać maszyn wirtualnych JavaScript, aby uprościć osadzanie poza Internetem lub opracowywać bez nich swoje aplikacje.

Aby dowiedzieć się więcej, przeczytaj Osadzone elementy inne niż internetowe — WebAssembly.

Bezpieczeństwo WebAssembly

WebAssembly to rozwiązanie w formacie binarnym, które oferuje natywną wydajność. Działa świetnie w Internecie, ale można go również dostosować do osadzania innych niż internetowe. Dzięki temu WASM jest szeroko dostępny w ramach usług, rozwiązań i procesów. Oznacza to jednak więcej wyzwań związanych z bezpieczeństwem.

Wyzwania i zagrożenia bezpieczeństwa WASM

Mimo że WebAssembly jest uważane za bezpieczne i wydajne, wiąże się z wieloma zagrożeniami bezpieczeństwa, w tym:

  • Piaskownica WebAssembly
  • Zarządzanie pamięcią
  • Zaciemnianie kodu
  • Kontrole integralności

# 1. Piaskownica WebAssembly

WASM działa w przeglądarce internetowej, podobnie jak JavaScript. Wykorzystuje tę samą maszynę wirtualną (VM) co JavaScript. Piaskownica skutecznie zapewnia bezpieczne środowisko wykonawcze i utrudnia to, co działa pod maską.

Tak więc, jeśli kod JavaScript/WebAssembly zawiera złośliwy kod, trudno go wykryć, ponieważ jest to czarna skrzynka. Ponadto kod WASM jest w formacie binarnym gotowym do uruchomienia; działa szybciej, co utrudnia rozwiązaniom antywirusowym wyszukiwanie złośliwego kodu. Na przykład kod może zawierać niechciane reklamy lub możliwość przekierowania użytkowników na niechciane strony ze złośliwym oprogramowaniem.

Ponadto nadmierne poleganie WebAssembly na JavaScript podczas uruchamiania w Internecie oznacza również, że dziedziczy on luki w zabezpieczeniach JavaScript. Dlatego jako programista musisz przestrzegać środków ostrożności i środków bezpieczeństwa JavaScript podczas kodowania WASM.

#2. Zarządzanie pamięcią

Zarządzanie pamięcią w WASM jest trudne. Po pierwsze, nie uzyskuje bezpośredniego dostępu do pamięci fizycznej, ponieważ jest wykonywana w maszynie wirtualnej. Dlatego wykorzystuje pamięć hosta.

Po drugie, czyszczenie pamięci w WASM wymaga wyraźnego procesu, podczas gdy JavaScript czyści się sam.

Ponadto, gdy funkcja WASM zwraca dane wyjściowe do JavaScript, zwraca wskaźnik do pozycji w przydzielonej przestrzeni pamięci WASM. Tak więc, jeśli zadeklarowana pamięć zostanie zapełniona, program WASM może ulec awarii, rujnując wrażenia użytkownika. Aby temu zapobiec, programiści muszą używać środków dezynfekujących do debugowania kodu lub łańcuchów narzędzi, takich jak emscripten.

#3. Zaciemnianie kodu

Wykonywanie piaskownicy WASM sprawia, że ​​jego kod jest zaciemniony. Ponadto format binarny WASM również nie jest czytelny dla człowieka, co utrudnia inżynierię wsteczną, która jest niezbędna do zidentyfikowania złośliwego kodu.

To sprawia, że ​​kod WebAssembly jest trudny do debugowania ze względu na brak formatu czytelnego dla człowieka. Otwiera to wiele luk w zabezpieczeniach, w tym zdolność hakerów do ukrywania kodu, który kradnie poufne informacje lub wykonuje wstrzykiwanie kodu w celu przejęcia hosta.

#4. Kontrole integralności

Wszelkie dane przesyłane przez Internet są podatne na temperowanie danych. Na przykład hakerzy mogą przeprowadzić atak typu „man-in-the-middle” w celu zmiany wartości danych. Jest to problem dla WASM, biorąc pod uwagę, że nie ma odpowiedniego sposobu przeprowadzania kontroli integralności.

Może jednak współpracować z JavaScriptem w celu przeprowadzania kontroli integralności. Innym sposobem identyfikacji potencjalnych luk w kodzie WASM jest użycie narzędzi integracyjnych, takich jak Jit. Zapewnia, że ​​kod jest wolny od złych aktorów i nie może wpływać na aplikacje ani otaczającą infrastrukturę chmurową.

Zrozumienie modelu bezpieczeństwa WASM

WebAssembly poważnie traktuje bezpieczeństwo. Dlatego w oficjalnych dokumentach WASM wspomnieli, że ich model bezpieczeństwa dba o dwa ważne cele:

  • Upewnij się, że żadne wadliwe lub złośliwe moduły nie mają wpływu na użytkowników
  • Upewnij się, że programiści mogą ograniczyć wszelkie zagrożenia bezpieczeństwa i tworzyć bezpieczne aplikacje, zapewniając jednocześnie, że punkt 1 jest zawsze utrzymywany.
  • Model bezpieczeństwa WASM zakłada, że ​​aplikacje WebAssembly działają niezależnie, nie będąc w stanie uciec od środowiska piaskownicy. Jednak interfejsy API mogą otworzyć drogę do ataku na środowisko hosta.

    Inna technika odporna na błędy obejmuje deterministyczne uruchamianie aplikacji z ograniczonymi oczekiwaniami. Dzięki zapewnieniu obu warunków większość uruchomień aplikacji jest uważana za bezpieczną.

    Aby poprawić bezpieczeństwo, programiści powinni egzekwować zasady tego samego pochodzenia dla przepływu informacji. Jeśli tworzysz dla sieci innych niż Internet, musisz użyć modelu bezpieczeństwa POSIX. Jeśli chcesz przeczytać więcej o jego modelu bezpieczeństwa, sprawdź: Bezpieczeństwo – WebAssembly.

    Interfejs systemu WebAssembly (WASI)

    WASI (The WebAssembly System Interface) odgrywa również kluczową rolę w osadzeniu WASM poza siecią, ponieważ poprawia bezpieczeństwo. Jest to modułowy interfejs systemowy, który oferuje ekscytujące właściwości bezpieczeństwa i przenośność.

    W rzeczywistości jest teraz częścią karty podgrup interfejsu systemu WebAssembly, a zatem jest znormalizowany. Dzięki WASI, WASM jest szeroko stosowany w różnych obszarach przetwarzania brzegowego/serwerowego. Ponadto WASI upraszcza zabezpieczenia podczas przechodzenia do osadzania poza internetem ze środowiska osadzania w sieci.

    Ostatnie słowa

    Przenośność i bezpieczeństwo WebAssembly to dwa duże tematy. W części 3 WebAssembly dla początkujących staraliśmy się to uprościć i podzielić, szczególnie dla początkujących.

    Następnie możesz zapoznać się ze ściągawkami JavaScript dla programistów i uczniów.