NX bit
Le NX Bit, pour No eXecute, est une technique de protection d'espace exécutable utilisée dans les processeurs pour dissocier les zones de mémoire contenant des instructions, donc exécutables, des zones contenant des données, protégeant le système des virus et chevaux de Troie utilisant les failles de dépassement de tampon.
Historique
Le NX Bit est intégré pour la première fois sur les processeurs AMD, d'abord sur les processeurs Opteron en avril 2003, puis sur les processeurs Athlon en septembre 2003. Le NX Bit a ensuite été étendu à toute la gamme de processeurs AMD. En septembre 2004, Intel intègre une fonctionnalité similaire, appelée XD bit (pour eXecute Disable), d'abord sur ses processeurs pour serveurs (Xeon, révision Nocona), puis en octobre 2004 sur ses processeurs grand public (Pentium 4, Celeron D, Pentium M et Celeron M)[1].
D'autres architectures processeurs ont par la suite adopté le principe du NX Bit, sous des noms différents :
- MIPS utilise le XI bit (pour eXecute Inhibit) ;
- ARM utilise le XN bit (pour eXecute Never)[2] ;
- PowerPC utilise le UG bit (pour User Guard).
Bien qu'elles possèdent des noms différents, ces fonctionnalités reposent toutes sur le même principe. Ainsi, l'appellation la plus ancienne, NX Bit, est communément utilisée pour désigner cette technique de protection. Cependant, on retrouve aussi l'appellation NX/XD, faisant référence respectivement aux appellations d'AMD et d'Intel.
Le système d'exploitation doit être adapté pour pouvoir tirer avantage du NX Bit. Microsoft gère cette technologie depuis Windows XP Service Pack 2 et Windows Server 2003 SP1[3] via la fonctionnalité Data Execution Prevention. Ce mécanisme a été remanié sous Windows Vista. Enfin, il est devenu obligatoire pour exécuter Windows 8.
Fonctionnement
Un système d'exploitation avec prise en charge du NX Bit peut marquer certaines zones de mémoire comme non exécutables. Le processeur refusera alors d'exécuter tout code se trouvant dans ces zones de mémoire marquées par le système. Toute tentative d'exécution de code dans ces zones marquées déclenche une violation d'accès de mémoire, qui alerte alors l'administrateur du système d'une activité potentiellement malveillante.
Principe technique
Le NX bit est implémenté au niveau des entrées de la table des pages, qui gèrent la correspondance entre les adresses virtuelles et physiques. Chaque entrée de la table des pages possède un bit qui indique si la page correspondante est exécutable ou non. Si le bit est à 0, le processeur peut exécuter le code contenu dans la page ; si le bit est à 1, le processeur refuse d’exécuter le code et déclenche une exception. Le NX bit n’est disponible que sur les processeurs 64 bits ou sur les processeurs 32 bits utilisant l’extension PAE (Physical Address Extension).
Limites
Bien qu'efficace contre les attaques par dépassement de tampon, le NX Bit présente toutefois certaines limites et ne constitue donc pas une solution miracle :
- Il nécessite un support du système d’exploitation et des applications. Certains systèmes ou applications peuvent ne pas gérer correctement le NX bit ou le désactiver pour des raisons de compatibilité ou de performance ;
- Il ne protège pas contre les attaques qui ne cherchent pas à exécuter du code, mais à modifier le flot d’exécution du programme en écrasant des pointeurs de fonction ou des adresses de retour. Ces attaques peuvent utiliser du code existant dans la mémoire exécutable, comme la technique du return-oriented programming ;
- Il peut être contourné par des techniques qui exploitent des failles dans le noyau pour modifier les permissions des pages mémoire. Par exemple, une attaque appelée JIT spraying peut utiliser un compilateur JIT pour générer du code malveillant dans la mémoire exécutable.
Références
- David Corroy, « Le XD-bit enfin dans les CPU Intel grand public », sur Tom’s Hardware, (consulté le )
- « Documentation – Arm Developer », sur developer.arm.com (consulté le )
- (en) « NX bit », sur Microsoft Wiki (consulté le )