Google přepsal firmwaru pvmfm, používanou v Androidu, v jazyce Rust.

V rámci snahy o posílení bezpečnosti kritických programových komponent platformy Android společnost Google přepsala firmwaru pvmfm, která je použita pro organizaci práce virtuálních strojů spuštěných hypervizorem pVM v rámci Android Virtualization Framework. Dříve byla firma napsaná v C a implementována nad bootloaderem U-Boot, v jehož kódu byly dříve nalezeny zranitelnosti vyplývající z problémů s pamětí.

Přepsaná firware v Rustu je součástí Androidu 14, a během vývoje firmwaru vznikly univerzální knihovny, které byly zformovány do crate-balíčků a předány komunitě Rust. Například byl publikován balíček smccc pro podporu ARM rozhraní PSCI (Power State Coordination Interface) a volání SMCCC (SMC Calling Convention), a balíček aarch64-paging pro manipulaci se stránkovacími tabulkami paměti. Také byla provedena práce na odstranění chyb a rozšíření funkcionality existujícího balíčku virtio-drivers s implementací ovladačů VirtIO. Kromě platformy Android jsou uvedené balíčky využívány v projektu Oak, který vyvíjí komponenty pro přenos, ukládání a zpracování dat v zabezpečených prostředích (TEE, Trusted Execution Environment).

Hypervizor pVM získává kontrolu v rané fázi načítání a zajišťuje úplnou izolaci paměti virtuálních strojů a hostitelského prostředí, což zabraňuje hostitelskému systému v přístupu k chráněným virtuálním strojům, ve kterých probíhá zpracování citlivých dat. Firmware pvmfm (Protected Virtual Machine Firmware) získává kontrolu ihned po spuštění virtuálního stroje, provádí kontrolu vytvořeného prostředí a rozhoduje o nouzovém přerušení načítání v případě zjištění problémů s integritou, nebo generuje spouštěcí certifikát pro hostitelský systém v případě potvrzení řetězce důvěry.

Přepisování v jazyce Rust umožňuje jednodušší a bezpečnější dodržování "pravidla dvou", které Google uplatňuje pro zajištění bezpečnosti systémových komponent Android. Podle tohoto pravidla musí jakýkoli přidaný kód splnit maximálně dvě z těchto tří podmínek: práce s neověřenými vstupy, použití nebezpečného programovacího jazyka (C/C++) a provádění s vyššími právy. Z tohoto pravidla vyplývá, že kód pro zpracování externích dat by měl být buď omezen na minimální oprávnění (izolován), nebo napsán v bezpečném programovacím jazyce. Podle statistik Google je přibližně 70 % všech nebezpečných zranitelností zjištěných v Androidu způsobeno chybami při práci s pamětí.

Rust se zaměřuje na bezpečné zacházení s pamětí a umožňuje snížit riziko vzniku zranitelností způsobených takovými problémy, jako je přístup do oblasti paměti po jejím uvolnění a překročení meze bufferu. Bezpečné zacházení s pamětí v Rustu je zajištěno během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů a zohlednění doby života objektů (oblast viditelnosti), a také pomocí hodnocení správnosti přístupu k paměti během běhu kódu. Rust také poskytuje nástroje na ochranu proti celočíselným přetečením, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných jako standard, a nabízí silnou statickou typizaci pro minimalizaci logických chyb.

Mezi obtížemi, které vznikají při vývoji nízkoúrovňových komponent v jazyce Rust, jako jsou ovladače, se zmiňuje potřeba práce s holými ukazateli v režimu unsafe, jelikož byl Rust navržen s ohledem na použití paměti alokované v programu, a v kódu pracujícím bez vrstev nad hardwarem je nutné se obracet na sdílenou paměť a MMIO. V současnosti možnosti Rustu pro práci s holými ukazateli zanechávají mnoho přání, ale situace by se měla změnit po stabilizaci podpory makros offset_of, slice_ptr_get a slice_ptr_len.

Mezi nevýhody se také vyplatí zmínit potřebu vylepšené syntaxe pro přístup k polím struktur a indexům polí prostřednictvím čistých ukazatelů bez vytváření referencí, stejně jako omezení při vytváření bezpečných obalů kolem unsafe operací, které mohou vyvolat neurčité chování a nelze je ověřit překladačem. Například je nemožné vytvořit takové obaly pro operace se stránkovými tabulkami paměti, protože mapování stránek v jedné části programu může ovlivnit jiné části.

Pokud jde o velikost výsledného kódu, stará verze firmwaru pVM zabírala 220 kB, zatímco nová má 460 kB, ale v přepsané variantě byly přidány nové funkce, díky nimž jsme se mohli zbavit některých dalších komponent používaných při spouštění. Nakonec se celková velikost všech starých a nových spouštěcích komponentů ukázala jako srovnatelná. Upozorňuje se, že když je velikost důležitější než výkon, srovnatelné výsledky s jazykem C lze dosáhnout zahrnutím dalších režimů optimalizace velikosti v překladači, snížením zbytečných závislostí a nepoužíváním prostředků pro formátování řetězců.

Dále se zmiňuje pokračování práce na realizaci spuštění důvěryhodných aplikací (Trusted Application) napsaných v jazyce Rust v operačním systému Trusty, který poskytuje TEE prostředí (Trusted Execution Environment) pro Android, běžící paralelně s Androidem na stejném procesoru v odděleném izolačním prostředí. Trusty se používá v zařízeních Pixel a již využívá Rust v knihovnách a systémových komponentách (jádro zůstává na C).

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster