Делает ли канарейка подобные атаки невозможными?
Нет, это не так. Это затрудняет возврат к libc или ROP, но это определенно не панацея от таких атак.
Прежде всего, стековые канарейки защищают только от разрушения адреса возврата из-за переполнения буфера. Но есть и другие способы повредить память: косвенная перезапись указателя или уязвимости форматной строки.
Во-вторых, стековые канарейки можно обойти, перезаписав их исходным значением. Я не говорю, что это легко в современных реализациях, но это определенно не невозможно.
В-третьих, хотя атаки называются возврат-to-libc и возврат ориентированное программирование, кто сказал, что нам нужны инструкции возврата для выполнения этих атак? Эти атаки могут быть инициированы путем повреждения любого участка памяти, из которого будет загружаться процессор, и адреса для перехода. Наиболее распространенным примером является указатель на функцию. Но мы также можем перезаписать буферы GOT или longjmp
. (Кстати, было показано, что ROP можно выполнять без использования любые инструкции по возврату!)
Четвертая причина — это не слабость стековых канареек как таковых, а одна из реализаций. Канарейки стека обычно помещаются только в функции, которые имеют основанный на стеке буфер character размером не менее 8. Таким образом, такая реализация не будет обнаруживать переполнения в других буферах. Эта уязвимость использовала переполнение в целочисленном массиве, поэтому его нельзя было обнаруживаются стековыми канарейками.
person
mtvec
schedule
26.04.2012