Google Android-də istifadə olunan pvmfm proqram təminatını Rust-da yenidən yazdı

Android platformasının vacib proqram komponentlərinin təhlükəsizliyini gücləndirmək səylərinin bir hissəsi olaraq, Google, Android Virtualization Framework-dən pVM hipervizoru tərəfindən işə salınan virtual maşınları işlətmək üçün istifadə edilən pvmfm proqram təminatını Rust dilində yenidən yazıb. Əvvəllər proqram təminatı C dilində yazılırdı və əvvəllər yaddaş problemlərindən qaynaqlanan zəifliklərin olduğu aşkar edilmiş U-Boot bootloader-in üzərinə tətbiq olunurdu.

Rust-da yenidən yazılmış proqram təminatı Android 14-ə daxil edilib və proqram təminatının hazırlanması zamanı yaradılan universal kitabxanalar qutu paketləri kimi qablaşdırılıb və Rust icmasına bağışlanıb. Məsələn, smccc paketi ARM-in PSCI (Power State Coordination Interface) interfeyslərini və SMCCC (SMC Calling Convention) çağırışlarını, eləcə də yaddaş səhifəsi cədvəllərini manipulyasiya etmək üçün aarch64 səhifələmə paketini dəstəkləmək üçün dərc edilib. VirtIO drayverlərini tətbiq edən mövcud virtio-driver paketinin səhvlərini düzəltmək və funksionallığını genişləndirmək üçün də işlər aparılıb. Android platformasına əlavə olaraq, bu paketlər etibarlı icra mühitlərində (TEE) məlumatların ötürülməsi, saxlanması və emalı üçün komponentlər hazırlayan Oak layihəsində də istifadə olunur.

pVM hipervisoru, açılış prosesinin əvvəlində nəzarəti ələ keçirir və tam yaddaş izolyasiyasını təmin edir. virtual maşınlar və host mühiti, host sisteminin həssas məlumatların emal edildiyi qorunan virtual maşınlara daxil olmasının qarşısını alır. pvmfm (Qorunan Virtual Maşın Proqram Təminatı) proqram təminatı virtual maşın işə düşdükdən dərhal sonra nəzarəti ələ keçirir, yaradılan mühiti yoxlayır və bütövlük problemləri aşkar edildikdə açılışı dayandırmaq və ya etibar zənciri təsdiqlənərsə, qonaq sistemi üçün açılış sertifikatı yaratmaq barədə qərar verir.

Rust-da Refaktorinq, Google-ın Android sistem komponentlərinin təhlükəsizliyini qorumaq üçün istifadə etdiyi "iki qaydası"na daha sadə və daha təhlükəsiz şəkildə riayət etməyə imkan verir. Bu qayda, əlavə edilmiş hər hansı bir kodun üç şərtdən ikisindən çoxuna cavab verməməsini tələb edir: etibarsız girişin işlənməsi, təhlükəli proqramlaşdırma dilindən (C/C++) istifadə edilməsi və yüksək imtiyazlar ilə icra edilməsi. Bu qayda həmçinin xarici məlumatları emal edən kodun ya minimum imtiyazlara qədər azaldılmasını (təcrid olunmuş), ya da təhlükəsiz proqramlaşdırma dilində yazılmasını nəzərdə tutur. Google statistikasına görə, Android-də müəyyən edilmiş bütün təhlükəli zəifliklərin təxminən 70%-i yaddaş idarəetmə səhvlərindən qaynaqlanır.

Rust yaddaş təhlükəsizliyinə diqqət yetirir və istifadədən sonra boşalma və buferin həddindən artıq yüklənməsi kimi problemlərin yaratdığı zəifliklər riskini azaldır. Rust, istinad yoxlaması, obyekt sahibliyinin izlənməsi və obyektin ömrünün (əhatə dairəsinin) uçotu, eləcə də işləmə zamanı yaddaşa girişin təsdiqlənməsi vasitəsilə kompilyasiya zamanı yaddaş təhlükəsizliyini təmin edir. Rust həmçinin tam ədəd daşmalarından qorunma təmin edir, istifadədən əvvəl dəyişən dəyərlərin məcburi başlanğıcını tələb edir, standart kitabxanadakı səhvləri daha yaxşı idarə edir, dəyişməz istinadlar və dəyişənlər konsepsiyasını standart olaraq tətbiq edir və məntiq səhvlərini minimuma endirmək üçün güclü statik yazı təklif edir.

Rust-da drayverlər kimi aşağı səviyyəli komponentlər hazırlanarkən qarşılaşılan çətinliklərdən biri də çılpaq göstəriciləri təhlükəli rejimdə idarə etmək ehtiyacıdır. Rust, proqram tərəfindən ayrılmış yaddaş nəzərə alınmaqla hazırlanmışdır, aparat örtükləri olmadan işləyən kod isə ortaq yaddaşa və MMIO-ya daxil olmalıdır. Rust-ın çılpaq göstəriciləri idarə etmək imkanları hazırda çox azdır, lakin offset_of, slice_ptr_get və slice_ptr_len makrosları üçün dəstək sabitləşdikdən sonra bu, yaxşılaşmalıdır.

Digər diqqətəlayiq çatışmazlıqlar arasında istinadlar yaratmadan çılpaq göstəricilər vasitəsilə struktur sahələrinə və massiv indekslərinə daxil olmaq üçün təkmilləşdirilmiş sintaksisə ehtiyac, eləcə də təyin olunmamış davranışa səbəb ola bilən və kompilyator tərəfindən yoxlanıla bilməyən təhlükəli əməliyyatlar üçün təhlükəsiz örtüklərin yaradılmasındakı məhdudiyyətlər var. Məsələn, proqramın bir hissəsində səhifə xəritələşdirilməsi digər hissələrə təsir göstərə biləcəyi üçün yaddaş səhifə cədvəlləri ilə əməliyyatlar üçün bu cür örtüklərin yaradılması mümkün deyil.

Yaranan kod ölçüsünə gəldikdə, köhnə pVM proqram təminatı versiyası 220 KB, yenisi isə 460 KB tuturdu. Lakin, yenidən yazılmış versiyaya yeni xüsusiyyətlər əlavə edildi ki, bu da yükləmə zamanı istifadə olunan bəzi digər komponentləri aradan qaldırmağa imkan verdi. Nəticədə, bütün köhnə və yeni yükləmə komponentlərinin ümumi ölçüsü müqayisə edilə bilən idi. Qeyd olunur ki, ölçü performansdan daha vacib olduqda, kompilyatorda əlavə ölçü optimallaşdırma rejimlərini aktivləşdirməklə, lazımsız asılılıqları aradan qaldırmaqla və sətir formatlama vasitələrindən istifadə etməməklə C dilindəki nəticələrə bənzər nəticələr əldə etmək olar.

Bundan əlavə, Trusty əməliyyat sistemində Rust dilində yazılmış etibarlı tətbiqlərin işə salınması üzərində iş davam etdirilir ki, bu da Android üçün eyni prosessorda ayrı, təcrid olunmuş mühitdə Android ilə paralel işləyən Etibarlı İcra Mühiti (TEE) təmin edir. Trusty, Pixel cihazlarında istifadə olunur və artıq Rust-dan kitabxanalarda və sistem komponentlərində istifadə edir (nüvə C dilində qalır).

Mənbə: opennet.ru

Добавить комментарий