Jak zapobiec atakom przepełnienia bufora
Krok 1
Napisz kod zabezpieczający, aby uniknąć ataków przepełnienia. W języku C istnieje wiele funkcji, które hakerzy mogą wykorzystać do przepełnienia buforów. Zminimalizuj użycie funkcji strcpy (), strcat (), sprintf () i vsprintf (), które nie sprawdzają limitów. Jeśli to możliwe, unikaj używania gets (), które nie określa, ile znaków ma zostać przeczytanych, a zatem pozostawia twój kod podatny na ataki. Jeśli używasz scanf (), pamiętaj o podaniu szerokości dla formatu% s, aby uniknąć przepełnień.
Krok 2
Sprawdź, czy możesz używać trampolin, aby uniknąć przepełnienia bufora. Ponieważ przepełnienie bufora występuje w stosach pamięci, a nie w kodzie, najprostszym rozwiązaniem wydaje się zapobieganie wykonywaniu kodu przez wstawianie niewielkich fragmentów kodu, aby uniemożliwić te działania. Jest to możliwe w Linuksie, ale jest to bardzo trudne. Tylko kilka kompilatorów używa małych fragmentów kodu zwanych trampolinami, które działają jako bariera między kodem wywołania funkcji a samą funkcją. Dlatego, jeśli złośliwy kod próbuje zastąpić bufor, trampolina może przechwycić i zneutralizować próby hakerów.
Krok 3
Zaimplementuj narzędzia kompilacji, aby dać ci ostrzeżenia, gdy używasz kodu, który pozostawia cię podatną na ataki. Niektóre z tych narzędzi wygenerują kod, który uniemożliwi osobom postronnym dostęp do nielegalnych adresów i wyłączy kod, który podejmie taką próbę. Produkty takie jak StackShield i StackGuard są bardzo pomocne. StackSheild przeanalizuje adres zwrotny funkcji i wypowie ją w przypadku wystąpienia nieprawidłowości. StackGuard umieszcza słowo Kanarowe w adresie nadawcy i sprawdza, czy słowo zostało zmienione, kończąc funkcję, gdy jest ona dostępna.
Krok 4
Zainstaluj narzędzia, takie jak libsafe, aby sprawdzić zabezpieczenia w dynamicznym środowisku wykonawczym. Libsafe działa w systemie Linux i sprawdza najbliższy adres zwrotny ramki stosu, a następnie upewnia się, że adres nie zostanie nadpisany. Libsafe zastąpi także niezabezpieczone funkcje, takie jak gets (), strcpy () i scanf ().