2012-02-22 12 views
13

Przez przypadek natknąłem się na artykuł wspominający, że możesz "włączyć" ASLR z -pie -fPIE (lub raczej uczynić swoją aplikację ASLR-świadomą). -fstack-protector jest również powszechnie zalecany (choć rzadko widzę wyjaśnienia, jak i przeciw jakiemu rodzajowi ataków on chroni).Przydatne flagi GCC do poprawy bezpieczeństwa programów?

Czy istnieje lista przydatnych opcji i objaśnień, w jaki sposób zwiększają one bezpieczeństwo?

...

A jak przydatne są takie środki i tak, gdy aplikacja używa około 30 bibliotek, które korzystają z żadnej z tych? ;)

+0

co to jest ASLR? gdzie możemy znaleźć szczegółowe wyjaśnienie tych flag i ich wpływu na wydajność? – sree

Odpowiedz

4

Co do ostatniego pytania:

A jak przydatne są takie środki i tak, gdy aplikacja używa około 30 bibliotek, które korzystają z żadnej z tych? ;)

PIE jest konieczne tylko dla główny program aby mogły być ładowane w sposób losowy adres. ASLR zawsze działa dla bibliotek współdzielonych, więc korzyści PIE są takie same bez względu na to, czy korzystasz z jednej biblioteki współdzielonej, czy 100.

Ochronnik stosu skorzysta tylko z kodu skompilowanego z ochroną przed stosami, więc używaj go tylko w swoim głównym Program nie pomoże, jeśli twoje biblioteki będą pełne luk.

W każdym razie, zachęcam do tego, aby nie brać pod uwagę tych opcji jako części aplikacji, a zamiast tego stanowić część całej integracji systemu. Jeśli korzystasz z ponad 30 bibliotek (z których większość to śmieciowe, jeśli chodzi o jakość kodu i bezpieczeństwo) w programie, który będzie współpracował z niezaufanymi, potencjalnie szkodliwymi danymi, dobrym pomysłem będzie zbudowanie całego systemu z osłoną stosu i innymi opcjami hartowania zabezpieczającego.

Należy jednak pamiętać, że najwyższe poziomy _FORTIFY_SOURCE i prawdopodobnie niektóre inne nowe opcje bezpieczeństwa powodują przerwanie ważnych rzeczy, które mogą być wymagane przez prawidłowe i poprawne programy, dlatego też należy przeanalizować, czy można z nich bezpiecznie korzystać. . Jedna znana, niebezpieczna rzecz, którą robi jedna z opcji (zapominam o której) sprawia, że ​​specyfikator %n dla printf nie działa, przynajmniej w niektórych przypadkach. Jeśli aplikacja używa %n, aby uzyskać przesunięcie w wygenerowanym ciągu i musi użyć tego offsetu, aby później go zapisać, a wartość nie zostanie wypełniona, jest to potencjalna luka sama w sobie ...

5

The Hardening page on the Debian wiki wyjaśnia co najmniej najbardziej popularne, które są użyteczne w systemie Linux. Z listy brakuje przynajmniej -D_FORTIFY_SOURCE = 2, -Wformat, -Wformat-security, a dla dynamicznego programu ładującego - relro, a teraz funkcje.

+0

Upewnij się, że nigdy nie użyjesz -D_FORTIFY_SOURCE = 2 bez -O1 (lub -O2, -O3, itd.). Debian naprawił to, ale niektóre dystrybucje nie, i tam przerwie kompilację na -O0. IOW, nie dodawaj -D_FORTIFY_SOURCE do CPPFLAGS tam, gdzie powinno. Dodaj go do CFLAGS/CXXFLAGS wraz z opcją -O1/-O2/-O3/-O6. – anonymous

5

Gentoo Hardened wykorzystuje te flagi:

CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" 
LDFLAGS="-Wl,-z,now -Wl,-z,relro" 

widziałem około 5-10% spadek wydajności w porównaniu do zoptymalizowanego Gentoo Linux (w tym PAX/SELinux i inne środki, nie tylko CFLAGS.) w domyślnej benchmarku Phoronix apartamencie.

+1

Aby nieco zaktualizować tę odpowiedź, lepiej użyć "-fstack-protector-strong", który tylko wstawia kanarki na stos w funkcjach, w których może nastąpić przepełnienie, a nie wszędzie. Skutkuje to praktycznie tak skutecznym ograniczaniem SO, aby uzyskać mniejszy koszt pod względem kosztów ogólnych. – AoeAoe

Powiązane problemy