Do kódovej základne jadra Linux, na základe ktorej sa vytvára verzia 6.18, bola prijatá implementácia mechanizmu medzi-procesného interakcie Binder, napísaná v programovacom jazyku Rust. Binder sa používa v Androide na organizáciu interakcie medzi procesmi a vzdialeného volania metód (jeden proces Android môže volať metódu alebo funkciu v inom procese Android, pričom používa Binder na identifikáciu, volanie a prenos argumentov medzi procesmi). Kód Binder bol prepisovaný v Ruste v rámci projektu na zvýšenie bezpečnosti, propagáciu techník bezpečného programovania a zvýšenie účinnosti identifikovania problémov pri práci s pamäťou v Androide (asi 70 % zo všetkých nebezpečných zraniteľností odhalených v Androide je spôsobených chybami pri práci s pamäťou).
Použitie Rusta umožnilo riešiť niektoré problémy, s ktorými sa vyrovnávali vývojári Binder, vrátane chýb súvisiacich s počítaním odkazov, zablokovaniami a kontrolou hraníc, a zároveň výrazne znížiť zložitosti spracovania chýb. Implementácia Binder na Ruste je funkčne rovnaká ako jej pôvodná verzia v jazyku C, prechádza všetkými testami AOSP (Android Open-Source Project) a môže sa používať na vytváranie funkčných editorov Android firmvérov. Napriek pokročilým možnostiam a podpore objektov so zložitou semantikou vlastníctva, sa ovládač na Ruste ukázal byť menším ako varianta v C — 5.5 oproti 5.8 tisícom riadkov kódu.
V popise commitu autor spomína nasledujúce motívy pre prepisovanie Binder:
- Binder sa vyvíja už 15 rokov a za tento čas jeho funkčnosť a zložitost značně vzrástli — projekt sa nachádza na križovatke všetkých komponentov Android a pokrýva množstvo úloh, ktoré presahujú rámec IPC:
- správna analýza a konverzia obsahu transakcií, ktoré môžu obsahovať niekoľko objektov rôznych typov (napríklad ukazovatele, súborové popisovače), interagujúcich navzájom;
- kontrola veľkosti poolov vlákien v užívateľskom priestore a zabezpečenie priradenia transakcií vláknam tak, aby sa zabránilo vzájomnému zablokovaniu pri vyčerpaní vlákien v poole;
- sledovanie počítadiel odkazov na objekty, ktoré sú spoločné viacerými procesmi, správne preposielajúc zmeny počítadiel odkazov medzi procesmi;
- spracovanie mnohých scenárov vzniku chýb a kombinovanie 13 rôznych zámkov, 7 počítadiel odkazov a atomických premenných. Vykonávať takéto úlohy by mal maximálne rýchlo a presne.
- Starý kód nazbieral značný technický dlh, ktorý sťažoval hľadanie chýb aj ďalší vývoj. Napríklad sa v jadre nachádzajú rozsiahle funkcie s viac ako tisíc riadkami kódu, pochybnými metódami spracovania chýb a zamotanými štruktúrami.
- Binder je kritická z hľadiska bezpečnosti zložka Androidu, pretože prvky platformy, ktoré fungujú v izolovaných sandboxových prostrediach, ako je proces vykresľovania v Chrome a SW Codec, majú naň priamy prístup, a zraniteľnosť v Binderi by mohla obísť izoláciu. Vysoká zložitost v kombinácii s technickým dlhom výrazne sťažuje udržanie vysokej úrovne bezpečnosti v Binderi.
Zdroj: opennet.ru
