En 1991, le premier kernel Linux faisait son apparition grâce au finlandais Linus Benedict Torvalds jusqu’à devenir un standard dans le monde du web et du cloud. Aujourd’hui, ce sont plus de 8 millions de changements qui sont acceptés toutes les heures dans le noyau et plus de 4500 lignes de code qui s’enrichissent quotidiennement. Ce début d’année est l’occasion de vous proposer une rapide rétrospective des récentes avancées majeures du kernel. Des technologies de fond qui, à n’en pas douter, ne manqueront pas d’impacter les futurs développements.
1. IO_URING (Input Output Userspace Ring)
IO_Uring est une nouvelle interface system (syscall) permettant d'effectuer des opérations d'I/O asynchrone sur des périphériques de stockage. Lorsqu'on a besoin de performances en I/O élevées, les interfaces synchrones que sont read(2)/write(2) sont souvent insuffisantes. L'API POSIX définit bien des interfaces asynchrones que sont aio_read(3) et aio_write(3) mais leurs implémentations sont souvent compliquées et les performances associées médiocres.
IO_uring est une nouvelle interface pour effectuer ces requêtes asynchrones. Elle propose deux buffers circulaires non bloquants entre l'userspace et le kernel. L'un sert pour les soumissions (requêtes écrites par l'userspace et lues par le kernel) et l'autre pour la complétion (réponses/acquittements écrits par le kernel et lus par l'userspace). Avec cette nouvelle interface et un noyau linux récent, il est maintenant possible d'atteindre le chiffre faramineux de 10 millions d’opérations d'I/O par seconde sur un seul cœur (voir : https://twitter.com/axboe/status/1452689372395053062).
Si vous voulez en savoir plus, voici quelques liens pour approfondir le sujet :
- Documentation d’introduction: https://kernel.dk/io_uring.pdf
- The rapid growth of io_uring: https://lwn.net/Articles/810414/
- Documentation pour la librairie liburing: https://unixism.net/loti/ref-liburing/index.html
2. eBPF
Epbf est une technologie du noyau Linux qui peut exécuter des programmes isolés (sandbox) dans l'espace noyau. Elle est utilisée pour étendre de manière sûre et efficace les capacités du noyau sans avoir à modifier le code source de celui-ci ou à charger des modules complémentaires. Ceci offre une nouvelle flexibilité pour customiser le fonctionnement du noyau Linux sans avoir à gérer le coût important de maintenance d’un fork ou de modules out-of-tree.
Historiquement, le système d'exploitation a toujours été un endroit idéal pour mettre en œuvre des fonctionnalités d'observabilité, de sécurité ou d'optimisation réseaux en raison de la capacité privilégiée du noyau à superviser et contrôler l'ensemble du système.
Epbf est aujourd'hui utilisée pour faire entre autre :
- De la cybersécurité en monitorant l'exécution du système dans son ensemble (filtrage appel système, filtrage réseau, monitoring des processus...). Voir par exemple le projet Falco
- De l'optimisation et du filtrage réseau. Voir par exemple le projet Cilium
Les deux exemples ci-dessus sont très orientés IT/Cloud mais vu la puissance de cette technologie, ce n'est qu'une question de temps avant de la retrouver sur des projets linux embarqués. Avec l'importance que les sujets de connectivité et de cybersécurité prennent, il est sûr qu'Epbf fera partie des solutions à envisager même dans les environnements contraints tel que l’embarqué.
Pour plus d'information sur le sujet, voir : https://ebpf.io.
3. Kernel Self Protection Project
La robustification du noyau linux (hardening) suit son cours. L'année 2021 aura été riche en nouveautés de ce côté-là. Il est difficile de faire une liste exhaustive, mais si cela vous intéresse, je vous invite à regarder ici : - https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project - https://outflux.net/blog/archives/category/security/ (blog de Kees Cook, le mainteneur principal de KSPP).
Si je ne devais retenir que deux contre-mesures récentes apportées par le projet KSPP dans le noyau linux, ça serait :
1. Control Flow Integrity:
CFI est une technique de sécurité informatique qui empêche une grande variété d'attaques de logiciels malveillants dont notamment les attaques évoluées de type Return Oriented Programming (ROP). Il s'agit de rajouter des vérifications au runtime du flux d’exécution du programme afin d’identifier et d'empêcher les tentatives de détournements. Bien que cette technologie soit disponible depuis 2018 pour le noyau Android, il aura fallu attendre 2021 et la version 5.13 du noyau pour avoir une implémentation disponible dans une version mainline.
Pour plus d'informations : https://lwn.net/Articles/810077/.
2. Memory detection using Armv8.5 MTE (Hardware KernelAddressSANitizer):
Kasan est une technique du noyau linux qui permet de détecter les problèmes de corruptions mémoire tels que les buffer overflow ou les use-after-free. Kasan repose sur le principe du "tag mémoire" :
- La mémoire est divisée en granules de taille fixe.
- Chaque granule de mémoire a un tag associé.
- Chaque pointeur a aussi un tag attribué.
- Lors de l'allocation, la mémoire et le pointeur obtiennent le même tag aléatoire.
- Lors du déréférencement du pointeur, le tag du pointeur doit correspondre au tag de la mémoire.
Via une implémentation logicielle, l’overhead est très important puisque des instructions logicielles doivent être ajoutées à chaque accès mémoire pour vérifier les tags avec comme conséquences :
- +50% pour la taille de code
- 2x plus d'utilisation mémoire
- 2x plus de temps CPU
Vu l'overhead conséquent, cette méthodologie est généralement utilisée en environnement de test et désactivée en production. La spécification d'Armv8.5-A (qui est reprise dans Armv9 dont les processeurs devraient être intégrés dans les produits finis courant 2022) permet une implémentation hardware de cette technologie. En effet sur Arm64, l'option MTE (Memory Tagging Extension) permet que seuls les 56 bits de poids faibles soit utilisés pour l'adresse mémoire virtuelle, laissant de disponibles 8 bits dans lesquels on peut donc insérer le tag directement dans le pointeur mémoire lui-même.
MTE fournit donc :
- Un moyen de stocker le pointeur et son tag mémoire.
- Des instructions pour les manipuler.
- Une vérification hardware automatique des tags.
Avec cela l'overhead mémoire n’est plus que de 3% (stockage des tags mémoires) et l'overhead cpu inférieur à 10%. Il devient donc possible de les activer en production. Reste à voir combien de temps les processeurs ARM V9 mettront à passer du monde de la téléphonie aux autres secteurs industriels pour pouvoir en bénéficier.
Pour plus d'informations :
Nous venons de voir dans cet article les différentes technologies majeures ajoutées au noyau Linux ces dernières années et qui sont de véritables “game-changer”. Chez Ausy nous avons nul doute qu’elles vont continuer d’évoluer et irradier dans l’écosystème linux entier, de l’IT à l’embarqué. Ce sont des sujets que nous suivons attentivement afin de comprendre les impacts et les nouvelles approches qui vont en découler pour répondre de manière plus efficace aux prochains enjeux auxquels nous devrons faire face pour nos clients : cybersécurité, performance, observabilité …