Google je prepisao firmware pvmfm na jeziku Rust, koji se koristi u Androidu

U sklopu radova na jačanju sigurnosti kritično važnih softverskih komponenti Android platforme, Google je prepisao firmware pvmfm na Rust jeziku, koji se koristi za organizaciju rada virtualnih mašina pokrenutih hipervizorom pVM unutar Android Virtualization Framework-a. Prijašnji firmware bio je napisan u C jeziku i implementiran preko U-Boot bootloadera, u čijem je kodu prethodno otkriveno više ranjivosti uzrokovanih problemima s memorijom.

Prepisani firmware na Rust jeziku uključen je u Android 14, a univerzalne biblioteke koje su nastale tokom razvoja firmware-a oblikovane su kao crate-paketi i predane Rust zajednici. Na primjer, objavljen je paket smccc za podršku ARM sučeljima PSCI (Power State Coordination Interface) i pozivima SMCCC (SMC Calling Convention), te paket aarch64-paging za manipulaciju tablicama stranica memorije. Također je obavljen rad na ispravljanju grešaka i proširenju funkcionalnosti postojećeg paketa virtio-drivers s implementacijom VirtIO drajvera. Osim Android platforme, navedeni paketi korišteni su u projektu Oak, koji razvija komponente za prijenos, pohranjivanje i obradu podataka u zaštićenim okruženjima (TEE, Trusted Execution Environment).

Hipervizor pVM preuzima kontrolu u ranoj fazi pokretanja i osigurava potpunu izolaciju memorije virtualnih mašina i host-okruženja, sprječavajući pristup zaštićenim virtualnim mašinama iz host-sustava, u kojima se obrađuju povjerljivi podaci. Firmware pvmfm (Protected Virtual Machine Firmware) preuzima kontrolu odmah nakon pokretanja virtualne mašine, provodi provjeru stvorene okoline i donosi odluku o hitnom prekidu pokretanja u slučaju otkrivanja grešaka u integritetu ili generira boot certifikat za gostujući sustav u slučaju potvrde lanca povjerenja.

Obrada na Rust jeziku omogućuje jednostavnije i sigurnije pridržavanje "pravila dva", koje Google primjenjuje za održavanje sigurnosti sistemskih komponenata Androida. Prema ovom pravilu svaki dodani kod može ispuniti najviše dva od tri uvjeta: rad s nepouzdanom ulaznom podacima, korištenje nesigurnog programskog jezika (C/C++) i izvršavanje s povećanim privilegijama. Iz ovog pravila proizlazi da kod za obradu vanjskih podataka mora ili biti sveden na minimalne privilegije (izoliran), ili biti napisan na sigurnom programskom jeziku. Prema statistikama, Google navodi da oko 70% svih opasnih ranjivosti otkrivenih u Androidu proizlazi iz grešaka u radu s memorijom.

Rust je fokusiran na sigurnu obradu memorije i smanjuje rizik od pojave ranjivosti uzrokovanih problemima kao što su pristupanje memoriji nakon njezinog oslobađanja i prekoračenje granica bafera. Sigurna obrada memorije osigurava se u Rustu tijekom kompilacije putem provjere referenci, praćenja vlasništva objekata i uzimanja u obzir vremena života objekata (oblasti vidljivosti), kao i putem procjene ispravnosti pristupa memoriji tijekom izvršenja koda. Rust također pruža sredstva za zaštitu od preljeva cijelih brojeva, zahtijeva obaveznu inicijalizaciju varijablnih vrijednosti prije korištenja, bolje obrađuje pogreške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabli po defaultu, te nudi jaku statičku tipizaciju za minimiziranje logičkih grešaka.

Među teškoćama koje se javljaju u procesu razvoja niskorazinskih komponenti na Rust jeziku, poput drajvera, spominje se potreba za radom s golim pokazivačima u unsafe modu, budući da je Rust osmišljen s obzirom na korištenje memorije koja je dodijeljena programu, a u kodu koji radi bez slojeva iznad hardvera, potrebno je pristupati dijeljenoj memoriji i MMIO. Trenutno mogućnosti Rusta za rad s golim pokazivačima ostavljaju mnogo da se želi, ali situacija bi se trebala promijeniti nakon stabilizacije podrške za makroe offset_of, slice_ptr_get i slice_ptr_len.

Među nedostacima se ističe potreba za poboljšanim sintaksom za pristup poljima struktura i indeksima nizova putem golih pokazivača bez kreiranja referenci, kao i ograničenja u stvaranju sigurnih obloga oko unsafe operacija koje mogu uzrokovati nepredvidivo ponašanje i koje ne može proveriti kompajler. Na primer, takve obloge nije moguće stvoriti za operacije sa stranicama memorije, jer mapiranje stranica u jednom delu programa može uticati na druge delove.

Što se tiče veličine rezultantnog koda, stara verzija firmvera pVM zauzimala je 220 kB, dok nova zauzima 460 kB, ali u novu verziju dodate su nove mogućnosti, zahvaljujući kojima je bilo moguće osloboditi se nekih drugih komponenti koje su se koristile prilikom pokretanja. U konačnici, ukupna veličina svih starih i novih pokretnih komponenti ispada uporediva. Istaknuto je da kada je veličina važnija od performansi, moguće je postići poredivljive rezultate sa jezikom C uključivanjem dodatnih režima optimizacije po veličini u kompajleru, odbacivanjem suvišnih zavisnosti i nekorisćenjem sredstava za formatiranje nizova.

Dodatno se pominje nastavak rada na implementaciji mogućnosti pokretanja aplikacija napisanim na jeziku Rust koje zaslužuju poverenje (Trusted Application) u operativnom sistemu Trusty, koji pruža TEE okruženje (Trusted Execution Environment) za Android, izvršavajući se paralelno sa Androidom na istom procesoru u odvojenom izolovanom okruženju. Trusty se koristi na uređajima Pixel i već koristi Rust u bibliotekama i sistemskim komponentama (jezgro ostaje na C-u).

Izvor: opennet.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster