Udostępnij za pośrednictwem


Unikanie przepełnień buforu

Przekroczenie buforu jest jednym z najczęstszych źródeł ryzyka bezpieczeństwa. Przepełnienie buforu jest spowodowane traktowaniem niesprawdzonych, zewnętrznych danych wejściowych jako wiarygodnych. Działanie kopiowania tych danych przy użyciu operacji, takich jak CopyMemory, strcat, strcpylub wcscpy, może tworzyć nieprzewidziane wyniki, co pozwala na uszkodzenie systemu. W najlepszych przypadkach aplikacja zostanie przerwana z podstawowym zrzutem, błędem segmentacji lub naruszeniem dostępu. W najgorszych przypadkach osoba atakująca może wykorzystać przepełnienie buforu, wprowadzając i wykonując inny złośliwy kod w procesie. Kopiowanie niezabezpieczonych danych wejściowych do bufora opartego na stosie jest najczęstszą przyczyną błędów, które można wykorzystać.

Przepełnienia buforu mogą wystąpić na różne sposoby. Poniższa lista zawiera krótkie wprowadzenie do kilku typów sytuacji przekroczenia buforu i oferuje kilka pomysłów i zasobów, które ułatwiają unikanie tworzenia nowych zagrożeń i eliminowania istniejących:

Przepełnienia buforu statycznego

Przepełnienie buforu statycznego występuje, gdy bufor, który został zadeklarowany na stosie, jest zapisywany z większą ilością danych niż przydzielono do przechowywania. Mniej widoczne wersje tego błędu występują, gdy niezweryfikowane dane wejściowe użytkownika są kopiowane bezpośrednio do zmiennej statycznej, powodując potencjalne uszkodzenie stosu.

przekroczenia sterta

Przepełnienie stert, takie jak przepełnienie buforu statycznego, może prowadzić do uszkodzenia pamięci i stosu. Ponieważ przekroczenia sterty występują w pamięci sterty, a nie w stosie, niektórzy uważają, że są mniej zdolne do powodowania poważnych problemów; niemniej jednak przekroczenia sterty wymagają rzeczywistej uwagi programistycznej i są równie zdolne do powodowania zagrożeń systemowych, jak przepełnienia buforu statycznego.

błędy indeksowania tablicy

Błędy indeksowania tablic są również źródłem przekroków pamięci. Staranne sprawdzanie granic i zarządzanie indeksami pomoże zapobiec przekroczeniu tego typu pamięci.

Zapobieganie przepełnieniu buforu polega przede wszystkim na pisaniu dobrego kodu. Zawsze sprawdzaj wszystkie dane wejściowe i bezpiecznie kończy się niepowodzeniem w razie potrzeby. Aby uzyskać więcej informacji na temat pisania bezpiecznego kodu, zobacz następujące zasoby:

  • Maguire, Steve [1993], Pisanie solidnego kodu, ISBN 1-55615-551-4, Microsoft Press, Redmond, Waszyngton.
  • Howard, Michael i LeBlanc, David [2003], Pisanie Bezpiecznego Kodu, 2. wyd., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.

Notatka

Te zasoby mogą nie być dostępne w niektórych językach i krajach.

 

Bezpieczna obsługa ciągów to długotrwały problem, który nadal jest rozwiązywany przez stosowanie dobrych rozwiązań programistycznych i często przy użyciu istniejących systemów z bezpiecznymi funkcjami obsługi ciągów i ich modernizacją. Przykładem zestawu funkcji dla interfejsu systemu Windows jest na przykład StringCbCat.