Предотвращают ли канарейки атаки на возврат в libc и программирование, ориентированное на возврат? - PullRequest
11 голосов
/ 06 апреля 2011

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

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

Ответы [ 2 ]

17 голосов
/ 26 апреля 2012

Разве канарейка делает подобные атаки невозможными?Это затрудняет выполнение return-to-libc или ROP, но это определенно не серебряная пуля против таких атак.

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

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

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

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

3 голосов
/ 13 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...