Dans le code de base du noyau Linux, sur lequel est basé la version 6.18, l'implémentation du mécanisme de communication inter-processus Binder, écrite en Rust, a été adoptée. Binder est utilisé sur Android pour organiser la communication entre les processus et l'appel de méthodes à distance (un processus Android peut appeler une méthode ou une fonction dans un autre processus Android en utilisant Binder pour identifier, invoquer et transmettre des arguments entre les processus). Le code de Binder a été réécrit en Rust dans le cadre d'un projet visant à renforcer la sécurité, à promouvoir les pratiques de programmation sécurisée et à améliorer l'efficacité de la détection des problÚmes de gestion de la mémoire sur Android (environ 70 % de toutes les vulnérabilités critiques détectées sur Android sont causées par des erreurs de gestion de la mémoire).
L'utilisation de Rust a permis de rĂ©soudre certains problĂšmes auxquels Ă©taient confrontĂ©s les dĂ©veloppeurs de Binder, y compris les erreurs liĂ©es au comptage des rĂ©fĂ©rences, aux blocages et Ă la vĂ©rification des limites, ainsi qu'Ă rĂ©duire considĂ©rablement la complexitĂ© de la gestion des erreurs. L'implĂ©mentation de Binder en Rust est fonctionnellement Ă©quivalente Ă la version originale en C, passe tous les tests AOSP (Android Open-Source Project) et peut ĂȘtre utilisĂ©e pour crĂ©er des versions fonctionnelles des firmwares Android. MalgrĂ© des capacitĂ©s avancĂ©es et le support d'objets avec une sĂ©mantique complexe de possession, le pilote en Rust est plus petit que la version en C â 5,5 par rapport Ă 5,8 milliers de lignes de code.
Dans la description du commit, l'auteur mentionne les motivations suivantes pour la réécriture de Binder :
- Binder, qui existe depuis 15 ans, a vu sa fonctionnalitĂ© et sa complexitĂ© augmenter considĂ©rablement au fil du temps â le projet se situe Ă la jonction de tous les composants d'Android et couvre de nombreuses tĂąches, allant au-delĂ de l'IPC :
- analyse et transformation correctes du contenu des transactions, qui peuvent contenir plusieurs objets de types différents (par exemple, des pointeurs, des descripteurs de fichiers), interagissant les uns avec les autres ;
- contrÎle de la taille des pools de threads dans l'espace utilisateur et garantie de l'attribution des transactions aux threads de maniÚre à éviter les blocages mutuels lors de l'épuisement des threads dans le pool ;
- suivi des compteurs de références des objets partagés par plusieurs processus, en transmettant correctement les modifications des compteurs de références entre les processus ;
- Le traitement de nombreux scénarios d'erreurs et la combinaison de 13 différents verrouillages, 7 compteurs de liens et de variables atomiques. Dans ce cas, il doit exécuter de telles tùches aussi rapidement et correctement que possible.
- Le code ancien accumule une dette technique significative, ce qui complique la recherche d'erreurs ainsi que le développement ultérieur. Par exemple, dans le noyau, il existe de grandes fonctions de plus de mille lignes de code, des méthodes de gestion des erreurs douteuses et des structures embrouillées.
- Binder est un composant critique en termes de sécurité dans Android, car les éléments de la plateforme fonctionnant dans des environnements sandbox isolés, comme le processus de rendu dans Chrome et SW Codec, y ont un accÚs direct, et une vulnérabilité dans Binder permettrait de contourner cette isolation. La complexité élevée, associée à la dette technique, rend le maintien d'un niveau de sécurité élevé dans Binder trÚs difficile.
Source : opennet.ru
