Buffer Overflow (Přetečení vyrovnávací paměti)

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í.

Jak Buffer Overflow funguje?

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).

Typy přetečení

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.

Ukázka v jazyce C (Zranitelný kód)

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.

Ochranné mechanismy

Moderní operační systémy a kompilátory obsahují několik vrstev ochrany, které zneužití těchto chyb ztěžují:

ASLR (Address Space Layout Randomization): Náhodně mění umístění klíčových dat v paměti při každém spuštění programu. Útočník pak neví, kde se nachází jeho kód.

DEP / NX bit (Data Execution Prevention): Označuje části paměti s daty jako „nespustitelné“. I když útočník kód do paměti vloží, procesor jej odmítne vykonat.

Stack Canaries: Do paměti před návratovou adresu se vloží náhodná hodnota („kanárek“). Pokud je při ukončení funkce tato hodnota jiná (byla přepsána), program okamžitě skončí dříve, než se stihne spustit škodlivý kód.

Prevence při vývoji

Nejúčinnější obranou je psát bezpečný kód:

Používat moderní jazyky (Rust, Go, Java, Python), které paměť spravují automaticky.

V C/C++ nahradit nebezpečné funkce (gets, strcpy, sprintf) bezpečnými variantami (fgets, strncpy, snprintf), které vyžadují limit délky.

Provádět pravidelné audity kódu a statickou analýzu.

Související pojmy: Malware, Exploit, Zásobník (Stack), Halda (Heap), ASLR, Shellcode, C++, Kybernetická bezpečnost.