Целостность потока управления (CFI ) - общий термин для компьютерной безопасности методы, которые предотвращают широкий спектр атак вредоносных программ от перенаправления потока выполнения (потока управления ) программы.
Связанные методы включают разделение кодовых указателей (CPS), целостность кодовых указателей (CPI), канарейки стека, теневые стеки, и vtable проверка указателя.
Связанные реализации доступны в Clang, Microsoft's Control Flow Guard и Return Flow Guard, Google Indirect Function- Проверка вызовов и защита от повторного использования атак (RAP).
Google поставил Android с ядром Linux, скомпилированным Clang с Оптимизация времени компоновки (LTO) и CFI с 2018 года.
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
, которая выполняет следующие шаги:
Есть несколько общих методов обхода CFG: