😔
Почему большинство критичных уязвимостей связаны с управлением памятью в C++?C++ даёт прямой доступ к памяти. Это мощь и проклятие одновременно.
Microsoft подсчитал: за последние 12 лет 70% их CVE — memory corruption. Разберём топ-5 механизмов, которые превращают код в дыры безопасности.
💔
Buffer Overflow — перезапись стекаchar buffer[8];
strcpy(buffer, userInput); // 20 байт в 8-байтовый буфер
Данные выходят за границы и перезаписывают return address на стеке. Атакующий контролирует, куда прыгнет выполнение после
ret. Под капотом: стек растёт вниз, локальные переменные располагаются перед сохранённым
RIP. Переполнение идёт вверх по адресам прямо в критичные данные.
Защита: std::string, санитайзер ASan (-fsanitize=address), stack canaries.
⚡️
Use-After-Free — висячий указательint* ptr = new int(42);
delete ptr;
*ptr = 100; // UB: память отдана аллокатору
Аллокатор переиспользует освобождённый блок для нового объекта. Ваша запись портит чужие данные, часто vtable объекта. Это даёт атакующему контроль над virtual dispatch — RCE через подмену указателя на функцию.
Защита: unique_ptr, ptr = nullptr после delete,
MemorySanitizer.
❌
Integer Overflow в размерахsize_t size = count * sizeof(T); // count из сети
void* buf = malloc(size); // size обернулся в 0
Беззнаковое переполнение легально в C++, но создаёт логическую ошибку. Аллокатор выделяет крошечный буфер, затем туда пишутся гигабайты → heap overflow → перезапись metadata аллокатора.
Защита: проверка
count < SIZE_MAX / sizeof(T),
-fsanitize=unsigned-integer-overflow.
😡
Double Freedelete ptr;
// ...
delete ptr; // Ломает free list аллокатора
Аллокатор хранит free-блоки в linked list. Double free записывает адрес блока в free list дважды. Следующий malloc() может вернуть один и тот же блок двум владельцам → два указателя на одну память → запись через один портит данные другого.
Защита: RAII, умные указатели,
heap profiler.
💰
Format String — printf как бэкдорprintf(userInput); // "%x %x %n"
%x читает стек (утечка адресов ASLR), %n пишет по адресу из стека. Атакующий конструирует цепочку спецификаторов для записи произвольного значения в произвольный адрес.
Защита: всегда
printf("%s", input), -
Wformat=2.
🍕
Практический выводВсе уязвимости эксплуатируют UB и прямой доступ к памяти. Защитный стек 2026: компилятор (-D_FORTIFY_SOURCE=2), санитайзеры на
CI, ASLR+DEP в рантайме. Но даже это не заменит понимание механизмов на уровне стека и кучи.
✏️
Какие санитайзеры используете в проекте?📍Навигация:
Вакансии • Задачи • СобесыБиблиотека C/C++ разработчика #буст