В ядро Linux 6.18 принята реализация Binder IPC для Android, написанная на Rust

В кодовую базу ядра 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.
Release. Ссылка here.