Информационная безопасность
Exploit Development: Buffer Overflow
EternalBlue. 2017 год. NSA разрабатывает эксплоит для buffer overflow в SMBv1 протоколе Windows (CVE-2017-0144). Shadow Brokers утекают его в интернет. WannaCry ransomware использует EternalBlue для самораспространения. За 4 дня: 200 000 компьютеров в 150 странах зашифрованы. Национальная служба здравоохранения Великобритании парализована - хирургические операции отменены. Один buffer overflow = 8 миллиардов долларов ущерба.
- **EternalBlue 2017 (CVE-2017-0144):** buffer overflow в SMBv1 - WannaCry, NotPetya, 200K жертв, 8B USD ущерба
- **Log4Shell 2021 (CVE-2021-44228):** heap-based exploit через JNDI lookup - CVSS 10.0, миллиарды серверов
- **Pwn2Own 2023:** Chrome sandbox escape через V8 UAF + Linux kernel privesc - 180 000 USD выплата за chain эксплоитов
Stack Buffer Overflow: классика
1988 год. Morris Worm использует buffer overflow в fingerd для заражения 6 000 Unix систем - 10% всего интернета того времени. 2003 год. MS Blaster (CVE-2003-0352) - buffer overflow в RPC. 2017 год. EternalBlue (CVE-2017-0144) - buffer overflow в SMBv1, использован в WannaCry. Один класс уязвимостей, 35 лет истории.
**Безопасные функции:** `strcpy` -> `strncpy`/`strlcpy`; `sprintf` -> `snprintf`; `gets` -> `fgets`. Но даже strncpy не всегда безопасна (не null-terminates если dst full). **Современный C:** `-fsanitize=address` (AddressSanitizer) в debug build находит overflow во время разработки.
**Stack Smashing Protector (-fstack-protector-all)** в GCC/Clang - stack canary. Bypass через информационные утечки: если программа печатает адреса (format string vuln) - canary может утечь. NX/DEP bypass - через return-to-libc или ROP chains.
Stack canary защита включена. Атакующий нашёл format string vulnerability в той же функции. Как это комбинируется?
Heap Overflow и Use-After-Free
Stack overflow устарел как техника - большинство компиляторов включают защиты по умолчанию. Современные эксплоиты атакуют heap: динамически выделяемую память через malloc/new. Heap layout менее предсказуем, но атаки опаснее: use-after-free (UAF), heap grooming, type confusion.
| Техника | Механизм | Защита |
|---|---|---|
| Heap overflow | Запись за границу heap chunk | Heap canaries (ptmalloc), ASAN |
| Use-After-Free | Использование памяти после free() | Smart pointers (C++), GC |
| Heap spray | Заполнение heap payload для повышения hit rate | ASLR, heap randomization |
| Double free | free() дважды на один указатель | Защиты аллокатора (ptmalloc safe-unlinking) |
| Type confusion | Объект используется как другой тип | Type-safe языки, RTTI checks |
Браузер имеет UAF уязвимость в JavaScript engine. ASLR включён. Как атакующий обходит?
Return-Oriented Programming (ROP)
NX/DEP запрещает выполнение кода из stack/heap. Shellcode не работает. **ROP (Return-Oriented Programming)** обходит это: вместо нового кода, атакующий строит цепочку из существующих инструкций программы, заканчивающихся на `ret`. Каждый такой фрагмент - "gadget". Цепочка gadgets = Turing-complete вычисление без нового кода.
**ROPgadget, pwntools, peda** - стандартные инструменты CTF/pentest для построения ROP chains. pwntools - Python библиотека для автоматизации эксплоит разработки: `elf = ELF('binary')`, `rop = ROP(elf)`, `rop.execve('/bin/sh', 0, 0)`.
NX/DEP включён. Full RELRO включён. Stack canary включён. ASLR включён. Возможна ли ROP атака?
ASLR Bypass: дерандомизация адресного пространства
ASLR рандомизирует базовые адреса stack, heap, libraries при каждом запуске. Hardcoded адреса в эксплоите не работают. Но ASLR имеет ограниченную энтропию (32-bit: 16 бит, это только 65536 вариантов), и уязвимости утечки адресов (info leak) дерандомизируют его.
**PIE (Position Independent Executable)** - весь бинарный файл тоже рандомизируется. Без PIE: базовый адрес программы фиксирован, code segment всегда по одному адресу - ROP gadgets предсказуемы. С PIE: нужна info leak для адреса программы тоже. Сборка с `-fPIE -pie`.
NX/DEP и ASLR вместе полностью защищают от buffer overflow эксплоитов
NX/DEP + ASLR - значительно усложняют эксплуатацию, но не делают невозможной. ROP обходит NX без нового кода. Info leak дерандомизирует ASLR. Современная защита: NX + ASLR + PIE + canary + CFI + memory-safe языки.
Каждая защита решает конкретную технику: NX блокирует shellcode -> ROP. ASLR рандомизирует адреса -> info leak. Без устранения самой уязвимости (использование safe языков, input validation) - защитные механизмы это борьба с симптомом.
64-bit Linux, ASLR включён, PIE отсутствует. Атакующий не имеет info leak. Возможна ли ROP атака?
Ключевые идеи
- **Stack Overflow:** перезапись return address через bounds-unchecked копирование. Защита: canary + NX + ASLR + PIE. strcpy -> strncpy или Rust
- **Heap Attacks:** use-after-free, heap grooming, type confusion - современная основа браузерных эксплоитов. Smart pointers и GC устраняют класс
- **ROP:** Turing-complete вычисление из существующих gadgets. Обходит NX/DEP. Блокируется CFI (Control Flow Integrity) в LLVM/GCC
- **ASLR Bypass:** info leak для дерандомизации. Без PIE - code gadgets фиксированы. Полная защита: ASLR + PIE + CFI + memory-safe языки
Связанные темы
Buffer overflow - gateway в системную безопасность и reverse engineering:
- Безопасность памяти — Rust, Go, Swift устраняют buffer overflow на уровне языка
- Reverse Engineering — Анализ binary для поиска gadgets и понимания уязвимых функций
- Linux Hardening — ASLR, NX, seccomp - OS-level mitigation buffer overflow эксплоитов
Вопросы для размышления
- Используется ли C/C++ в production проектах? Включены ли `-fstack-protector-all`, `-pie`, `-fPIE`, `-D_FORTIFY_SOURCE=2` при компиляции?
- Есть ли AddressSanitizer (-fsanitize=address) в debug/CI builds? Какие heap ошибки он находит?
- Если бы нужно было выбрать язык для нового системного компонента - как бы учитывались memory safety характеристики?
Связанные уроки
- sec-21 — Privilege escalation - цель большинства buffer overflow эксплоитов
- sec-25 — Memory safety - языки и инструменты устраняющие buffer overflow класс
- sec-23 — Reverse engineering - необходим для анализа binary и написания эксплоита
- os-07-memory