Mastodon Mastodon Mastodon Mastodon

Переповнення буфера

Оновлено: · CyberSecureFox Editorial Team

Переповнення буфера — помилка роботи з пам’яттю, за якої програма записує в буфер більше даних, ніж він вміщує, і перезаписує сусідні ділянки пам’яті.

Як відбувається переповнення буфера

Програми на C і C++ виділяють буфери фіксованого розміру для рядків, мережевих пакетів та інших даних. Якщо код копіює вхідні дані без перевірки довжини — наприклад, функціями strcpy чи sprintf, — зайві байти «перетікають» у сусідню пам’ять. Під час переповнення у стеку можна перезаписати адресу повернення функції, під час переповнення у купі — пошкодити інші об’єкти та службові дані алокатора.

Зловмисник, який керує цими даними, може перенаправити виконання на свій код або зібрати його з наявних фрагментів (ROP — зворотно-орієнтоване програмування). Підсумок — віддалене виконання коду чи підвищення привілеїв, у кращому разі — аварійне завершення програми.

Чому це важливо

Переповнення буфера — один із найстаріших і найбільш експлуатованих класів вразливостей. Його використав хробак Морріса 1988 року, а Code Red (2001) і SQL Slammer (2003) поширилися світом через переповнення в серверах Microsoft. Запис за межі буфера (CWE-787) досі входить до лідерів рейтингу CWE Top 25 найнебезпечніших програмних помилок. За даними Microsoft і Google, помилки роботи з пам’яттю разом із use-after-free становлять більшість критичних вразливостей у великих проєктах на C/C++.

Як запобігти

  • Писати новий код мовами з безпечною роботою з пам’яттю — Rust, Go, Java, C#, як радять CISA та АНБ.
  • У C/C++ використовувати функції з перевіркою меж і сучасні контейнери, тестувати фазерами й AddressSanitizer.
  • Не вимикати захисти компілятора та ОС: stack canary, DEP/NX, ASLR, CFI.
  • Швидко встановлювати оновлення — публічні експлойти для переповнень з’являються швидко.
Синоніми:
buffer overflow