В основния код на Linux, на който е базирана версия 6.18, е приета реализация на механизма за междупроцесно взаимодействие Binder, написан на Rust. Binder се използва в Android за организиране на взаимодействието между процесите и за отдалечено извикване на методи (един Android процес може да извика метод или функция в друг Android процес, използвайки Binder за идентификация, извикване и предаване на аргументи между процесите). Кодът на Binder беше пренаписан на Rust в рамките на проект за подобряване на сигурността, насърчаване на безопасното програмиране и засилване на откритията на проблеми с паметта в Android (около 70% от всички опасни уязвимости, открити в Android, са причинени от грешки в работата с паметта).
Използването на Rust позволи разрешаването на някои от проблемите, с които се сблъскваха разработчиците на Binder, включително грешки, свързани с броенето на референции, блокировки и проверка на граници, както и значително намаляване на сложността при обработката на грешки. Реализацията на Binder на Rust е функционално аналогична на оригиналната версия на C, преминава всички тестове на AOSP (Android Open-Source Project) и може да се използва за създаване на работещи варианти на Android фърмуер. Независимо от напредналите възможности и поддръжката на обекти със сложна семантика на притежание, драйверът на Rust е по-малък от версията на C — 5.5 срещу 5.8 хиляди реда код.
В описанието на комита авторът споменава следните мотиви за пренаписването на Binder:
- Binder съществува вече 15 години и през това време неговата функционалност и сложност значително нараснаха — проектът е на пресечната точка на всички компоненти на Android и обхваща множество задачи, които излизат извън IPC:
- коректен анализ и трансформация на съдържанието на транзакции, които могат да съдържат няколко обекта от различни типове (например, указатели, файлови дескриптори), взаимодействуващи помежду си;
- контрол на размера на пуловете от потоци в потребителското пространство и осигуряване на назначаването на транзакции на потоци по начин, който да избегне взаимни блокировки при изчерпване на потоците в пула;
- проследяване на броячите на референции на обекти, споделяни от няколко процеса, коректно пренасочвайки промените на броячите на референции между процесите;
- обработка на множество сценарии за възникване на грешки и комбинация от 13 различни блокировки, 7 броячи на връзки и атомарни променливи. При това, подобни задачи трябва да се извършват максимално бързо и коректно.
- В стария код се е натрупал значителен технически дълг, който усложнява както търсенето на грешки, така и последващото разработване. Например, в ядрото се срещат големи функции с над хиляда реда код, съмнителни методи за обработка на грешки и заплетени структури.
- Binder е критичен компонент по отношение на безопасността на Android, тъй като елементи от платформата, работещи в изолирани sandbox-среда, като процеса на рендериране в Chrome и SW Codec, имат директен достъп до него, а уязвимост в Binder би могла да заобиколи изолацията. Високата сложност, заедно с техническия дълг, значително усложняват поддържането на висок ниво на безопасност в Binder.
Източник: opennet.ru
