Предотвращают ли канарейки атаки возврата в libc и возвратно-ориентированного программирования?

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

Делает ли канарейка подобные атаки невозможными?


person jj.    schedule 06.04.2011    source источник


Ответы (2)


Делает ли канарейка подобные атаки невозможными?

Нет, это не так. Это затрудняет возврат к libc или ROP, но это определенно не панацея от таких атак.

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

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

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

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

person mtvec    schedule 26.04.2012
comment
@Aderis: Спасибо, исправлено! - person mtvec; 13.03.2017

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

person Konstantin Weitz    schedule 13.04.2011