Несовпадение размеров буфера при использовании Unicode и ANSI156
Пример ошибки, связанной с Unicode158
Предотвращение переполнения буфера158
Безопасная обработка строк159
Функция strcpy159
Функция strncpy161
Функция sprintf163
Функция _snprintf164
Строки в Standart Template Library165
Функции gets и fgets166
Использование Strsafe.h166
Пара слов об осторожности при работе со строковыми функциями168
Параметр /GS компилятора Visual C++.NET169
Резюме172
Глава 6. Выбор механизма управления доступом173
Почему списки ACL так важны173
Раздел не «по теме»: исправление кода доступа к реестру175
Из чего состоит ACL176
Как выбрать оптимальный ACL179
Эффективные запрещающие ACE-записи181
Создание ACL181
Создание ACL в WindowsNT4181
Создание ACL в Windows2000185
Создание ACL средствами Active Template Library188
Как правильно упорядочить ACE-записи190
Безопасность при использовании SID сервера терминалов и удаленного рабочего стола192
Нулевая DACL и другие опасные типы ACE193
Нулевая DACL и аудит195
Опасные типы ACE195
Что делать, если нельзя изменить нулевую DACL196
Другие механизмы управления доступом196
Роли в .NET Framework197
Роли в COM+198
IP-ограничения199
Триггеры и разрешения сервера SQL Server200
Пример приложения для поликлиники200
Важное замечание по поводу механизмов управления доступом201
Резюме202
Глава 7. Принцип минимальных привилегий203
Ущерб от вредоносного ПО204
Вирусы и троянцы204
Изменение страниц Web-сайтов205
Краткий экскурс в управление доступом206
Коротко о привилегиях206
Привилегия SeBackupPrivilege207
Привилегия SeRestorePrivilege210
Привилегия SeDebugPrivilege210
Привилегия SeTcbPrivilege211
Привилегии SeAssignPrimaryTokenPrivilege и SeIncreaseQuotaPrivilege211
Привилегия SeLoadDriverPrivilege211
Привилегия SeRemoteShutdownPrivilege212
Привилегия SeTakeOwnershipPrivilege212
Несколько слов о маркерах212
Как взаимодействуют маркеры, привилегии, SID, ACL и процессы213
Идентификаторы SID и управление доступом, а также привилегии и их проверка214
Три аргумента в пользу назначения приложению высоких привилегий214
Проблемы с ACL214
Открытие ресурсов в режиме доступа GENERIC_ALL215
Проблемы с привилегиями215
Использование секретов LSA215
Решение проблем, возникающих из-за предоставления высоких привилегий216
Решение проблемы ACL216
Решение проблем с привилегиями217
Решение проблем с LSA217
Определение оптимального набора привилегий217
Этап 1: выясните, какие ресурсы нужны приложению217
Этап 2: выясните, какими системными API-функциями пользуется приложение218
Этап 3: определите, какая требуется учетная запись219
Этап 4: исследуйте содержимое маркера219
Этап 5: выясните необходимость всех привилегий и SID-идентификаторов225
Этап 6: внесите изменения в маркер225
Разрешите выполнение приложения под непривилегированными учетными записями225
Используйте ограниченные маркеры227
Используйте ограниченные маркеры229
Программа-пример, демонстрирующая возможности ограниченных маркеров229
Применяйте политику ограниченного использования программ и WindowsXP233
Полностью удаляйте ненужные привилегии235
Учетные записи непривилегированных служб в WindowsXP/.NET Server 2003238
Привилегия олицетворения в Windows .NET Server 2003240
Отладка ошибок, возникающих из-за ограничения привилегий241
Почему приложения не работают под рядовой учетной записью241
Как выяснить, почему приложение «падает»242
Резюме244
Глава 8. Подводные камни криптографии248
«Слабые» случайные числа248
Проблема с функцией rand249
Случайные числа криптографического качества в Win32251
Случайные числа криптографического качества в управляемом коде256
Случайные числа криптографического качества на Web-страницах256
Создание криптографических ключей на основе пароля257
Оценка эффективной длины пароля257
Управление ключами260
Долгосрочные и краткосрочные ключи261
Выбор длины ключа для защиты данных261
Выбор места хранения ключей262
Функции CryptGenKey и CryptExportKey263
Проблемы обмена ключами265
Создание собственных криптографических функций267
Использование одного ключа потокового шифрования269
Зачем нужно потоковое шифрование270
Подводные камни потокового шифрования270
Что делать, когда необходимо использовать лишь один ключ273
Атаки на поточные шифры путем переворота бит274
Защита от атак переворота бит275
Что выбрать: хеш, хеш с ключом или цифровую подпись275
Повторное использование буфера для открытого и зашифрованного текста280
Криптография как средство защиты от атак281
Документируйте все случаи использования криптографии282
Резюме282
Глава 9. Защита секретных данных283
Атака на секретные данные284
Когда секрет хранить не обязательно284
Хеш с модификатором данных285
Применение PKCS #5 для усложнения задачи взломщика287
Получение секретных данных от пользователя288
Защита секретов в Windows 2000 и следующих ОС семейства288
Частный случай: реквизиты пользователя в WindowsXP291
Защита секретов в WindowsNT4293
Защита секретов в Windows95/98/Me и Windows CE296
Получение информации об устройстве средствами PnP297
Слабость единого универсального решения301
Управление секретами в памяти302
Оптимизирующий компилятор... с подвохом303
Шифрование секретных данных в памяти306
Блокировка памяти для предотвращения выгрузки секретной информации на диск307
Защита секретных данных в управляемом коде308
Управление секретами в памяти в управляемом коде314
Поднимаем планку безопасности316
Хранение данных в файле на FAT-томе316
Применение встроенного ключа и операции XOR316
Применение встроенного ключа и алгоритма 3DES316
Использование 3DES для шифрования данных и хранение пароля в реестре316
Использование 3DES для шифрования данных и хранение пароля в защищенном разделе реестра317
Использование 3DES для шифрования данных, хранение пароля в надежном разделе реестра, а также защита самого файла и раздела реестра списками ACL317
Шифрование данных по алгоритму 3DES, хранение пароля в надежном разделе реестра, требование ввести пароль, а также защита списками ACL файла и раздела реестра317
Компромиссы при защите секретных данных317
Резюме318
Глава 10. Все входные данные — от лукавого!319
Суть проблемы320
Излишнее доверие321
Методы защиты от атак, основанных на изменении входных данных322
Как проверять корректность данных324
«Осторожные» переменные в Perl326
Регулярные выражения как средство проверки входящих данных327
Будьте внимательны с поиском (или проверкой) данных329
Регулярные выражения и Unicode330
Розеттский камень регулярных выражений333
Регулярные выражения в Perl334
Регулярные выражения в управляемом коде334
Регулярные выражения в сценариях335
Регулярные выражения в C++336
Хороший подход, но без использования регулярных выражений336
Резюме337
Глава 11. Недостатки канонического представления338
Что означает «канонический» и как это понятие создает проблемы339
Проблемы канонического представления имен файлов339
Обход фильтров имен файлов в сервисе Napster339
Брешь в Mac OS X и Apache340
Брешь в именах устройств DOS340
Брешь в символической ссылке на каталог /tmp в пакете StarOffice компании Sun340
Стандартные ошибки в канонических именах Windows341
Представление длинных имен файлов в формате «8.3»341
Завершающие символы343
Формат «\\?\»344
Обход каталогов и пути относительно родительского каталога (..)344
Абсолютные и относительные имена файлов345
Имена файлов, нечувствительные к регистру символов345
Общие ресурсы UNC345
Когда файл не является файлом: почтовые ящики и именованные каналы346
Когда файл не является файлом: имена устройств и зарезервированные имена346
Проблемы приведения в канонический вид в Web347
Обход родительского контроля AOL347
Обход механизмов обеспечения безопасности eEye347
Зоны в Internet Explorer 4. Ошибка «IP-адрес без точек»348
Брешь, связанная с потоком ::$DATA в Internet Information Server 4.0349
Две строки вместо одной350
Еще одна напасть в Web — управляющие символы351
Шестнадцатеричные управляющие коды351
Кодировка UTF-8351
Как кодируются данные в UTF-8352
Кодировка Unicode UCS-2353
Двойная кодировка353
Управляющие коды HTML354
Атаки на основании визуального совпадения и гомографические атаки354
Предотвращение ошибок приведения в канонический вид355
Никогда не принимайте решений на основании имен355
Используйте регулярные выражения как метод контроля имени356
Отключайте генерацию имен файлов в формате «8.3»357
Не полагайтесь на переменную PATH — указывайте полные имена файлов357
Самостоятельно приводим имена в канонический вид358
Безопасно вызывайте CreateFile362
Лекарства от болезни приведения в канонический вид в Web362
Контроль правильности входных данных362
Исключительная осторожность с UTF-8362
ISAPI — между молотом и наковальней363
На закуску: проблемы приведения в канонический вид, не связанные с файлами364
Имена серверов364
Имена пользователей365
Резюме367
Глава 12. Ввод в базу данных368
Суть проблемы369
Псевдосредство №1: заключение вводимых данных в кавычки371
Псевдосредство №2: хранимые процедуры372
Средство №1: никаких подключений к СУБД под учетной записью администратора373
Средство №2: построение безопасных SQL-выражений374
Создание безопасных хранимых процедур375
Глубокая оборона376
Резюме380
Глава 13. Проблемы ввода в Web-среде381
Кросс-сайтовые сценарии: когда выходные данные превращаются в монстров381
Иногда взломщик обходится без тэга <SCRIPT>385
Атаку не всегда инициирует щелчок ссылки385
Другие атаки, связанные с XSS386
XSS-атаки на локальные файлы386
Атаки на HTML-ресурсы387
Как предотвратить XSS-бреши388
Кодирование выходных данных388
Обрамление всех свойств тэга двойными кавычками389
Вставка данных в свойство innerText389
Применение только одной кодовой страницы390
Параметр HttpOnly cookie-файлов в браузере Internet Explorer 6 SP1390
Отметка о происхождении материала из Интернета392
Атрибут <FRAME SECURITY> браузера Internet Explorer393
Параметр конфигурации ValidateRequest в ASP.NET 1.1393
Не ищите небезопасные конструкции394
Когда непременно нужно, чтобы пользователи посылали HTML на ваш Web-сайт395
Как проверить код на наличие XSS-дефектов396
Прочие вопросы безопасности в Web397
Проблемы из-за функции eval()397
Проблемы доверия в HTTP397
Проблемы с REFERER397
Приложения и фильтры на основе ISAPI398
Конфиденциальные данные в cookie-файлах и полях400
Будьте осторожны с «предсказуемыми» cookie-файлами401
Проблемы SSL/TLS на клиентской стороне401
Резюме402
Глава 14. Проблемы поддержки других языков403
Золотые правила безопасной реализации I18N404
Применение Unicode404
Предотвращение переполнения буфера из-за I18N404
Слова и байты405
Проверка корректности I18N406
Визуальная проверка406
Не проверяйте правильность строк посредством LCMapString407
Для проверки действительности имен файлов применяйте CreateFile407
Проблемы преобразования символов407
Вызов MultiByteToWideChar с флагами MB_PRECOMPOSED и MB_ERR_INVALID_CHARS408
Вызов WideCharToMultiByte с флагом WC_NO_BEST_FIT_CHARS408
Сравнение и сортировка411
Свойства символов Unicode412
Нормализация412
Резюме413
Часть III. Дополнительные методы создания защищенного кода415
Глава 15. Безопасность сокетов416
Как предотвратить подмену сервера417
Атаки с применением окон на прием в протоколе TCP424
Выбор интерфейсов сервера424
Порядок обработки запросов на создание подключения425
Создание приложений, поддерживающих взаимодействие через брандмауэры431
Используйте для работы только одно подключение431
Не создавайте обратных подключений от сервера к клиенту432