Рекомендации по безопасности для C++

В этой статье содержатся сведения об инструментах и методиках обеспечения безопасности. Использование этих инструментов не дает полной гарантии защиты от хакерских атак, но при этом существенно снижает шансы на успех таких атак.

Средства безопасности в Visual C++

Эти функции безопасности встроены в компилятор Microsoft C++ и компоновщик:

/guard (Включить функцию управления Flow Guard)
Приводит компилятору анализировать поток управления для непрямых целевых объектов вызовов во время компиляции, а затем вставлять код для проверки целевых объектов во время выполнения.

/GS (Проверка безопасности буфера)
Указывает компилятору на необходимость вставки кода, обнаруживающего переполнения, в функции, которыми могут воспользоваться злоумышленники. При обнаружении переполнения выполнение программы прекращается. По умолчанию этот параметр включен.

/SAFESEH (Образ содержит безопасные обработчики исключений)
Указывает компоновщику на необходимость включения в выходной образ таблицы, содержащей адрес каждого обработчика исключений. Во время выполнения операционная система проверяет по этой таблице, действительно ли используются только допустимые обработчики исключений. Это помогает предотвратить запуск обработчиков исключений, внедряемых злоумышленниками в среду выполнения. По умолчанию этот параметр выключен.

/NXCOMPAT, /NXCOMPAT (совместим с предотвращением выполнения данных) Эти параметры компилятора и компоновщика позволяют обеспечить совместимость защиты от выполнения данных (DEP). Функция DEP защищает ЦП от исполнения страниц, не содержащих кода.

/analyze (Анализ кода)
Этот параметр компилятора запускает анализ кода с целью выявления потенциальных проблем безопасности, таких как переполнение буфера, отмена инициализации памяти, разыменование нулевого указателя и утечки памяти. По умолчанию этот параметр выключен. Дополнительные сведения см. в разделе "Анализ кода для C/C++".

/DYNAMICBASE (Использование случайности макета адресного пространства)
Этот параметр компоновщика позволяет собрать исполняемый образ, который можно загрузить в другое расположение в памяти в начале выполнения. Этот параметр также делает расположение стека в памяти значительно менее прогнозируемым.

Среда выполнения повышенной безопасности

В библиотеку времени выполнения C (CRT) были добавлены безопасные версии функций, которые могут создать угрозу безопасности, например функция копирования непроверенной строки strcpy. Поскольку устаревшие, небезопасные версии этих функций использовать не рекомендуется, во время компиляции они выводят предупреждения. Рекомендуется использовать безопасные версии этих функций CRT, а не подавлять вывод предупреждений компилятора. Дополнительные сведения см. в разделе Функции безопасности в CRT.

Библиотека SafeInt

Библиотека SafeInt помогает предотвратить переполнение целых чисел и другие ошибки, которые могут возникнуть при выполнении математических операций приложения. Библиотека SafeInt включает класс SafeInt, класс SafeIntException и несколько функций SafeInt.

Класс SafeInt защищает от ошибок переполнения емкости целочисленных переменных и деления на нуль, которые могут использоваться в злонамеренных целях. Его можно использовать для обработки сравнений значений различных типов. Она предоставляет две политики обработки ошибок. Политика по умолчанию класса SafeInt заключается в выдаче исключения класса SafeIntException, сообщающего о причинах невозможности выполнения математической операции. Вторая политика заключается в том, что класс SafeInt останавливает выполнение программы. Также можно определить пользовательскую политику.

Каждая функция класса SafeInt защищает от злонамеренного использования ошибок одной из математических операций. Можно использовать параметры двух различных типов без преобразования их к одному типу. Для защиты множества математических операций используйте класс SafeInt.

Checked Iterators

Проверяемый итератор обеспечивает принудительное соблюдение ограничений контейнера. По умолчанию при превышении ограничений проверяемого итератора создается исключение, и выполнение программы прекращается. Проверяемый итератор предоставляет другие уровни ответа, которые зависят от значений, назначенных препроцессору, таких как _SECURE_SCL_THROWS и _ITERATOR_DEBUG_LEVEL. Например, _ITERATOR_DEBUG_LEVEL=2проверяемый итератор предоставляет комплексные проверки правильности в режиме отладки, которые становятся доступными с помощью утверждений. Дополнительные сведения см. в разделе "Проверенные итераторы " и _ITERATOR_DEBUG_LEVEL.

Анализ управляемого кода

Инструмент анализа управляемого кода, также известный как FxCop, выполняет проверку сборок на соответствие рекомендациям, изложенным в Правилах разработки приложений платформы .NET Framework. FxCop анализирует код и метаданные в каждой сборке и выявляет дефекты по следующим направлениям:

  • Разработка библиотек

  • Локализация

  • Соглашения об именах

  • Производительность

  • Безопасность

Средство проверки приложений Windows

Средство проверки приложений (AppVerifier) поможет определить потенциальные проблемы совместимости приложений, стабильности и безопасности.

Средство AppVerifier контролирует использование операционной системы приложением. Он следит за файловой системой, реестром, памятью и API-интерфейсами во время работы приложения, а при обнаружении ошибок выдает рекомендации по исправлению исходного кода.

Можно использовать AppVerifier в следующих целях:

  • Тестирование приложения на наличие возможных проблем совместимости, возникающих в результате типичных ошибок программирования.

  • Исследовать приложения для определения утечек памяти.

  • Выявлять потенциальные проблемы безопасности в приложениях.

Учетные записи пользователей Windows

Для разработчиков и в конечном счете пользователей использование учетных записей Windows, относящихся к группе "Администраторы", создает повышенный риск для безопасности. Дополнительные сведения см. в разделе "Запуск от имени члена группы пользователей" и "Как управление учетными записями пользователей" (UAC) влияет на ваше приложение.

Руководство по спекулятивным каналам выполнения на стороне

Сведения о том, как идентифицировать и устранять проблемы с аппаратными уязвимостями аппаратного обеспечения на стороне спекулятивного выполнения на стороне выполнения на C++ см . в руководстве разработчика C++ по спекулятивным каналам выполнения.

См. также

System.Security
Безопасность
Влияние контроля учетных записей на приложение