====== Mi a Buffer túlcsordulás? ====== 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 #include 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. ===== Veszélyek ===== 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. ==== Védekezési lehetőségek ==== 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. ==== A korábbi egy karakteres jelszókezelő kibővítése ==== #include #include #include 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.