Moyens de protection contre les débordements de pile sous le système Microsoft Windows Server 2003
Date : 22 Juin 2005
Les failles de type "débordement de pile" sont depuis plus de nombreuses années la cible privilégiée des développeurs de programmes d'attaques. Ce type de défaut peut permettre à un attaquant de prendre le contrôle d'un programme (programme local ou service réseau) défaillant, et de lui faire exécuter un code assembleur de son choix. Si ce programme défaillant a des privilèges élevés, l'attaque permet au pirate de prendre le contrôle total d'un système.
Pour empêcher ce type d'attaques, Microsoft a inclus en standard sur le système Windows 2003 un mécanisme spécifique qui protège la pile d'exécution des programmes. Il s'agit d'une protection "par canari", similaire à ce que propose "StackGuard" pour Unix :
- lors de l'appel d'une fonction, un marqueur est placé sur la pile. On peut imaginer ce marqueur comme étant un gros "sticker" jaune, d'où le nom de "canari".
- A la fin de l'exécution de la fonction, et avant de rendre la main à la fonction appelante, le programme vérifie que le marqueur "jaune" est toujours présent. Si le marqueur a disparu, c'est qu'il a été écrasé par un débordement de pile. Dans ce cas un traitement d'exception se déclenche et l'exécution du programme est abandonnée avant que le débordement de pile ait pu permettre à l'attaquant de "prendre la main" sur le programme défaillant.
Plusieurs protections additionnelles ont aussi été ajoutées à ce mécanisme principal :
- le ré-ordonnancement des variables locales des fonctions. Les variables de type "tableau" sont désormais placées en "bord" de pile, de façon à ce que, si elles débordent, elles ne puissent pas écraser d'autres variables locales (écraser une variable locale permet d'en changer la valeur, ce qui peut potentiellement permettre de modifier le comportement du programme).
- Un contrôle plus sévère de l'appel aux gestionnaires d'exceptions (refus d'exécuter un gestionnaire d'exception non préalablement enregistré, refus d'exécuter un gestionnaire d'exception se trouvant dans la pile) qui ont un rôle clef. En particulier, si l'attaquant peut prendre le contrôle du gestionnaire d'exception déclenché lorsque le mécanisme du "canari" détecte un débordement de pile, la détection peut être neutralisée. Les contrôles supplémentaires implantés sous Windows 2003 visent donc à éviter ce type d'attaque.
Les mécanismes implémentés par Microsoft Windows 2003 pour se protéger contre les attaques par débordement de pile ne sont certes pas la panacée. En particulier il a été exposé plusieurs méthodes d'attaques permettant de les contourner. Cependant ils constituent une amélioration significative de la sécurité de ces plates-formes et augmentent radicalement le niveau de difficulté d'une attaque par débordement de pile.
Nota :
- A ce jour, seul Windows 2003 bénéficie de ce type de protection (ni Windows 2000 et Windows XP n'en bénéficient).
- Par contre, le Service Pack 2 (SP2) de Windows XP introduit pour sa part un autre mécanisme de protection : le support de l'attribut "NX" (No eXecute). Ce service qui permet de marquer certaines pages mémoires (et en particulier les pages contenant la pile d'exécution) comme non exécutables. La fonction "NX" n'est cependant implémentée que par certains processeurs, comme par exemple certains processeurs AMD, ou les processeurs IPF (Itanium Processor Family) d'Intel.
Pour plus d'information
Magazine "Misc" No 12 (Mars-avril 2004) : article "La fin des 'Buffer Overflow' dans Windows (?)" par Nicolas Ruff : http://www.miscmag.com