Google opracowuje części Androida w języku Rust, aby poprawić bezpieczeństwo

Google pisze i przepisuje części Androida w języku Rust, aby poprawić bezpieczeństwo systemu operacyjnego jako całości w porównaniu z C i C++. Czytaj dalej, aby dowiedzieć się więcej!

Android jako kompletne rozwiązanie systemu operacyjnego składa się z wielu ruchomych części. Mówiąc najogólniej, te części to ekosystem aplikacji, a następnie sam system operacyjny. Jako programista wybrany język programowania różni się w zależności od tego, nad jaką częścią Androida pracujesz. Dla twórców aplikacji popularnymi opcjami są Java i Kotlin. Dla programistów pracujących nad systemem operacyjnym i jego niższymi poziomami, jak dotąd popularnym wyborem były C i C++. Dzisiaj Google dodaje trzecią opcję dla programistów systemów operacyjnych, ponieważ projekt Android Open Source obsługuje teraz język programowania Rust do tworzenia samego systemu operacyjnego.

Ograniczenia C i C++

Niższe poziomy systemu operacyjnego Android wymagają języków programowania systemów, takich jak C i C++. Języki te zapewniają programistom kontrolę i przewidywalność, co jest ważne podczas uzyskiwania dostępu do zasobów systemowych i sprzętu niskiego poziomu.

Niestety, C i C++ nie zapewniają gwarancji bezpieczeństwa pamięci, przez co są podatne na błędy i luki w zabezpieczeniach. Programista jest odpowiedzialny za zarządzanie czasem życia pamięci w tych językach, ale w przypadku złożonych i wielowątkowych baz kodu łatwiej to powiedzieć niż zrobić.

C i C++ razem tworzą dziesiątki milionów linii kodu na platformie Android. Te błędy bezpieczeństwa pamięci stają się najtrudniejszym do usunięcia źródłem niepoprawności kodu i stanowią około 70% luk w zabezpieczeniach Androida o dużej wadze. Samo naprawienie tych błędów nie wystarczy do rozwiązania problemu, a lepszym podejściem byłoby przede wszystkim zapobieganie im.

Brak gwarancji bezpieczeństwa pamięci zmusza programistów do uruchamiania procesów Androida w ściśle ograniczonych i nieuprzywilejowanych piaskownicach. Jednak piaskownice są kosztowne pod względem zasobów, zużywają dodatkowe obciążenie i wprowadzają opóźnienia. Sandboxing również nie eliminuje całkowicie luk w kodzie, a jego skuteczność jest zmniejszona ze względu na dużą gęstość błędów, co dodatkowo umożliwia atakującym połączenie wielu luk w zabezpieczeniach.

Innym ograniczeniem, choć nie unikalnym dla C i C++, ale mającym zastosowanie do wszystkich problemów związanych z bezpieczeństwem pamięci, jest to, że błędny stan musi zostać faktycznie wyzwolony w kodzie instrumentowanym, aby został wykryty. Zatem nawet jeśli Twój kod przeszedł doskonałe testy, rzeczywisty błąd może pozostać niewykryty. A gdy zostaną znalezione błędy, ich naprawienie to kolejne zadanie, wymagające długiego i kosztownego procesu, który nie zawsze prowadzi do prawidłowej naprawy. Dlatego wykrywanie błędów staje się zawodne, a w świetle tych ograniczeń lepszym podejściem jest zapobieganie błędom.

W tym miejscu pojawia się pytanie o przejście na język bezpieczny dla pamięci, taki jak Rust.

Rdza i jej zalety

Rust zapewnia gwarancje bezpieczeństwa pamięci, wykorzystując kombinację kontroli w czasie kompilacji, aby wymusić czas życia/własności obiektu, oraz kontroli w czasie wykonywania, aby upewnić się, że dostęp do pamięci jest prawidłowy. Bezpieczeństwo to zostało osiągnięte przy jednoczesnym zapewnieniu wydajności równoważnej C i C++. Rust zmniejsza także potrzebę stosowania piaskownicy, dając programistom więcej miejsca na wprowadzanie nowych funkcji, które są bezpieczniejsze i zużywają mniej zasobów.

Chociaż Rust rzeczywiście ma swoje zalety, nie jest możliwe przełączenie całego systemu operacyjnego Android na Rust z dnia na dzień. A to może nawet nie być potrzebne, ponieważ większość błędów pamięci Androida występuje w nowym lub niedawno zmodyfikowanym kodzie, a około 50% ma mniej niż rok. Google wierzy, że wysiłki w zakresie języka bezpiecznego dla pamięci najlepiej skupiają się na nowych rozwiązaniach, a nie na przepisywaniu dojrzałego kodu C i C++.

Rust skupia się także na zapobieganiu błędom, zamiast skupiać się na ich wykrywaniu, co skutkuje poprawą poprawności kodu. Ma kilka kluczowych cech, takich jak bezpieczeństwo pamięci, współbieżność danych, bardziej wyraziste systemy typów, niezmienność domyślne referencje i zmienne, bezpieczniejsza obsługa liczb całkowitych, lepsza obsługa błędów w standardowych bibliotekach i wiele więcej więcej.

Co oznacza przejście na Rust dla Androida?

Google twierdzi, że od 18 miesięcy dodaje obsługę Rusta do projektu Android Open Source. Ale dodanie nowego języka do platformy Android to ogromne przedsięwzięcie. Należy utrzymać niektóre łańcuchy narzędzi i zależności, zaktualizować infrastrukturę testową i narzędzia, a programistów należy przeszkolić.

Google ma kilka wczesnych projektów, które udostępni w nadchodzących miesiącach. Ale mimo to stało się jasne, że skalowanie obsługi Rusta na większą liczbę systemów operacyjnych to projekt wieloletni.

Z tego, co widzimy, Google używa już Rusta w kilku miejscach. Nowy stos Bluetooth w Androidzie przepisuje kod o nazwie „Gabeldorsche" jest pisane w Rust. Prace nad Gabeldorsche rozpoczęły się mniej więcej w czasach Androida 11, ale nadal nie są jeszcze używane. Androida Magazyn kluczy 2.0 moduł jest napisany w języku Rust, podobnie jak część spoiwa zajmująca przestrzeń użytkownika, sterownik IPC dla Androida. Chociaż nie jest związany z Androidem, Fuksjajest nowy stos sieciowy jest również pisany w języku Rust.

W przypadku twórców aplikacji przełącznik nie zmienia niczego w sposobie, w jaki jako programista aplikacji piszesz aplikacje ani w działaniu interfejsów API platformy. Ten przełącznik wpływa tylko na sposób pisania systemu operacyjnego. Według członka zespołu ds. relacji z programistami Androida, Google nie planuje obecnie wypuszczania pakietu Rust NDK. Obsługiwane języki do tworzenia aplikacji nadal będą Kotlin, Java, C i C++.