Google je prepisao firmware pvmfm, korišćen u Androidu, na jeziku Rust

V okviru dela na izboljšanju varnosti kritičnih programski komponent platforme Android je podjetje Google prek koda Rust prenovilo programsko opremo pvmfm, ki se uporablja za delovanje virtualnih strojev, ki jih zažene hipervizor pVM v okviru Android Virtualization Framework. Prej je bila programska oprema napisana v jeziku C in je bila izvedena nad zaganjalnikom U-Boot, v katerem so že prej odkrili ranljivosti, povezane s težavami pri upravljanju z pomnilnikom.

Prenovljena programska oprema v jeziku Rust je vključena v Android 14, pravične knjižnice, ustvarjene v procesu razvoja programske opreme, pa so oblikovane v obliki crate-paketov in prenesene skupnosti Rust. Na primer, objavljen je paket smccc za podporo ARM vmesnikom PSCI (Power State Coordination Interface) in klicem SMCCC (SMC Calling Convention), ter paket aarch64-paging za upravljanje s tabelami strani pomnilnika. Opravljena je bila tudi odprava napak in širitev funkcionalnosti obstoječega paketa virtio-drivers s realizacijo VirtIO gonilnikov. Poleg platforme Android so ti paketi vključeni tudi v projekt Oak, ki razvija komponente za prenos, shranjevanje in obdelavo podatkov v varnih okoljih (TEE, Trusted Execution Environment).

Hipervizor pVM prevzame nadzor v zgodnji fazi zagona in zagotavlja popolno izolacijo pomnilnika virtualnih naprav in gostiteljskega okolja, kar preprečuje dostop gostiteljske sistem do zaščitenih virtualnih strojev, v katerih se obdelujejo zaupni podatki. Programska oprema pvmfm (Protected Virtual Machine Firmware) prevzame nadzor takoj po zagonu virtualnega stroja, izvede preverjanje oblikovanega okolja in odloči o nujni prekinitvi zagona v primeru odkritja težav z celovitostjo ali generira zagonski certifikat za gostujoči sistem, če se potrdi veriga zaupanja.

Preprocessing in Rust enables simpler and safer compliance with the 'two rules' applied by Google to maintain the security of Android system components. According to this rule, any added code must fall under no more than two of three conditions: working with unverified input data, using unsafe programming languages (C/C++), and executing with elevated privileges. This rule implies that code for processing external data should either be limited to minimal privileges (isolated) or be written in a safe programming language. According to Google statistics, about 70% of all dangerous vulnerabilities identified in Android stem from memory management errors.

Rust focuses on safe memory management and reduces the risk of vulnerabilities caused by issues such as accessing memory after it has been freed and buffer overflows. Safe memory work in Rust is ensured at compile time through reference checking, ownership tracking of objects, and consideration of object lifetimes (scope), as well as through access validation to memory during code execution. Rust also provides mechanisms to protect against integer overflows, requires mandatory initialization of variable values before use, better handles errors in the standard library, applies the concept of immutability (immutable) for references and variables by default, and offers strong static typing to minimize logical errors.

Among the challenges faced during the development of low-level components in Rust, such as drivers, is the necessity of working with raw pointers in unsafe mode, as Rust is designed with careful consideration of memory allocated in the program, and in code that operates without layers above the hardware, it is necessary to interact with shared memory and MMIO. Currently, Rust's capabilities to work with raw pointers leave much to be desired, but the situation is expected to improve after the stabilization of support for the offset_of, slice_ptr_get, and slice_ptr_len macros.

Med pomanjkljivostmi je tudi treba omeniti potrebo po izboljšanem sintaksu za dostop do polj struktur in indeksov tabel prek golih kazalcev brez ustvarjanja referenc ter omejitve pri ustvarjanju varnih ovitkov nad nevarnimi operacijami, ki lahko povzročijo nedoločeno vedenje in jih prevajalnik ne more preveriti. Na primer, takšnih ovitkov ni mogoče ustvariti za operacije s spodnjimi tabelami pomnilnika, saj lahko preslikovanje strani v enem delu programa vpliva na druge dele.

Kar zadeva velikost rezultantne kode, je stara različica programske opreme pVM zasedala 220 kB, nova pa 460 kB, vendar so v prepisano različico dodane nove funkcije, s katerimi so se uspeli znebiti nekaterih drugih komponent, ki so se uporabljale pri nalaganju. Na koncu se je skupna velikost vseh starih in novih nalagalnih komponent izkazala za primerljivo. Opaženo je, da lahko pri velikosti kot pomembnejšemu faktorju dosežemo primerljive rezultate s programskim jezikom C, če vključimo dodatne načine optimizacije velikosti v prevajalniku, opustimo odvečne odvisnosti in ne uporabljamo orodij za oblikovanje nizov.

Dodatno se omenja nadaljevanje dela na implementaciji možnosti zagona zanesljivih aplikacij, napisanih v jeziku Rust (Trusted Application), v operacijskem sistemu Trusty, ki nudi okolje TEE (Trusted Execution Environment) za Android in deluje vzporedno z Androidom na istem procesorju v ločenem izoliranem okolju. Trusty se uporablja v napravah Pixel in že uporablja Rust v knjižnicah in sistemskih komponentah (jedro ostaja v C).

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster