A la base de código del kernel Linux, que constituye la base de la versión 6.18, se adoptó la implementación del mecanismo de comunicación entre procesos Binder, escrito en el lenguaje Rust. Binder se utiliza en Android para organizar la interacción entre procesos y llamadas a métodos remotos (un proceso Android puede llamar a un método o función en otro proceso Android, utilizando Binder para identificar, invocar y pasar argumentos entre procesos). El código de Binder fue reescrito en Rust como parte de un proyecto para mejorar la seguridad, promover prácticas de programación seguras y mejorar la eficiencia de la detección de problemas de memoria en Android (aproximadamente el 70% de todas las vulnerabilidades peligrosas identificadas en Android, causado por errores al trabajar con la memoria).
El uso de Rust nos permitió abordar varios problemas que los desarrolladores de Binder habían encontrado, incluidos errores relacionados con el conteo de referencias, el bloqueo y la comprobación de límites, y reducir significativamente la complejidad del manejo de errores. La implementación de Binder en Rust es funcionalmente idéntica a la implementación original en C y pasa todas las pruebas AOSP (Android Proyecto de código abierto) y se puede utilizar para crear ediciones funcionales. Android-firmware. A pesar de sus funciones avanzadas y su compatibilidad con objetos con semántica de propiedad compleja, el controlador Rust es más pequeño que la versión en C: 5.5 mil líneas de código frente a 5.8 mil.
En la descripción del commit, el autor menciona las siguientes razones para reescribir Binder:
- Binder lleva 15 años en desarrollo, y durante este tiempo su funcionalidad y complejidad han aumentado significativamente; el proyecto se encuentra en la intersección de todos los componentes. Android y abarca diversas tareas más allá de la comunicación entre procesos (IPC):
- análisis y transformación correctos del contenido de transacciones que pueden contener varios objetos de diferentes tipos (por ejemplo, punteros, descriptores de archivos) que interactúan entre sí;
- controlar el tamaño de los grupos de subprocesos del espacio de usuario y garantizar que las transacciones se asignen a los subprocesos de manera que se eviten bloqueos cuando el grupo se quede sin subprocesos;
- Seguimiento de los contadores de referencia de objetos compartidos entre procesos, propagando correctamente los cambios de los contadores de referencia entre procesos;
- Gestiona múltiples escenarios de error y combina 13 bloqueos diferentes, 7 contadores de referencia y variables atómicas. Debe realizar estas tareas con la mayor rapidez y precisión posibles.
- El código heredado había acumulado una deuda técnica considerable, lo que dificultaba tanto la detección de errores como el desarrollo posterior. Por ejemplo, el núcleo contenía funciones extensas que superaban las mil líneas de código, métodos de gestión de errores cuestionables y estructuras complejas.
- Binder es un componente crítico para la seguridad. AndroidDado que los elementos de la plataforma que se ejecutan en entornos aislados (sandbox), como el proceso de renderizado de Chrome y el códec de software (SW Codec), tienen acceso directo a ella, la vulnerabilidad en Binder permitiría eludir el entorno aislado. La alta complejidad, sumada a la deuda técnica, dificulta enormemente el mantenimiento de un alto nivel de seguridad en Binder.
Fuente: opennet.ru
