Protection de zones mémoires contenant du code exécutable
Par l'intermédiaire de PaX, les zones de code ne seront pas accessibles en écriture, ce qui permet de se protéger contre des interventions malicieuses tentant de les modifier. Cela est fait en utilisant (ou émulant) la fonctionnalité du NX Bit.
PAGEEXEC
PAGEEXEC est la première implémentation proposée pour implémenter le bit NX sur les architectures i386. Le bit supervisor surchargé pour émuler le comportement du bit NX. Cette implémentation repose sur le translation lookaside buffer (TLB), le cache utilisé par l'unité de gestion mémoire. Lors d'une tentative d'accès à une page protégée qui n'est pas encore dans le TLB, en exécution, une faute de protection est levée. Comme sur les processeurs récents le TLB est séparé en un cache pour les exécutions (ITLB) et un cache pour les données (DTLB), PaX peut déterminer si il s'agit d'une instruction, qui doit alors être interdite.
SEGMEXEC
SEGMEXEC émule le fonctionnement du bit NX sur les processeurs IA-32. Cela fonctionne en segmentant la mémoire en deux zone de 1.5 Go chacune. La zone basse (de 0 à 1.5 Go) contient les données non exécutables, c'est-à-dire les données mais aussi instructions (qui peuvent en effet vouloir être lues). La seconde zone, exécutable, en revanche ne contient que les instructions. Les mappings des deux segments pointent vers les mêmes zones de la mémoire physique, ainsi la mémoire vive utilisée n'est pas doublée.
Lorsqu'une adresse mémoire doit être exécutée, elle est traduite dans la zone contenant le code exécutable. Si le code n'est pas présent à l'adresse traduite, il s'agit alors d'une tentative d'exécution de code interdite, le programme est alors tué.
Restriction via mprotect()
Voir entre autres (en) mprotect
Trampoline emulation
Les trampolines implémentés par GCC sous la forme de petites portions de code généralement générés sur la pile lors du runtime. Cela nécessite donc de rendre exécutable la pile, ce qu'empêche PaX. Pour éviter que les programmes utilisant cette technique ne soient tués, PaX est capable d'identifier et d'autoriser leur utilisation.
Address space layout randomization
L'address space layout randomization consiste à rendre certaines adresses de la mémoire virtuelle aléatoires permettant de se prémunir contre l'exploitation de certaines failles (généralement de type dépassement de tampon). Les parties du programmes qui seront placés à des adresses aléatoires sont en général la pile, le tas, la position des bibliothèques, …
Rendre aléatoire l'adresse de la pile
Pour éviter une utilisation aléatoire de la Pile d'appel d'un programme, PaX rend cette adresse aléatoire.
Rendre aléatoire l'adresse de base utilisé par mmap() base
Dans un système d'exploitation POSIX, l'appel système mmap() mappe des fichiers ou des périphériques informatiques en mémoire. Rendre aléatoire l'adresse de base utilisée par mmap() permet de se protéger contre certaines exploitations de faille
Base ET_EXEC rendue aléatoire
Marquage des exécutables ELF
PaX permet à des fichiers exécutables au format ELF d'être marqué avec des permissions réduites via les outils chpax et paxctl. Ces marquages sont dans l'en-tête ELF et sont à la fois indépendants du système de fichier et de la partie Code objet du fichier. L'outil chpax est obsolète et remplacé par paxctl.
PaX permet des marquages individuels pour PAGEEXEC et SEGMEXEC, de rendre aléatoire les adresses de base de la pile d'appel, du tas, de mmap(), …