Стек теней - Shadow stack

В компьютерная безопасность, а теневой стек это механизм защиты процедура хранится обратный адрес,[1] например, из переполнение буфера стека. Сам теневой стек - это второй отдельный стек, который «затеняет» программу. стек вызовов. в пролог функции, функция сохраняет свой адрес возврата как в стеке вызовов, так и в теневом стеке. в эпилог функции, функция загружает адрес возврата как из стека вызовов, так и из стека теней, а затем сравнивает их. Если две записи обратного адреса различаются, то обнаружена атака; Типичный план действий - просто завершить программу или предупредить системных администраторов о возможной попытке вторжения. Теневой стек похож на стек канареек в том, что оба механизма направлены на поддержание целостность потока управления защищенной программы путем обнаружения атак, которые изменяют сохраненный адрес возврата злоумышленником во время эксплуатация пытаться.

Теневые стеки могут быть реализованы путем перекомпиляции программ с измененными прологами и эпилогами,[2] с помощью методов динамической двоичной перезаписи для достижения того же эффекта,[3] или с аппаратной поддержкой.[4] В отличие от стека вызовов, который также хранит локальные программные переменные, переданные аргументы, разлитые регистры и другие данные, теневой стек обычно просто хранит вторую копию адреса возврата функции.

Теневые стеки обеспечивают большую защиту адресов возврата, чем канарейки стека, которые полагаются на секретность канареечного значения и уязвимы для атак несмежной записи.[5] Сами стеки теней могут быть защищены защитными страницами[6] или с сокрытием информации, так что злоумышленнику также потребуется найти теневой стек, чтобы перезаписать адрес возврата, хранящийся там.

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

В 2016 г. Intel объявила о предстоящей аппаратной поддержке теневых стеков с помощью технологии Control-flow Enforcement.[7]

Теневые стеки сталкиваются с некоторыми проблемами совместимости. После того, как программа выдает исключение или longjmp происходит, адрес возврата в верхней части теневого стека не будет соответствовать адресу возврата, извлеченному из стека вызовов. Типичным решением этой проблемы является выталкивание записей из теневого стека до тех пор, пока не будет найден соответствующий адрес возврата, и завершение программы только тогда, когда совпадений в теневом стеке не найдено.[3].

А многопоточный программа, у которой будет стек вызовов для каждого выполняющегося потока, тогда также будет иметь теневой стек, затеняющий каждый из стеков вызовов.

Смотрите также

Рекомендации

  1. ^ Делшадтехрани, Лейла; Элдридж, Шайлер; Чанакчи, Садулла; Эгеле, Мануэль; Джоши, Аджай (1 января 2018 г.). "Нил: программируемый сопроцессор мониторинга". Письма IEEE по компьютерной архитектуре. 17 (1): 92–95. Дои:10.1109 / LCA.2017.2784416. ISSN  1556-6056.
  2. ^ "StackShield: инструмент защиты от разрушения стека для Linux". Вендикатор.
  3. ^ а б Синнадурай, Сараванан; Чжао, Цинь; Вонг, Вен Фай (2008). «Прозрачный теневой стек времени выполнения: защита от злонамеренного изменения адреса возврата» (PDF). Цитировать журнал требует | журнал = (помощь)
  4. ^ Ozdoganoglu, H .; Бродли, К.; Виджайкумар, Т .; Куперман, Б. (2002). «SmashGuard: Аппаратное решение для предотвращения атак на адрес возврата функции» (PDF). Цитировать журнал требует | журнал = (помощь)
  5. ^ Секерес, Ласло; Плательщик, Матиас; Вэй, Дао; Песня, Рассвет. «СОК: Вечная война в памяти» (PDF). Цитировать журнал требует | журнал = (помощь)
  6. ^ Чиеу, Цзиккер; Сюй, Фу-Хау (2001). «RAD: решение во время компиляции для атак на переполнение буфера». Труды 21-й Международной конференции по распределенным вычислительным системам. С. 409–417. Дои:10.1109 / ICDSC.2001.918971. ISBN  0-7695-1077-9.
  7. ^ "Предварительный просмотр технологии принудительного исполнения потока управления" (PDF). Корпорация Intel.