Google zaprezentował ostatnio poprzez publikację lWłączenie języka programowania Rust wśród języków dozwolonych w kodzie projektu Chromium.
Wspomniano, że w celu włączenia istnieje szereg wymagań na przykład w przypadku bibliotek Rust innych firm, które żądają integracji z bazą kodu Chromium, biblioteka musi przewyższać swoich rówieśników pod względem szybkości, zużycia pamięci i stabilności lub być jedyną implementacją danej technologii.
Biblioteki Rust są również akceptowalne, gdy funkcjonalność może być wykonywana w uprzywilejowanym procesie lub gdy użycie biblioteki zmniejsza ryzyko błędów w porównaniu z innymi bibliotekami lub kodem C++. Nie zdecydowano jeszcze, które biblioteki mogą zostać uwzględnione w Chromium.
Decyzja została podjęta w ramach inicjatywy mającej na celu zapobieganie pojawianiu się błędów pamięci w bazie kodu Chrome. Według statystyk przedstawionych dwa lata temu, 70% krytycznych i niebezpiecznych problemów bezpieczeństwa w Chromium wynika z błędów pamięci.
Wykorzystanie języka Rust, który koncentruje się na bezpiecznym zarządzaniu pamięcią i zapewnia automatyczne zarządzanie pamięcią, zmniejszy ryzyko podatności spowodowane problemami takimi jak dostęp do obszaru pamięci po jego zwolnieniu i przepełnienie bufora.
Bezpieczna obsługa pamięci w Rust jest zapewniona w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektu i czasu życia obiektu (zakres), a także ocenę dostępu do pamięci pod kątem poprawności podczas wykonywania kodu. Rust zapewnia również ochronę przed przepełnieniem liczb całkowitych, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej radzi sobie z błędami w standardowej bibliotece, domyślnie wymusza koncepcję niezmiennych odniesień i zmiennych, oferuje silne typowanie statyczne w celu zminimalizowania błędów logicznych.
Korzystanie z Rusta ułatwi i zwiększy bezpieczeństwo stosowania „zasady działania”, której Google używa do zapewnienia bezpieczeństwa swojej bazy kodu.
Zgodnie z tą zasadą każdy dodany kod nie może spełniać więcej niż dwóch z trzech warunków: pracować z niezweryfikowanymi danymi wejściowymi, używać niebezpiecznego języka programowania (C/C++) i uruchamiać z podwyższonymi uprawnieniami. Z zasady tej wynika, że kod obsługujący dane zewnętrzne musi być sprowadzony do najmniejszych uprawnień (wyizolowany) lub napisany w bezpiecznym języku programowania.
W przypadku Rusta, który został pierwotnie opracowany z myślą o przeglądarce, integracja z istniejącym kodem może być przeprowadzona bez użycia IPC i przy mniejszej złożoności w celu zorganizowania ochrony przed błędami pamięci, co przyspieszy proces programowania (wymaga pisania mniejszej ilości kodu i łatwiejsza weryfikacja) oraz zmniejszenie liczby błędów związanych z bezpieczeństwem.
Aby uprościć integrację Zaktualizuj kod za pomocą istniejącego kodu C++ i unikaj obecnie ryzyka i ograniczeń związanych z integracją postanowiono ograniczyć jednokierunkową interakcję: wywoływanie Rusta z C++ (tj. kod Rusta można wywołać tylko z kodu C++) za pośrednictwem funkcji API, ale nie mieszać z kodem C++), co również utrzyma drzewo zależności pod kontrolą.
Drugim ograniczeniem jest obsługa tylko bibliotek innych firm, które są dostarczane w postaci oddzielnych komponentów, które nie są powiązane z Chromium i mają interfejs API zorientowany na zadania.
Oprócz używania Rusta do blokowania exploitów wykorzystujących luki w zabezpieczeniach pamięci typu use-after-free, począwszy od wydania Chrome 102, kod C++ zaczął zamiast tego używać typu MiraclePtr (raw_ptr). obszary pamięci i bloki, jeśli takie dostępy zostaną znalezione.
Szacuje się, że wpływ nowej metody ochrony na wydajność i zużycie pamięci jest znikomy.
Na koniec należy o tym wspomnieć nie ma jeszcze planów przepisania istniejącego kodu w Rust, ale od teraz zewnętrzne biblioteki napisane w Rust będą mogły być integrowane z bazą kodu.
System kompilacji dodał już narzędzia do kompilacji kodu Rust, uruchamiania testów i integracji komponentów Rust z kodem C++. Oczekuje się, że kod Rust pojawi się jako część wydań Chrome w przyszłym roku.
źródło: https://security.googleblog.com