Rust jest jednym z głównych języków rozwoju platformy Android

Google ogłosił włączenie języka programowania Rust do grona języków dozwolonych przy tworzeniu platformy Android. Kompilator języka Rust został dołączony do drzewa źródeł Androida w 2019 roku, ale obsługa tego języka pozostawała w fazie eksperymentalnej. Niektóre z pierwszych komponentów Rusta zaplanowanych dla Androida obejmują nowe implementacje mechanizmu komunikacji międzyprocesowej Binder i stosu Bluetooth.

Wprowadzenie Rusta odbyło się w ramach projektu mającego na celu wzmocnienie bezpieczeństwa, promowanie bezpiecznych technik programowania oraz zwiększenie efektywności identyfikowania problemów podczas pracy z pamięcią w systemie Android. Należy zauważyć, że około 70% wszystkich niebezpiecznych luk zidentyfikowanych w Androidzie wynika z błędów podczas pracy z pamięcią. Używanie Rusta, który koncentruje się na bezpieczeństwie pamięci i automatycznym zarządzaniu pamięcią, zmniejszy ryzyko wystąpienia luk w zabezpieczeniach spowodowanych błędami pamięci, takimi jak dostęp po zwolnieniu i przepełnienie bufora.

Rust wymusza bezpieczeństwo pamięci w czasie kompilacji poprzez sprawdzanie referencji, własność obiektu i śledzenie czasu życia obiektu (zakresy) oraz ocenę poprawności dostępu do pamięci w czasie wykonywania. Rust zapewnia także ochronę przed przepełnieniem liczb całkowitych, wymaga inicjalizacji wartości zmiennych przed użyciem, ma lepszą obsługę błędów w bibliotece standardowej, domyślnie wykorzystuje koncepcję niezmiennych referencji i zmiennych oraz oferuje silne typowanie statyczne w celu zminimalizowania błędów logicznych.

W systemie Android bezpieczeństwo pamięci jest zapewnione w już obsługiwanych językach Kotlin i Java, ale nie nadają się one do tworzenia komponentów systemu ze względu na duże obciążenie. Rust umożliwia osiągnięcie wydajności zbliżonej do języków C i C++, co pozwala na wykorzystanie go do tworzenia niskopoziomowych części platformy i komponentów do interakcji ze sprzętem.

Aby zapewnić bezpieczeństwo kodu C i C++, Android wykorzystuje izolację piaskownicy, analizę statyczną i testy fuzzingowe. Możliwości izolacji sandboksa są ograniczone i osiągnęły granicę swoich możliwości (dalsza fragmentacja na procesy jest niepraktyczna z punktu widzenia zużycia zasobów). Ograniczeniami korzystania z piaskownicy są duże koszty ogólne i zwiększone zużycie pamięci spowodowane koniecznością uruchamiania nowych procesów, a także dodatkowe opóźnienia związane z wykorzystaniem IPC.

Jednocześnie sandbox nie eliminuje luk w kodzie, a jedynie zmniejsza ryzyko i komplikuje atak, ponieważ exploit wymaga zidentyfikowania nie jednej, ale kilku luk. Metody oparte na testowaniu kodu mają swoje ograniczenia, ponieważ aby zidentyfikować błędy, konieczne jest stworzenie warunków, w których problem się ujawni. Nie jest możliwe uwzględnienie wszystkich możliwych opcji, dlatego wiele błędów pozostaje niezauważonych.

W przypadku procesów systemowych w Androidzie Google stosuje „zasadę dwóch”, zgodnie z którą każdy dodany kod musi spełniać nie więcej niż dwa z trzech warunków: praca z niezweryfikowanymi danymi wejściowymi, używanie niebezpiecznego języka programowania (C/C++) oraz działa bez ścisłej izolacji piaskownicy (z podwyższonymi uprawnieniami). Zasada ta oznacza, że ​​kod do przetwarzania danych zewnętrznych musi zostać albo zredukowany do minimalnych uprawnień (izolowany), albo napisany w bezpiecznym języku programowania.

Google nie zamierza przepisywać istniejącego kodu C/C++ w Rust, ale planuje użyć tego języka do opracowania nowego kodu. Używanie Rusta do nowego kodu ma sens, ponieważ statystycznie większość błędów pojawia się w nowym lub niedawno zmienionym kodzie. W szczególności około 50% wykrytych błędów pamięci w Androidzie jest wykrywanych w kodzie napisanym niecały rok temu.

Rust jest jednym z głównych języków rozwoju platformy Android


Źródło: opennet.ru

Dodaj komentarz