Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Дневник охотника за ошибками. Путешествие через джунгли проблем безопасности программного обеспечения

Покупка
Артикул: 442765.02.99
Доступ онлайн
279 ₽
В корзину
Книга «Дневник охотника за ошибками», написанная экспертом по безопасности программного обеспечения Тобиасом Клейном (Tobias Klein), рассказывает, как обнаруживаются и используются ошибки, найденные им в некоторых наиболее популярных во всем мире программных продуктах, таких как операционная система Apple iOS, медиапроигрыватель VLC, веб-браузеры и даже ядро операционной системы Mac OS X. В этом уникальном отчете вы увидите, как разработчики, по чьей вине произошли эти ошибки, исправили их — или же оказались не в состоянии это сделать. Попутно вы познакомитесь: — с приемами поиска ошибок, такими как идентификация и отслеживание движения пользовательских данных и инженерный анализ; — с эксплуатацией уязвимостей, таких как разыменование нулевого указателя, переполнение буфера и преобразования типов; — с принципами разработки концептуального программного кода, доказывающего наличие уязвимости; — с правилами передачи извещений об ошибках производителям программного обеспечения или независимым брокерам. Книга «Дневник охотника за ошибками» снабжена реальными примерами уязвимого кода и программ, использовавшихся для поиска и проверки ошибок. Неважно, охотитесь ли вы за ошибками только ради забавы, зарабатываете ли вы на этом или просто стремитесь сделать мир безопаснее, вы приобретете новые ценные навыки, наблюдая за тем, как действует профессиональный охотник за ошибками.
Клейн, Т. Дневник охотника за ошибками. Путешествие через джунгли проблем безопасности программного обеспечения : практическое руководство / Т. Клейн ; пер. с англ. А. Н. Киселёва. - 2-е изд. - Москва : ДМК Пресс, 2023. - 241 с. - ISBN 978-5-89818-599-2. - Текст : электронный. - URL: https://znanium.com/catalog/product/2108478 (дата обращения: 12.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
ДНЕВНИК 

ОХОТНИКА ЗА ОШИБКАМИ

Путешествие через 
джунгли проблем безопасности 
программного обеспечения

Тобиас Клейн
San Francisco

A Bug Hunter’s
Diary

A Guided Tour Through the Wilds
of Software Security

TOBIAS KLEIN
Путешествие через
джунгли проблем безопасности
программного обеспечения

Дневник охотника 
за ошибками

ТОБИАС КЛЕЙН

Москва, 2023

2-е издание, электронное
УДК 004.438С/С++:004.056
ББК 32.973.26-018
К48

К48
Клейн, Тобиас.
Дневник охотника за ошибками. Путешествие через джунгли проблем безопасности 
программного обеспечения / Т. Клейн ; пер. с англ. А. Н. Киселёва. — 2-е изд., 
эл. — 1 файл pdf : 241 с. — Москва : ДМК Пресс, 2023. — Систем. требования: Adobe 
Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный.

ISBN 978-5-89818-599-2

Книга «Дневник охотника за ошибками», написанная экспертом по безопасности программного 
обеспечения Тобиасом Клейном (Tobias Klein), рассказывает, как обнаруживаются и используются 
ошибки, найденные им в некоторых наиболее популярных во всем мире программных 
продуктах, таких как операционная система Apple iOS, медиапроигрыватель VLC, веб-браузеры 
и даже ядро операционной системы Mac OS X. В этом уникальном отчете вы увидите, 
как разработчики, по чьей вине произошли эти ошибки, исправили их — или же оказались не 
в состоянии это сделать. 
Попутно вы познакомитесь: 
—  с приемами поиска ошибок, такими как идентификация и отслеживание движения пользовательских 
данных и инженерный анализ; 
—  с эксплуатацией уязвимостей, таких как разыменование нулевого указателя, переполнение 
буфера и преобразования типов; 
—  с принципами разработки концептуального программного кода, доказывающего наличие 
уязвимости; 
—  с правилами передачи извещений об ошибках производителям программного обеспечения 
или независимым брокерам.
Книга «Дневник охотника за ошибками» снабжена реальными примерами уязвимого кода 
и программ, использовавшихся для поиска и проверки ошибок. Неважно, охотитесь ли вы за 
ошибками только ради забавы, зарабатываете ли вы на этом или просто стремитесь сделать мир 
безопаснее, вы приобретете новые ценные навыки, наблюдая за тем, как действует профессиональный 
охотник за ошибками.

УДК 004.438С/С++:004.056 
ББК 32.973.26-018

Электронное издание на основе печатного издания: Дневник охотника за ошибками. Путешествие через 
джунгли проблем безопасности программного обеспечения / Т. Клейн ; пер. с англ. А. Н. Киселёва. — Москва : 
ДМК Пресс, 2015. — 241 с. — ISBN 978-5-97060-294-2. — Текст : непосредственный.

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

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских 
прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.

ISBN 978-5-89818-599-2
© by Tobias Klein, No Starch Press, Inc.
©  Оформление, перевод на русский язык, 
ДМК Пресс, 2015
Содержание

Благодарности......................................................................11
Введение ...............................................................................12

Глава 1
Выявление уязвимостей .......................................................14

1.1. Ради забавы и выгоды ......................................................15
1.2. Универсальные приемы ....................................................15

Мои личные предпочтения ................................................................15
Поиск потенциально уязвимого кода .............................................16
Фаззинг ..................................................................................................16
Дополнительная литература ............................................................17

1.3. Ошибки обращения с памятью ........................................18
1.4. Используемые инструменты .............................................19

Отладчики .............................................................................................19
Дизассемблеры ....................................................................................19

1.5. EIP = 41414141 ................................................................20
1.6. Заключительное примечание ..........................................21

Примечания ..........................................................................................21

Глава 2
Назад в 90-е .........................................................................23

2.1. Обнаружение уязвимости ................................................24

Шаг 1: создание списка демультиплексоров ................................24
Шаг 2: идентификация входных данных ..........................................25
Шаг 3: определение порядка движения входных данных ...........25
СОДЕРЖАНИЕ

2.2. Эксплуатация уязвимости ................................................27

Шаг 1: Поиск образца файла в формате TiVo .............................28
Шаг 2: Определение пути достижения уязвимого кода .............28
Шаг 3: Изменение файла в формате TiVo так, чтобы он 
вызывал ошибку в проигрывателе VLC ...........................................31
Шаг 4: Изменение файла в формате TiVo для захвата 
контроля над EIP ..................................................................................32

2.3. Ликвидация уязвимости ...................................................34
2.4. Полученные уроки ............................................................39
2.5. Дополнение .......................................................................39

Примечания ..........................................................................................41

3.1. Обнаружение уязвимости ................................................43

Глава 3
Выход из зоны WWW ..........................................................43

Шаг 1: составление списка IOCTL-запросов, 
поддерживаемых ядром .....................................................................44
Шаг 2: идентификация входных данных ..........................................45
Шаг 3: определение порядка движения входных данных ...........47

3.2. Эксплуатация уязвимости ................................................55

Шаг 1: Вызов ситуации разыменования нулевого указателя 
для отказа в обслуживании ...............................................................55
Шаг 2: использование нулевой страницы для получения 
контроля над EIP/RIP ..........................................................................60

3.3 Ликвидация уязвимости ....................................................71
3.4. Полученные уроки ............................................................72
3.5. Дополнение .......................................................................72

Примечания ..........................................................................................73

Глава 4
И снова нулевой указатель .................................................75

4.1. Обнаружение уязвимости ................................................76

Шаг 1: составление списка демультиплексоров 
в библиотеке FFmpeg .........................................................................76
СОДЕРЖАНИЕ

Шаг 2: идентификация входных данных ..........................................76
Шаг 3: определение порядка движения входных данных ...........77

4.2. Эксплуатация уязвимости ................................................81

Шаг 1: поиск образца файла в формате 4X с допустимым 
блоком strk ............................................................................................81
Шаг 2: изучение организации блока strk .......................................81
Шаг 3: изменение содержимого блока strk для вызова 
ошибки в FFmpeg .................................................................................83
Шаг 4: изменение содержимого блока strk для получения 
контроля над EIP ..................................................................................87

4.3. Ликвидация уязвимости ...................................................92
4.4. Полученные уроки ............................................................96
4.5. Дополнение .......................................................................97

Примечания ..........................................................................................97

Глава 5
Зашел и попался ..................................................................99

5.1. Обнаружение уязвимости ................................................99

Шаг 1: составление списка зарегистрированных 
объектов WebEx и экспортируемых методов ..............................100
Шаг 2: тестирование экспортируемых методов в браузере ...102
Шаг 3: поиск методов объекта в двоичном файле ....................104
Шаг 4: поиск входных значений, подконтрольных 
пользователю .....................................................................................107
Шаг 5: исследование методов объектов......................................108

5.2. Эксплуатация уязвимости ............................................. 112
5.3. Ликвидация уязвимости ................................................ 114
5.4. Полученные уроки ......................................................... 114
5.5. Дополнение .................................................................... 115

Примечания ........................................................................................115

Глава 6
Одно ядро покорит их .........................................................99

6.1 Обнаружение уязвимости .............................................. 117
СОДЕРЖАНИЕ

Шаг 1: подготовка гостевой системы в виртуальной машине 
VMware для отладки ядра ................................................................118
Шаг 2: составление списка драйверов и объектов
устройств, созданных антивирусом avast! ...................................118
Шаг 3: проверка настроек безопасности устройства .............120
Шаг 4: составление списка поддерживаемых 
IOCTL-запросов .................................................................................121
Шаг 5: поиск входных данных, подконтрольных 
пользователю .....................................................................................128
Шаг 6: исследование обработки IOCTL-запросов ...................131

6.2. Эксплуатация уязвимости ............................................. 136
6.3. Ликвидация уязвимости ................................................ 144
6.4. Полученные уроки ......................................................... 144
6.5. Дополнение .................................................................... 144

Примечания ........................................................................................145

Глава 7
Ошибка, древнее чем 4.4BSD .......................................... 147

7.1. Обнаружение уязвимости ............................................. 147

Шаг 1: составление списка IOCTL-запросов, 
поддерживаемых ядром ...................................................................148
Шаг 2: идентификация входных данных ........................................148
Шаг 3: определение порядка движения входных данных .........150

7.2. Эксплуатация уязвимости ............................................. 154

Шаг 1: вызов ошибки для обрушения системы 
(отказ в обслуживании).....................................................................154
Шаг 2: подготовка окружения для отладки ядра ........................156
Шаг 3: подключение отладчика к целевой системе ..................156
Шаг 4: получение контроля над EIP ..............................................158

7.3. Ликвидация уязвимости ................................................ 165
7.4. Полученные уроки ......................................................... 166
7.5. Дополнение .................................................................... 166

Примечания ........................................................................................167
СОДЕРЖАНИЕ

Глава 8
Подделка рингтона ........................................................... 169

8.1. Обнаружение уязвимости ............................................. 169

Шаг 1: исследование аудиовозможностей смартфона 
iPhone ...................................................................................................170
Шаг 2: создание фаззера и испытание телефона .....................170

8.2. Анализ аварий и эксплуатация уязвимости ................. 177
8.3. Ликвидация уязвимости ................................................ 185
8.4. Полученные уроки ......................................................... 185
8.5. Дополнение .................................................................... 186

Примечания ........................................................................................186

Приложение A
Подсказки для охотника ................................................... 187

A.1. Переполнение буфера на стеке ................................... 187

Пример: переполнение буфера на стеке в Linux .......................189
Пример: переполнение буфера на стеке в Windows ...............190

A.2. Разыменование нулевого указателя ............................ 192
A.3. Преобразование типов в языке C ................................ 193
A.4. Затирание глобальной таблицы смещений ................. 197

Примечания ........................................................................................202

Приложение B
Отладка ............................................................................. 203

B.1. Отладчик Solaris Modular Debugger (mdb) .................. 203
B.2. Отладчик Windows (WinDbg) ....................................... 205
B.3. Отладка ядра Windows ................................................. 206

Шаг 1: настройка гостевой системы в виртуальной машине 
VMware для удаленной отладки ядра ...........................................207
Шаг 2: изменение файла boot.ini гостевой системы .................209
Шаг 3: настройка WinDbg в хост-машине VMware 
для отладки ядра Windows ..............................................................209
СОДЕРЖАНИЕ

B.4. Отладчик GNU Debugger (gdb) .................................... 210
B.5. Использование ОС Linux для отладки ядра Mac OS X .....212

Шаг 1: установка древней версии операционной 
системы Red Hat Linux 7.3 ................................................................212
Шаг 2: получение всех необходимых пакетов программного 
обеспечения .......................................................................................213
Шаг 3: сборка отладчика Apple в системе Linux ........................213
Шаг 4: подготовка окружения отладки ........................................216
Примечания ........................................................................................216

Приложение C
Методы защиты ................................................................. 218

C.1. Приемы защиты от эксплуатации уязвимостей ........... 218

Случайная организация адресного пространства (ASLR) ........219
Защита от срыва стека: Security Cookies (/GS), .........................219
Stack-Smashing Protection (SSP) и Stack Canaries .......................219
Защита от выполнения данных NX и DEP .....................................219
Выявление механизмов защиты от эксплойтов ...........................220

C.2. RELRO ............................................................................. 223

Испытание 1: поддержка частичного режима RELRO ...............224
Испытание 2: поддержка полного режима RELRO ....................225
В заключение ......................................................................................226

C.3. Solaris Zones ................................................................... 227

Терминология .....................................................................................227
Настройка неглобальной зоны в Solaris ......................................228
Примечания ........................................................................................230

Предметный указатель ..................................................... 233

Об авторе .......................................................................... 239
Благодарности

Я хотел бы поблагодарить всех, кто выполнял технический обзор книги 
и внес в нее свой вклад: Феликс Линднер (Felix «FX» Lindner), Себастьян 
Крамер (Sebastian Krahmer), Дэн Розенберг (Dan Rosenberg), 
Фабиан Михайлович (Fabian Mihailowitsch), Стеффен Трешер 
(Steffen Tröscher), Андреас Курц (Andreas Kurtz), Марко Лоренц 
(Marco Lorenz), Макс Зиглер (Max Ziegler), Рене Шенфельдт (René 
Schönfeldt) и Силк Клейн (Silke Klein), а также Сондра Сильверхо-
ук (Sondra Silverhawk), Элисон Ло (Alison Law) и всех остальных 
сотрудников издательства No Starch Press.
Введение

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

Цели этой книги

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

Кому предназначена эта книга

Эта книга адресована исследователям и консультантам по проблемам 
безопасности программного обеспечения, программистам на C/C++, 
специалистам по выявлению уязвимостей и всем, кто желает погрузиться 
в захватывающий мир охоты за ошибками. Чтобы получить 
максимум от этой книги, читатель должен хорошо знать язык C и 
быть знаком с языком ассемблера для процессоров семейства x86.
ВВЕДЕНИЕ

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

Отказ от ответственности

Цель этой книги – показать читателям, как выявлять уязвимости в 
программном обеспечении, защищаться от них и минимизировать 
их отрицательное влияние. Знание приемов выявления и эксплуатации 
уязвимостей совершенно необходимо, чтобы понимать основные 
проблемы и приемы защиты от них. С 2007 года, в Германии, где я 
живу, стало незаконным создавать или распространять «инструменты 
для взлома». К таким инструментам относятся простые сканеры 
портов, а также действующие эксплойты1. Поэтому, в соответствии с 
законом, в этой книге не будут представлены полные исходные тексты 
эксплойтов. Примеры, имеющиеся здесь, лишь демонстрируют 
шаги, позволяющие получить управление над потоком выполнения 
(над указателем инструкций или программным счетчиком) уязвимой 
программы.

Ресурсы

Все URL-адреса, упоминаемые в книге, а также примеры программного 
кода, информацию об ошибках и опечатках и другие сведения 
можно найти по адресу: http://www.trapkit.de/books/bhd/

1 Программы, эксплуатирующие уязвимости. – Прим. перев.
ВЫЯВЛЕНИЕ 

УЯЗВИМОСТЕЙ
1

ГЛАВА

Выявление уязвимостей – это процесс поиска ошибок в программном 
или аппаратном обеспечении. Однако в этой книге термин «выявление 
уязвимостей» используется исключительно для описания 
процесса поиска ошибок в программном обеспечении, вызывающих 
проблемы с безопасностью. Такие ошибки, также называемые уязвимостями, 
позволяют злоумышленнику проникать в удаленные системы, 
повышать уровень локальных привилегий, преодолевать границы 
привилегий или наносить иной ущерб системам.
Еще десять лет тому назад выявление уязвимостей в программном 
обеспечении воспринималось как хобби или средство привлечения 
внимания средств массовой информации. Когда стало понятно, что 
это занятие может приносить прибыль [1], к этому занятию стали 
относиться гораздо серьезнее.
Уязвимостям в программном обеспечении и программам, эксплуатирующим 
их (известным как эксплойты ) уделяется большое внимание 
в прессе. Кроме того, существует огромное количество книг и 
ресурсов в Интернете, где описывается процесс эксплуатации уязвимостей 
и ведутся нескончаемые обсуждения о необходимости открытия 
информации об их выявлении. Но, не смотря на это, удивительно 
мало публикаций, описывающих сам процесс выявления. Термины, 
такие как «уязвимость в программном обеспечении» или «эксплойт» 
получили широкое распространение, однако многие – даже специалисты 
в области безопасности – не знают, как выявлять эти уязвимости.

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

1.1. Ради забавы и выгоды

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

1.2. Универсальные приемы

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

Мои личные предпочтения

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

УНИВЕРСАЛЬНЫЕ ПРИЕМЫ
ГЛАВА 1. ВЫЯВЛЕНИЕ УЯЗВИМОСТЕЙ

понять, как оно действует. Однако, читать весь программный код от 
начала до конца бессмысленно. При поиске ошибок я обычно стараюсь 
определить места, где в программу попадают пользовательские 
данные, введенные через интерфейс с внешним миром. В качестве 
примеров можно назвать данные, полученные из сети, из файла или 
из окружения времени выполнения.
Затем я изучаю пути, какими введенные данные следуют через 
программу, пока не найду потенциально уязвимый программный код, 
выполняющий операции над этими данными. Иногда такие точки 
входа удается выявить исключительно во время чтения исходных 
текстов (глава 2) или дизассемблированных листингов (глава 6). 
Иногда, чтобы отыскать код, обрабатывающий данные, в дополнение 
к статическому анализу приходится изучать результаты отладки 
исследуемого программного обеспечения (глава 5). Кроме того, при 
создании эксплойтов я обычно объединяю статический и динамический 
подходы.
После того, как ошибка будет найдена, необходимо доказать, что 
ею действительно можно воспользоваться, поэтому я пытаюсь написать 
для нее эксплойт. В процессе создания такого эксплойта, большую 
часть времени я провожу в отладчике.

Поиск потенциально уязвимого кода

Выше представлен лишь один из подходов, используемых при выявлении 
уязвимостей. Другая тактика поиска потенциально уязвимого 
кода заключается в изучении окрестностей вызовов «небезопасных» 
библиотечных функций языка C/C++, таких как strcpy() и 
strcat(), с целью выявить возможность переполнения буфера . В диз-
ассемблерном листинге можно попробовать отыскать инструкции 
movsx  и проверить возможность появления уязвимости переполнения 
знакового разряда . После обнаружения потенциально уязвимого 
кода, можно пойти по программному коду в обратном направлении и 
проследить, действительно ли выявленный фрагмент уязвим и достижим 
из точки входа в программу. Я редко пользуюсь этим приемом, 
но другие охотники за ошибками молятся на него.

Фаззинг

Существует совершенно иной подход к выявлению уязвимостей, известный 
как фаззинг (fuzzing). Фаззинг – это прием динамического 
Доступ онлайн
279 ₽
В корзину