Защита от хакеров корпоративных сетей
Шрифт:
· В программу переполнения буфера входят загрузчик, адрес перехода и программный код полезной нагрузки.
· Загрузчик записывает программный код полезной нагрузки в указанный буфер. В зависимости от ситуации загрузка может осуществляться сетевыми средствами, с помощью формы ввода или чтения из файла.
· Адрес перехода – адрес, который подменяет сохраненное в стеке содержимое регистра EIP. Имеется много возможностей для подмены содержимого регистра EIP с целью непосредственной или косвенной передачи управления нужной программе. Ряд способов позволяет повысить надежность передачи управления, например к ним относятся способ последовательности операций NOP (NOP sleds) или способ
· Программный код полезной нагрузки – это код, который стремится выполнить нападающий и который может делать все, что угодно. Анализируя результаты дизассемблирования прототипа программного кода полезной нагрузки на языке С, получают его окончательный вариант в виде последовательности машинных команд. Обычно код полезной нагрузки состоит из самых необходимых команд процессора, чтобы максимально сжать программный код, сэкономить место и время его доставки.
Современные способы переполнения буфера
· Для защиты от переполнения буфера проверяется безопасность записываемых в буфер данных. В результате риск переполнения буфера может уменьшиться, но не исчезнет совсем, потому что широко известны способы маскировки небезопасных данных. Например, если в буфер записываются только алфавитно-цифровые символы, то при записи программного кода из алфавитно-цифровых символов проверка данных ничего не выявит, а при проверке длины записываемых данных следует написать более компактный код.
· Иногда вместо подмены сохраненного в стеке содержимого регистра EIP возможны только частичное переполнение буфера или подмена значений в отдельных областях стека. Этого оказывается достаточным для передачи управления нужной программе. Требуется лишь подпортить данные в нужном месте стека, чтобы в дальнейшем произошло переполнение буфера и была вызвана нужная программа. Или в стеке подменить указатель функции, чтобы при ее вызове опять же вызвать нужную программу.
· Кроме переполнения стека, к компрометации системы может привести переполнение динамически распределяемой памяти, если в результате переполнения будут искажены данные или перезаписан указатель функции, потому что это в конечном счете приводит к установлению контроля над процессором.
Новаторские принципы построения программного кода полезной нагрузки
· В программном коде полезной нагрузки может использоваться уже загруженный обычным способом программный код. Это позволит уменьшить размер программного кода полезной нагрузки и предоставит возможность воспользоваться готовыми заготовками программ в своих целях. Не следует забывать, что зачастую в память загружено больше программного кода, чем это нужно. Поэтому исследование памяти процесса поможет найти полезный, предварительно загруженный код.
· Если для программы переполнения буфера чего-то не хватает, не бойтесь самостоятельно догрузить необходимое. Загружая динамические библиотеки, можно загрузить любой код, уже существующий на машине. Это даст практически неограниченные возможности для написания программного кода полезной нагрузки.
· Вложенный программный код полезной нагрузки позволяет скомпрометировать систему. Основная идея вложенного программного кода полезной нагрузки заключается в использовании одним кодом полезной нагрузки с незначительными правами другой уязвимости для загрузки нового кода полезной нагрузки в память привилегированного процесса.
Часто задаваемые вопросы
Наиболее часто авторы книги отвечали на приведенные ниже вопросы. Вопросы интересны тем, что они позволяют читателю лучше усвоить изложенный в главе материал и реализовать его на практике для обеспечения безопасности вычислительных систем. Если у читателя возникли вопросы по главе, зайдите на сайт www.syngress.com/solutions и щелкните
Вопрос: В чем причина переполнения буфера? Ответ: Причиной переполнения буфера является стек, который широко используется программами. Неверный контроль размера пересылаемых данных может привести к разрушению стека. Противостоят этому аппаратные и программные средства. Но зачастую применяемые для защиты стека решения относятся к области экзотики и влекут неоправданные издержки в производительности и совместимости.
Вопрос: Где можно глубже познакомиться с вопросами переполнения буфера? Ответ: Чтение списков рассылки типа Bugtraq (www.securityfocus.com) и сопутствующие статьи об атаках переполнения буфера в журналах типа «Phrack» помогут значительно углубить знания в этой области.
Вопрос: Возможно ли самостоятельно выявить в программе уязвимость переполнения буфера? Ответ: Квалифицированное тестирование поможет избавиться от ошибок переполнения буфера в программе. Уделите достаточно времени написанию своих программ и используйте в программах функции, проверяющие размер обрабатываемых данных.
Вопрос: Переполняются только буферы? Ответ: Фактически любое неправильное использование стековых переменных может привести к переполнению буфера. Этот тип уязвимости присущ программам, написанным на языке программирования с недостаточным контролем типов используемых данных, например на языке С. В последнее время возросли последствия от переполнения буфера, о чем свидетельствуют, например, локальная компрометация Sendmail (www.securityfocus.com/bid/3163) и найденная удаленная уязвимость в SSH1 (www.securityfocus.com/bid/2347). Подобные уязвимости трудны для обнаружения автоматическим инструментарием и могут доставить серьезные проблемы в будущем.
Вопрос: Каким образом можно обнаружить переполнение буфера? Ответ: Существует ряд способов для локализации в программе ошибок переполнения буфера. При наличии исходного текста атакованного приложения можно воспользоваться рядом разнообразных инструментальных средств, предназначенных для определения проблемных участков кода. Например, ITS4 (www.cigital.com/services/its4) или FlawFinder (www.dwheeler.com/flawfinder). Но и без исходных текстов доступен ряд способов. Один из них – проверка входных данных. Многочисленные инструментальные средства пригодны для контроля полей ввода информации в программах общего применения. К ним относится компонента контроля общесетевых протоколов CHAM (common hacker attack methods – общие методы хакерских атак) программы eEye\'s Retina (www.eEye.com), написанная автором. Дэйв Айтел (Dave Aitel) из @Stake написал для API программу SPIKE (www.atstake.com/research/tools/spike-v1.8.tar.gz), которая проверяет входные данные Web-приложений. Один из недавно появившихся способов обнаружения уязвимости переполнения буфера основан на ревизии выполнимого кода. Ревизия выполнимого кода основана на пользовательских средствах поиска характерных комбинаций машинных команд. Пока подобных общедоступных средств мало, но в скором времени ожидается рост их числа. При желании можно изучить даже некоторые инструментальные средства атак.
Глава 9 Ошибки форматирующей строки
В этой главе обсуждаются следующие темы:
• Уязвимость форматирующей строки
• Пример уязвимой программы
• Тестирование программ способом случайной форматирующей строки
• Программа атаки с использованием форматирующей строки
· Резюме
· Конспект
· Часто задаваемые вопросы