SSTIC 2012 - 20 years of PaX

Et c’est reparti pour un nouveau SSTIC 😀

10 ans, ça se fête, et je sent que ça va troller sévère sur twitter (#SSTIC #anSSTIC et #trollSSTIC sur twitter).

On commence avec du lourd avec :

20 years of PaX

SLIDES

On commence avec un petit historique de PaX, qui à commencé en 2000 comme un outil de prévention d’intrusions au niveau de l’hôte (HIPS). Au lieu de se concentrer sur la remédiation des divers bugs et failles présentes, l’équipe s’est concentré sur des techniques permettant d’empêcher l’exploitation de ces bugs.

PaX était et reste un hobbie pour l’orateur. A l’origine ils étaient 3, mais la vraie vie a éloigné les autres membres de la Team.  Les fonctionnalités de PAX visent à protéger les exécutables d’une quelconque exploitation au travers de pages mémoires non exécutables, d’ASLR etc.. (notamment la Stack dans le cadre de buffer overflow). Ces fonctionnalités ont depuis été reprises dans les systèmes d’exploitation de Microsoft (DEP, ASLR, etc…).

L’auteur fait ensuite un focus sur les techniques d’exploitation : corruption mémoire (buffer overflow, heap overflow…), execution de code injecté (shellcodes), Execution de code existant dans un ordre qui n’était pas prévu (ROP, Return into libc). Execution de code existant dans l’ordre prévu par le programme (attaques basés sur l’altération des données utilisés par l’application).

PaX vise à protéger les programmes contre ces attaques sans altérer ou ajouter de code à ces derniers à l’aide de  PAGEEXEC/SEGMEXEC/MPROTECT, ASLR, Non executable Kernel pages (KERNEXEC), sections mémoire du kernel en lecture seule (KERNEXEC,CONSTIFY), Ségrégation des pages mémoire Kernel et Utilisateur (UDEREF)… l’ensemble des features développés par l’équipe de PaX est juste énorme.

Comme tout projet, il à aussi ses fonctionnalités non documenté 🙂

KERNEXEC fournit des pages mémoires non executable, et repose sur des fonctionnalités spécifiques du jeux d’instruction du CPU. 

CONSTIFY permet de créer des mappings en lecture seule. 

UDEREF permet d’empécher le code userland d’accéder au code Kernel via des zones mémoires partagés. Sous i386 la ségrégation est assurée par la segmentation, sous amd64 c’est la pagination qui est utilisée pour passer la zone mémoire userland en non-executable pendant l’appel système.

USERCOPY permet de valider les bornes mémoire lors d’une copie de données depuis l’espace mémoire Kernel vers l’espace mémoire d’un processus Userland (fuite d’information) ou inversement (buffer overflow). (NDLR : ça pique, la présentation est dense en informations).

(NDLR : et je viens de rater 3 slides de features à cause d’un pépin réseau :s ça va trop vite).

L’auteur nous présente en suite un ensemble de plugins GCC pour renforcer le kernel à la compilation (simplifiant l’implémentation de certaines fonctionnalités de PaX). On retrouve les fonctionnalités présentées précédemment et des détails quand à leur implémentation. (NDLR : vivement les actes…). Certaines de ces fonctionnalités ajoutent du code au kernel au travers du plugin GCC, ce qui impacte parfois la performance du noyau.

Pour le futur de PaX, l’auteur prévoit de lutter contre les détournements du flot de contrôle de l’application (return into libc, rop) à l’aide d’un plugin de compilateur et par de l’instrumentation du code assembleur.
L’auteur aimerait aussi explorer des techniques de détection des bug de type Use After Free, en se reposant sur la taille énorme de l’espace d’adressage de la mémoire pour empêcher la réutilisation d’une adresse mémoire dans le programme. KERNSEAL est une fonctionnalité future pour luter contre l’écriture arbitraire d’information dans la mémoire Kernel.

HYPEREXEC : d’après l’auteur la virtualisation n’apporte pas de sécurité, car la complexité des hyperviseurs est tellement grande qu’ils ajoutent leur propres failles à celles des noyaux qui sont déjà très complexes.

Voila qui conclut cette première présentation de SSTIC 2012