На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Атаки на переполнение буфера с помощью механизмов фильтрации и аудита транзакций

Иногда для уничтожения файла журнала или организации неполадок в процессе регистрации системных событий используются очень большие транзакции. При такой атаке код для создания отчетов в журнале может исследовать транзакцию в реальном времени, но слишком большие транзакции приводят к переходу к интересующей хакера ветке кода или к вызову нужного ему исключения. Другими словами, транзакция исполняется, но происходит ошибка в механизме регистрации или фильтре. Это имеет два последствия: во-первых, можно запускать транзакции, которые не регистрируются (возможно полное искажение регистрационной записи для такой транзакции), а во-вторых, можно проникать через установленную систему фильтрации, которая в другом случае остановила бы атаку.
Шаблон атаки: ошибка при фильтрации с помощью переполнения буфера
При этой атаке хакер хочет, чтобы в механизме фильтрации произошел сбой, и он добивается этого с помощью транзакции очень большого размера. Если при подобном сбое фильтр "открывает дорогу", значит, хакер добился нужного результата,
Ошибка при фильтрации в демоне программы Taylor UUCP
Одним из вариантов проведения атаки с использованием ошибки в работе фильтра является отправка аргументов слишком большого размера. Демон Taylor UUCP предназначен для удаления вредоносных аргументов до их исполнения. Однако при наличии слишком длинных аргументов этот демон оказывается не в состоянии их удалить. Это "открывает двери" для проведения атаки.
Переполнение буфера с помощью переменных среды
Большое количество атак основано на использовании переменных среды. Переменные среды также считаются уязвимым местом, где переполнение буфера может применяться для передачи в программу вредоносного набора байтов. При этом программа может принимать абсолютно непроверенные входные данные и использовать их в действительно важных местах.

Шаблон атаки: атаки на переполнение буфера с помощью переменных среды
В программах используется огромное количество переменных среды, и нередко при этом нарушаются принципы безопасности. В этом шаблоне атаки определяется, может ли конкретная переменная среды привести к ошибке в работе программы.
Переполнение буфера с помощью $НОМБ
Атака на переполнение буфера в программе sccw позволяет локальным пользователям с помощью переменной среды $НОМЕ получить доступ с правами суперпользователя.
Атака на переполнение буфера с помощью TERM
ДЛЯ атаки на переполнение буфера в программе г log in можно воспользоваться глобальной переменной TERM.
Шаблон атаки: атаки на переполнение буфера с помощью вызовов функций API
Атаки на переполнение буфера могут проводиться с помощью библиотек или модулей совместно используемого кода. Таким образом, опасности подвергаются и все клиенты, которые используют уязвимую библиотеку. Это имеет огромное значение для безопасности всей системы, поскольку подобные ошибки влияют на многие программные процессы.
Модуль libc для FreeBSD
Переполнение буфера во FreeBSD-утилите setlocate (хранится в модуле libc) оказывает существенное влияние на работу сразу многих программ.
Ошибка в библиотеке xt
Атака на переполнение буфера в библиотеке xt системы X позволяет локальным пользователям выполнять команды с привилегиями суперпользователя.
Шаблон атаки: переполнение буфера в локальных утилитах с интерфейсом командной строки
Доступные во многих командных интерпретаторах утилиты с интерфейсом командной строки, могут применяться для расширения привилегий вплоть до уровня суперпользователя.
Переполнение буфера в passwd
Атака на переполнение буфера, проведенная против команды passwd для платформы HPUX, позволяет пользователям с помощью аргумента командной строки получить привилегии системного администратора.
Ошибка в getopt для платформы Solaris
Используя чрезмерно большое значение argv [ 0 ] в команде getopt (модуль libc) на платформе Solaris, можно организовать переполнение буфера и получить привилегии суперпользователя.

Проблема множественных операций
Когда данные обрабатываются функцией, то последняя, как известно, должна четко отслеживать, что происходит с данными. Но это справедливо, только когда с данными "работает" одна функция. Когда же с одними и теми же данными выполняется несколько операций, то проследить воздействие на данные каждой из операций становится значительно сложнее. В частности, это справедливо, если при операции каким-либо образом изменяется строка данных.
Существует множество стандартных операций со строками, которые изменяют размер строки. Нас интересует тот момент, когда программный код, который отвечает за преобразование, не изменяет размер буфера, в котором хранится строка.
Шаблон атаки: увеличение размера параметров
Если предоставленные параметры преобразуются функцией обработки в более длинную строку, но это изменение размера никак не учитывается, то хакер получает возможность для проведения атаки. Это происходит тогда, когда оригинальный (некорректный) размер строки используется в остальных частях программы.
Ошибка в функции glob () FTP-сервера
В результате некорректного изменения размеров строки для атаки можно использовать расширение имени файла функцией glob () FTP-сервера.
Поиск возможностей для осуществления переполнения буфера
Одним из простейших методов для поиска возможностей переполнения буфера является предоставление на вход программы чересчур длинных аргументов и изучение того, что происходит в дальнейшем. Этот элементарный подход используется в некоторых из средств для обеспечения безопасности приложений. С этой же целью можно создавать длинные запросы к Web- или FTP-серверу или создавать "неприятные" заголовки сообщений электронной почты и предоставлять их на вход sendmail. Иногда такой вариант тестирования по методу "черного ящика" может принести положительный результат, но он всегда отнимает очень много времени.
Намного лучше при поиске ошибок переполнения буфера найти уязвимые вызовы функций API с помощью методов статического анализа. Используя или исходный, или дизассемблированный код, подобный поиск можно выполнять автоматически. После обнаружения потенциально уязвимых мест можно воспользоваться тестированием по методу "черного ящика" с целью проверить эффективность использования этих ошибок при атаке.

Сокрытие ошибки при обработке исключений
При динамическом тестировании возможных ошибок, связанных с переполнением буфера, следует помнить, что вполне реально воспользоваться обработчиками исключений. Они будут перехватывать некоторые некорректные входные данные и таким образом не давать программе проявлять внутренние ошибки, даже если хакеру удалось вызвать нужное переполнение буфера. Если программа "справляется" с попыткой организовать переполнение буфера и нет никаких внешних проявлений случившегося события, то весьма сложно узнать, оказала ли проведенная попытка какое-либо воздействие на работу программы.
Обработчики исключений представляют собой специальные блоки кода, которые вызываются, когда происходит ошибка при обработке данных (что полностью соответствует происходящему при возникновении переполнения буфера). В процессоре х86 обработчики исключений хранятся в связанном списке (linked list) и вызываются по порядку. Вершина списка обработчиков исключений хранится по адресу, который указан в регистре FS: [ 0 ]. Таким образом регистр FS указывает на специальную структуру, которая называется ТЕВ (Thread Environment Block), а первый элемент этой структуры (FS: [ 0 ] ) является обработчиком исключений.
С помощью нескольких приведенных ниже команд можно определить, используется ли обработчик исключений (порядок команд может изменяться в зависимости от фазы Луны, то есть совершенно произвольный).
mov eax, fs:[0 ]
push SOME_ADDRESS_TO_AN_EXCEPTION_HANDLER push eax
mov dword ptr fs:[0] , esp
Если возникает впечатление, будто обработчик команд маскирует существующую ошибку, которую способен использовать хакер, то всегда можно подключиться к исполняющемуся процессу с помощью отладчика и установить точку останова на адресе вызова обработчика исключений.
Использование дизассемблера
Вместо использования методов слепого динамического тестирования для выявления потенциальных целей атак на переполнение буфера, лучше воспользоваться методами статического анализа программ. Одним из лучших вариантов, с которых следует начать работу, является дизассемблирование двоичного файла. Значительный объем информации можно получить при быстром поиске статических строк, ко­торые содержат символы форматирования, например %з, одновременно выявляя места, где эти строки подаются на обработку.
При этом методе исследования ссылки на статические строки обычно даются с указанием смещения (offset).
push offset SOMELCOOTDN
Если подобный код находится выше кода операции со строкой, проверьте, не указывает ли приведенный адрес на строку форматирования (индикатором служит строка %s). Если смещение указывает на строку форматирования, то следующая проверка должна относиться к исходной строке: не является ли она строкой пользовательских данных? Для этой цели можно провести поиск тегов boron

"Подготовка вредоносных данных"). Если смещение используется для перехода на операцию работы со строкой (и не обрабатываются пользовательские данные), то эта область кода, скорее всего, неуязвима для атаки, поскольку пользователь не имеет непосредственного контроля над данными.
Если цель (адресат) операции по работе со строкой находится в стеке, то обычно она указывается как смещение из ЕВР, например:
push [ebp-10h]
Такая структура указывает на использование буферов стека. Если цель операции находится в стеке, то провести атаку с помощью переполнения буфера достаточно просто. Если вызывается функция strncpy () или другая подобная функция, которая задает размер, то хакер может проверить, что этот размер, по крайней мере, немного меньше, чем действительный размер данных в буфере. Мы поясним это немного позже, однако основная идея состоит в том, чтобы найти ошибку хотя бы минимального превышения доступного размера буфера, когда можно провести атаку через стек. И наконец, для любых вычислений, при которых используется значение длины данных, хакер должен проверить наличие ошибок преобразования знаковых чисел в беззнаковые и наоборот (что мы также поясним далее).

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика