Предотвращают ли canaries атаки с возвратом в libc и программирование, ориентированное на возврат?

#security #stack-overflow #exploit

#Безопасность #переполнение стека #эксплойт

Вопрос:

Я пытаюсь понять, возможны ли эксплойты с возвратом в libc и программирование, ориентированное на возврат, если используется canary.
Canary будет помещен в стек между возвращаемым значением и переполняемым буфером, и его потребуется перезаписать, чтобы изменить возвращаемое значение на местоположение библиотечной функции или вычисления. Canaries существуют с 1997 года (StackGuard), а ROP — это метод, впервые представленный в 2007 году (Shacham).

Делает ли canary атаки такого типа невозможными?

Ответ №1:

Делает ли canary атаки такого типа невозможными?

Нет, это не так. Это усложняет выполнение возврата в libc или ROP, но это определенно не является серебряной пулей против таких атак.

Прежде всего, stack canaries защищают только от потери адреса возврата из-за переполнения буфера. Но есть и другие способы повреждения памяти: косвенная перезапись указателя или уязвимости при форматировании строк, чтобы назвать два.

Во-вторых, stack canaries можно обойти, перезаписав их исходным значением. Я не говорю, что это легко в современных реализациях, но это, безусловно, не невозможно.

В-третьих, хотя атаки называются программированием, ориентированным на возврат в libc и Return, кто сказал, что нам нужны инструкции возврата для выполнения этих атак? Эти атаки могут быть инициированы повреждением любой ячейки памяти, из которой процессор будет загружаться, и адреса для перехода к ним. Наиболее распространенным примером является указатель на функцию. Но мы могли бы также перезаписать буферы GOT или longjmp . (В качестве дополнительного примечания было показано, что ROP может быть выполнен без использования каких инструкций возврата!)

Четвертая причина заключается не в слабости stack canaries в se, а в одной из большинства реализаций. Канарейки стека обычно помещаются только в функции, которые имеют буфер символов на основе стека размером не менее 8. Следовательно, эти реализации не будут обнаруживать переполнения в других буферах. Этот эксплойт использовал переполнение массива целых чисел, поэтому он не мог быть обнаружен stack canaries.

Комментарии:

1. @Aderis: Спасибо, исправлено!

Ответ №2:

Вот веб-сайт, который объясняет canaries, созданные с помощью gcc. http://xorl.wordpress.com/2010/10/14/linux-glibc-stack-canary-values /. Поскольку canary проверяется перед выполнением команды ret, ваш эксплойт завершится неудачей, если вы перезапишете canary (что в большинстве случаев вам приходится делать, чтобы перезаписать адрес возврата в стеке). Поскольку ROP и Return в Lib c также перезаписывают адрес возврата, оба метода не будут работать.