💣 Buffer Overflow – klasyczna podatność, która wciąż zagraża systemom
Buffer Overflow (przepełnienie bufora) to jedna z najstarszych i najczęściej wykorzystywanych podatności w historii bezpieczeństwa informatycznego. Mimo upływu lat, nadal stanowi poważne zagrożenie, zwłaszcza w systemach pisanych w językach takich jak C czy C++, gdzie nie istnieje automatyczne zarządzanie pamięcią.
🧠 Na czym polega buffer overflow?
Buffer overflow to sytuacja, w której do bufora w pamięci (czyli zarezerwowanego fragmentu RAM) zapisywana jest większa ilość danych, niż przewidziano. Nadmiar danych „wylewa się” poza przypisany obszar, nadpisując inne dane w pamięci – często adresy zwrotne, wskaźniki, a nawet kod wykonywany przez aplikację.
🎯 Przykład:
char bufor[10];
gets(bufor); // nie sprawdza długości danych!
Użytkownik może wpisać 100 znaków, mimo że bufor mieści tylko 10, co prowadzi do przepełnienia bufora i potencjalnego wykonania złośliwego kodu.
🔥 Co może osiągnąć atakujący?
Atak buffer overflow może pozwolić na:
- ✳️ Wstrzyknięcie i wykonanie złośliwego kodu
- ✳️ Zmienienie kierunku wykonania programu (np. poprzez manipulację adresem zwrotnym)
- ✳️ Uzyskanie dostępu do systemu
- ✳️ Podniesienie uprawnień
- ✳️ Obejście mechanizmów uwierzytelniania

🔬 Typy ataków buffer overflow
| Typ | Opis |
|---|---|
| Stack-based overflow | Klasyczny typ ataku. Przepełnienie bufora w stosie, często umożliwiające nadpisanie adresu zwrotnego funkcji. |
| Heap-based overflow | Przepełnienie bufora w stercie – trudniejsze do wykrycia i wykorzystania, ale nadal możliwe. |
| Integer overflow | Zmiana wartości liczbowych (np. rozmiaru bufora) w celu ułatwienia przepełnienia. |
| Format string attacks | Ataki przy użyciu nieprawidłowego formatowania ciągów znaków (printf() itp.), umożliwiające odczyt/zapis w pamięci. |
🧰 Narzędzia do wykrywania buffer overflow
- AFL (American Fuzzy Lop) – narzędzie do fuzzingu
- Valgrind – wykrywanie problemów z pamięcią w aplikacjach
- GDB – debugger pozwalający prześledzić przepływ programu
- ASAN (AddressSanitizer) – rozszerzenie GCC i Clang
- Pwntools / Ghidra / radare2 – eksploracja binarek, analiza luk
🛡️ Jak chronić się przed buffer overflow?
✅ Z punktu widzenia programisty:
- Unikaj funkcji niezabezpieczonych:
gets(),strcpy(),sprintf() - Używaj bezpiecznych alternatyw:
fgets(),strncpy(),snprintf() - Sprawdzaj rozmiar danych przed zapisaniem do bufora
- Wykorzystuj narzędzia analizy statycznej kodu
✅ Z punktu widzenia systemu:
- Włącz DEP (Data Execution Prevention) – blokuje wykonywanie kodu w pamięci oznaczonej jako „dane”
- Włącz ASLR (Address Space Layout Randomization) – losuje rozmieszczenie segmentów pamięci
- Korzystaj z Canary values – wartości strażnicze wykrywające nadpisania bufora
- Włącz stack smashing protection – zabezpieczenia w kompilatorze (
-fstack-protector)
💣 Przykład ataku z wykorzystaniem buffer overflow (uproszczony):
- Aplikacja zawiera funkcję:
void login() { char password[8]; gets(password); if(strcmp(password, "sekret") == 0) printf("Dostęp przyznany"); } - Napastnik wpisuje długi ciąg np. 32 bajty + shellcode
- Nadpisuje adres powrotu funkcji
login(), kierując go na własny kod w buforze - Po zakończeniu funkcji
login(), system wykonuje kod atakującego
📚 Znane ataki wykorzystujące buffer overflow
- Atak na Morris Worm (1988) – pierwszy masowy robak komputerowy
- Blaster Worm (2003) – wykorzystywał przepełnienie bufora w RPC
- Heartbleed (2014) – częściowo związany z błędnym zarządzaniem pamięcią
- Ataki na serwery z exploitem EternalBlue – wykorzystanie luki w SMB
🏁 Podsumowanie
Buffer overflow to technika ataku, która mimo swojego wieku nadal jest aktualna i skuteczna. Występuje głównie w niskopoziomowym kodzie, a jej skutki mogą być katastrofalne – od przejęcia sesji po zdalne wykonanie kodu. Dlatego programiści, administratorzy i zespoły DevSecOps muszą rozumieć ryzyko i korzystać z odpowiednich technik oraz narzędzi ochrony.






