Analyse approfondie du nouveau appel système mseal de Linux
mseal est un nouvel appel système introduit dans le noyau Linux 6.10, qui fournit une fonctionnalité de « scellement de mémoire » pour la protection de la mémoire.
- Cet appel système rend immuables des zones mémoire pendant l’exécution d’un programme afin d’empêcher un attaquant de modifier les permissions mémoire ou de manipuler l’agencement de la mémoire de manière illicite.
mseal vise à empêcher l’exécution de code par des attaquants distants, contrairement à memfd_create et memfd_secret, qui servent à se défendre contre des attaquants locaux visant des données sensibles stockées en mémoire.
Fonctionnement de mseal
- La signature de fonction de
mseal est simple : elle reçoit une adresse de départ et une longueur, puis scelle la zone mémoire correspondante.
- La fonction
do_mseal verrouille la zone mémoire, puis check_mm_seal et apply_mm_seal vérifient la validité de la zone avant d’appliquer le scellement.
- Une zone mémoire scellée ne peut plus voir ses permissions modifiées, être démontée ou redimensionnée via des appels système comme
mprotect, munmap ou mremap.
Techniques d’attaque contrées par mseal
- Renforcement de NX :
mseal empêche de modifier les permissions d’exécution d’une VMA, ce qui bloque les attaques fondées sur le shellcode.
- Atténuation des attaques data-only basées sur l’unmapping :
mseal empêche la libération arbitraire et le remappage d’une zone mémoire, ce qui bloque les attaques data-only.
Renforcement logiciel avec mseal
mseal permet de renforcer la sécurité en scellant certaines zones mémoire d’un logiciel.
- Les développeurs peuvent utiliser
mseal pour sceller sélectivement des zones mémoire susceptibles de contenir des données non fiables.
- À mesure que l’intégration avec glibc progresse, une fonctionnalité de scellement automatique pourrait être ajoutée.
Résumé de GN⁺
mseal est une nouvelle fonctionnalité de sécurité introduite dans le noyau Linux, qui scelle des zones mémoire afin d’empêcher l’exécution de code par des attaquants distants.
- Contrairement aux mécanismes existants de protection mémoire, cet appel système empêche les changements de permissions mémoire et l’unmapping, ce qui bloque les attaques data-only.
- L’introduction de
mseal joue un rôle important dans le renforcement de la sécurité logicielle, et davantage de cas d’usage sont attendus via son intégration à glibc.
- Parmi les projets offrant des fonctionnalités similaires figurent
memfd_create et memfd_secret, dédiés à la protection de la mémoire.
1 commentaires
Commentaire Hacker News
Dans la liste de diffusion du noyau, il a été fait mention d’un « débat houleux ». Un commentaire se demande si un initié pourrait résumer les objections et les inquiétudes. La liste de diffusion a tendance à être évitée parce qu’elle est trop intense
Chrome veut cet appel, mais comme un attaquant peut remapper avec d’autres flags, il ne peut pas déverrouiller des pages scellées
Un lien vers l’article sur
mseal()et ses suites est fourniUne certaine tristesse est exprimée face au fait que, bien que les architectures modernes (x86_64) disposent de nombreuses fonctionnalités favorisant une programmation sûre, les systèmes d’exploitation doivent tout de même implémenter ce type d’appel
Une question est posée sur la possibilité de neutraliser l’appel système
msealavec une astuceLD_PRELOADLe prototype de
mseal()dans l’article n’est pas syntaxiquement correct. Le premier argument devrait êtreunsigned long start_addret nonunsigned start addrOpenBSD dispose de cette fonctionnalité depuis longtemps. La question est posée de savoir pourquoi elle n’arrive que maintenant sur Linux