Author: Yves Martin Date: To: guilde Subject: A propos du No eXecute d'AMD64
Hello,
Comme je vois que l'on méprise Intel - j'aimerai répondre.
Les mécanismes de protection de mémoire en exécution existent sur plateform
Intel depuis longtemps (80386)
mais visiblement personne ne fait l'effort de l'exploiter. Je m'explique.
Pour ceux qui connaissent un peu la prog. système, Intel fournit deux
mécanismes d'utilisation de la mémoire:
- la segmentation
- la pagination
Après lecture de doc rapide:
- la segmentation fournit trois catégories: code (exécutable, read-only),
data (non exécutable, read ou/et write) et system
et autres fioritures que je passent (direction d'expansion pour une pile
par exemple)
- la pagination nécessite un arbre de correspondance virtuel/physique et
comme les segments sont là pour protéger l'exécution ou pas le flag n'est
pas présent à ce niveau - par contre, on peut définir le read/write avec
la granularité de la page (redondance avec la segmentation)
On peut faire un OS robuste avec la segmentation seulement ou avec les
deux mécanismes - mais si on utilise seulement la pagination, toutes les
pages sont exécutables
(en fait dans ce cas, on fait un segment global pour toute la mémoire et
forcément en exécution pour les pages contenant du code)
Mais voilà, la segmentation n'existe pas sur toutes les architectures, s'en
servir rendrait l'OS moins portable - alors que la pagination existe partout
ou presque ( vieux machin ;) le 68000 sans MMU par exemple)
En conclusion, Intel fournit tout ce qu'il faut mais il faut s'en servir
correctement. Pour faire un Linux plus robuste aux attaques par dépassement
de buffer en pile, il faut utiliser les segments (et mettre la pile sur un
segment de données non exécutable par exemple) - donc faire un Linux plus
spécifique x86.
De souvenir, je crois que les premiers Linux x86 de Linus utilisaient la
segmentation pour ce problème justement - mais a été refait avec uniquement
de la pagination pour la portabilité entre plateformes.