Playing with ptrace() for fun and profitNicolas Bareil

Parmi les appels systèmes les moins documentés et les plus obscurs (dixit la page de manuel), ptrace() est en bonne position. On aurait néanmoins tort de l'ignorer car c'est l'une des fonctions les plus intéressantes sur les systèmes UNIX, son utilisation première est le debugging de programme, mais derrière ce mot très vague se cache des fonctionnalités parfaites pour tout bidouilleur : l'accès en lecture et en écriture de toute la mémoire virtuelle d'un processus (ainsi que ses registres). De plus, il n'y a pas besoin d'être un utilisateur privilégié pour l'utiliser, il est seulement requit d'avoir le mêmeUID et ne pas être déjà tracé.

Tout au long de cette présentation, nous allons découvrir l'appel système, comment l'utiliser en abordant les problèmes d'implémentation comme le placement des instructions dans l'espace d'adressage du processus, l'interruption des appels systèmes, etc. Enfin, nous dresserons un éventail d'applications de ptrac() afin de voir ce qu'il peut apporter d'un point de vue sécurité (mise en place de protection, analyse de code malicieux, etc.). L'utilisation de ptrace() permettra également de mettre en relief les limites de la sécurité de certains outils comme les firewalls applicatifs ou les processus chrootés (évasion possible).