Бравые помощники компилятора Крис Касперски ака мыщъх Хакер, номер #076, стр. 076-104-2 Это сужает круг "подозреваемых" и значительно упрощает задачу контроля за буферами. Существует множество утилит, предотвращающих (или, во всяком случае, пытающихся предотвратить) переполнения. Вот только некоторые из них... Stack Guard Вероятно, самый удачный и самый популярный анти-хакерский протектор, представляющий собой заплатку для GCC, модернизирующую машинный код пролога (function_prolog) и эпилога (function_prolog), вставляемый компилятором в начало и конец каждой функции. При входе в функцию, поверх адреса возврата устанавливается чувствительный индикатор (он же canary-word), неизбежно затираемый хакером при последовательном переполнении. Перед выходом из функции, canary-word сверяется с оригиналом, хранящемся в недосягаемом для хакера месте, и если его целостность окажется нарушенной, программа сообщит, что ее взломали, и мирно отвалит, устроив себе настоящий DoS (отказ в обслуживании). Для предотвращения подделки чувствительного детектора Stack Guard предпринимает целый ряд мер. Canary-word представляет собой комбинацию из четырех символов-завершителей (0x00000000L, CR, LF и FFh), которые большинство функций воспринимает как завершитель ввода, и случайной привязки, считываемой из устройства /dev/urandom или генерируемой на основе текущего времени, если /dev/urandom недоступно. Этот прием защищает лишь от последовательных переполнений (да и то не от всех), и бессилен против индексных. При необходимости, Stack Guard может запрещать модификацию адреса возврата на время выполнения функции, что существенно усиливает защищенность, но вместе с тем, "роняет" производительность (canary-word быстродействия практически не сокращает). К тому же, для реализации данного механизма требуется определенная поддержка со стороны ядра, а в большинстве ядер ее нет. ProPolice Для предотвращения атак срыва стека (stack smashing attack) на основе Stack Guard одним японским кодером из IBM был создан ProPolice (Stack Protector) - патч для GCC, с помощью которого переопределяются объявления локальных переменных и добавляются дополнительные проверки во время выполнения программ. При обнаружении переполнения проблемный процесс ликвидируется и в системный журнал производится запись типа "stack overflow in function XXX". В настоящее время ProPolice по умолчанию включен в Trusted Debian и OpenBSD. Неисполняемый стек Специальный патч от Solar'a Designer'а, встраивается в Линуховое ядро, делая стек неисполняемым. Переполняющиеся буфера по прежнему будут приводить к краху приложения, но непосредственная передача управления на shell-код становится невозможной, точнее возможной, но очень трудно реализуемой (подробности в статье Defeating Solar Designer's Non-executable Stack Patch, выложенной на сервере www.insecure.org/sploits/non-executable.stack.problems.html). |