Do kódu jádra Linux, na jehož základě vzniká verze 6.18, byla přijata implementace mechanismu meziprocesní komunikace Binder napsaná v jazyce Rust. Binder se používá v Androidu pro organizaci interakce mezi procesy a vzdáleného volání metod (jeden proces Android může zavolat metodu nebo funkci v jiném procesu Android prostřednictvím Bindera, který se používá k identifikaci, volání a předávání argumentů mezi procesy). Kód Bindera byl přepracován do Rustu jako součást projektu zaměřeného na zvýšení bezpečnosti, propagaci metod bezpečného programování a zlepšení účinnosti odhalování problémů s pamětí v Androidu (přibližně 70 % všech nebezpečných zranitelností odhalených v Androidu je způsobeno chybami při práci s pamětí).
Použití Rustu umožnilo vyřešit některé problémy, se kterými se vývojáři Bindera potýkali, včetně chyb spojených s počítáním odkazů, zámky a kontrolou hranic, a také výrazně snížilo složitost zpracování chyb. Implementace Bindera v Rustu je funkčně ekvivalentní původní verzi v C, prochází všemi testy AOSP (Android Open-Source Project) a může být použita k vytváření funkčních verzí Android firmware. Přestože má pokročilé možnosti a podporu objektů se složitou sémantikou vlastnictví, řidič v Rustu je menší než varianta v C – 5,5 oproti 5,8 tisícům řádků kódu.
V popisu commitu autor zmiňuje následující důvody pro přepisování Bindera:
- Binder se vyvíjí už 15 let a za tuto dobu se jeho funkčnost a složitost značně zvýšily – projekt se nachází na pomezí všech komponentů Android a pokrývá řadu úkolů, které přesahují rámec IPC:
- správná analýza a transformace obsahu transakcí, které mohou obsahovat více objektů různých typů (například ukazatele, souborové deskriptory) interagujících mezi sebou;
- řízení velikosti poolů vláken v uživatelském prostoru a zajištění přidělování transakcí vláknům tak, aby se předešlo vzájemným zámkům při vyčerpání vláken v poolu;
- sledování počítadel odkazů objektů, které jsou sdílené mezi několika procesy, a správné přenášení změn počítadel odkazů mezi procesy;
- zpracování mnoha scénářů vzniku chyb a kombinace 13 různých zámků, 7 počítadel odkazů a atomových proměnných. Přitom by měl tyto úkoly vykonávat co nejrychleji a nejpřesněji.
- Ve starém kódu se nahromadila značná technická zadluženost, která ztěžovala jak hledání chyb, tak i další vývoj. Například v jádru se vyskytují velké funkce s více než tisíci řádky kódu, sporné metody zpracování chyb a komplikované struktury.
- Binder je z hlediska bezpečnosti kritickou součástí Androidu, protože prvky platformy pracující v izolovaných sandboxových prostředích, jako je vykreslovací proces v Chromu a SW Codec, mají k němu přímý přístup, a zranitelnost v Binderu by mohla umožnit obcházení izolace. Vysoká složitost v kombinaci s technickým dluhem značně ztěžují udržení vysoké úrovně bezpečnosti v Binderu.
Zdroj: opennet.ru
