Целостность потока управления
Целостность потока управления ( CFI ) — это общий термин для методов компьютерной безопасности при самых разных атаках вредоносных программ , которые предотвращают перенаправление потока выполнения ( потока управления ) программы .
Предыстория [ править ]
Компьютерная программа обычно меняет свой поток управления, чтобы принимать решения и использовать разные части кода. Такие передачи могут быть прямыми , когда целевой адрес записывается в самом коде, или косвенными , когда целевой адрес сам является переменной в памяти или регистре ЦП. При типичном вызове функции программа выполняет прямой вызов, но возвращается к вызывающей функции, используя стек – косвенная передача обратного края . Когда указатель на функцию вызывается , например, из виртуальной таблицы , мы говорим, что происходит косвенная передача вперед . [1] [2]
Злоумышленники стремятся внедрить код в программу, чтобы использовать ее привилегии или извлечь данные из ее памяти. До того, как исполняемый код стал доступен только для чтения, злоумышленник мог произвольно изменять код во время его выполнения, ориентируясь на прямую передачу или даже вообще обходясь без передачи. После того, как W^X получил широкое распространение, злоумышленник хочет вместо этого перенаправить выполнение в отдельную незащищенную область, содержащую запускаемый код, используя косвенные передачи: можно перезаписать виртуальную таблицу для атаки по переднему краю или изменить стек вызовов. для атаки по обратному краю ( возвратно-ориентированное программирование ). CFI предназначен для защиты непрямых переводов от попадания в непредусмотренные места. [1]
Техники [ править ]
Сопутствующие методы включают разделение указателей кода (CPS), целостность указателя кода (CPI), канарейки стека , теневые стеки и проверку указателя виртуальной таблицы . [3] [4] [5]
Реализации [ править ]
Сопутствующие реализации доступны в Clang (в целом LLVM), [6] Microsoft Control Flow Guard [7] [8] [9] и защита обратного потока, [10] Косвенные проверки вызовов функций Google [11] и защита от повторного использования атак (RAP). [12] [13]
LLVM/Clang [ править ]
Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( сентябрь 2020 г. ) |
LLVM/Clang предоставляет опцию «CFI», которая работает на переднем крае, проверяя наличие ошибок в виртуальных таблицах и приведения типов. зависит от оптимизации времени соединения (LTO). Знание того, какие функции следует вызывать в обычных случаях, [14] Существует отдельная схема « теневого стека вызовов », которая защищает обратную сторону путем проверки изменений стека вызовов, доступная только для aarch64. [15]
С 2018 года Google поставляет Android с ядром Linux , скомпилированным Clang, с оптимизацией времени соединения (LTO) и CFI. [16] SCS доступен для ядра Linux в качестве опции, в том числе и для Android. [17]
flow Enforcement Intel Control - Технология
Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( январь 2021 г. ) |
Технология Intel Control-flow Enforcement (CET) обнаруживает компромиссы для контроля целостности потока с помощью теневого стека (SS) и косвенного отслеживания ветвей (IBT). [18] [19]
Теневой стек хранит копию адреса возврата каждого CALL в специально защищенном теневом стеке. При RET процессор проверяет, равны ли адреса возврата, хранящиеся в обычном и теневом стеках. Если адреса не равны, процессор генерирует INT #21 (ошибка защиты потока управления).
Косвенное отслеживание ветвей обнаруживает косвенные инструкции JMP или CALL с неавторизованными целями. Это реализовано путем добавления нового внутреннего конечного автомата в процессор. Поведение косвенных инструкций JMP и CALL изменено таким образом, что они переключают конечный автомат с IDLE на WAIT_FOR_ENDBRANCH. В состоянии WAIT_FOR_ENDBRANCH следующей выполняемой инструкцией должна быть новая инструкция ENDBRANCH (ENDBR32 в 32-битном режиме или ENDBR64 в 64-битном режиме), которая меняет внутренний конечный автомат с WAIT_FOR_ENDBRANCH обратно на IDLE. Таким образом, каждая разрешенная цель косвенного JMP или CALL должна начинаться с ENDBRANCH. Если процессор находится в состоянии WAIT_FOR_ENDBRANCH (то есть предыдущая инструкция была косвенным JMP или CALL), а следующая инструкция не является инструкцией ENDBRANCH, процессор генерирует INT #21 (ошибка защиты потока управления). На процессорах, не поддерживающих косвенное отслеживание ветвей CET, инструкции ENDBRANCH интерпретируются как NOP и не имеют никакого эффекта.
Microsoft Control Flow Guard [ править ]
Control Flow Guard (CFG) был впервые выпущен для Windows 8.1 с обновлением 3 (KB3000850) в ноябре 2014 года. Разработчики могут добавлять CFG в свои программы, добавив /guard:cf
флаг компоновщика перед связыванием программы в Visual Studio 2015 или более поздней версии. [20]
Начиная с обновления Windows 10 Creators Update (Windows 10 версии 1703), ядро Windows скомпилировано с помощью CFG. [21] Ядро Windows использует Hyper-V , чтобы предотвратить перезапись растрового изображения CFG вредоносным кодом ядра. [22]
для каждого процесса CFG работает путем создания битовой карты , где установленный бит указывает, что адрес является допустимым пунктом назначения. Перед выполнением каждого косвенного вызова функции приложение проверяет, присутствует ли адрес назначения в растровом изображении. Если адрес назначения отсутствует в растровом изображении, программа завершается. [20] Это усложняет злоумышленнику использование использования после освобождения путем замены содержимого объекта и последующего использования косвенного вызова функции для выполнения полезной нагрузки. [23]
Детали реализации [ править ]
Для всех защищенных косвенных вызовов функций _guard_check_icall
вызывается функция, которая выполняет следующие шаги: [24]
- Преобразуйте целевой адрес в смещение и номер бита в растровом изображении.
- Самые высокие 3 байта — это смещение байтов в растровом изображении.
- Битовое смещение представляет собой 5-битное значение. Первые четыре бита — это младшие биты с четвертого по восьмой адреса.
- Пятый бит битового смещения устанавливается в 0, если адрес назначения соответствует 0x10 (последние четыре бита равны 0), и в 1, если это не так.
- Проверьте значение адреса цели в растровом изображении.
- Если целевой адрес находится в растровом изображении, вернитесь без ошибки.
- Если целевой адрес отсутствует в растровом изображении, завершите программу.
Методы обхода [ править ]
Существует несколько общих методов обхода CFG:
- Установите в качестве места назначения код, расположенный в модуле, отличном от CFG, загруженном в том же процессе. [23] [25]
- Найдите непрямой вызов, который не был защищен CFG (CALL или JMP). [23] [25] [26]
- Используйте вызов функции с количеством аргументов, отличным от того, для которого предназначен вызов, что приводит к смещению стека и выполнению кода после возврата функции (исправлено в Windows 10). [27]
- Используйте вызов функции с тем же количеством аргументов, но один из переданных указателей обрабатывается как объект и записывается в смещение на основе указателя, что позволяет перезаписать адрес возврата. [28]
- Перезаписать вызов функции, используемый CFG для проверки адреса (исправлено в марте 2015 г.). [26]
- Установите для растрового изображения CFG все 1, разрешив все косвенные вызовы функций. [26]
- Используйте примитив контролируемой записи для перезаписи адреса в стеке (поскольку стек не защищен CFG) [26]
Microsoft eXtended Flow Guard [ править ]
eXtended Flow Guard (XFG) еще официально не выпущен, но доступен в предварительной версии Windows Insider и публично представлен на Bluehat Shanghai в 2019 году. [29]
XFG расширяет CFG, проверяя сигнатуры вызовов функций, чтобы гарантировать, что косвенные вызовы функций относятся только к подмножеству функций с той же сигнатурой. Проверка сигнатуры вызова функции реализуется путем добавления инструкций по сохранению хеша целевой функции в регистре r10 непосредственно перед косвенным вызовом и сохранения вычисленного хеша функции в памяти, непосредственно предшествующей коду целевого адреса. При выполнении косвенного вызова функция проверки XFG сравнивает значение в r10 с сохраненным хешем целевой функции. [30] [31]
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б Пайер, Маттиас. «Целостность потока управления: введение» . nebelwelt.net .
- ^ Буроу, Натан; Карр, Скотт А.; Нэш, Джозеф; Ларсен, Пер; Франц, Майкл; Брунталер, Стефан; Пайер, Матиас (31 января 2018 г.). «Целостность потока управления: точность, безопасность и производительность» . Обзоры вычислительной техники ACM . 50 (1): 1–33. дои : 10.1145/3054924 .
- ^ Пайер, Матиас ; Кузнецов Владимир. «О различиях свойств CFI, CPS и CPI» . nebelwelt.net . Проверено 1 июня 2016 г.
- ^ «Обнаружение ошибок Adobe Flash приводит к новому методу предотвращения атак» . Мрачное чтение . 10 ноября 2015 года . Проверено 1 июня 2016 г.
- ^ Финал. «Финал будет представлен на выставке Black Hat USA 2016» . www.prnewswire.com . Проверено 1 июня 2016 г.
- ^ «Целостность потока управления — документация Clang 3.9» . clang.llvm.org . Проверено 1 июня 2016 г.
- ^ Паули, Даррен. «Средство защиты от вредоносных программ Microsoft обновлено, но даже Редмонд говорит, что оно больше не нужно» . Регистр . Проверено 1 июня 2016 г.
- ^ Мимозо, Майкл (22 сентября 2015 г.). «Обход, разработанный для защиты памяти Microsoft, Control Flow Guard» . угроз | Первая остановка для новостей безопасности . Проверено 1 июня 2016 г.
- ^ Смит, г-жа (23 сентября 2015 г.). «DerbyCon: бывший лауреат премии BlueHat обойдет Control Flow Guard в Windows 10» . Сетевой мир . Архивировано из оригинала 27 сентября 2015 года . Проверено 1 июня 2016 г.
- ^ «Защитник обратного потока» . Тенсент . 2 ноября 2016 г. Проверено 19 января 2017 г.
- ^ Тайс, Кэролайн; Редер, Том; Коллингборн, Питер; Чековей, Стивен; Эрлингссон, Ульфар; Лосано, Луис; Пайк, Джефф (01 января 2014 г.). Обеспечение целостности прямого потока управления в GCC и LLVM . стр. 941–955. ISBN 9781931971157 .
- ^ Безопасность, хе-хе. «Команда PaX представляет защиту от эксплойтов повторного использования кода» . Безопасность (на немецком языке) . Проверено 1 июня 2016 г.
- ^ «Часто задаваемые вопросы о РПД» . Проверено 1 июня 2016 г.
- ^ «Целостность потока управления — документация Clang 17.0.0git» . clang.llvm.org .
- ^ «ShadowCallStack — документация Clang 17.0.0git» . clang.llvm.org .
- ^ «Обновлены патчи Clang LTO для ядра Linux — Phoronix» .
- ^ «ShadowCallStack» . Проект Android с открытым исходным кодом .
- ^ «Спецификация технологии обеспечения контроля потока управления» (PDF) . Зона разработчиков Intel . Архивировано из оригинала (PDF) 14 августа 2017 г. Проверено 05 января 2021 г.
- ^ «RIP ROP: Внутреннее устройство CET в Windows 20H1» . Winsider Seminars & Solutions Inc. Проверено 05 января 2021 г.
- ^ Jump up to: Перейти обратно: а б «Защитник потока управления» . MSDN . Проверено 19 января 2017 г.
- ^ «Анализ выпуска Shadow Brokers и смягчения последствий с помощью безопасности на основе виртуализации Windows 10» . Майкрософт Технет . 16 июня 2017 года . Проверено 20 июня 2017 г.
- ^ «Универсальный обход CFG посредством злоупотребления изменчивостью» (PDF) . Блог Алекса Ионеску . Проверено 7 июля 2017 г.
- ^ Jump up to: Перейти обратно: а б с Фалькон, Франциско (25 марта 2015 г.). «Использование CVE-2015-0311, часть II: обход защиты потока управления в Windows 8.1 с обновлением 3» . Основная безопасность . Проверено 19 января 2017 г.
- ^ «Защита потока управления» (PDF) . Тренд Микро . Проверено 19 января 2017 г.
- ^ Jump up to: Перейти обратно: а б «Внутренние элементы управления потоком управления Windows 10» (PDF) . Сила сообщества . Проверено 19 января 2017 г.
- ^ Jump up to: Перейти обратно: а б с д «Комплексный обход защиты потока управления» (PDF) . Блэкхэт . Проверено 19 января 2017 г.
- ^ «Интересная деталь об Control Flow Guard» . Бром . Проверено 19 января 2017 г.
- ^ Томас, Сэм (18 августа 2016 г.). «Объектно-ориентированная эксплуатация: новые методы обхода средств защиты Windows» . Слайдшер . Проверено 19 января 2017 г.
- ^ «Повышение безопасности Windows» . Проверено 19 мая 2021 г.
- ^ «РАСШИРЕННАЯ ЗАЩИТА ПОТОКА ПОД МИКРОСКОПОМ» . Проверено 19 мая 2021 г.
- ^ «Разработка эксплойта: между камнем и защитным местом (расширенного потока): исследование XFG» . 23 августа 2020 г. Проверено 19 мая 2021 г.