On Tue, 28 May 2002, Bruno Crochet wrote:

> Je re�ois souvent de la liste s�curit� Mandrake des messages ou il est 
> question de "buffer overflow", du type de celui-ci:

Je compl�te ce qui a d�j� �t� dit par quelques exemples pratiques:

Premier cas:

   on suppose un programme contenant une variable
   bool�enne `is_normal_user', qui si fausse, donne les droits
   super-utilisateur durant l'ex�cution. 


      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>

      /* BUGS
       *    - Weak error detection/recovery.
       *    - Unbounded array checking.
       * EXPLOIT
           % ./a.out truc 1234567890
           0xbffffb1c 0xbffffb28
           % ./a.out truc 12345678901
           0xbffffb1c 0xbffffb28
           % ./a.out truc 123456789012
           0xbffffb1c 0xbffffb28
           EXECUTION AVEC DROITS ANORMAUX.
       */

      int main(int argc, char **argv) {
         int is_normal_user = 1; /* by default be safe */
         char buffer[10]; /* tampon */

         printf("0x%x 0x%x\n", &buffer[0], &is_normal_user);

         if (!strcmp("turlututu", argv[1])) {
            is_normal_user = 0;
         }

         sprintf(buffer, "%s", argv[2]);

         if (!is_normal_user) {
            printf("EXECUTION AVEC DROITS ANORMAUX.\n");
         }

         return 0;
      }

   On remarquera que ce premier cas ne n�cessite pas d'ex�cution de code.
   La plupart des s�curisations par marquage de pile non ex�cutable ne
   peuvent donc rien faire contre cela. Il n�cessite par contre une bonne
   connaissance du code ainsi que des conditions optimales pour �tre
   exploit�. Dans notre cas l'exploitation se fait via la stack, mais
   on se rend bien compte que cela peut se faire �galement par des
   structures de donn�es en RAM.

Second cas:

   Cas particulier du premier cas o� l'on �crase en fait une `variable'
   sp�ciale (interne) qui correspond � l'adresse de retour de la
   fonction. Dans ce cas on peut d�router l'ex�cution (p.ex. ex�cuter un
   unlink(2) � la place d'un open(2), ou pire ex�cuter le buffer que
   l'on a utilis� pour le d�bordement: dans ce dernier cas on peut
   ex�cuter N'IMPORTE QUEL CODE dans le cas g�n�ral. Ce tout dernier cas
   peut �tre souvent �vit� en rendant la pile non-ex�cutable. Mais il faut
   se rendre compte que cela peut se contourner, tous les buffers n'�tant
   pas allou�s sur la pile).

> En quoi un buffer overflow est-il dangereux?

Il permet � un attaquant, via des entr�es de donn�es sp�cialement con�ues
(via param�tres de ligne de commande y compris nom de programme, donn�es
dans une base de donn�es, param�tres d'un FORMulaire HTML, donn�es d'une
session TCP, etc) de prendre le contr�le de variables du programme, voire
du flux de contr�le du programme, voire m�me de faire ex�cuter n'importe
quel code d�sir� par l'attaquant avec les droits du programmes.

--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.

Répondre à