K kódové základně jádra Linux, která tvoří základ pro verzi 6.18, byla přijata implementace mechanismu meziprocesové komunikace Binder, napsaného v jazyce Rust. Binder se používá v Android organizovat interakci mezi procesy a vzdálenými voláními metod (jeden proces Android může volat metodu nebo funkci v jiném procesu Android, s využitím Binderu k identifikaci, vyvolání a předávání argumentů mezi procesy). Binderův kód byl přepsán v Rustu jako součást projektu na zlepšení zabezpečení, podporu bezpečných programovacích postupů a zvýšení efektivity detekce problémů s pamětí v Android (přibližně 70 % všech nebezpečných zranitelností identifikovaných v Android, způsobené chybami při práci s pamětí).
Použití Rustu nám umožnilo vyřešit několik problémů, se kterými se vývojáři Binderu setkali, včetně chyb souvisejících s počítáním referencí, zamykáním a kontrolou hranic, a výrazně snížit složitost zpracování chyb. Implementace Binderu v Rustu je funkčně identická s původní implementací v jazyce C a splňuje všechny testy AOSP (Android Open-Source Project) a lze jej použít k vytvoření pracovních edic Android-firmware. Navzdory pokročilým funkcím a podpoře objektů se složitou sémantikou vlastnictví je ovladač Rust menší než verze v jazyce C – 5.5 tisíce řádků kódu oproti 5.8 tisíci.
V popisu commitu autor uvádí následující důvody pro přepsání Binderu:
- Binder se vyvíjí již 15 let a během této doby se jeho funkčnost a komplexnost výrazně zvýšily – projekt se nachází na průsečíku všech jeho komponent. Android a pokrývá řadu úkolů nad rámec IPC:
- správná analýza a transformace obsahu transakcí, které mohou obsahovat několik objektů různých typů (např. ukazatelů, deskriptorů souborů), které spolu vzájemně interagují;
- řídit velikost poolů vláken v uživatelském prostoru a zajistit, aby transakce byly přiřazovány vláknům tak, aby se zabránilo zablokování, když pool vyčerpá všechna vlákna;
- Sledování čítačů referencí objektů sdílených mezi procesy, správné šíření změn čítačů referencí mezi procesy;
- Zpracování více chybových scénářů a kombinování 13 různých zámků, 7 referenčních čítačů a atomických proměnných. Tyto úkoly musí provádět co nejrychleji a nejpřesněji.
- Starší kód nahromadil značný technický dluh, což komplikovalo jak detekci chyb, tak další vývoj. Jádro například obsahovalo rozsáhlé funkce přesahující tisíc řádků kódu, sporné metody ošetřování chyb a složité struktury.
- Binder je bezpečnostně kritická komponenta Android, protože prvky platformy běžící v izolovaných sandboxových prostředích, jako je proces vykreslování v Chromu a SW Codec, k němu mají přímý přístup a zranitelnost v Binderu by umožňovala obejít sandbox. Vysoká složitost spolu s technickým zadlužením značně ztěžuje udržování vysoké úrovně zabezpečení v Binderu.
Zdroj: opennet.ru
