Продолжая использовать наш сайт, вы даете согласие на обработку файлов cookie, которые обеспечивают правильную работу сайта. Благодаря им мы улучшаем сайт!
Принять и закрыть

Читать, слущать книги онлайн бесплатно!

Электронная Литература.

Бесплатная онлайн библиотека.

Читать: Защита от хакеров корпоративных сетей - Коллектив Авторов на бесплатной онлайн библиотеке Э-Лит


Помоги проекту - поделись книгой:

Анализируя приведенный пример, можно найти обработчик почты для домена cipherpunks.com. Хост parabola.cipherpunks.com может быть использован для сбора информации. Например, если в системе используется версия программы sendmail, которая позволит злоумышленнику расширить учетные записи пользователя, то он сможет найти адреса электронной почты системного администратора. Из этого можно будет узнать тип транспортного агента, установленного в системе, как это показано в следующем примере:

elliptic@ellipse:~$ telnet modulus.cipherpunks.com 25

Trying 192.168.1.253...

Connected to 192.168.1.253.

Escape character is “^]”.

220 modulus.cipherpunks.com ESMTP Server (Microsoft Exchange

Internet

Mail Service 5.5.2448.0) ready

Из примера видно, как почтовый север с радостью выбалтывает сведения об установленных программах (Microsoft Exchange), а из этого можно сделать вывод о типе операционной системы хоста.

Nmap

Атака, имеющая своей целью получение доступа к хосту, может быть направлена против выполняющихся в системе сервисов. Нередко сервисы уязвимы, и это позволяет злоумышленнику добиться своего. Еще до атаки можно высказать предположение о сервисах, используемых системой для предотвращения сбора информации, и исследовать порты, запустив утилиту netcat, чтобы выяснить возможность подключения через них в службе.

Сбор сведений о доступных сервисах системы сильно упрощается при использовании такого инструментария, как Network Mapper или Nmap. Как ранее уже упоминалось, Nmap в случае его применения для достижения злонамеренных целей использует многочисленные изощренные методы определения характеристик хоста. К этим возможностям относится переменный режим сканирования TCP-трафика и анализ IP-ответов для определения операционных систем и идентификации прослушиваемых сервисов на хосте.

Nmap может использоваться для определения общедоступных сервисов сети, а также прослушиваемых сервисов, подвергнувшихся фильтрации такими средствами, как оболочки TCP-трафика, или межсетевыми экранами. Посмотрите на следующий отчет:

elliptic@ellipse:~$ nmap -sS -O derivative.cipherpunks.com

Starting nmap V. 2.54BETA22 (www.insecure.org/nmap/)

Interesting ports on derivative.cipherpunks.com

(192.168.1.237):

(The 1533 ports scanned but not shown below are in state: closed)

Port State Service

21/tcp open ftp

22/tcp open ssh

23/tcp filtered telnet

25/tcp open smtp

37/tcp open time

53/tcp open domain

80/tcp open http

110/tcp open pop-3

143/tcp open imap2

Remote operating system guess: Solaris 2.6 – 2.7

Uptime 11.096 days (since Thu Nov 29 08:03:12 2001)

Nmap run completed – 1 IP address (1 host up) scanned in 60

seconds

Давайте одновременно проанализируем эту небольшую часть отчета о сканировании. Во-первых, Nmap был запущен с флагами sS и O. Эти флаги указывают Nmap на необходимость сканирования символов синхронизации SYN на хосте и идентификации операционной системы на основе полученных IP-ответов. Во-вторых, в отчете видны три колонки данных. В крайней слева колонке расположен номер порта и протокол, используемый прослушиваемым сервисом. В средней – состояние порта: подвергнулся ли порт фильтрации, как у порта службы telnet, являющейся оболочкой TCP-трафика, или открыт для общедоступного использования, как остальные. Индексация Web

Индексация Web (или, как ее еще обычно называют, спайдеринг (spidering) – движение паука по паутине) – следующий тип сбора информации. С начала 90-х годов компании типа Yahoo! WebCrawler и другие начали использовать автоматизированные программы для посещения Web-сайтов и индексации размещенных на них данных, чтобы впоследствии проиндексированные данные можно было найти с помощью поискового запроса. Это было началом бизнеса Web-порталов.

Индексация сайтов обычно выполняется различными по форме и названию программами. Их называют роботами, пауками или червяками. Хотя все они выполняют одну и ту же функцию, их безо всякой видимой причины называют по-разному. Эти программы просматривают все связи анализируемого Web-сайта и индексируют находящиеся на них данные. Индексы просмотренных данных помещаются в реляционную базу данных и связываются с поисковой машиной (машина поиска – в сети Internet инструментальные средства, предназначенные для отсеивания информации, не относящейся к теме запроса). Если пользователь во время посещения портала сформулирует поисковый запрос по ключевым словам, то ему будут предъявлены ссылки на проиндексированные Web-страницы, соответствующие его запросу.

Но что произойдет, если конфиденциальная информация Web-страниц не сохранится с соответствующими правами доступа? Поскольку данные Web-страниц архивированы, то злоумышленник может получить доступ к важной информации о сайте, а значит, он может собирать интересующие его сведения с помощью поисковой машины. Уже упоминалось о том, что эта проблема не нова. Она существовала несколько лет назад, начиная с первых поисковых машин, существует сегодня и, к сожалению, будет существовать завтра.

Эта проблема не ограничена порталами. Инструментарий типа wget может быть использован для рекурсивного извлечения всех страниц сайта. Для этого достаточно запустить программу с нужными параметрами. Посмотрите на следующий пример:

elliptic@ellipse:~$ wget -m -x http://www.mrhal.com

–11:27:35– http://www.mrhal.com:80/

=> “www.mrhal.com/index.html”

Connecting to www.mrhal.com:80... connected!

HTTP request sent, awaiting response... 200 OK

Length: 1,246 [text/html]

0K -> . [100%]

11:27:35 (243.36 KB/s) – “www.mrhal.com/index.html” saved

[1246/1246]

Loading robots.txt; please ignore errors.

–11:27:35– http://www.mrhal.com:80/robots.txt

=> “www.mrhal.com/robots.txt”

Connecting to www.mrhal.com:80... connected!

HTTP request sent, awaiting response... 404 Not Found

11:27:35 ERROR 404: Not Found.

–11:27:35– http://www.mrhal.com:80/pics/hal.jpg

=> “www.mrhal.com/pics/hal.jpg”

Connecting to www.mrhal.com:80... connected!

HTTP request sent, awaiting response... 200 OK

Length: 16,014 [image/jpeg]

0K -> .......... ..... [100%]

11:27:35 (1.91 MB/s) – “www.mrhal.com/pics/hal.jpg” saved

[16014/16014]

[…]

FINISHED –11:27:42–

Downloaded: 1,025,502 bytes in 44 files

В примере вывод команды wget завершен символами […] из-за большого количества файлов (44 файла), загружаемых с Web-сайта www.mrhal.com, которые были бы напечатаны в конце отчета. Команда wget была запущена с переключателями m и x. Переключатель m (переключатель зеркального сохранения информации) включает режим загрузки копии всех файлов сайта www.mrhal.com в соответствии с их ссылками. Переключатель x используется для сохранения структуры директорий сайта при его загрузке на компьютер пользователя. Подобный инструментарий позволяет злоумышленнику проиндексировать сайт и создать его зеркальную копию. Впоследствии злоумышленник может воспользоваться стандартными системными утилитами для быстрого анализа скопированных данных. Например, программа grep позволяет быстро найти представляющие для него интерес строки. В первую очередь это относится к строкам «password», «root» и «passwd».

Резюме

В главе рассмотрено семь классов атак, приводящих к отказу в обслуживании, утечке информации, нарушению прав доступа к файлу, дезинформации, доступу к специальным файлам или базам данных, удаленному вызову программ и расширению прав.

Об атаках, приводящих к отказу в обслуживании (DOS-атаках), говорят в том случае, когда в результате действий злоумышленника ресурс преднамеренно заблокирован или деградирован. Локальные DOS-атаки нацелены на достижение локального отказа в обслуживании и приводят к деградации процесса, исчерпанию дисковой памяти или истощению индексных узлов. DOS-атаки из сети могут начинаться как с сервера, так и с клиентской части (как в одном из вариантов DOS-атаки из сети на Web-браузеры – бомбы JavaScript). DOS-атаки из сети на сервисы используют многочисленные подключения для предотвращения использования сервисов. DOS-атаки на систему похожи на локальные DOS-атаки и основаны на создании потока символов синхронизации SYN для переполнения очереди или использовании атак типа smurf для достижения отказа в обслуживании в результате перенасыщения сетевого трафика. Распределенные DOS-атаки (DDoS-атаки) относятся к классу сетевых атак, нацеленных на систему в целом. Распределенные программы перенасыщения трафика, как, например, tfn и shaft, могут быть использованы для достижения отказа в обслуживании.

Утечка информации – результат злоупотребления ресурсами. Обычно нападению на систему предшествует утечка информации. В главе рассмотрены пути утечки информации через баннеры оболочки безопасности SSH. Была показана принципиальная возможность «снятия отпечатков пальцев» у ряда служб, например у служб, обеспечивающих работу по протоколам HTTP или FTP. Протокол SNMP – пример протокола, в котором недопустимо мало внимания уделено вопросам безопасности, и поэтому сравнительно легко получить доступ к важной информации в системах, построенных на его основе. Web-сервер легко предоставляет сведения, интересующие злоумышленников, если на него совершено нападение атакой типа точка-точка – слэш (../). Уже упоминалось об инциденте, когда один Интернет-провайдер воспользовался файлами паролей другого провайдера, для того чтобы переманить к себе его клиентов. Тем самым были рассеяны любые мифы о допустимости утечки информации в хорошо сделанной системе, даже если она может маскировать или скрывать свои «отпечатки пальцев».

При помощи изменения прав доступа к файлу злоумышленник может получить доступ к важной информации, например к именам пользователей и их паролям. Поэтому непонятно, почему зачастую специалисты в области безопасности пренебрегают такой мерой предосторожности, как изменение разрешений доступа к файлу или владельцев файлов, в которых записаны эти разрешения. При рассмотрении подобных вопросов важно различать однопользовательские системы, в которых не предусмотрено управление доступом к файлу, и многопользовательские системы с одним или несколькими уровнями доступа, примерами которых служат списки контроля ACL системы Solaris и ролевой механизм управления доступом (Role-Based Access Control-RBAC). В главе также обсуждались атаки символических связей для перезаписи файлов других пользователей.

Дезинформация определяется как предоставление противоположной стороне фальшивых данных, провоцирующих противоположную сторону на неадекватное поведение. Стандартные методы дезинформации предусматривают редактирование журналов, использование программных инструментальных средств с правами привилегированного пользователя (rootkits) и модулей ядра. Редактирование журналов – элементарное средство скрытия вторжения. Инструментальные средства типа rootkits позволяют подменять системные программы. Наиболее изощренные методы дезинформации заключаются в подмене модулей ядра, осуществляющих компрометацию системы на нижнем уровне операционной системы: на уровне ее ядра.

Доступ к специальным файлам / базам данных – еще одно средство получения доступа к системным ресурсам. Ранее обсуждалась возможность использования специальных файлов для получения важной информации, например паролей. База данных – хранилище важной информации о ресурсах системы. Доступ к базе данных может быть получен в результате использования ошибок в обслуживающем их программном обеспечении, например ошибок в Web-интерфейсе или программных ошибок типа переполнения буфера. Ну и конечно, от злоумышленника потребуются определенные усилия, чтобы разобраться с разграничением доступа в базах данных.

Удаленное выполнение программ – серьезная проблема, позволяющая злоумышленнику взять под свой контроль атакованную систему. Эта угроза легко реализуется в тех случаях, когда в системе не предусмотрена аутентификация. Удаленное выполнение программ осуществляется при помощи автоматизированного инструментария, накладывающего те или иные ограничения на используемые программы.

О расширении прав говорят в случае, когда неавторизованный пользователь получил доступ к ресурсу, хотя ранее он им не обладал. Были рассмотрены варианты удаленного получения доступа на правах как привилегированного, так и непривилегированного пользователя. В первом случае при помощи демонов HTTP на UNIX-системах, во втором – при помощи таких служб, как демоны SSH. В главе также обсуждались вопросы применения Троянских коней и методов социотехники для получения привилегированного пользовательского доступа к хосту. Отмечалось сходство методов удаленного и локального расширения прав.

Тестирование уязвимостей – необходимая и обязательная обязанность всякого, кто занимается администрированием систем или обеспечением их безопасности. Доказательство возможности нападения (proof of concept) – один из методов тестирования, который используется для доказательства существования уязвимостей. Другие методы заключаются в применении демонстрирующих проблему программ, автоматизированного инструментария безопасности и контроля версий (versioning) для обнаружения уязвимых версий программного обеспечения.

Опытный злоумышленник применяет различные методы подготовки атак. Базы данных Whois могут использоваться для сбора разносторонней информации о системе, доменах и сетях. Такие средства DNS, как утилита dig, могут использоваться для сбора информации о хостах и используемом ими программном обеспечении, а nslookup – для идентификации почтовых серверов доменов. В главе кратко освещены вопросы сканирования сети при помощи Nmap. Сканирование сети позволяет выудить сведения о сервисах операционных систем хостов. Наконец, обсуждался спайдеринг для сбора сведений о сайте: его расположении и наличии на нем потенциально важной информации.

Конспект

Обзор классов атак

· По своему результату атаки разбиты на семь классов: отказ в обслуживании, утечка информации, нарушение прав доступа к файлу, дезинформация, получение доступа к специальным файлам / базам данных, удаленное выполнение программ и расширение прав.

· Отказ в обслуживании хоста может быть достигнут в результате локальной или DOS-атаки из сети.

· Атаке почти всегда предшествует анализ сведений, полученных в результате утечки информации.

· Незащищенная директория и неверные права доступа к файлу могут позволить локальному злоумышленнику получить доступ к информации, важной для других пользователей.

· Скомпрометированной системе нельзя доверять ни при каких обстоятельствах до тех пор, пока она не будет восстановлена с безопасного носителя (например, дистрибутива производителя).

· Атаки на базы данных могут использовать либо бреши программного интерфейса, например Web-интерфейса, либо ошибки программного обеспечения баз данных, например переполнение буфера.

· Большинство уязвимостей, используемых для удаленного выполнения программ, могут быть в значительной мере обезврежены при помощи ограничения прав доступа, замены корневой директории (change rooting) и недопущения помещения в стек программ (non-executable stack protection).

· При расширении прав доступа злоумышленник может получить удаленный непривилегированный и привилегированный доступы или локальный привилегированный доступ.

Методы тестирования уязвимостей

· Тестирование уязвимостей – необходимая часть обеспечения безопасности систем.

· Доказательство возможности нападения (proof of concept) – лучший метод определения любой уязвимости, поскольку он помогает определить суть уязвимости, место ее нахождения и способ защиты.

· Применение программ, демонстрирующих уязвимости, – наиболее часто используемый метод доказательства возможности нападения. Подобные программы можно найти в Интернете.

· Широко используется автоматизированный инструментарий обеспечения безопасности, с помощью которого в большинстве случаев корпоративные группы персонала по безопасности проводят плановый аудит безопасности.

· Контроль версий позволяет перегруженному работой отделу безопасности оценить опасность со стороны известных уязвимостей и их влияние на работоспособность развернутых систем.

· Для подготовки атак могут быть использованы сведения из баз данных Whois. А в случае атаки из базы данных Whois можно получить контактную информацию владельца сайта.

· Информация DNS раскрывает структуру сети.

· Индексация Web (спайдеринг – spidering) позволяет получать сведения о структуре директорий и важных файлах.

Часто задаваемые вопросы

Вопрос: Может ли атака относиться к нескольким классам атак?

Ответ: Да. Некоторые атаки могут быть отнесены к нескольким классам. Например, отказ в обслуживании, вызванный аварийным завершением сервиса в результате неверного ввода информации пользователем.

Вопрос: Где можно дополнительно прочитать о предупреждении DDoS-атак? Ответ: Дейв Диттрич (Dave Dittrich) – автор ряда статей на эту тему. Статьи можно найти по адресу www.washington.edu/People/dad.

Вопрос: Как можно предотвратить утечку информации? Ответ: Этой теме посвящено много работ. Некоторые варианты утечки информации могут быть предупреждены, например такие как чрезмерно словоохотливые баннеры или диагностические сообщения, выдаваемые по умолчанию. Другой вариант утечки информации может быть остановлен только в результате переписывания программ и изменения их настроек.

Вопрос: Можно ли предотвратить утечку информации посредством «занавеса секретности»? Ответ: Ни в коем случае. Нельзя привести в пользу этого утверждения ни одного логически обоснованного довода, поскольку программное обеспечение обменивается сертификатами (мандатами) практически независимо от пользователя. Хотя если остановить данный поток информации, то это осложнит жизнь злоумышленников и повысит шансы обнаружения их атак.

Вопрос: Где можно достать программы, демонстрирующие уязвимости? Ответ: Их можно найти при помощи подробных адресных списков типа Bugtraq (www.securityfocus.com) или в архивах подобных программ PacketStorm (www.packetstormsecurity.org) либо Church of the Swimming Elephant (www.cotse.com).

Вопрос: Как можно защитить собственную информацию в базе данных Whois? Ответ: В настоящее время для этого немного возможностей. Можно сообщить неверные сведения во время регистрации домена. Но в этом случае возможны проблемы при уведомлении вас о последующих модификациях сети. К тому же неверно указанные данные вряд ли помогут вам в случае возникновения каких-либо конфликтов.

Вопрос: Может ли быть получена дополнительная информация при помощи утилиты DNS dig? Ответ: Да. Ошибочно сконфигурированные сервера доменных имен могут разрешать передачу зоны в адрес произвольного хоста, создавая предпосылки раскрытия информации о структуре сети.

Глава 4 Методология

В этой главе обсуждаются следующие темы:

Суть методологии исследования уязвимости

Значение экспертизы исходного текста программы

Технологии реинжиниринга

Тестирование методом «черного ящика»

· Резюме

· Конспект

· Часто задаваемые вопросы

Введение

Как правило, одну и ту же задачу можно решать несколькими способами. Выбранный способ зависит от ресурсов, имеющихся в распоряжении исполнителя, и методов решений, которыми он лучше всего владеет. В случае исследования уязвимостей ресурсами являются программный код, время и инструментарий исследователя.

В некоторых случаях исследователь может легко получить исходный текст анализируемой программы. Для большинства людей экспертиза исходного текста программ – наиболее легкий способ определения наличия или отсутствия в программе уязвимостей. Причина многих уязвимостей состоит в использовании в программе специфических функций языка программирования и способов вызова внешних функций. Анализ исходного текста программы часто позволяет выявить уязвимости и понять их причины.

Другим способом определения возможных ошибок программы служит реинжиниринг, который позволяет восстановить структурную схему программы и алгоритм ее работы. Для реинжиниринга требуется специальный программмный инструментарий: дизассемблеры и отладчики. Любая трансляция программы сопровождается потерей части исходного текста программы или его неочевидными преобразованиями. Другими словами, при трансляции программы исходный текст заменяется объектным кодом таким образом, что точное обратное восстановление исходного текста в большинстве случаев невозможно. Поэтому, основываясь только на результатах реинжиниринга, понять логику работы программы очень сложно.

И наконец, последний рассматриваемый способ – тестирование методом «черного ящика». Тестирование методом «черного ящика» позволяет определить зависимость между входными и выходными данными программы без выяснения ее внутреннего устройства. В некоторых случаях тестирование методом «черногоящика» – единственно возможный метод анализа программы на начальном этапе, в других – позволяет определить пути анализа программы, на которых следует сконцентрироваться.

В этой главе будут рассмотрены различные методы изучения уязвимости и показаны примеры их использования.

Суть методологии исследования уязвимости

Поясним простым языком, что понимается под методологией исследования уязвимости. Уязвимость – это нечто, что независимо от того, воспользовался ли ею кто-нибудь или нет, присутствует всюду, будь то микроконтроллер или суперкомпьютер. Исследование – процесс сбора информации, который может как привести, так и не привести к нахождению уязвимости. Методология — это обычно используемые на практике, рекомендуемые или признанные большинством профессионалов приемы и методы исследования уязвимостей.

Методы исследования уязвимостей по своей сути универсальны. Как домашний энтузиаст безопасности, так и корпоративные аудиторы безопасности в повседневной деятельности применяют одни и те же методы, один и тот же набор инструментальных средств. Диапазон применяемых средств широк: от шестнадцатеричных редакторов до дизассемблеров кода. Методы могут быть как эмпирическими, основанными на счастливой догадке, так и научно обоснованными на основе фундаментальных знаний. Некоторые из этих методов могут показаться хаотичными, в то время как другие – детализированными, строго регламентирующими последовательность выполняемых при исследовании действий. Новичок может предпочесть последние методы, в то время как закаленные исследователи с большим опытом программирования в большей степени полагаются на свою интуицию. Причина выбора тех или иных методов кроется в личном предпочтении исследователя.

...

Примечание

В практике обеспечения безопасности используется ряд схем исследования уязвимостей, которые предусматривают различные методы исследования. Некоторые предпочитают детализированные методичные методы пошагового аудита программ, а другие – методы, в которых последовательность выполняемых действий напоминает «белый шум».

Выбор субъективен и целиком определяется предпочтениями исследователя. Уже говорилось о широком распространении программных средств определения уязвимостей и аудита программного обеспечения. Некоторые из них по своим возможностям аналогичны Web CGI или SQL Database. Другие, как, например, Bugzilla, предоставляют ряд дополнительных возможностей, включая прекрасный интерфейс, ведение учетных записей пользователя, идентификаторов ошибок и их отслеживание.

Следует сказать, что для анализа различных типов данных требуются разные методы исследования. Для анализа двоичных данных требуется совершенно иной подход, чем для анализа исходного текста программы. Поэтому рассмотрим эти два подхода отдельно друг от друга.

Анализ исходного текста программы

Анализ исходного текста программы предполагает экспертизу текста программы на предмет ошибок. Программа может быть написана на языках C, Perl, Java, C++, ASP, PHP и им подобных. Обычно аудит исходного текста программы начинается с поиска потенциально небезопасных функций, или, другими словами, функций, подверженных ошибкам.

Поиск подверженных ошибкам функций

Аудит исходного текста программы осуществляется различными способами. Прежде всего это поиск потенциально небезопасных функций при помощи различных утилит поиска, например grep.

Следует обратить внимание на использование функций языка C strcpy и sprintf. Злоумышленник часто их применяет, пытаясь добиться переполнения буфера из-за отсутствия или неверного выполнения проверки принадлежности адресов диапазону правильных адресов памяти. Использование других функций, как, например, mktemp, может привести к перезаписи файлов в результате конкуренции программ, содержащих функцию, или к повышению привилегий.

Построчная экспертиза исходного текста

Один из методов анализа исходного теста программы – построчная экспертиза программы в соответствии с алгоритмом ее выполнения. Это более тщательное изучение программы, на которое уходит больше времени.

Согласно этому методу от исследователя требуется просмотреть исходный текст программы в соответствии с гипотетической последовательностью ее выполнения. Гипотетическая последовательность выполнения отражает различные условия выполнения программы, определяемые ее входными данными. Ход выполнения программы визуально прослеживается исследователем, мысленно отслеживающим обработку данных различными функциями по мере их вызова программой.

Анализ различий

Анализ различий – метод определения уязвимостей программы, который применяется, если производитель сообщил об уязвимости, не детализируя ее сути. С помощью этого метода определяется, был ли изменен файл программы, a если был, то где именно.

diff – одна из лучших утилит, реализующая рассматриваемый метод. Она поставляется с большинством версий операционных систем UNIX и благодаря Фонду свободно распространяемого программого обеспечения (Free Software Foundation) реализована на многих платформах. diff сравнивает две копии данных и отображает любые различия между ними, то есть она позволяет найти различия в двух исходных файлах программ и их местонахождение.

Обычно метод различий применяется для уточнения сути и последствий уязвимости, о которой производитель опубликовал какие-либо детали. Например, в оперативных сообщениях об обновлении программного обеспечения часто содержатся неопределенные детали обновления программ, которые могут оказать влияние на их безопасность, как это было продемонстрировано последним сообщением об обновлении программы axspawn.

Про патч уязвимости было заявлено, что он исправляет возможную ошибку переполнения буфера. При этом ни слова не было сказано о каких-либо подробностях. Детали прояснились после сравнения версий 0.2.1 и 0.2.1a программы при помощи утилиты diff:

elliptic@ellipse:~$ diff axspawn-0.2.1/axspawn.c axspawn-

0.2.1a/axspawn.c

491c491

< envc = 0;

> envc = 0;

493c493

< sprintf(envp[envc++], “AXCALL=%s”, call);

> sprintf(envp[envc++], “AXCALL=%.22s”, call);

495c495

< sprintf(envp[envc++], “CALL=%s”, (char *)user);

> sprintf(envp[envc++], “CALL=%.24s”, (char

*)user); 497c497

< sprintf(envp[envc++], “PROTOCOL=%s”, protocol);

> sprintf(envp[envc++], “PROTOCOL=%.20s”,

protocol); 500c500

< envp[envc] = NULL;

> envp[envc] = NULL;

Видно, что в первой версии программы axspawn.c используется функция sprintf без всяких ограничений на длину выводимой строки данных, а во второй – введено ограничение на длину выводимой строки в спецификации преобразования. В некоторых случаях производитель может выпустить патч, который будет сообщать отличия между двумя версиями программы. Обычно такие патчи выпускаются для операционных систем типа BSD (BSD – Berkeley Software Design Incorporated – компания-разработчик программного обеспечения), например FreeBSD. В январе 2002 года была найдена уязвимость в пакете инструментальных средств операционной системы FreeBSD. До ее устранения пользователь мог извлечь данные во временную директорию и изменить их. До тех пор, пока уязвимость не была всесторонне изучена, патч pkg_add сообщал точное местонахождение уязвимости:

– usr.sbin/pkg_install/lib/pen.c 17 May 2001 12:33:39 -0000

+++ usr.sbin/pkg_install/lib/pen.c 7 Dec 2001 20:58:46 -0000

@@ -106,7 +106,7 @@

cleanup(0);

errx(2, __FUNCTION__ “: can’t mktemp “%s””, pen);

}

– if (chmod(pen, 0755) == FAIL) {

+ if (chmod(pen, 0700) == FAIL) {

cleanup(0);

errx(2, __FUNCTION__ “: can’t mkdir “%s””, pen);

}

Удаляемая патчем часть исходного текста обозначена знаком минус (-), а добавляемая – знаком плюс (+). Можно увидеть, что часть исходного текста, содержащая код создания директории с разрешениями 0755, заменяется на код, создающий директорию с разрешениями 0700.

Следует признать, что исследование уязвимости не всегда бывает таким простым. Рассмотрим анализ выполнимого кода программы.

Анализ двоичного кода

Первое, что приходит на ум при исследовании уязвимостей, – аудит исходного текста программы. Тем не менее в большинстве случаев анализ двоичного кода – единственно возможный метод поиска уязвимостей. Благодаря появлению движения за открытые исходные тексты программ и проекта создания свободно распространяемого программного обеспечения GNU License получить исходные тексты программ стало намного проще. Но не все производители поддержали открытый обмен исходными текстами. К тому же большая часть программного обеспечения по-прежнему поставляется без исходных текстов.

Трассировка двоичного кода

Один из методов определения потенциальных уязвимостей заключается в трассировке выполнения программы. Для трассировки используется различный инструментарий. Для этой цели в системе Solaris применяется специальный пакет программ truss компании Sun. В других операционных системах используются аналогичные программы, например strace для Linux.

Трассировка выполнения программы позволяет наблюдать за ее взаимодействием с операционной системой. Используемые программой переменные окружения могут быть исследованы в соответствии с режимами ее работы. Дополнительно при трассировке программы можно просмотреть используемые программой адреса памяти и получить другую полезную информацию о возможных проблемах в каких-либо частях программы.

Использование трассировки позволяет определить, где и когда проявится уязвимость в исследуемой программе.

Отладчики

Применение отладчиков – еще один способ поиска уязвимостей. Отладчики позволяют выявить ошибки программы во время ее выполнения. На практике применяются различные отладчики. Gnu Debugger (GDB) – один из наиболее известных среди них.

Отладчики могут управлять работой программы во время ее выполнения. С помощью отладчика может быть выполнена как вся программа целиком, так и ее часть. Отладчик может отображать содержимое регистров, память по указанным адресам и другую полезную для поиска уязвимостей информацию.

Аудит документации

Другой способ аудита двоичного кода заключается в анализе принятых соглашений и документов по разработке программ (которые не следует путать с исходным кодом программ). Материалы по разработке программ обычно представляются в виде диаграмм, информационных листов или спецификаций, как, например, RFC (Requests for Comments – запросы на комментарии, серия документов IETF, первые упоминания о которой относятся к 1969 году. Документы этой серии содержат описания протоколов Internet и связанную с ними информацию).

Анализ программ на основе протокола спецификации может привести к различным выводам. Этот тип исследования заключается не только в установлении соответствия анализируемой программы спецификациям проектирования, но и в детальном анализе проблемных ситуаций в ней. Воспользовавшись результатами исследования основополагающих принципов построения протокола, например Telnet или POP3, можно протестировать службу, написанную на основе выбранного протокола, на предмет ее соответствия протоколу. Рассматривая ранее изученные классы атак на выбранные части реализации протокола (атаки, нацеленные на переполнение буфера или ошибки форматирующей строки), можно написать программу, демонстрирующую найденную уязвимость.

Анализаторы

Последний, заслуживающий внимания метод поиска уязвимостей – это применение анализаторов. Анализаторы – это инструмент исследования уязвимостей, который применяется как средство поиска неисправностей или для отладки. Другими словами, анализаторы – это модули проверки текущего состояния программы. К сожалению, цели применения анализаторов могут быть разными.

Анализаторы могут применяться для контроля взаимодействия между системой и ее пользователями. С их помощью можно графически отображать происходящие в работе программы события, например генерацию последовательности чисел. Они также позволяют контролировать работу программ общего шлюзового интерфейса, определять предназначение программ CGI и даже собирать информацию о критических ошибках проектирования этих программ.

Анализаторы применяются совместно с ранее упомянутым аудитом документации проектирования. С их помощью проводятся исследования Web-интерфейсов или других сетевых протоколов, которые хотя и не являются общепризнанными стандартами, но широко используются.

Значение экспертизы исходного текста программы

Аудит исходных текстов программы должен быть предусмотрен при установке любой системы. Аудит исходных текстов предполагает поиск потенциально опасных (подверженных ошибкам) функций и методологии построчного анализа исходных текстов программы. Часто это затруднено из-за того, что исходный текст программы размещается в нескольких файлах, а не в одном. Например, исходный текст почтовых транспортных агентов, Web-серверов и им подобных программ может быть размещен в нескольких исходных файлах, файлах заголовков, сборочных файлах проекта и в нескольких директориях.

Поиск функций, подверженных ошибкам

Рассмотрим подробнее поиск функций, подверженных ошибкам. Подобный поиск может осуществляться различными способами. Один их них заключается в том, чтобы в редакторе открыть каждый файл исходного текста программы и в нем средствами поиска редактора искать подверженную ошибкам функцию. Скорее всего, на это уйдет много времени. Целесообразнее и эффективнее использовать утилиту grep.

Рассмотрим несколько простых примеров уязвимостей, которые могут быть найдены в исходном тексте программы в результате поиска функций, подверженных ошибкам.

Переполнение буфера

Переполнение буфера, известное также как ошибка граничных условий, происходит в том случае, когда размер записываемых в память данных превышает размер выделенной для этого области памяти. Елиас Леви (Elias Levy), известный как Alephl, написал на эту тему статью «Smashing the Stack for Fun and Profit» («Разрушение стека для забавы и обогащения»). Со статьей можно ознакомиться в 49-ом выпуске Phrack, статья номер 14.

Посмотрите на следующую программу:

/* scpybufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* scpybufo.c demonstrates the problem */

/* with the strcpy() function which */

/* is part of the c library. This */

/* program demonstrates strcpy not */

/* sufficiently checking input. When */

/* executed with an 8 byte argument, a */

/* buffer overflow occurs. */

#include <stdio.h>

#include <strings.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8];

strcpy(c, b);

return;

}

В этой написанной на языке C программе приведен пример использования функции strcpy. Данные из массива argv [1], в котором хранится аргумент вызова программы, копируются функцией strcpy в массив символов, для которого при объявлении была выделена память для восьми символов. Поскольку в программе не выполняется никаких проверок размера пересылаемых данных, то при копировании более восьми символов происходит переполнение буфера. Функция sprintf — еще один пример часто встречающейся подверженной ошибкам функции. В результате ее применения возможно переполнение буфера, как это показано в следующем примере:

/* sprbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* sprbufo.c demonstrates the problem */

/* with the sprintf() function which */

/* is part of the c library. This */

/* program demonstrates sprintf not */

/* sufficiently checking input. When */

/* executed with an argument of 8 bytes */

/* or more a buffer overflow occurs. */

#include <stdio.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8];

sprintf(c, “%s”, b);

return;

}

Как и в предыдущем примере, строка символов аргумента программы копируется в восьмибайтовый массив символов. Поскольку при копировании из argv [1] не выполняется никаких проверок на соответствие размера пересылаемых данных размеру памяти, в которую выполняется копирование, то в результате возможно переполнение буфера. Применение функции strcat без проверки размера обрабатываемых данных также может привести к переполнению буфера, как это видно из следующего примера:

/* scatbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* scatbufo.c demonstrates the problem */

/* with the strcat() function which */

/* is part of the c library. This */

/* program demonstrates strcat not */

/* sufficiently checking input. When */

/* executed with a 7 byte argument, a */

/* buffer overflow occurs. */

#include <stdio.h>

#include <strings.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8] = «0»;

strcat(c, b);

return;

}

Данные командной строки из массива argv [1] передаются функции overflow_function, которая сцепляет их с данными восьмибайтового массива символов с. Поскольку в программе размер сцепляемых данных не проверяется, то в результате возможен выход за границы массива c. Gets – еще одна проблематичная функция языка C. Компилятор GNU языка C выдает предупреждающее сообщение при компиляции программ с функцией gets, потому что эта функция никак не контролирует размер получаемых данных. Посмотрите на следующий пример:

/* getsbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* This program demonstrates how NOT */

/* to use the gets() function. gets() */

/* does not sufficient check input */

/* length, and can result in serious */

/* problems such as buffer overflows. */

#include <stdio.h>

int main()

{

get_input();

return (0);

}

void get_input(void)

{

char c[8];

printf(“Enter a string greater than seven bytes: ”);

gets(c);

return;

}



Поделиться книгой:

На главную
Назад