Badacze z Uniwersytetu Stanforda, Uniwersytetu Kalifornijskiego w San Diego i Uniwersytetu Teksaskiego w Austin narzędzia , który może być stosowany jako dodatkowy poziom izolacji w celu blokowania luk w bibliotekach funkcji. RLBox ma na celu rozwiązanie problemu z bezpieczeństwem niegodnych zaufania zewnętrznych bibliotek, które nie są kontrolowane przez programistów, ale luki w nich mogą skompromitować główny projekt.
Firma Mozilla wdrożyć RLBox w wersjach Linux Firefox 74 oraz macOS Firefox 75 w celu izolacji wykonania biblioteki , odpowiedzialnej za renderowanie czcionek. RLBox nie jest specyficzny dla Firefox i może być stosowany do izolacji dowolnych bibliotek w różnych projektach. RLBox na licencji MIT. Obecnie RLBox działa na platformach Linux i macOS, wsparcie dla Windows przewidywane jest w późniejszym terminie.
działanie RLBox polega na kompilacji kodu C/C++ z izolowanej biblioteki do niskopoziomowego kodu pośredniego WebAssembly, który następnie jest przekształcany w moduł WebAssembly, którego uprawnienia są ograniczone tylko do tego modułu (na przykład biblioteka do przetwarzania łańcuchów nie będzie mogła otworzyć gniazda sieciowego ani pliku). Transformacja kodu C/C++ do WebAssembly odbywa się za pomocą .
Aby wykonać moduł WebAssembly, jest on kompilowany do kodu maszynowego za pomocą kompilatora i jest wykonywany w oddzielnym "nanoprocesie", izolowanym od reszty pamięci aplikacji. Kompilator Lucet oparty jest na tym samym kodzie, co silnik JIT , stosowanym w Firefox do wykonywania WebAssembly.
Zbudowany moduł działa w oddzielnym obszarze pamięci i nie ma dostępu do reszty przestrzeni adresowej. W przypadku wykorzystania luki w bibliotece napastnik będzie ograniczony i nie będzie mógł uzyskać dostępu do obszarów pamięci głównego procesu ani przekazać kontroli poza izolowane środowisko.
Dla programistów dostępny jest wyspecjalizowany , który umożliwia wywoływanie funkcji biblioteki w trybie izolacji. WebAssembly-handlerzy prawie nie wymagają dodatkowych zasobów, a interakcja z nimi nie jest znacznie wolniejsza niż wywołanie zwykłych funkcji (funkcje biblioteki są wykonywane w formie kodu natywnego, a dodatkowe koszty pojawiają się jedynie podczas kopiowania i sprawdzania danych w trakcie interakcji z izolowanym środowiskiem). Funkcje izolowanej biblioteki nie mogą być wywoływane bezpośrednio, a ich użycie wymaga zastosowania
pośrednika invoke_sandbox_function().
Z kolei, jeśli z biblioteki trzeba wywołać zewnętrzne funkcje, te funkcje muszą być wyraźnie zdefiniowane za pomocą metody register_callback (domyślnie RLBox udostępnia dostęp do funkcji ). Aby zapewnić bezpieczną obsługę pamięci (memory safety), izolacja wykonywanego kodu nie wystarcza, a konieczne jest również zapewnienie weryfikacji zwracanych strumieni danych.
Wartości utworzone w izolowanym środowisku są oznaczane jako niewiarygodne, ograniczane za pomocą i wymagają oraz kopiowania do pamięci aplikacji.
Bez oczyszczenia, próba użycia danych tainted w kontekście wymagającym zwykłych danych (i odwrotnie) prowadzi do generowania błędów na etapie kompilacji. Małe argumenty funkcji, zwracane wartości i struktury są przekazywane przez kopiowanie pomiędzy pamięcią procesu a pamięcią izolowanego środowiska. Dla dużych zestawów danych pamięć jest alokowana w izolowanym środowisku, a głównemu procesowi zwraca się bezpośredni wskaźnik "sandbox-reference".
Źródło: opennet.ru
