TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #6435 2.58K
😔 Почему большинство критичных уязвимостей связаны с управлением памятью в 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 Free

delete 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++ разработчика

#буст
  • 🔥 9
  • 👍 3
  • 😁 1
  • 🌚 1
  • 👾 1
More from @cppproglib
  1. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  2. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 13, 2026🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение s…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →