Në kuadër të përmirësimit të sigurisë së komponentëve kritikë softuerikë në platformën Android, kompania Google e rifashoi firmware-in pvmfm në gjuhën Rust, i cili përdoret për të organizuar funksionimin e makinave virtuale që aktivizohen nga hipervizori pVM, pjesë e Android Virtualization Framework. Më parë firmware-i ishte shkruar në gjuhën C dhe ishte implementuar mbi ngarkuesin U-Boot, në kodin e të cilit ishin zbuluar më parë dobësi të shkaktuara nga probleme me menaxhimin e memories.
Firmware-i i rifashuar në Rust është përfshirë në Android 14, ndërsa bibliotekat universale të krijuara gjatë zhvillimit të firmware-it janë formuar në formën e paketave crate dhe janë dorëzuar në komunitetin Rust. Për shembull, është publikuar paketa smccc për mbështetje të ndërfaqeve ARM PSCI (Power State Coordination Interface) dhe thirrjeve SMCCC (SMC Calling Convention), si dhe paketa aarch64-paging për manipulimin e tabelave të faqeve të memories. Gjithashtu, është punuar për eliminimin e gabimeve dhe zgjerimin e funksionalitetit të paketës ekzistuese virtio-drivers me implementimin e driver-ëve VirtIO. Ndaj platformës Android, këto paketa janë përdorur edhe në projektin Oak, i cili zhvillon komponentë për transmetimin, ruajtjen dhe përpunimin e të dhënave në mjedise të sigurta (TEE, Mjedisi i Ekzekutimit të Besuar).
Hipervizori pVM merr kontrollin në një fazë të hershme të ngarkesës dhe siguron izolimin e plotë të memories makinat virtuale dhe mjedisit host, duke mos lejuar që sistemi host të ketë qasje në makinat virtuale të mbrojtura, në të cilat përfundohen të dhëna konfidenciale. Firmware-i pvmfm (Protected Virtual Machine Firmware) merr kontrollin menjëherë pas fillimit të makinës virtuale, kryen verifikimin e mjedisit të krijuar dhe merr vendimin për të ndërprerë ngarkimin në rast të identifikimit të problemeve me integritetin ose gjeneron një certifikatë ngarkimi për sistemin mysafir në rast të konfirmimit të zinxhirit të besimit.
Rikonstrukcioni në gjuhën Rust lejon të arrihen më shumë thjeshtësi dhe siguri në përmbushjen e "rregullit të dy", të aplikuar nga Google për të ruajtur sigurinë e komponenteve sistemike të Android. Sipas këtij rregulli, çdo kod i shtuar duhet të përmbushë jo më shumë se dy nga tre kushte: puna me të dhëna të pa verifikuara, përdorimi i një gjuhe programimi të pasigurt (C/C++) dhe ekzekutimi me privilegje të rritura. Nga ky rregull del që kodi për përpunimin e të dhënave të jashtme duhet të ose të jetë i zvogëluar në privilegje minimale (izoluar), ose të jetë shkruar në një gjuhë programimi të sigurt. Sipas statistikave të Google, rreth 70% e të gjitha dobësive të rrezikshme, të zbuluara në Android, shkaktohen nga gabime në punën me memorien.
Rust fokusohet në punën e sigurt me memorien dhe lejon uljen e rrezikut të shfaqjes së dobësive, shkaktuar nga probleme si referimi në një zonë memorien pas lirimit të saj dhe dalja përtej kufijve të tamponit. Puna e sigurt me memorien në Rust sigurohet në kohën e përpunimit përmes verifikimit të referencave, ndjekjes së pronësisë së objekteve dhe marrjes parasysh të kohëzgjatjes së jetës së objekteve (zonave të dukshme), si dhe duke vlerësuar saktësinë e aksesit në memorie gjatë ekzekutimit të kodit. Rust gjithashtu ofron mjete për mbrojtjen nga mbingarkesat numerike, kërkon inicializimin e detyruar të vlerave të variablave para përdorimit, trajton më mirë gabimet në bibliotekën standarde, aplikon konceptin e referencave dhe variablave të pandryshueshëm (immutable) si dhe ofron një tipizim të fortë statik për minimizimin e gabimeve logjike.
Nga vështirësitë që shfaqen në procesin e zhvillimit të komponenteve të ulët në gjuhën Rust, siç janë drejtoritë, përmendet nevoja për të punuar me tregues të pastër në modin unsafe, pasi Rust është krijuar me përkushtimin për përdorimin e memorjes që është rezervuar në program, dhe në kodin që punon pa shtresa mbi harduerin, është e nevojshme të referoheni në memorien e ndarë dhe MMIO. Aktualisht, mundësitë e Rust përpunimin me tregues të pastër lënë për të dëshiruar, por situata duhet të ndryshojë pas stabilizimit të mbështetjes për makrot e offset_of, slice_ptr_get dhe slice_ptr_len.
Një nga disavantazhet është nevoja për një sintaksë më të përmirësuar për qasje në fushat e strukturave dhe indekset e masivëve përmes treguesve të pastër pa krijuar lidhje, si dhe kufizimet në krijimin e mbështjelljeve të sigurta mbi operacionet e pa sigurta, të cilat mund të shkaktojnë sjellje të pasigurt dhe nuk mund të verifikohen nga kompajleri. Për shembull, mbështjelljet e tilla nuk mund të krijohen për operacionet me tabelat e faqeve të memories, pasi mapimi i faqeve në një pjesë të programit mund të ndikojë në pjesë të tjera.
Sa i përket madhësisë së kodit rezultues, varianti i vjetër i firmware pVM zinte 220 kB, ndërsa i ri zë 460 kB, por në këtë version të ri janë shtuar funksionalitete të reja, falë të cilave është arritur të eliminohen disa komponentë të tjerë të përdorur gjatë ngarkimit. Si rezultat, madhësia totale e të gjitha komponentëve të ngarkimit të vjetër dhe të rinj është krahasuese. Vërehet se kur madhësia është më e rëndësishme se performanca, rezultate të ngjashme me atë të gjuhës C mund të arrihen duke aktivizuar në kompilator opsione të tjera optimizimi për madhësinë, duke hequr varësitë e panevojshme dhe duke mos përdorur mjete formatimi të stringjeve.
Po ashtu, përmendet vazhdimi i punës për realizimin e mundësisë për ekzekutimin e aplikacioneve të besueshme të shkruara në gjuhën Rust (Trusted Application) në sistemin operativ Trusty, që ofron një mjedis TEE (Trusted Execution Environment) për Android, ekzekutuese paralelisht me Android në të njëjtin procesor në një mjedis të izoluar. Trusty aplikohet në pajisjet Pixel dhe tashmë përdor Rust në bibliotekat dhe komponentët sistemikë (në ndërkohë, bërthama mbetet në C).
Burimi: opennet.ru
