Naukowcy z Uniwersytetu Stanforda, Uniwersytetu Kalifornijskiego w San Diego i Uniwersytetu Teksasu w Austin narzędzia , który może służyć jako dodatkowa warstwa izolacyjna do blokowania luk w bibliotekach funkcji. RLBox ma na celu rozwiązanie problemu bezpieczeństwa niezaufanych bibliotek stron trzecich, które nie są pod kontrolą programistów, ale których luki mogą zagrozić głównemu projektowi.
Firma Mozilla włącz RLBox w Linux-kompilacje Firefoksa 74 i macOS-Firefox 75 kompiluje się tak, aby izolować wykonywanie bibliotek , odpowiedzialny za renderowanie czcionek. Jednak RLBox nie jest specyficzny dla Firefoksa i może być używany do izolowania dowolnych bibliotek w dowolnych projektach. RLBox na licencji MIT. RLBox obecnie obsługuje platformy Linux и macOS, Pomoc Windows spodziewane później.
Praca RLBox sprowadza się do kompilacji kodu C/C++ izolowanej biblioteki do niskopoziomowego kodu pośredniego WebAssembly, który następnie projektowany jest jako moduł WebAssembly, którego uprawnienia są ustawiane w odniesieniu tylko do tego modułu (np. do przetwarzania ciągów znaków nie będzie mógł otworzyć gniazda sieciowego ani pliku). Konwersja kodu C/C++ na WebAssembly odbywa się za pomocą .
W celu bezpośredniego wykonania moduł WebAssembly jest kompilowany do kodu maszynowego za pomocą kompilatora i działa w oddzielnym „nanoprocesie” odizolowanym od reszty pamięci aplikacji. Kompilator Lucet opiera się na tym samym kodzie, co silnik JIT , używany w przeglądarce Firefox do wykonywania zestawu WebAssembly.
Zmontowany moduł pracuje w wydzielonym obszarze pamięci i nie ma dostępu do reszty przestrzeni adresowej. W przypadku wykorzystania luki w bibliotece atakujący będzie ograniczony i nie będzie mógł uzyskać dostępu do obszarów pamięci głównego procesu ani przenieść kontroli poza izolowane środowisko.
Informacje wysokiego poziomu są udostępniane programistom , co umożliwia wywoływanie funkcji bibliotecznych w trybie izolacji. Procedury obsługi WebAssembly nie wymagają prawie żadnych dodatkowych zasobów, a interakcja z nimi nie jest dużo wolniejsza niż wywoływanie zwykłych funkcji (funkcje biblioteczne wykonywane są w postaci natywnego kodu, a koszty ogólne powstają tylko podczas kopiowania i sprawdzania danych podczas interakcji z izolowanym środowiskiem). Izolowanych funkcji bibliotecznych nie można wywoływać bezpośrednio i należy uzyskać do nich dostęp za pomocą
warstwa invoke_sandbox_function().
Z kolei w przypadku konieczności wywołania funkcji zewnętrznych z biblioteki należy te funkcje jawnie zdefiniować przy pomocy metody rejestru_callback (domyślnie RLBox zapewnia dostęp do funkcji ). Aby zapewnić bezpieczeństwo pamięci, izolacja wykonania kodu nie wystarczy i wymaga także sprawdzania zwracanych strumieni danych.
Wartości wygenerowane w izolowanym środowisku są oznaczane jako niegodne zaufania i ograniczone w użyciu i do „czyszczenia”, którego potrzebują i kopiowanie do pamięci aplikacji.
Bez czyszczenia próba użycia skażonych danych w kontekście wymagającym zwykłych danych (i odwrotnie) powoduje wygenerowanie błędów w czasie kompilacji. Małe argumenty funkcji, wartości zwracane i struktury są przekazywane poprzez kopiowanie między pamięcią procesu a pamięcią piaskownicy. W przypadku dużych zestawów danych pamięć jest przydzielana w izolowanym środowisku, a bezpośredni wskaźnik odniesienia do piaskownicy jest zwracany do głównego procesu.
Źródło: opennet.ru
