Obsah

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


Prevence při vývoji

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


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