Целостность потока управления

редактировать
термин в области компьютерной безопасности

Целостность потока управления (CFI ) - общий термин для компьютерной безопасности методы, которые предотвращают широкий спектр атак вредоносных программ от перенаправления потока выполнения (потока управления ) программы.

Содержание

  • 1 Методы
  • 2 Реализации
    • 2.1 Clang и Google Android
    • 2.2 Microsoft Control Flow Guard
    • 2.3 Детали реализации
    • 2.4 Методы обхода
  • 3 См. Также
  • 4 Ссылки

Методы

Связанные методы включают разделение кодовых указателей (CPS), целостность кодовых указателей (CPI), канарейки стека, теневые стеки, и vtable проверка указателя.

Реализации

Связанные реализации доступны в Clang, Microsoft's Control Flow Guard и Return Flow Guard, Google Indirect Function- Проверка вызовов и защита от повторного использования атак (RAP).

Clang и Google Android

Google поставил Android с ядром Linux, скомпилированным Clang с Оптимизация времени компоновки (LTO) и CFI с 2018 года.

Microsoft Control Flow Guard

Control Flow Guard (CFG) впервые был выпущен для Windows 8.1 Обновление 3 (KB3000850) в ноябре 2014 г. Разработчики могут добавлять CFG в свои программы, добавляя / guard: cfфлаг компоновщика перед компоновкой программы в Visual Studio 2015 или новее.

Начиная с Windows 10 Creators Update (Windows 10 версии 1703), ядро ​​Windows компилируется с CFG. Ядро Windows использует Hyper-V для предотвращения перезаписи вредоносным кодом ядра битовой карты CFG.

CFG работает, создавая битовую карту для каждого процесса, где установленный бит указывает, что адрес является действительный пункт назначения. Перед выполнением каждого косвенного вызова функции приложение проверяет, находится ли адрес назначения в битовой карте. Если адрес назначения отсутствует в битовой карте, программа завершается. Это затрудняет злоумышленнику использование use-after-free путем замены содержимого объекта и последующего использования косвенного вызова функции для выполнения полезной нагрузки.

Подробности реализации

Для всех защищенных косвенных вызовов функций вызывается функция _guard_check_icall, которая выполняет следующие шаги:

  1. Преобразует целевой адрес в смещение и номер бит в битовой карте.
    1. Старшие 3 байта - это байтовое смещение в битовой карте.
    2. Битовое смещение - это 5-битное значение. Первые четыре бита - это младшие биты адреса с 4-го по 8-й.
    3. Пятый бит битового смещения устанавливается в 0, если адрес назначения выровнен с 0x10 (последние четыре бита равны 0), и 1, если это не так.
  2. Изучите значение адреса цели в битовой карте
    1. Если целевой адрес находится в битовой карте, возвратиться без ошибки.
    2. Если целевой адрес не в растровом изображении завершите программу.

Методы обхода

Есть несколько общих методов обхода CFG:

  • Задайте адресатом код, расположенный в не-CFG модуле, загруженном в том же процессе.
  • Найдите косвенный вызов, который не был защищен CFG (CALL или JMP).
  • Используйте вызов функции с другим числом аргументов, чем предназначен для вызова, что приведет к смещению стека, и выполнение кода после возврата из функции (исправлено в Windows 10).
  • Используйте вызов функции с тем же количеством аргументов, но один из переданных указателей обрабатывается как объект и записывает в базу указателя d смещение, позволяющее перезаписать адрес возврата.
  • Перезаписать вызов функции, используемый CFG для проверки адреса (исправлено в марте 2015 г.)
  • Установить растровое изображение CFG на все единицы, разрешая все косвенные функции вызовы
  • Используйте примитив управляемой записи для перезаписи адреса в стеке (поскольку стек не защищен CFG)

См. также

Ссылки

Последняя правка сделана 2021-05-15 11:05:59
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте