Kiedy i jak korzystać z funkcji ochrony stosu GCC?

Włączyłem Ostrzeżenie -Wstack-protector podczas kompilacji projektu, nad którym pracuję (komercyjny wieloplatformowy silnik C++, kompilujący się na Mac OS X 10.6 z GCC 4.2). Ta flaga ostrzega o funkcjach, które nie będą chronione przed rozbijaniem stosu, nawet jeśli -fstack-protector jest włączona. GCC emituje pewne ostrzeżenia podczas budowania projektu:

Funkcja Nie chroniąca: brak bufora o długości co najmniej 8 bajtów
nie chroni zmiennych lokalnych: zmienna długość bufor

Dla pierwszego Ostrzeżenia, odkryłem, że możliwe jest dostosowanie minimalnego rozmiaru bufora, który musi mieć, gdy jest używany w funkcji, aby ta funkcja była chroniona przed smashingiem stosu: --param ssp-buffer-size=X może być używana, gdzie X domyślnie wynosi 8 i może być tak małe, jak 1.

Dla drugiego ostrzeżenia, nie mogę stłumić jego wystąpienia, chyba że przestanę używać -Wstack-protector.

  1. Kiedy należy stosować -fstack-protector? (jak na przykład, cały czas podczas dev, czy tylko podczas śledzenia błędów?)
  2. Kiedy należy stosować -fstack-protector-all?
  3. co mi mówi -Wstack-protector? Czy to sugeruje zmniejszenie minimalnej wielkości bufora?
  4. jeśli tak, to czy są jakieś minusy, aby umieścić rozmiar do 1?
  5. wygląda na to, że -Wstack-protector nie jest typem flagi, którą chcesz włączyć przez cały czas, jeśli chcesz mieć kompilację bez ostrzeżeń. Czy to prawda?
Author: Jonathan Leffler, 2009-10-27

2 answers

Stack-protection jest strategią utwardzania, a nie debugowania. Jeśli Twoja gra jest zorientowana na sieć lub w inny sposób zawiera dane pochodzące z niekontrolowanego źródła, włącz ją. Jeśli nie ma danych pochodzących z niekontrolowanego miejsca, nie włączaj go.

Oto jak to się rozegra: jeśli masz błąd i zmienisz bufor w oparciu o coś, co atakujący może kontrolować, ten atakujący może zastąpić adres zwrotny lub podobne części stosu, aby spowodować, że zamiast tego wykona swój kod Twojego kodu. Ochrona stosu spowoduje przerwanie programu, jeśli wykryje to zdarzenie. Twoi użytkownicy nie będą zadowoleni, ale nie zostaną zhakowani. To nie jest rodzaj hakowania, który polega na oszukiwaniu w grze, to rodzaj hakowania, który polega na użyciu luki w kodzie, aby stworzyć exploit, który potencjalnie zainfekuje Twojego użytkownika.

Dla rozwiązań zorientowanych na debugowanie, spójrz na rzeczy takie jak mudflap.

Co do Twoich konkretnych pytań:

  1. użyj stosu protector, jeśli otrzymujesz dane z niekontrolowanych źródeł. Odpowiedź na to pytanie brzmi prawdopodobnie tak. Więc użyj go. Nawet jeśli nie masz danych z niekontrolowanych źródeł, prawdopodobnie w końcu lub już to zrobisz i nie zdajesz sobie z tego sprawy.
  2. Zabezpieczenia stosu dla wszystkich buforów mogą być używane, jeśli chcesz uzyskać dodatkową ochronę w zamian za jakiś hit wydajności. Z gcc4. 4. 2 Podręcznik :

    - fstack-protector

    Emituj dodatkowy kod do sprawdzenia dla przepełnień buforów, takich jak ataki smashingu stosu. Odbywa się to poprzez dodanie zmiennej guard do funkcji z podatnymi obiektami. Obejmuje to funkcje wywołujące alloca oraz funkcje z buforami większymi niż 8 bajtów. Osłony są inicjowane po wprowadzeniu funkcji, a następnie sprawdzane po zakończeniu funkcji. Jeśli kontrola osłony nie powiedzie się, wyświetlany jest komunikat o błędzie i Program kończy działanie.

    - fstack-protector-all

    Like-fstack-protector że wszystkie funkcje są chronione.

  3. Ostrzeżenia mówią, jakich buforów Ochrona stosu nie może chronić.

  4. niekoniecznie sugeruje zmniejszenie minimalnego rozmiaru bufora, a przy rozmiarze 0/1 jest to takie samo jak stack-protector-all. To tylko wskazując go do ciebie, tak, że można, jeśli zdecydujesz przeprojektować kod tak, że bufor jest chroniony.
  5. nie, te ostrzeżenia nie reprezentują problemów, tylko wskazują informacje dla Ciebie. Nie używaj ich regularnie.
 70
Author: brantgurga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 12:55:50

Rzeczywiście nie powinno cię obchodzić ostrzeżenie dla normalnych budów. To raczej wiadomość informacyjna. Mam nadzieję, że to oczywiste, że masz nieodłączną troskę o bezpieczeństwo ze zmiennymi buforami na stosie; źle Oblicz rozmiar i otwierasz dużą dziurę.

 1
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-28 04:46:05