Krytyczna luka w Wasmtime, środowisku wykonawczym aplikacji WebAssembly

Aktualizacje naprawcze Wasmtime 6.0.1, 5.0.1 i 4.0.1 naprawiły lukę (CVE-2023-26489), której przypisano krytyczny poziom zagrożenia. Luka umożliwia zapisanie danych w obszarze pamięci poza granicami dozwolonymi dla izolowanego kodu WebAssembly, który może zostać potencjalnie wykorzystany przez osobę atakującą do wykonania kodu poza izolowanym środowiskiem WASI.

Wasmtime to środowisko wykonawcze służące do uruchamiania aplikacji WebAssembly z rozszerzeniami WASI (WebAssembly System Interface) jako zwykłych, samodzielnych aplikacji. Zestaw narzędzi napisany jest w języku Rust, a przyczyną luki jest błąd logiczny w zdefiniowaniu reguł liniowego adresowania pamięci w generatorze kodu Cranelift, który tłumaczy pośrednią reprezentację niezależną od architektur sprzętowych na wykonywalny kod maszynowy dla architektury x86_64.

W szczególności dla aplikacji WebAssembly obliczono 35-bitowe adresy efektywne zamiast 33-bitowych adresów dozwolonych w WebAssembly, co przesunęło limit pamięci wirtualnej dozwolonej dla operacji odczytu i zapisu do 34 GB, zaś ustawienia środowiska piaskownicy zapewniają ochronę dla 6 GB z adresu bazowego. Dzięki temu do odczytu i zapisu z aplikacji WebAssembly dostępny był zakres pamięci wirtualnej od 6 do 34 GB z adresu bazowego. Ta pamięć może obsługiwać inne środowiska WebAssembly lub komponenty wykonawcze WebAssembly.

Jeśli nie jest możliwa aktualizacja wersji Wasmtime, obejściem problemu zablokowania błędu jest określenie opcji „Config::static_memory_maximum_size(0)”, aby włączyć oddzielne sprawdzanie granic dla wszystkich liniowych dostępów do pamięci (co powoduje znaczny spadek wydajności) . Inną opcją jest użycie ustawienia „Config::static_memory_guard_size(1 < 36)” w celu zwiększenia liczby stron ochronnych (wyjątek zgłaszany podczas dostępu) umieszczonych w problematycznym obszarze pamięci wirtualnej (co skutkuje rezerwacją dużej ilości pamięci wirtualnej i ograniczenie liczby jednocześnie uruchomionych aplikacji WebAssembly).

Źródło: opennet.ru

Dodaj komentarz