Najlepsze praktyki w zakresie zabezpieczeń dla C++

Ten artykuł zawiera informacje o narzędziach zabezpieczeń i rozwiązaniach. Użycie ich nie sprawia, że aplikacje są odporne na ataki, ale sprawia, że skuteczne ataki są mniej prawdopodobne.

Funkcje zabezpieczeń visual C++

Te funkcje zabezpieczeń są wbudowane w kompilator i konsolidator języka Microsoft C++:

/guard (Włącz funkcję Control Flow Guard)
Powoduje, że kompilator analizuje przepływ sterowania dla celów wywołań pośrednich w czasie kompilacji, a następnie wstawia kod w celu zweryfikowania obiektów docelowych w czasie wykonywania.

/GS (Sprawdzanie zabezpieczeń buforu)
Nakazuje kompilatorowi wstawienie kodu wykrywania przekroczenia do funkcji, które są narażone na wykorzystanie. Po wykryciu przekroczenia wykonywanie zostanie zatrzymane. Domyślnie ta opcja jest włączona.

/SAFESEH(Obraz zawiera programy obsługi wyjątków Sejf)
Nakazuje konsolidatorowi dołączenie do obrazu wyjściowego tabeli zawierającej adres każdego programu obsługi wyjątków. W czasie wykonywania system operacyjny używa tej tabeli, aby upewnić się, że są wykonywane tylko uzasadnione programy obsługi wyjątków. Pomaga to zapobiec wykonywaniu procedur obsługi wyjątków, które są wprowadzane przez złośliwy atak w czasie wykonywania. Domyślnie ta opcja jest wyłączona.

/NXCOMPAT, /NXCOMPAT (Zgodne z zapobieganiem wykonywaniu danych) Te opcje kompilatora i konsolidatora umożliwiają zgodność zapobiegania wykonywaniu danych (DEP). Program DEP chroni procesor CPU przed wykonywaniem stron innych niż kod.

/analyze (Analiza kodu)
Ta opcja kompilatora aktywuje analizę kodu, która zgłasza potencjalne problemy z zabezpieczeniami, takie jak przepełnienie buforu, nie zainicjowana pamięć, wyłuski wskaźnika null i przecieki pamięci. Domyślnie ta opcja jest wyłączona. Aby uzyskać więcej informacji, zobacz Code Analysis for C/C++ Overview (Analiza kodu dla języka C/C++ — omówienie).

/DYNAMICBASE (Użyj losowego układu przestrzeni adresowej)
Ta opcja konsolidatora umożliwia tworzenie obrazu wykonywalnego, który można załadować w różnych lokalizacjach w pamięci na początku wykonywania. Ta opcja sprawia również, że lokalizacja stosu w pamięci jest znacznie mniej przewidywalna.

Rozszerzone zabezpieczenia CRT

Biblioteka środowiska uruchomieniowego języka C (CRT) została rozszerzona w celu uwzględnienia bezpiecznych wersji funkcji, które stanowią zagrożenie bezpieczeństwa — na przykład niezaznaczonej strcpy funkcji kopiowania ciągów. Ponieważ starsze, niezabezpieczone wersje tych funkcji są przestarzałe, powodują ostrzeżenia dotyczące czasu kompilacji. Zachęcamy do korzystania z bezpiecznych wersji tych funkcji CRT zamiast pomijania ostrzeżeń kompilacji. Aby uzyskać więcej informacji, zobacz Funkcje zabezpieczeń w CRT.

Biblioteka SafeInt

biblioteka Sejf Int pomaga zapobiegać przepełnianiu liczb całkowitych i innym błędom, które mogą wystąpić, gdy aplikacja wykonuje operacje matematyczne. Biblioteka SafeInt zawiera klasę Sejf Int, klasę Sejf IntException i kilka funkcji Sejf Int.

Klasa SafeInt chroni przed przepełnieniem liczb całkowitych i programami wykorzystującymi luki podzielone przez zero. Można go użyć do obsługi porównań między wartościami różnych typów. Zapewnia ona dwie zasady obsługi błędów. Domyślne zasady są przeznaczone dla SafeInt klasy, aby zgłosić SafeIntException wyjątek klasy, aby zgłosić, dlaczego nie można ukończyć operacji matematycznej. Drugą zasadą jest zatrzymanie wykonywania programu przez klasę SafeInt . Można również zdefiniować zasady niestandardowe.

Każda SafeInt funkcja chroni jedną operację matematyczną przed błędem, który można wykorzystać. Można użyć dwóch różnych rodzajów parametrów bez konwertowania ich na ten sam typ. Aby chronić wiele operacji matematycznych, użyj SafeInt klasy .

Zaznaczone iteratory

Sprawdzony iterator wymusza granice kontenera. Domyślnie, gdy sprawdzony iterator jest poza granicami, generuje wyjątek i kończy wykonywanie programu. Sprawdzony iterator udostępnia inne poziomy odpowiedzi, które zależą od wartości przypisanych do preprocesora, takich jak _SECURE_SCL_THROWS i _ITERATOR_DEBUG_LEVEL. Na przykład w _ITERATOR_DEBUG_LEVEL=2pliku sprawdzony iterator zapewnia kompleksowe kontrole poprawności w trybie debugowania, które są udostępniane przy użyciu aseratorów. Aby uzyskać więcej informacji, zobacz Sprawdzono iteratory i _ITERATOR_DEBUG_LEVEL.

Analizowanie kodu zarządzanego

Analiza kodu zarządzanego, znana również jako FxCop, sprawdza zestawy pod kątem zgodności z wytycznymi projektowymi platformy the.NET Framework. FxCop analizuje kod i metadane w każdym zestawie, aby sprawdzić wady w następujących obszarach:

  • Projekt biblioteki

  • Lokalizacja

  • Konwencje nazewnictwa

  • Wydajność

  • Zabezpieczenia

Weryfikator aplikacji systemu Windows

Weryfikator aplikacji (AppVerifier) może pomóc w zidentyfikowaniu potencjalnych problemów ze zgodnością, stabilnością i zabezpieczeniami aplikacji.

Narzędzie AppVerifier monitoruje sposób korzystania z systemu operacyjnego przez aplikację. Obserwuje system plików, rejestr, pamięć i interfejsy API, gdy aplikacja jest uruchomiona, i zaleca poprawki kodu źródłowego w przypadku wykrytych problemów.

Możesz użyć elementu AppVerifier, aby:

  • Przetestuj potencjalne błędy zgodności aplikacji spowodowane typowymi błędami programowania.

  • Sprawdź aplikację pod kątem problemów związanych z pamięcią.

  • Identyfikowanie potencjalnych problemów z zabezpieczeniami w aplikacji.

Konta użytkowników systemu Windows

Korzystanie z kont użytkowników systemu Windows należących do grupy Administracja istrators uwidacznia deweloperów i — według rozszerzeń — klientów na zagrożenia bezpieczeństwa. Aby uzyskać więcej informacji, zobacz Running as a Member of the Users Group (Running as a Member of the Users Group ) ( Jak kontrola konta użytkownika (UAC) wpływa na aplikację.

Wskazówki dotyczące kanałów po stronie wykonywania spekulatywnego

Aby uzyskać informacje na temat sposobu wcięcia i eliminowania problemów ze sprzętem kanału po stronie wykonywania spekulacyjnego w oprogramowaniu C++, zobacz C++ Developer Guidance for Speculative Execution Side Channels (Wskazówki dla deweloperów języka C++ dotyczące kanałów po stronie wykonywania spekulatywnego).

Zobacz też

System.Security
Bezpieczeństwo
Jak kontrola konta użytkownika (UAC) wpływa na aplikację?