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