Navigácia
Inovácie

Anatómia pamäťových zraniteľností: Ako funguje Buffer Overflow, ROP-chains a obrana OS

2 novembra, 2026 techy.sk

Predstavte si, že máte formulár s políčkom na zadanie mena. Vy doň namiesto troch slov vpíšete tisíc znakov nepretržitého textu. Namiesto toho, aby aplikácia vypísala chybu, zrazu prenechá plnú kontrolu nad počítačom útočníkovi. Vítajte vo svete pamäťových zraniteľností – mieste, kde chýbajúca kontrola hraníc v kóde dokáže položiť aj tie najbezpečnejšie systémy na svete.

Aj v roku 2026 tvoria pamäťové zraniteľnosti (Memory Corruption) kritickú časť nahlásených bezpečnostných dier (CVE). Od čias legendárneho červa Morris Worm z roku 1988 až po moderné útoky na smartfóny a IoT zariadenia zostáva princíp pretečenia buffera jednou z najobávanejších zbraní hackerov.

V tomto článku sa pozrieme na to, ako funguje pamäťový zásobník (Stack), ako vzniká Buffer Overflow, ako sa útočníci prispôsobili ochranným mechanizmom pomocou techniky ROP a prečo sa technologickí giganti snažia nahradiť jazyky C a C++ bezpečnejším Rustom.

1. Zásobník (Stack): Ako si program pamätá, čo robí

Aby sme pochopili, ako sa da pamäť „zmanipulovať“, musíme najprv vedieť, ako C/C++ programy spravujú pamäť pri volaní funkcií.

Keď program zavolá funkciu (napríklad spocitaj_dane()), operačný systém pre ňu vyhradí časť pamäte na takzvanom Zásobníku (Stack). Zásobník funguje na princípe LIFO (Last-In, First-Out) – predstavte si ho ako kôpku tanierov.

V pamäti sa na zásobník ukladajú:

  1. Lokálne premenné: Pole znakov, čísla, štruktúry (napr. char meno[64]).
  2. Návratová adresa (Return Address / EIP/RIP): Pokyn pre procesor, kam sa má v kóde vrátiť po dokončení funkcie.

A v tomto momente prichádza zásadný problém architektúry: Lokálne premenné a návratová adresa ležia v pamäti tesne vedľa seba.

2. Klasický Buffer Overflow: Keď pohár pretečie

Predstavte si nasledujúci, na prvý pohľad nevinný kód v jazyku C:

void over_heslo() {
    char buffer[64]; // Vyhradený priestor pre 64 znakov
    gets(buffer);    // NEBEZPEČNÉ: načítava text bez kontroly dĺžky!
}

Funkcia gets() bezohľadne číta vstup od užívateľa a ukladá ho do premennej buffer.

  • Ak užívateľ zadá 20 znakov, všetko je v poriadku.
  • Ak užívateľ zadá 100 znakov, prvých 64 zaplní buffer a zvyšných 36 znakov začne prepisovať všetko, čo leží v pamäti za ním!

Ako z toho útočník vytvorí útok?

  1. Prepísanie Návratovej Adresy: Útočník presne vypočíta vzdialenosť (offset) medzi bufferom a návratovou adresou.
  2. Vstreknutie Shellcodu: Do vstupu pribalí spravidla malý spúšťací kód v jazyku Assembly (tzv. Shellcode), ktorý otvorí príkazový riadok (shell).
  3. Presmerovanie toku: Prepíše návratovú adresu tak, aby neukazovala späť do pôvodného programu, ale na adresu jeho vlastného Shellcodu.

Keď funkcia skončí, procesor si z pamäte prečíta podstrčenú adresu a bezstarostne vykoná útočníkov kód s právami spusteného programu.

3. Prvá línia obrany a odpoveď hackerov

Svet IT nezostal s vyloženými kartami. Vývojári operačných systémov a kompilátorov postupne zaviedli bezpečnostné zábrany. No na každú zábranu komunity hackerov vymysleli protizbraň.

Ochrana 1: DEP / NX Bit (Data Execution Prevention)

  • Princíp: Pamäťové oblasti sú označené príznakmi: Čítanie (R), Zápis (W) alebo Vykonávanie (X). Stack má povolený zápis, no zakázané vykonávanie kódu.
  • Dôsledok: Aj keď útočník na stack uloží svoj Shellcode, procesor ho odmietne spustiť a program spadne (Segmentation Fault).

Protizbraň útočníkov: ROP (Return-Oriented Programming)

Keď útočníci nemohli spúšťať vlastný kód z pamäte, rozhodli sa použiť kód, ktorý už v programe (alebo v systémových knižniciach ako libc) existuje!

  • Gadgety: Útočník hľadá v legitímnom spustiteľnom kóde malé útržky inštrukcií ukončené príkazom ret (napr. pop eax; ret;).
  • ROP Chain: Poskladaním stoviek takýchto návratových adries za sebou na stacku dokáže útočník donútiť procesor postupne vykonávať jednotlivé „gadgety“ a poskladať z nich ľubovoľnú logiku bez toho, aby spustil jediný bajt vlastného nevydaného kódu.

4. Moderný bezpečnostný štít v OS

Dnešné operačné systémy (Windows 11, Linux, macOS, iOS, Android) používajú viacvrstvovú architektúru ochrany, vďaka ktorej je zneužitie Buffer Overflow mimoriadne náročné:

Ochranný mechanizmusAko funguje?
ASLR (Address Space Layout Randomization)Pri každom spustení programu náhodne zamieša adresy v RAM. Útočník vopred nevie, kde v pamäti ležia funkcie či gadgety.
Stack Canaries (Kanárik v bani)Kompilát pred návratovú adresu vloží tajnú náhodnú hodnotu. Ak sa pri Buffer Overflow prepíše, program deteguje útok a okamžite sa ukončí.
CFI (Control Flow Integrity)Hardvérová a softvérová kontrola, ktorá dohliada na to, aby skoky v kóde smerovali len na platné a očakávané miesta.

5. Nástroje bezpečnostných výskumníkov (s GitHub odkazmi)

Etickí hackeri a bezpečnostní analytici používajú na odhaľovanie a testovanie pamäťových zraniteľností špecializované nástroje:

  • Pwntools: Najpopulárnejší Python framework pre tvorbu exploitov a CTF (Capture The Flag) súťaže.
  • ROPgadget: Nástroj, ktorý automaticky prehľadá binárny súbor a nájde v ňom využiteľné ROP gadgety pre obídenie DEP.
  • GDB s rozšírením GEF / PEDA: Legendárny debugger obohatený o vizualizáciu zásobníka, kontrolu kanárikov a hľadanie pamäťových adries.

6. Budúcnosť: Koniec C/C++ v kritických systémoch?

Napriek desaťročiam vzdelávania vývojárov sa pamäťové chyby neustále opakujú. Dôvod je jednoduchý: jazyky C a C++ dávajú programátorovi priamu kontrolu nad pamäťou, no neposkytujú žiadne záchranné siete.

Preto americká agentúra NSA aj CISA (Cybersecurity and Infrastructure Security Agency) oficiálne odporučili prechod na „Memory-Safe“ programovacie jazyky.

Spoločnosti ako Microsoft, Google (v systéme Android) či Linuxový kernel dnes masívne adoptujú Rust. Rust dokáže už počas kompilácie (vďaka konceptu Ownership a Borrow Checker) garantovať, že v kóde nenastane Buffer Overflow, Use-After-Free ani Invalidation ukazovateľov – a to všetko bez straty výkonu a bez potreby Garbage Collectora.

Záver

Hacking pamäte a boj proti nemu pripomínajú nekonečnú hru na mačku a myš. Každý nový ochranný mechanizmus OS prinúti výskumníkov objaviť novú, ešte sofistikovanejšiu techniku útoku.

Pochopenie toho, ako funguje Buffer Overflow a manipulácia so zásobníkom, nie je len základom pre etický hacking, ale predovšetkým kľúčovou vedomosťou pre každého softvérového inžiniera, ktorý chce písať bezpečný a odolný kód.

Zdieľať článok

Mohlo by vás zaujímať