Платформын чухал програм хангамжийн бүрэлдэхүүн хэсгүүдийн аюулгүй байдлыг бэхжүүлэх ажлын хүрээнд Android Google нь pVM гипервизорын ажиллуулсан виртуал машинуудын ажиллагааг зохион байгуулахад ашигладаг Rust дээр pvmfm програмыг дахин бичсэн. Android Виртуалчлалын хүрээ. Өмнө нь програм хангамжийг C хэл дээр бичиж, U-Boot bootloader дээр хэрэгжүүлдэг байсан бөгөөд уг bootloader код нь санах ойн удирдлагын асуудлаас үүдэлтэй эмзэг байдлыг агуулсан байсан нь өмнө нь тогтоогдсон.
Rust дээр дахин бичигдсэн програм хангамж нь багцад багтсан болно Android 14, мөн програм хангамжийн хөгжүүлэлтийн явцад бий болсон бүх нийтийн сангуудыг хайрцаг багц болгон савлаж, Rust нийгэмлэгт хандивласан. Жишээлбэл, smccc багцыг ARM-ийн PSCI (Power State Coordination Interface) интерфэйсүүд болон SMCCC (SMC Calling Convention) дуудлагуудыг дэмжих, мөн санах ойн хуудасны хүснэгтүүдийг удирдах aarch64-paging багцыг нийтэлсэн. Мөн алдааг засах, VirtIO драйверуудыг хэрэгжүүлснээр одоо байгаа virtio-drivers багцын функцийг өргөжүүлэх ажлыг хийсэн. Платформоос гадна Android Тодорхойлсон багцуудыг хамгаалагдсан орчинд (TEE, Trusted Execution Environment) өгөгдөл дамжуулах, хадгалах, боловсруулах бүрэлдэхүүн хэсгүүдийг боловсруулдаг Oak төсөлд ашигладаг.
pVM гипервизор нь ачаалах процессын эхэн үед хяналтыг авч, санах ойн бүрэн тусгаарлалтыг хангадаг. виртуал машинууд мөн хост орчин нь хост системийг мэдрэмтгий өгөгдөл боловсруулагддаг хамгаалагдсан виртуал машинуудад хандахаас сэргийлдэг. pvmfm (Protected Virtual Machine Firmware) програм хангамж нь виртуал машин ажиллаж эхэлмэгц шууд хяналтыг авч, үүсгэсэн орчныг шалгаж, бүрэн бүтэн байдлын асуудал илэрсэн тохиолдолд ачаалалтыг зогсоох эсэхийг шийддэг эсвэл итгэлцлийн гинжин хэлхээ баталгаажсан тохиолдолд зочин системийн ачаалах гэрчилгээг үүсгэдэг.
Rust дахь рефакторинг нь системийн бүрэлдэхүүн хэсгүүдийн аюулгүй байдлыг хангахын тулд Google-ийн ашигладаг "хоёрын дүрэм"-ийг илүү хялбар бөгөөд аюулгүй дагаж мөрдөх боломжийг олгодог. AndroidЭнэ дүрмийн дагуу нэмэгдсэн аливаа код нь гурван нөхцөлийн хоёроос илүүгүйг хангасан байх ёстой: найдваргүй оролтын өгөгдлийг боловсруулах, аюултай програмчлалын хэл (C/C++) ашиглах, өндөр эрхтэйгээр ажиллуулах. Энэ дүрэм нь гадаад өгөгдлийг боловсруулах кодыг хамгийн бага эрхтэйгээр (тусгаарлагдсан) болгох эсвэл аюулгүй програмчлалын хэлээр бичих ёстой гэсэн үг юм. Google-ийн статистик мэдээллээр, тодорхойлогдсон бүх аюултай эмзэг байдлын ойролцоогоор 70% нь ... Android, санах ойтой ажиллах үед гарсан алдаанаас үүдэлтэй.
Rust нь санах ойн аюулгүй байдалд анхаарлаа хандуулж, ашиглалтын дараа үнэгүй, буфер хэтрүүлэх зэрэг асуудлуудаас үүдэлтэй эмзэг байдлын эрсдлийг бууруулдаг. Rust нь лавлагаа шалгах, объектын өмчлөлийг хянах, объектын ашиглалтын хугацааг (хамрах хүрээ) бүртгэх, мөн санах ойд нэвтрэх эрхийг баталгаажуулах замаар хөрвүүлэх үед санах ойн аюулгүй байдлыг хангадаг. Rust нь бүхэл тооноос хэтрэхээс хамгаалж, ашиглахын өмнө хувьсагчийн утгыг заавал эхлүүлэх шаардлагатай, стандарт номын сан дахь алдааг илүү сайн зохицуулж, өөрчлөгддөггүй лавлагаа болон хувьсагчийн үзэл баримтлалыг анхдагчаар хэрэгжүүлдэг бөгөөд логик алдааг багасгахын тулд хүчтэй статик бичвэрийг санал болгодог.
Rust дахь драйверууд гэх мэт доод түвшний бүрэлдэхүүн хэсгүүдийг боловсруулахад тулгардаг нэг бэрхшээл бол нүцгэн заагчийг аюултай горимд ашиглах хэрэгцээ юм. Rust нь програмын хуваарилсан санах ойг харгалзан бүтээгдсэн бөгөөд техник хангамжийн давхардалгүйгээр ажилладаг код нь хуваалцсан санах ой болон MMIO-д хандах ёстой. Rust-ийн нүцгэн заагчтай харьцах чадвар нь одоогоор маш их хэрэгцээтэй байгаа боловч offset_of, slice_ptr_get, slice_ptr_len макросын дэмжлэг тогтворжсоны дараа энэ нь сайжирна.
Бусад анхаарал татахуйц дутагдал нь лавлагаа үүсгэхгүйгээр нүцгэн заагчаар бүтцийн талбарууд болон массивын индексүүдэд хандах синтаксийг сайжруулах шаардлага, мөн тодорхойгүй үйлдэл үүсгэж болох, хөрвүүлэгчээр шалгах боломжгүй аюултай үйлдлүүдэд аюулгүй савлагаа үүсгэх хязгаарлалт зэрэг багтана. Жишээлбэл, санах ойн хуудасны хүснэгттэй ажиллахад зориулж ийм боодол үүсгэх боломжгүй, учир нь програмын нэг хэсэгт хуудасны зураглал хийх нь бусад хэсгүүдэд нөлөөлж болно.
Үүссэн кодын хэмжээсийн тухайд, хуучин pVM програмын хувилбар нь 220 KB, шинэ нь 460 KB эзэлдэг. Гэсэн хэдий ч дахин бичсэн хувилбар нь шинэ боломжуудыг нэмсэн бөгөөд энэ нь ачаалах явцад ашигласан бусад бүрэлдэхүүн хэсгүүдийг арилгах боломжийг бидэнд олгосон. Үүний үр дүнд бүх хуучин болон шинэ ачаалах бүрэлдэхүүн хэсгүүдийн нийт хэмжээ харьцуулах боломжтой болсон. Хэмжээ нь гүйцэтгэлээс илүү чухал үед хөрвүүлэгчид хэмжээг оновчтой болгох нэмэлт горимуудыг идэвхжүүлж, шаардлагагүй хамаарлыг арилгах, мөр форматлах хэрэгслийг ашиглахгүй байх замаар Си хэл дээрхтэй харьцуулж болохуйц үр дүнд хүрч болохыг тэмдэглэв.
Түүнчлэн, TEE (Итгэмжлэгдсэн гүйцэтгэх орчин)-ыг хангадаг Trusty үйлдлийн системд Rust хэлээр бичигдсэн итгэмжлэгдсэн програмуудыг (Итгэмжлэгдсэн програм) ажиллуулах чадварыг хэрэгжүүлэх ажлыг үргэлжлүүлэх талаар дурдсан. Android, зэрэгцээ гүйцэтгэсэн Android тусдаа, тусгаарлагдсан орчинд ижил процессор дээр ажилладаг. Trusty нь Pixel төхөөрөмжүүдэд ашиглагддаг бөгөөд номын сан болон системийн бүрэлдэхүүн хэсгүүдэд Rust-ийг аль хэдийн ашигладаг (цөм нь C хэл дээр хэвээр байна).
Эх сурвалж: opennet.ru
