A buffer túlcsordulás akkor történik, amikor adatokat írnak egy bufferbe (memóriaterületre) úgy, hogy az adatok meghaladják a rendelkezésre álló buffer méretet. Ez a „túlcsordulás” felülírhatja a memória más részeit, ami biztonsági rést jelent, mert a támadók rosszindulatú kódot helyezhetnek el a programban.
Egyszerű C Példa Tekintsünk egy egyszerű C programot, amely tartalmaz egy buffer túlcsordulásos sebezhetőséget:
#include <stdio.h> #include <string.h> void veszelyesFuggveny(char *bejovoAdat) { char buffer[10]; strcpy(buffer, bejovoAdat); // veszélyes másolás } int main() { char nagyAdat[100] = "Túl hosszú szöveg, ami túlcsordulást okoz..."; veszelyesFuggveny(nagyAdat); return 0; }
Ebben a példában a veszelyesFuggveny() egy 10 karakter hosszúságú buffer-t használ. Az strcpy() függvényt használjuk az adatok másolására a bufferbe, anélkül, hogy ellenőriznénk az adatok hosszát. Ha a bejovoAdat több mint 10 karaktert tartalmaz, akkor a buffer túlcsordul, és potenciálisan felülírja a memória más részeit.
A buffer túlcsordulás veszélyes, mert a támadók kihasználhatják ezt a sebezhetőséget rosszindulatú kód futtatására. Például, ha a túlcsordulás felülírja a visszatérési címet a memóriában, a támadó irányíthatja a programot, hogy saját kódját hajtsa végre.
A buffer túlcsordulás elleni védekezés érdekében fontos, hogy mindig ellenőrizzük az adatok hosszát, mielőtt azokat egy bufferbe másoljuk. A C nyelvben használhatjuk a strncpy függvényt a strcpy helyett, amely lehetővé teszi a másolandó karakterek számának korlátozását, vagy használhatunk magasabb szintű nyelveket, amelyek automatikusan kezelik ezt a típusú memória kezelést.
#include <stdio.h> #include <string.h> #include <stdlib.h> int checkPassword(const char *jelszo) { char buffer[12]; int jogosultsag = 0; // Alapértelmezett: nincs jogosultság strcpy(buffer, jelszo); if (strcmp(buffer, "titkos") == 0) { jogosultsag = 1; // Jelszó helyes: jogosultság engedélyezve } return jogosultsag; } int main() { char jelszo[100]; printf("Kérem a jelszót: "); gets(jelszo); // Veszedelmes függvény, nem ellenőrzi a buffer méretét if (checkPassword(jelszo)) { printf("Hozzáférés engedélyezve.\n"); } else { printf("Hozzáférés megtagadva.\n"); } return 0; }
A gets() függvényt használjuk a jelszó bekérésére, ami veszélyes, mert nem ellenőrzi a rendelkezésre álló buffer méretét. Ha a felhasználó több mint 12 karaktert ad meg, az túlcsordulást okoz a buffer-ben a checkPassword() függvényben.
Ez a példa bemutatja, hogyan lehet kihasználni a buffer túlcsordulását, de fontos hangsúlyozni, hogy a valós alkalmazásokban mindig biztonságos programozási technikákat kell alkalmazni. A gets() függvényt soha nem szabad már éles környezetben használni, helyette biztonságos alternatívákat, mint a fgets(), kell alkalmazni. Ezenkívül a modern fordítók és operációs rendszerek számos védelmi mechanizmust tartalmaznak (pl. stack canaries, ASLR) a buffer túlcsordulás ellen.