Platformaning muhim dasturiy ta'minot komponentlari xavfsizligini mustahkamlash bo'yicha sa'y-harakatlarning bir qismi sifatida Android Google pVM gipervizori tomonidan ishga tushirilgan virtual mashinalarning ishlashini tashkil qilish uchun ishlatiladigan Rust dasturida pvmfm dasturini qayta yozdi. Android Virtualizatsiya doirasi. Ilgari, dasturiy ta'minot C tilida yozilgan va U-Boot yuklagichi ustiga o'rnatilgan edi, uning kodida ilgari xotira boshqaruvi muammolari tufayli yuzaga kelgan zaifliklar mavjud ekanligi aniqlangan edi.
Paketga Rustda qayta yozilgan dasturiy ta'minot kiritilgan Android 14 va dasturiy ta'minotni ishlab chiqish jarayonida yaratilgan universal kutubxonalar quti paketlari sifatida paketlangan va Rust hamjamiyatiga xayriya qilingan. Masalan, smccc paketi ARMning PSCI (Power State Coordination Interface) interfeyslari va SMCCC (SMC Calling Convention) chaqiruvlarini, shuningdek, xotira sahifalari jadvallarini boshqarish uchun aarch64-paging paketini qo'llab-quvvatlash uchun nashr etilgan. Shuningdek, VirtIO drayverlarini amalga oshirish orqali mavjud virtio-drivers paketining xatolarini tuzatish va funksiyalarini kengaytirish bo'yicha ishlar olib borildi. Platformadan tashqari Android Belgilangan paketlar himoyalangan muhitda (TEE, Ishonchli ijro muhiti) ma'lumotlarni uzatish, saqlash va qayta ishlash uchun komponentlarni ishlab chiqadigan Oak loyihasida qo'llaniladi.
pVM gipervizori yuklash jarayonining boshida boshqaruvni o'z qo'liga oladi va to'liq xotira izolyatsiyasini ta'minlaydi. virtual mashinalar va xost muhiti, xost tizimining maxfiy ma'lumotlar qayta ishlanadigan himoyalangan virtual mashinalarga kirishiga to'sqinlik qiladi. pvmfm (Himoyalangan Virtual Mashina Dasturiy Ta'minoti) dasturiy ta'minoti virtual mashina ishga tushirilgandan so'ng darhol boshqaruvni o'z qo'liga oladi, yaratilgan muhitni tekshiradi va yaxlitlik muammolari aniqlanganda yuklashni to'xtatish yoki ishonch zanjiri tasdiqlansa, mehmon tizimi uchun yuklash sertifikatini yaratish to'g'risida qaror qabul qiladi.
Rustda refaktoring Google tomonidan tizim komponentlarining xavfsizligini ta'minlash uchun qo'llaniladigan "ikkita qoida"ga rioya qilishni osonroq va xavfsizroq qiladi. AndroidUshbu qoidaga ko'ra, har qanday qo'shilgan kod uchta shartning ikkitasidan ko'p bo'lmaganiga javob berishi kerak: ishonchsiz kirish ma'lumotlarini qayta ishlash, xavfli dasturlash tilidan (C/C++) foydalanish va yuqori imtiyozlar bilan ishlash. Ushbu qoida tashqi ma'lumotlarni qayta ishlash uchun kod minimal imtiyozlarga qadar olib tashlanishi (izolyatsiya qilingan) yoki xavfsiz dasturlash tilida yozilishi kerakligini anglatadi. Google statistikasiga ko'ra, aniqlangan barcha xavfli zaifliklarning taxminan 70% ... Android, xotira bilan ishlashda xatolar tufayli yuzaga keladi.
Rust xotira xavfsizligiga e'tibor qaratadi va bo'sh qolgan xotiraga kirish va buferning haddan tashqari ko'tarilishi kabi muammolar tufayli yuzaga keladigan zaifliklar xavfini kamaytiradi. Rust kompilyatsiya vaqtida xotira xavfsizligini mos yozuvlarni tekshirish, ob'ektga egalik qilish va ob'ektning ishlash muddatini kuzatish (ko'lamlar) va ish vaqtida xotiraga kirishning to'g'riligini baholash orqali amalga oshiradi. Rust shuningdek, butun sonlarning to'lib ketishidan himoya qiladi, foydalanishdan oldin o'zgaruvchan qiymatlarni ishga tushirishni talab qiladi, standart kutubxonada xatolarni yaxshiroq boshqarishga ega, sukut bo'yicha o'zgarmas havolalar va o'zgaruvchilar tushunchasidan foydalanadi va mantiqiy xatolarni minimallashtirish uchun kuchli statik yozishni taklif qiladi.
Rust tilidagi drayverlar kabi past darajadagi komponentlarni ishlab chiqish jarayonida yuzaga keladigan qiyinchiliklar orasida xavfsiz rejimda yalang'och ko'rsatkichlar bilan ishlash zarurati qayd etilgan, chunki Rust dasturda ajratilgan xotiradan foydalanishni hisobga olgan holda yaratilgan. dastur va apparat ustidagi qatlamlarsiz ishlaydigan kodda biz umumiy xotira va MMIO ga kirishimiz kerak. Hozirda Rust-ning yalang'och ko'rsatgich imkoniyatlari ko'p narsani orzu qiladi, biroq bu ofset_of, slice_ptr_get va slice_ptr_len makroslarini qo'llab-quvvatlash barqarorlashgandan keyin o'zgarishi kerak.
Kamchiliklar orasida, shuningdek, tuzilma maydonlari va massiv indekslariga havolalar yaratmasdan yalang'och ko'rsatkichlar orqali kirish uchun takomillashtirilgan sintaksis zarurati, shuningdek, noaniq xatti-harakatlarga olib kelishi mumkin bo'lgan va kompilyator tomonidan tekshirilmaydigan xavfli operatsiyalar ustidan xavfsiz ulanishlarni yaratishdagi cheklovlar ham diqqatga sazovordir. Masalan, xotira sahifalari jadvallari bilan operatsiyalar uchun bunday bog'lashlarni yaratib bo'lmaydi, chunki dasturning bir qismida sahifalarni xaritalash boshqa qismlarga ta'sir qilishi mumkin.
Olingan kodning hajmiga kelsak, pVM proshivkasining eski versiyasi 220 kB, yangisi esa 460 kB ni egallagan, ammo qayta yozilgan versiyaga yangi xususiyatlar qo'shildi, buning natijasida ba'zi boshqa dasturlardan xalos bo'lish mumkin edi. yuklash paytida ishlatiladigan komponentlar. Natijada, barcha eski va yangi yuklash komponentlarining umumiy hajmi solishtirish mumkin bo'ldi. Ta'kidlanishicha, o'lcham unumdorlikdan muhimroq bo'lsa, kompilyatorda qo'shimcha o'lchamlarni optimallashtirish rejimlarini yoqish, keraksiz bog'liqliklardan voz kechish va qator formatlash vositalaridan foydalanmaslik orqali C tili bilan taqqoslanadigan natijalarga erishish mumkin.
Bundan tashqari, unda Trusty operatsion tizimida Rust tilida yozilgan ishonchli ilovalarni (Ishonchli ilova) ishga tushirish imkoniyatini joriy etish bo'yicha ishlarning davom ettirilishi haqida so'z boradi, bu esa TEE (Ishonchli ijro muhiti) ni ta'minlaydi. Android, parallel ravishda bajarilgan Android alohida, izolyatsiya qilingan muhitda bir xil protsessorda. Trusty Pixel qurilmalarida ishlatiladi va allaqachon kutubxonalar va tizim komponentlarida Rustdan foydalanadi (yadro C tilida qoladi).
Manba: opennet.ru
