УДК 004.4
ББК 32.973.26018.2
М97
Ховард М., Лебланк Д., Виега Д.
Х68 Как написать безопасный код на С++, Java, Perl, PHP, ASP.NET . – М.: ДМК
Пресс, 2018. – 288 с.: ил.
ISBN 9785970606179
Эта книга необходима всем разработчикам программного обеспечения,
независимо от платформы, языка или вида приложений.
Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual
Basic .NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac
OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид Лебланк, обу
чают программистов как писать безопасный код в компании Microsoft. На
различных примерах продемонстрированы как сами ошибки, так и способы
их исправления и защиты от них.
Если вы – программист, то вам просто необходимо прочесть эту книгу.
УДК 004.4
ББК 32.973.26018.2
Original English language edition published by McGrawHill Companies. Copyright © by
McGrawHill Companies. All rights reserved.
Все права защищены. Любая часть этой книги не может быть воспроизведена в
какой бы то ни было форме и какими бы то ни было средствами без письменного разреше
ния владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность
технических ошибок все равно существует, издательство не может гарантировать абсолютную
точность и правильность приводимых сведений. В связи с этим издательство не несет ответ
ственности за возможные ошибки, связанные с использованием книги.
ISBN 0-07-226085-8 (àíãë.) Copyright © by McGrawHill Companies.
ISBN 978-5-97060-617-9 © Перевод на русский ÿçûê, оформление, èçäàíèå,
ДМК Пресс
Стр.5
Содержание
Об авторах .................................................................................... 18
О научных редакторах .................................................................. 19
Предисловие ................................................................................ 20
Благодарности ............................................................................. 22
Введение....................................................................................... 23
Структура книги.......................................................................... 24
Кому предназначена эта книга ................................................... 25
Какие главы следует прочитать .................................................. 25
Грех 1. Переполнение буфера ................................................ 26
В чем состоит грех ..................................................................... 26
Подверженные греху языки ........................................................ 27
Как происходит грехопадение .................................................... 27
Греховность C/C++................................................................. 31
Родственные грехи................................................................. 33
Где искать ошибку ...................................................................... 33
Выявление ошибки на этапе анализа кода ................................. 33
Тестирование ............................................................................. 34
Примеры из реальной жизни ...................................................... 35
CVE19990042 ....................................................................... 35
CVE20000389 – CVE20000392 ........................................... 35
CVE20020842, CVE20030095, CAN20030096 ................... 35
CAN20030352....................................................................... 36
Искупление греха ....................................................................... 37
Замена опасных функций работы со строками....................... 37
Следите за выделениями памяти ........................................... 37
Проверьте циклы и доступ к массивам ................................... 37
Пользуйтесь строками в стиле C++, а не C ............................. 37
Пользуйтесь STLконтейнерами вместо статических
массивов ................................................................................ 38
Стр.7
Содержание
7
Пользуйтесь инструментами анализа .................................... 38
Дополнительные защитные меры............................................... 38
Защита стека.......................................................................... 39
Запрет исполнения в стеке и куче .......................................... 39
Другие ресурсы .......................................................................... 39
Резюме....................................................................................... 40
Грех 2. Ошибки, связанные с форматной строкой ............ 42
В чем состоит грех ..................................................................... 42
Подверженные греху языки ........................................................ 42
Как происходит грехопадение .................................................... 43
Греховность C/C++................................................................. 45
Родственные грехи................................................................. 45
Где искать ошибку ...................................................................... 46
Выявление ошибки на этапе анализа кода ................................. 46
Тестирование ............................................................................. 46
Примеры из реальной жизни ...................................................... 47
CVE20000573 ....................................................................... 47
CVE20000844 ....................................................................... 47
Искупление греха ....................................................................... 47
Искупление греха в C/C++ ...................................................... 48
Дополнительные защитные меры............................................... 48
Другие ресурсы .......................................................................... 48
Резюме....................................................................................... 48
Грех 3. Переполнение целых чисел....................................... 49
В чем состоит грех ..................................................................... 49
Подверженные греху языки ........................................................ 49
Как происходит грехопадение .................................................... 49
Греховность C и C++ .............................................................. 50
Поразрядные операции ......................................................... 55
Греховность C# ...................................................................... 55
Греховность Visual Basic и Visual Basic .NET ........................... 56
Греховность Java .................................................................... 57
Греховность Perl..................................................................... 58
Где искать ошибку ...................................................................... 59
Выявление ошибки на этапе анализа кода ................................. 59
C/C++ ..................................................................................... 59
C# .......................................................................................... 61
Java ........................................................................................ 62
Visual Basic и Visual Basic .NET ................................................ 62
Стр.8
8
Содержание
Perl ......................................................................................... 62
Тестирование ............................................................................. 62
Примеры из реальной жизни ...................................................... 62
Ошибка в интерпретаторе Windows Script позволяет
выполнить произвольный код ................................................ 63
Переполнение целого в конструкторе объекта
SOAPParameter ....................................................................... 63
Переполнение кучи в HTRдокументе, передаваемом
поблочно, может скомпрометировать Webсервер ................ 63
Искупление греха ....................................................................... 64
Дополнительные защитные меры............................................... 66
Другие ресурсы .......................................................................... 66
Резюме....................................................................................... 66
Не рекомендуется .................................................................. 66
Грех 4. Внедрение SQLкоманд .............................................. 67
В чем состоит грех ..................................................................... 67
Подверженные греху языки ........................................................ 67
Как происходит грехопадение .................................................... 68
Греховность C# ...................................................................... 68
Греховность PHP .................................................................... 69
Греховность Perl/CGI.............................................................. 69
Греховность Java .................................................................... 70
Греховность SQL .................................................................... 71
Родственные грехи................................................................. 72
Где искать ошибку ...................................................................... 72
Выявление ошибки на этапе анализа кода ................................. 72
Тестирование ............................................................................. 73
Примеры из реальной жизни ...................................................... 75
CAN20040348....................................................................... 75
CAN20020554....................................................................... 75
Искупление греха ....................................................................... 75
Проверяйте все входные данные ........................................... 76
Никогда не применяйте конкатенацию для построения
SQLпредложений .................................................................. 76
Дополнительные защитные меры............................................... 79
Другие ресурсы .......................................................................... 79
Резюме....................................................................................... 80
Грех 5. Внедрение команд....................................................... 82
В чем состоит грех ..................................................................... 82
Стр.9
Содержание
9
Подверженные греху языки ........................................................ 82
Как происходит грехопадение .................................................... 82
Родственные грехи................................................................. 84
Где искать ошибку ...................................................................... 84
Выявление ошибки на этапе анализа кода ................................. 84
Тестирование ............................................................................. 86
Примеры из реальной жизни ...................................................... 86
CAN20011187....................................................................... 86
CAN20020652....................................................................... 87
Искупление греха ....................................................................... 87
Контроль данных .................................................................... 87
Если проверка не проходит .................................................... 90
Дополнительные защитные меры............................................... 90
Другие ресурсы .......................................................................... 91
Резюме....................................................................................... 91
Грех 6. Пренебрежение обработкой ошибок....................... 92
В чем состоит грех ..................................................................... 92
Подверженные греху языки ........................................................ 92
Как происходит грехопадение .................................................... 92
Раскрытие излишней информации ........................................ 92
Игнорирование ошибок ......................................................... 93
Неправильная интерпретация ошибок ................................... 93
Бесполезные возвращаемые значения .................................. 94
Обработка не тех исключений, что нужно ............................... 94
Обработка всех исключений .................................................. 94
Греховность C/C++................................................................. 94
Греховность C/C++ в Windows ................................................ 95
Греховность C++ .................................................................... 96
Греховность C#, VB.NET и Java .............................................. 96
Родственные грехи................................................................. 97
Где искать ошибку ...................................................................... 97
Выявление ошибки на этапе анализа кода ................................. 97
Тестирование ............................................................................. 97
Примеры из реальной жизни ...................................................... 98
CAN20040077 do_mremap в ядре Linux................................. 98
Искупление греха ....................................................................... 98
Искупление греха в C/C++ ...................................................... 98
Искупление греха в C#, VB.NET и Java.................................... 99
Другие ресурсы .......................................................................... 99
Резюме..................................................................................... 100
Стр.10
10
Содержание
Грех 7. Кросссайтовые сценарии....................................... 101
В чем состоит грех ................................................................... 101
Подверженные греху языки ...................................................... 101
Как происходит грехопадение .................................................. 101
Греховное ISAPIрасширение или фильтр на C/C++ ............. 102
Греховность ASP .................................................................. 103
Греховность форм ASP.NET .................................................. 103
Греховность JSP................................................................... 103
Греховность PHP .................................................................. 103
Греховность Perlмодуля CGI.pm.......................................... 103
Греховность modperl ........................................................... 104
Где искать ошибку .................................................................... 104
Выявление ошибки на этапе анализа кода ............................... 104
Тестирование ........................................................................... 105
Примеры из реальной жизни .................................................... 106
Уязвимость IBM Lotus Domino для атаки
с кросссайтовым сценарием и внедрением HTML .............. 106
Ошибка при контроле входных данных в сценарии isqlplus,
входящем в состав Oracle HTTP Server, позволяет
удаленному пользователю провести атаку
с кросссайтовым сценарием .............................................. 106
CVE20020840 ..................................................................... 107
Искупление греха ..................................................................... 107
Искупление греха в ISAPIрасширениях и фильтрах
на C/C++ .............................................................................. 107
Искупление греха в ASP ....................................................... 108
Искупление греха в ASP.NET ................................................. 108
Искупление греха в JSP ........................................................ 108
Искупление греха в PHP ....................................................... 110
Искупление греха в Perl/CGI ................................................. 110
Искупление греха в modperl ................................................ 111
Замечание по поводу HTMLкодирования ............................ 111
Дополнительные защитные меры............................................. 112
Другие ресурсы ........................................................................ 112
Резюме..................................................................................... 113
Грех 8. Пренебрежение защитой сетевого трафика ....... 114
В чем состоит грех ................................................................... 114
Подверженные греху языки ...................................................... 114
Как происходит грехопадение .................................................. 115
Родственные грехи............................................................... 117
Стр.11
Содержание
11
Где искать ошибку .................................................................... 117
Выявление ошибки на этапе анализа кода ............................... 118
Тестирование ........................................................................... 121
Примеры из реальной жизни .................................................... 121
TCP/IP .................................................................................. 121
Протоколы электронной почты ............................................. 122
Протокол E*Trade ................................................................. 122
Искупление греха ..................................................................... 122
Рекомендации низкого уровня ............................................. 123
Дополнительные защитные меры............................................. 126
Другие ресурсы ........................................................................ 126
Резюме..................................................................................... 126
Грех 9. Применение загадочных URL и скрытых
полей форм ............................................................................... 128
В чем состоит грех ................................................................... 128
Подверженные греху языки ...................................................... 128
Как происходит грехопадение .................................................. 128
Загадочные URL ................................................................... 128
Скрытые поля формы ........................................................... 129
Родственные грехи............................................................... 129
Где искать ошибку .................................................................... 130
Выявление ошибки на этапе анализа кода ............................... 130
Тестирование ........................................................................... 131
Примеры из реальной жизни .................................................... 131
CAN20001001..................................................................... 132
Модификация скрытого поля формы в программе
MaxWebPortal ....................................................................... 132
Искупление греха ..................................................................... 132
Противник просматривает данные ....................................... 132
Противник воспроизводит данные ....................................... 133
Противник предсказывает данные ....................................... 135
Противник изменяет данные ................................................ 136
Дополнительные защитные меры............................................. 137
Другие ресурсы ........................................................................ 137
Резюме..................................................................................... 137
Грех 10. Неправильное применение SSL и TLS ................. 138
В чем состоит грех ................................................................... 138
Подверженные греху языки ...................................................... 138
Как происходит грехопадение .................................................. 139
Стр.12
12
Содержание
Родственные грехи............................................................... 142
Где искать ошибку .................................................................... 142
Выявление ошибки на этапе анализа кода ............................... 143
Тестирование ........................................................................... 144
Примеры из реальной жизни .................................................... 145
Почтовые клиенты ................................................................ 145
Webбраузер Safari ............................................................... 146
SSLпрокси Stunnel .............................................................. 146
Искупление греха ..................................................................... 147
Выбор версии протокола ..................................................... 147
Выбор семейства шифров ................................................... 148
Проверка сертификата......................................................... 149
Проверка имени хоста.......................................................... 150
Проверка отзыва сертификата ............................................. 151
Дополнительные защитные меры............................................. 153
Другие ресурсы ........................................................................ 153
Резюме..................................................................................... 154
Грех 11. Использование слабых систем
на основе паролей ................................................................... 155
В чем состоит грех ................................................................... 155
Подверженные греху языки ...................................................... 155
Как происходит грехопадение .................................................. 155
Родственные грехи............................................................... 158
Где искать ошибку .................................................................... 158
Выявление ошибки на этапе анализа кода ............................... 158
Политика управления сложностью пароля ........................... 158
Смена и переустановка пароля ............................................ 159
Протоколы проверки паролей .............................................. 159
Ввод и хранение паролей ..................................................... 160
Тестирование ........................................................................... 160
Примеры из реальной жизни .................................................... 161
CVE20051505 ..................................................................... 161
CVE20050432 ..................................................................... 162
Ошибка в TENEX ................................................................... 162
Кража у Пэрис Хилтон .......................................................... 163
Искупление греха ..................................................................... 163
Многофакторная аутентификация ....................................... 163
Хранение и проверка паролей .............................................. 164
Рекомендации по выбору протокола .................................... 167
Рекомендации по переустановке паролей ........................... 168
Стр.13
Содержание
13
Рекомендации по выбору пароля ......................................... 169
Прочие рекомендации ......................................................... 170
Дополнительные защитные меры............................................. 170
Другие ресурсы ........................................................................ 170
Резюме..................................................................................... 170
Не рекомендуется ................................................................ 171
Стоит подумать .................................................................... 171
Грех 12. Пренебрежение безопасным хранением
и защитой данных.................................................................... 172
В чем состоит грех ................................................................... 172
Подверженные греху языки ...................................................... 172
Как происходит грехопадение .................................................. 172
Слабый контроль доступа к секретным данным ................... 172
Греховность элементов управления доступом ..................... 174
Встраивание секретных данных в код .................................. 176
Родственные грехи............................................................... 177
Где искать ошибку .................................................................... 177
Выявление ошибки на этапе анализа кода ............................... 178
Тестирование ........................................................................... 178
Примеры из реальной жизни .................................................... 181
CVE20000100 ..................................................................... 181
CAN20021590..................................................................... 181
CVE19990886 ..................................................................... 181
CAN20040311..................................................................... 182
CAN20040391..................................................................... 182
Искупление греха ..................................................................... 182
Использование технологий защиты, предоставляемых
операционной системой ...................................................... 183
Искупление греха в C/C++ для Windows 2000
и последующих версий......................................................... 183
Искупление греха в ASP.NET версии 1.1 и старше ................ 185
Искупление греха в C# на платформе .NET Framework 2.0 ... 185
Искупление греха в C/C++ для Mac OS X версии v10.2
и старше............................................................................... 186
Искупление греха без помощи операционной системы
(или «храните секреты от греха подальше») ......................... 186
Замечание по поводу Java и Java KeyStore ........................... 188
Дополнительные защитные меры............................................. 189
Другие ресурсы ........................................................................ 190
Резюме..................................................................................... 191
Стр.14
14
Содержание
Грех 13. Утечка информации ................................................ 192
В чем состоит грех ................................................................... 192
Подверженные греху языки ...................................................... 192
Как происходит грехопадение .................................................. 193
Побочные каналы ................................................................. 193
Слишком много информации! .............................................. 194
Модель безопасности информационного потока ................. 196
Греховность C# (и других языков) ........................................ 198
Родственные грехи............................................................... 198
Где искать ошибку .................................................................... 199
Выявление ошибки на этапе анализа кода ............................... 199
Тестирование ........................................................................... 200
Имитация кражи ноутбука .................................................... 200
Примеры из реальной жизни .................................................... 200
Атака с хронометражем Дэна Бернстайна на шифр AES ...... 201
CAN20051411..................................................................... 201
CAN20051133..................................................................... 201
Искупление греха ..................................................................... 202
Искупление греха в C# (и других языках) ............................. 203
Учет локальности.................................................................. 203
Дополнительные защитные меры............................................. 203
Другие ресурсы ........................................................................ 204
Резюме..................................................................................... 204
Грех 14. Некорректный доступ к файлам........................... 206
В чем состоит грех ................................................................... 206
Подверженные греху языки ...................................................... 206
Как происходит грехопадение .................................................. 207
Греховность C/C++ в Windows .............................................. 207
Греховность C/C++............................................................... 208
Греховность Perl................................................................... 208
Греховность Python .............................................................. 208
Родственные грехи............................................................... 209
Где искать ошибку .................................................................... 209
Выявление ошибки на этапе анализа кода ............................... 209
Тестирование ........................................................................... 210
Примеры из реальной жизни .................................................... 210
CAN20050004..................................................................... 210
CAN20050799..................................................................... 211
CAN20040452 и CAN20040448 ......................................... 211
CVE20040115 Microsoft Virtual PC для Macintosh ................ 211
Стр.15
Содержание
15
Искупление греха ..................................................................... 211
Искупление греха в Perl ........................................................ 212
Искупление греха в C/C++ для Unix ...................................... 212
Искупление греха в C/C++ для Windows ............................... 213
Получение места нахождения временного каталога
пользователя ....................................................................... 213
Искупление греха в .NET ...................................................... 213
Дополнительные защитные меры............................................. 214
Другие ресурсы ........................................................................ 214
Резюме..................................................................................... 214
Грех 15. Излишнее доверие к системе разрешения
сетевых имен............................................................................ 215
В чем состоит грех ................................................................... 215
Подверженные греху языки ...................................................... 215
Как происходит грехопадение .................................................. 215
Греховные приложения ........................................................ 218
Родственные грехи............................................................... 218
Где искать ошибку .................................................................... 219
Выявление ошибки на этапе анализа кода ............................... 219
Тестирование ........................................................................... 220
Примеры из реальной жизни .................................................... 220
CVE20020676 ..................................................................... 220
CVE19990024 ..................................................................... 221
Искупление греха ..................................................................... 221
Другие ресурсы ........................................................................ 222
Резюме..................................................................................... 223
Грех 16. Гонки........................................................................... 224
В чем состоит грех ................................................................... 224
Подверженные греху языки ...................................................... 224
Как происходит грехопадение .................................................. 224
Греховность кода ................................................................. 226
Родственные грехи............................................................... 227
Где искать ошибку .................................................................... 227
Выявление ошибки на этапе анализа кода ............................... 228
Тестирование ........................................................................... 229
Примеры из реальной жизни .................................................... 229
CVE20011349 ..................................................................... 229
CAN20031073..................................................................... 230
CVE20040849 ..................................................................... 230
Стр.16
16
Содержание
Искупление греха ..................................................................... 230
Дополнительные защитные меры............................................. 232
Другие ресурсы ........................................................................ 232
Резюме..................................................................................... 233
Грех 17. Неаутентифицированный обмен ключами ........ 234
В чем состоит грех ................................................................... 234
Подверженные греху языки ...................................................... 234
Как происходит грехопадение .................................................. 234
Родственные грехи............................................................... 236
Где искать ошибку .................................................................... 236
Выявление ошибки на этапе анализа кода ............................... 236
Тестирование ........................................................................... 237
Примеры из реальной жизни .................................................... 237
Атака с «человеком посередине» на Novell Netware .............. 237
CAN20040155..................................................................... 238
Искупление греха ..................................................................... 238
Дополнительные защитные меры............................................. 239
Другие ресурсы ........................................................................ 239
Резюме..................................................................................... 239
Грех 18. Случайные числа криптографического
качества ..................................................................................... 240
В чем состоит грех ................................................................... 240
Подверженные греху языки ...................................................... 240
Как происходит грехопадение .................................................. 240
Греховность некриптографических генераторов ................. 241
Греховность криптографических генераторов ..................... 242
Греховность генераторов истинно случайных чисел ............ 242
Родственные грехи............................................................... 243
Где искать ошибку .................................................................... 243
Выявление ошибки на этапе анализа кода ............................... 244
Когда следует использовать случайные числа ..................... 244
Выявление мест, где применяются PRNGгенераторы ........ 244
Правильно ли затравлен CRNGгенератор ........................... 245
Тестирование ........................................................................... 245
Примеры из реальной жизни .................................................... 246
Браузер Netscape ................................................................. 246
Проблемы в OpenSSL ........................................................... 246
Искупление греха ..................................................................... 247
Стр.17
Содержание
17
Windows ................................................................................ 247
Код для .NET......................................................................... 248
Unix ...................................................................................... 248
Java ...................................................................................... 249
Повторное воспроизведение потока случайных чисел ......... 250
Дополнительные защитные меры............................................. 250
Другие ресурсы ........................................................................ 250
Резюме..................................................................................... 251
Стоит подумать .................................................................... 251
Грех 19. Неудобный интерфейс ........................................... 252
В чем состоит грех ................................................................... 252
Подверженные греху языки ...................................................... 252
Как происходит грехопадение .................................................. 252
Каков круг ваших пользователей? ........................................ 253
Минное поле: показ пользователям информации
о безопасности .................................................................... 254
Родственные грехи............................................................... 254
Где искать ошибку .................................................................... 255
Выявление ошибки на этапе анализа кода ............................... 255
Тестирование ........................................................................... 255
Примеры из реальной жизни .................................................... 256
Аутентификация сертификата в протоколе SSL/TLS ............ 256
Установка корневого сертификата в Internet Explorer 4.0 ..... 257
Искупление греха ..................................................................... 257
Делайте интерфейс пользователя простым и понятным ...... 258
Принимайте за пользователей решения,
касающиеся безопасности................................................... 258
Упрощайте избирательное ослабление политики
безопасности ....................................................................... 259
Ясно описывайте последствия ............................................. 260
Помогайте пользователю предпринять действия................. 262
Предусматривайте централизованное управление.............. 263
Другие ресурсы ........................................................................ 263
Резюме..................................................................................... 264
Приложение A. Соответствие между 19 смертными
грехами и «10 ошибками» OWASP ........................................ 265
Приложение B. Сводка рекомендаций ............................... 266
Предметный указатель .......................................................... 276
Стр.18