Powstaje często z brakujących lub błędnych kontroli długości w językach pozwalających na bezpośredni dostęp do pamięci. Skutki mieszczą się od uszkodzonych danych i awarii do — w pewnych warunkach — nieuprawnionego wykonania kodu.
Bufory mogą znajdować się na stosie, stercie lub innych obszarach pamięci, a słabość może dotyczyć niebezpiecznej operacji kopiowania, błędnego obliczenia rozmiaru lub zapisu poza granicami. Nadpisywana lokalizacja, kontrola atakującego, platforma i zabezpieczenia czasu wykonania kształtują wykorzystywalność i konsekwencje.
Najważniejsze punkty
Redukcja przyczynTam, gdzie to wykonalne, preferuj języki i interfejsy bezpieczne pamięciowo, waliduj długości i obliczenia całkowitoliczbowe, unikaj operacji bez ograniczeń i przeglądaj interakcje z komponentami natywnymi lub w inny sposób niebezpiecznymi pamięciowo.
WeryfikacjaUżywaj ukierunkowanego przeglądu kodu, analizy statycznej, diagnostyki kompilatora, sanitizerów, fuzzingu i testów regresyjnych do znajdowania defektów i potwierdzania, że poprawki pokrywają leżącą u podstaw klasę.
Warstwy czasu wykonaniaZabezpieczenia kompilatora i systemu operacyjnego, takie jak kanarki (canaries), pamięć niewykonywalna i randomizacja adresów, mogą utrudniać część eksploatacji, a izolacja i minimalne uprawnienia mogą ograniczać konsekwencje.
Istotne ograniczeniePrzepełnienie bufora nie zezwala automatycznie na wykonanie kodu; może jedynie uszkodzić dane lub zakończyć proces. Zabezpieczenia czasu wykonania to obrona w głębę, a nie substytut usunięcia wadliwej operacji na pamięci.