Buffer Overflow je kritická chyba v zabezpečení softwaru, která vzniká, pokud program nedokáže správně kontrolovat délku vstupních dat. Tato chyba umožňuje útočníkovi přepsat části paměti procesu, což může vést k pádu aplikace (DoS) nebo, v horším případě, ke spuštění libovolného škodlivého kódu (Remote Code Execution) s oprávněním dané aplikace.
Problém se týká především jazyků jako C a C++, které neprovádějí automatickou kontrolu hranic polí (array bounds checking) a umožňují přímou manipulaci s pamětí.
V operační paměti (RAM) jsou data uložena v přesně definovaných strukturách. Jednou z nejdůležitějších je Zásobník (Stack). Zásobník obsahuje kromě proměnných také tzv. Návratovou adresu (Return Address), která říká procesoru, kam se má vrátit po dokončení aktuální funkce.
1. **Očekávaný stav:** Program vyhradí 10 bajtů pro jméno uživatele. 2. **Útok:** Útočník pošle 50 bajtů dat. 3. **Přetečení:** Program zapíše prvních 10 bajtů do vyhrazeného prostoru a zbylých 40 bajtů "přeteče" do sousedních buněk. 4. **Přepsání adresy:** Útočník záměrně zformátuje data tak, aby přepsal návratovou adresu svou vlastní adresou, která míří na vložený škodlivý kód (shellcode).
| Typ | Popis |
|---|---|
| Stack Overflow | Přetečení na zásobníku. Nejčastější cesta k ovládnutí programu. |
| Heap Overflow | Přetečení v haldě (dynamicky alokovaná paměť). Složitější na zneužití, ale velmi nebezpečné. |
| Integer Overflow | Aritmetická chyba, kdy výsledek operace přesáhne rozsah číselného typu, což následně vede k nesprávné alokaci bufferu. |
Následující kód je klasickým příkladem chyby, protože funkce gets() nekontroluje délku vstupu:
void login() { char buffer[8]; // Vyhrazeno pouze 8 bajtů printf("Zadejte heslo: "); gets(buffer); // NEBEZPEČNÉ: načte neomezeně dat }
Pokud uživatel zadá více než 8 znaků, dojde k přetečení paměti.
Moderní operační systémy a kompilátory obsahují několik vrstev ochrany, které zneužití těchto chyb ztěžují:
Nejúčinnější obranou je psát bezpečný kód:
gets, strcpy, sprintf) bezpečnými variantami (fgets, strncpy, snprintf), které vyžadují limit délky.Související pojmy: Malware, Exploit, Zásobník (Stack), Halda (Heap), ASLR, Shellcode, C++, Kybernetická bezpečnost.