V kodo osnovne zasnove Linuxa, na podlagi katere se oblikuje izdaja 6.18, je sprejeta implementacija mehanizma medprocesnega komuniciranja Binder, napisana v jeziku Rust. Binder se uporablja v Androidu za organizacijo interakcije med procesi in oddaljenim klicem metod (en proces Android lahko pokliče metodo ali funkcijo v drugem procesu Android, pri čemer uporablja Binder za identifikacijo, klic in prenos argumentov med procesi). Koda Binderja je bila predelana v Rust v okviru projekta za krepitev varnosti, promocijo tehnik varnega programiranja in povečanje učinkovitosti odkrivanja težav pri delu s pomnilnikom v Androidu (približno 70 % vseh nevarnih ranljivosti, odkritih v Androidu, je posledica napak pri delu s pomnilnikom).
Uporaba Rusta je omogočila reševanje nekaterih težav, s katerimi so se srečevali razvijalci Binderja, vključno z napakami, povezanimi s štetjem referenc, zaklepi in preverjanjem meja, ter močno zmanjšala kompleksnost obravnave napak. Implementacija Binderja v Rustu je funkcionalno enaka prvotni različici v jeziku C, prehaja vse teste AOSP (Android Open-Source Project) in se lahko uporablja za ustvarjanje delovnih izdaj Android firmware. Kljub naprednim možnostim in podpori objektom s kompleksno semantiko lastništva je bil gonilnik v Rustu manjši od različice v jeziku C — 5.5 proti 5.8 tisoč vrstic kode.
V opisu commit-a avtor omenja naslednje razloge za prepis Binderja:
- Binder se razvija že 15 let in v tem času so se njegova funkcionalnost in kompleksnost znatno povečali — projekt se nahaja na stičišču vseh komponent Androida in pokriva številne naloge, ki presegajo IPC:
- pravilen pregled in pretvorba vsebine transakcij, ki lahko vsebujejo več objektov različnih tipov (na primer, kazalce, datotečne deskriptorje), ki delujejo drug z drugim;
- nadzor velikosti bazenov niti v uporabniškem prostoru in zagotavljanje dodeljevanja transakcij nitim na način, ki preprečuje medsebojno zaklepanje ob izčrpanju niti v bazenu;
- sledenje števcem referenc objektov, ki jih skupaj uporabljajo več procesov, s pravilnim prenosom sprememb števcov referenc med procesi;
- obdelava številnih scenarijev pojava napak in združevanje 13 različnih zaklepanja, 7 števcev povezav in atomarnih spremenljivk. Pri tem mora opraviti takšna opravila čim hitreje in pravilneje.
- V stari kodi se je nabral opazen tehnični dolg, ki je oteževal tako iskanje napak kot nadaljnji razvoj. Na primer, v jedru se srečujemo z velikimi funkcijami, ki presegajo tisoč vrstic kode, dvomljivimi metodami ravnanja z napakami in zapletenimi struktura.
- Binder je kritična komponenta Androida z vidika varnosti, saj imajo elementi platforme, ki delujejo v izoliranih peskovnikih, kot sta proces risanja v Chromu in SW Codec, neposreden dostop nanj, medtem ko bo ranljivost v Binderju omogočila obvoz izolacije. Visoka kompleksnost skupaj s tehničnim dolgom močno otežujejo vzdrževanje visoke ravni varnosti v Binderju.
Izvor: opennet.ru
