Défense: comment se protéger ?

Protections Userland contre les débordements de tampons

Nous allons voir les techniques Userland inventés pour se prémunir des bof. Ces protections consistent à rajouter du code dans le programme à la compilation, pour vérifier l'état de la pile, et détecter des corruptions. Elles se présentent donc sous la forme d'extensions (patches) pour le compilateur C: GCC.

Elles vont modifier l'organisation des zones de la stack, et rajouter des valeurs de contrôle, appelées canary qui seront vérifiées avant le retour d'une fonction. La vérification est faite par l'appel d'une fonction de contrôl avant chaque ret.

StackGuard

Conçu en 1997 par la société Immunix, ce projet été si interressant que lors de la conférence 'GCC 2003 Summit' ils ont proposé de l'intégrer dans la version de base du compilateur.

Malheuresement ce projet à été remplacé par SSP qui est maintenant intégré dans les version 4.1 du compilateur

SSP: Stack smashing protection

SSP: Stack Smashing-attack Protector, aka ProPolice, est la référence développée par IBM. Ce patch est une évolution de StackGuard. Elle utilise des canaris pour protéger les adresses de retour, les variables locales et les paramètres des fonctions sur la stack.

Voici comment ce patch protège ce morceau de code :

void    *foo(int sz)
{
  int   var1;
  char  buf[512];
  int   var2;
  ...
}

int     main(char *argv[], int argc)
{
  char  *ptr;

  ptr = foo(argv[1]);
}
    
              AVANT                =>         APRES 

                                         |  arguments du       |
        |  arguments du       |          |            main     |
        |            main     |          | adresse de retour   |
        | adresse de retour   |          | sauvegarde EBP      |
        | sauvegarde EBP      |          |      CANARY         |
main()  | variable ptr        |          | variable ptr        | main()
        |     ....            |          |     ....            |
        |  argument argv[1]   |          |  argument argv[1]   |
        | adresse de retour   |          | adresse de retour   |
        | sauvegarde EBP      |          | sauvegarde EBP      |
foo()   | variable var1       |          |      CANARY         |
        | variable buf[512]   |          | variable buf[512]   | foo()
        |     ....            |          | variable var1       |
        | variable var2       |          | variable var2       |
        +---------------------+          |  copie de argv[1]   |
                                         +---------------------+
    

Libsafe

C'est une libraire qui va remplacer les fonctions standarts vulnérables (strcpy, gets, ...) par des alternatives sécurisées.