Google har omskrevet pvmfm-firmware på Rust-sprog, der anvendes i Android

Som en del af arbejdet med at styrke sikkerheden i kritiske programmeringskomponenter på Android-platformen har Google omskrevet pvmfm-firmware på Rust-sprog, som bruges til at organisere driften af virtuelle maskiner, der køres af hypervisoren pVM inden for Android Virtualization Framework. Tidligere blev firmwaren skrevet i C og implementeret oven på U-Boot bootloaderen, i hvilken der tidligere blev fundet sårbarheder forårsaget af problemer med hukommelse.

Den omskrevne firmware i Rust er inkluderet i Android 14, og de universelle biblioteker, der blev skabt under udviklingen af firmwaren, er blevet udformet som crate-pakker og overdraget til Rust-fællesskabet. For eksempel er pakken smccc offentliggjort til støtte for ARM-interface PSCI (Power State Coordination Interface) og opkald af SMCCC (SMC Calling Convention), samt pakken aarch64-paging til manipulation af hukommelsesside-tabeller. Derudover er der blevet arbejdet på at rette fejl og udvide funktionaliteten af den eksisterende virtio-drivers pakke med implementering af VirtIO-drivere. Udover Android-platformen er de nævnte pakker anvendt i Oak-projektet, der udvikler komponenter til transmission, opbevaring og behandling af data i sikre miljøer (TEE, Trusted Execution Environment).

Hypervisoren pVM får kontrol tidligt i opstarten og sikrer fuld isolering af hukommelsen virtual machines og værtsmiljøet, hvilket forhindrer adgangen fra værtssystemet til de sikre virtuelle maskiner, hvor behandlingen af fortrolige data finder sted. pvmfm-firmwaren (Protected Virtual Machine Firmware) får kontrol straks efter opstarten af den virtuelle maskine, udfører kontrol af det dannede miljø og træffer beslutning om en nødstop af opstarten, hvis der opdages problemer med integriteten, eller genererer et boot-certifikat til gæstesystemet i tilfælde af bekræftelse af tillidens kæde.

Genbrug på Rust-sprog giver en enklere og sikrere overholdelse af "reglen om to", som Google anvender til at opretholde sikkerheden i systemkomponenter i Android. I henhold til denne regel skal enhver tilføjet kode opfylde højst to ud af tre betingelser: arbejde med usikre inddata, brug af usikre programmeringssprog (C/C++) og udførelse med forhøjede privilegier. Fra denne regel følger det, at koden til behandling af eksterne data enten skal begrænses til minimale privilegier (isoleret) eller skrives på et sikkert programmeringssprog. Ifølge Google skyldes omkring 70% af alle farlige sårbarheder, der er identificeret i Android, fejl i håndtering af hukommelse.

Rust fokuserer på sikker hukommelsesstyring og reducerer risikoen for sårbarheder forårsaget af problemer som adgang til hukommelse efter frigivelse og buffer-overløb. Sikker hukommelsesstyring sikres i Rust under kompilering gennem kontrol af referencer, sporing af ejerskab af objekter og overvejelser om objektets livstid (synlighed), samt ved at vurdere korrektheden af hukommelsesadgang, mens koden kører. Rust giver også værktøjer til at beskytte mod heltals-overløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet for uforanderlighed (immutable) af referencer og variabler som standard og tilbyder stærk statisk typekontrol for at minimere logiske fejl.

Fra de vanskeligheder, der opstår under udviklingen af low-level komponenter på Rust, såsom drivere, nævnes nødvendigheden af at arbejde med rå referencer i unsafe mode, da Rust er skabt med fokus på brugen af hukommelse tildelt i programmet, og i kode, der arbejder uden lag oven på hardwaren, skal der arbejdes med delt hukommelse og MMIO. I øjeblikket efterlader Rusts evner til at arbejde med rå referencer meget at ønske, men situationen burde ændre sig efter stabilisering af understøttelsen af makroerne offset_of, slice_ptr_get og slice_ptr_len.

En af ulemperne er også behovet for en forbedret syntaks til adgang til felter af strukturer og indeks i arrays gennem rene pegere uden at oprette referencer, samt begrænsningerne i at skabe sikre indpakninger over unsafe-operationer, som kan føre til udefineret adfærd og ikke kan kontrolleres af compilatoren. For eksempel kan sådanne indpakninger ikke oprettes til operationer med hukommelsessider, da kortlægning af sider i en del af programmet kan påvirke andre dele.

Hvad angår størrelsen på den resulterende kode, var den gamle version af pVM-firmware 220 kB, mens den nye er 460 kB, men i den omskrevne version blev der tilføjet nye funktioner, som gjorde det muligt at fjerne visse andre komponenter, der blev brugt ved opstart. Som et resultat var den samlede størrelse af alle gamle og nye opstarts-komponenter sammenlignelig. Det bemærkes, at når størrelse er vigtigere end ydeevne, kan sammenlignelige resultater med sprog som C opnås ved at aktivere yderligere størrelsesoptimeringsmodi i compilatoren, fjerne unødvendige afhængigheder og undgå brug af strengeformateringsmidler.

Der nævnes også fortsættelse af arbejdet med at implementere muligheden for at køre skrevne i Rust pålidelige applikationer (Trusted Application) i operativsystemet Trusty, der tilbyder et TEE-miljø (Trusted Execution Environment) til Android, der kører parallelt med Android på den samme processor i et separat isoleret miljø. Trusty anvendes i Pixel-enheder og bruger allerede Rust i biblioteker og systemkomponenter (kernen forbliver på C).

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster