6.2. Adatszerkezet támadás - Bináris forrás fájl túltöltése

6.2.1. Leírás

A buffer túlcsordulás forrása a bevitt adat lehet. Amikor a bináris forrás file túltöltéssel próbálkozik, a támadónak úgy kell módosítania/előkészítenie a bináris fájlt, hogy miután az alkalmazás beolvasta, kiszolgáltatottá váljon egy klasszikus Buffer túlcsordulás támadásnak (Buffer overflow attack). Az egyetlen különbség ez és a klasszikus típus között a bevitt adat forrásában van. A leggyakoribb példák a különlegesen elkészített MP3, JPEG vagy ANI fájlok, amik buffer túlcsordulást okoznak.

6.2.2. Példák

Az alkalmazás kiolvassa az első 8 karaktert a bináris fájlból.

   rezos@dojo-labs ~/owasp/binary $ cat read_binary_file.c
   #include <stdio.h> 
   #include <string.h>
   
   int main(void)
   {
          FILE *f;
          char p[8];
          char b[8];
   
          f = fopen("file.bin", "r");
          fread(b, sizeof(b), 1, f);
          fclose(f);
   
          strcpy(p, b);
   
          printf("%s\n", p);
   
          return 0;
   }
      

A létrehozott fájl több, mint 8 karaktert tartalmaz.

   rezos@dojo-labs ~/owasp/binary $ cat file.bin
   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      

Egy újabb, futtatásra tett próbálkozás után az alkalmazás a következővel leáll:

   rezos@dojo-labs ~/owasp/binary $ ./read_binary_file
   Segmentation fault
         

Hiba. Vajon buffer túlcsordulás történt?

     rezos@dojo-labs ~/owasp/binary $ gdb -q ./read_binary_file
   Using host libthread_db library "/lib/libthread_db.so.1".
   (gdb) r
   Starting program: /home/rezos/owasp/binary/read_binary_file
   
   Program received signal SIGSEGV, Segmentation fault.
   0xb7e4b9e3 in strcpy () from /lib/libc.so.6
     

Igen, ez egy buffer túlcsordulás volt a strcpy() függvényben.

Miért?

fread(b, sizeof(b), 1, f); - karaktereket olvas a „stream f, sizeof(b)”-ből egyszer a b bufferbe. Ez teljesen rendben lévőnek tűnik. De valójában nincs hely egy '\0' számára, ami lezárja a sztringet.

Az strcpy(p, b); végrehajtása közben, amikor mindkét buffer egyenlő, megtörténik a túlcsordulás. Ennek az oka a null bájt, mint végkarakter hiánya a b bufferben. A strcpy() függvény mindent be fog másolni a b[0]-tól kezdve a p[] bufferbe egészen a null bájtig. A támadó egy speciális fájl elkészítésével sikeresen véghezvitte a buffer túlcsordulás támadást.

  1. Használjunk egyenértékű, biztonságos függvényeket, amik ellenőrzik a buffer hosszát amikor csak lehetséges.

Mégpedig:

  1. gets() -> fgets()

  2. strcpy() -> strncpy()

  3. strcat() -> strncat()

  4. sprintf() -> snprintf()

  1. Azokat a függvényeket, amiknek nincs biztonságos verziójuk, át kell írni oly módon, hogy tartalmazzanak biztonsági ellenőrzéseket. Az erre szánt idő meg fog térülni a jövőben. Emlékezzen rá, hogy ezt csak egyszer kell megcsinálnia.

  1. Olyan fordítókat kell használni, amik képesek azonosítani a nem biztonságos függvényeket, logikai függvényeket és ellenőrzik, hogy a memória nincs-e átírva olyan helyen, ahol nem szabadna.