Google razvija dijelove Androida u Rustu kako bi poboljšao sigurnost

Google piše i prepisuje dijelove Androida u Rustu kako bi poboljšao sigurnost OS-a u cjelini, u odnosu na C i C++. Čitajte dalje da biste saznali više!

Android kao cjelovito OS rješenje uključuje puno pokretnih dijelova. Vrlo široko govoreći, ti dijelovi su ekosustav aplikacije, a zatim sam OS. Kao programer, vaš programski jezik po izboru razlikuje se ovisno o tome na kojem dijelu Androida radite. Za programere aplikacija, Java i Kotlin su popularne opcije. Za programere koji rade na OS-u i nižim razinama unutar njega, C i C++ su dosad bili popularni izbori. Danas Google dodaje treću opciju za programere OS-a, jer Android Open Source Project sada podržava Rust programski jezik za razvoj samog OS-a.

Ograničenja C i C++

Niže razine Android OS-a zahtijevaju sistemske programske jezike poput C i C++. Ovi jezici programerima pružaju kontrolu i predvidljivost, što je važno pri pristupanju resursima sustava i hardveru niske razine.

Nažalost, C i C++ ne osiguravaju sigurnosna jamstva memorije, što ih čini sklonima bugovima i sigurnosnim propustima. Programer je odgovoran za upravljanje životnim vijekom memorije na tim jezicima, ali u složenim i višenitnim bazama koda to je lakše reći nego učiniti.

C i C++ zajedno čine desetke milijuna linija koda na platformi Android. Ove sigurnosne pogreške u memoriji postaju izvor neispravnosti koda koji je najteže riješiti i predstavljaju ~70% Androidovih sigurnosnih ranjivosti visoke ozbiljnosti. Samo popravljanje tih grešaka postaje nedovoljno za rješavanje problema, a bolji bi pristup bio spriječiti ih na prvom mjestu.

Nedostatak sigurnosnih jamstava memorije prisiljava programere da pokreću Android procese unutar strogo ograničenih i neprivilegiranih sandboxova. Ali sandboxi su skupi u pogledu resursa, troše dodatne režije i uvode kašnjenje. Sandboxing također ne eliminira u potpunosti ranjivosti koda, a njegova je učinkovitost smanjena zbog velike gustoće programskih pogrešaka, što nadalje omogućuje napadačima da u lancu povežu višestruke ranjivosti.

Još jedno ograničenje, iako nije jedinstveno za C i C++, ali primjenjivo na sva pitanja sigurnosti memorije, jest da se pogrešno stanje zapravo mora pokrenuti u instrumentiranom kodu kako bi se otkrilo. Dakle, čak i ako vaš kôd ima izvrsna testiranja, stvarni bug može ostati neotkriven. A kada se pronađu greške, njihovo ispravljanje je još jedan zadatak, koji uključuje dug i skup proces koji ne mora uvijek dovesti do ispravnog popravka. Stoga otkrivanje grešaka postaje nepouzdano, a sprječavanje grešaka je bolji pristup u svjetlu ovih ograničenja.

Ovdje dolazi do izražaja prelazak na jezik koji je siguran za memoriju kao što je Rust.

Hrđa i njezine prednosti

Rust pruža jamstva sigurnosti memorije korištenjem kombinacije provjera u vrijeme kompajliranja za provedbu životnog vijeka/vlasništva objekta i provjera vremena izvođenja kako bi se osiguralo da su pristupi memoriji valjani. Ova sigurnost je postignuta uz pružanje ekvivalentnih performansi C i C++. Rust također smanjuje potrebu za sandboxingom, dopuštajući programerima više prostora za uvođenje novih značajki koje su sigurnije i manje troše resurse.

Iako Rust doista ima svoje prednosti, nije moguće preko noći prebaciti cijeli Android OS na Rust. A to možda čak i nije potrebno, budući da se većina Androidovih memorijskih grešaka javlja u novom ili nedavno izmijenjenom kodu, a oko 50% je manje od godinu dana. Google vjeruje da je njegova jezična nastojanja koja se tiču ​​sigurnosti memorije najbolje usmjeriti na nove razvoje, a ne na ponovno pisanje zrelog C i C++ koda.

Rust se također usredotočuje na sprječavanje grešaka umjesto da se uvelike oslanja na otkrivanje grešaka, što rezultira poboljšanom ispravnošću koda. Ima nekoliko ključnih značajki, kao što su sigurnost memorije, konkurentnost podataka, sustavi izražajnijih tipova, nepromjenjivi reference i varijable prema zadanim postavkama, sigurnije rukovanje cijelim brojevima, bolje rukovanje pogreškama u standardnim bibliotekama i mnogo toga više.

Što prijelaz na Rust znači za Android?

Google kaže da dodaje podršku za Rust u Android Open Source Project zadnjih 18 mjeseci. Ali dodavanje novog jezika platformi Android ogroman je pothvat. Potrebno je održavati neke lance alata i ovisnosti, ažurirati testnu infrastrukturu i alate, a programere je potrebno obučiti.

Google ima nekoliko projekata za rano usvajanje koje će podijeliti u nadolazećim mjesecima. Ali čak i tako, jasno je da je skaliranje podrške za Rust na više OS-a višegodišnji projekt.

Prema onome što vidimo, Google već koristi Rust na nekoliko mjesta. Androidov novi Bluetooth stack rewrite kodnog naziva "Gabeldorsche" piše se u Rustu. Rad na Gabeldorscheu započeo je otprilike u vrijeme Androida 11, ali se još uvijek ne koristi. Androida Spremište ključeva 2.0 modul je napisan u Rustu, kao i dio korisničkog prostora bindera, Androidovog IPC upravljačkog programa. Iako nije povezano s Androidom, Fuksijaje novo netstack također se piše u Rustu.

Za programere aplikacija, promjena ne mijenja ništa o tome kako vi, kao programer aplikacija, pišete aplikacije ili kako API-ji okvira rade. Ovaj prekidač utječe samo na način na koji je OS napisan. Prema riječima člana Android Developer Relations tima, Google također trenutno ne planira objaviti Rust NDK. Podržani jezici za razvoj aplikacija i dalje će biti Kotlin, Java, C i C++.