Информационная безопасность

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 chunkHeap canaries (ptmalloc), ASAN
Use-After-FreeИспользование памяти после free()Smart pointers (C++), GC
Heap sprayЗаполнение heap payload для повышения hit rateASLR, heap randomization
Double freefree() дважды на один указательЗащиты аллокатора (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
Exploit Development: Buffer Overflow

0

1

Войти