Методы защиты от атаки типа переполнение буфера
Переполнение буфера
По своей сути переполнение буфера - это удивительно простая ошибка, которая возникает в результате обычной практики. Компьютерные программы часто работают с кусками данных, которые считываются из файла, из сети или даже с клавиатуры. Программы выделяют блоки памяти конечного размера - буферы - для хранения этих данных в процессе работы над ними. Переполнение буфера происходит, когда в буфер записывается или считывается из него больше данных, чем он может вместить.
Методы защиты от атаки переполнения буфера: ASLR
В Linux есть некоторые встроенные механизмы, которые предотвращают выполнение потенциально вредоносного кода в случае переполнения буфера в программе. ASLR — рандомизация расположения адресного пространства — это рандомизирует адреса памяти, используемые программой каждый раз, когда она запускается, это становится препятствием на пути злоумышленника, поскольку это мешает им легко сделать рабочий эксплойт. Например, если каждый раз меняется обратный адрес, на который вы хотите перенаправить свою программу, она не может быть жестко закодирована в эксплойте. Это особенность самой ОС. Чтобы отключить ASLR: Это должно быть запущено снова после перезагрузки, если оно не включено в сценарий запуска, который автоматически выполняется при каждой загрузке.
Методы защиты от атаки переполнения буфера: DEP
DEP — предотвращение выполнения данных. Это помечает некоторые уязвимые части в памяти как неисполняемые. Это особенность компилятора. Некоторые директивы можно использовать во время компиляции, чтобы отключить такие функции защиты, поскольку они включены по умолчанию в gcc. Параметр -fno-stack-protector отключает стековую часть (канарейки), а параметр -z execstack делает исполняемыми и кучу, и стек.
Методы защиты от атаки переполнения буфера: инструменты во время разработки
Во время разработки существуют инструменты, которые могут анализировать исходный код и работающие программы, чтобы попытаться обнаружить опасные конструкции или ошибки переполнения до того, как эти ошибки попадут в готовое программное обеспечение. Например, AddressSantizer (это инструмент программирования с открытым исходным кодом, который обнаруживает ошибки повреждения памяти, такие как переполнение буфера или доступ к висящему указателю), и более старые, такие как Valgrind (это программный инструмент для отладки памяти, обнаружения утечек памяти и профилирования), предлагают такие возможности. Однако эти инструменты требуют активного участия разработчика.
Методы защиты от атаки переполнения буфера: некоторые системы
Возможно, наиболее важной является защита, известная под различными названиями W^X (“write exclusive-or execute”), DEP (“data execution prevention”), NX (“No Xecute”), XD (“eXecute Disable”), EVP (“Enhanced Virus Protection”, довольно необычный термин, иногда используемый AMD), XN (“eXecute Never”) и, возможно, другие. Принцип здесь прост. Эти системы стремятся сделать память либо пригодной для записи (пригодной для буферов), либо для исполнения (пригодной для библиотек и программного кода), но не для того и другого. Таким образом, даже если злоумышленник сможет переполнить буфер и контролировать адрес возврата, процессор в итоге откажется выполнять шеллкод.
Методы защиты от атаки переполнения буфера: неисполняемый стек
Неисполняемый стек предотвращает выполнения кода в области памяти стека (или динамической памяти), а также запись исполняемого кода, что может в некоторых случаях предотвратить эксплуатацию переполнения буфера. Таким образом, произвести переполнение буфера путем инъекции в стек исполняемого кода представляется невозможным, если используется неисполняемый стек.