Michael Howard David LeBlank WRITING SECURE CODE Second Edition Press Майкл Ховард Дэвид Лебланк ЗАЩИЩЕННЫЙ код 2-е издание, исправленное Москва 2004 УДК 004.45 ББК 32.973.26-018.2 Х68
Ховард М., Лебланк Д.
Х68 Защищенный код: Пер. с англ, Ч 2-е изд., испр.
говый дом Редакция, 2004. Ч 704 стр.: ил.
ISBN 5-7502-0238-0 В этой книге разработчики найдут практические советы и рекомендации по защите создаваемых приложений на всех этапах процесса создания ПО Ч от про ектирования безопасных приложений и до тестирования для выявления брешей в готовой программе и создания безопасной документации и сообщений об ошибках. Здесь рассказывается о моделировании опасностей, планировании про цесса разработки защищенных проблемах локализации и связан ных с ней опасностях, недостатках файловых систем, поддержке конфиденциаль ности в приложениях и безопасной установке приложений. Авторы иллюстриру ют свой рассказ примерами программ на самых разных языках Ч от до Perl.
Издание обогащено знанием, полученным авторами в процессе реализации Win dows Security Push Ч инициативы по укреплению защиты продуктов Microsoft.
Книга будет полезной менеджерам проектов, архитекторам приложений, про и техническим то есть абсолютно всем специалистам, вовлеченным в процесс разработки ПО, Ч как новичкам, так и профессионалам.
Книга состоит из 24 глав, 5 приложений, библиографического списка с анно тациями и предметного указателя.
УДК 004. ББК 32.973.26-018. к по договору с Microsoft Corporation, Вашинг тон, США.
Directory, ActiveX, Microsoft, Microsoft Press, MSDN, MS-DOS, Visual Basic. Visual C++, Visual Win32. Windows, и Windows NT товарными знака или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все другие являются собственностью соответствующих фирм.
Все названия компаний, организаций, продуктов, Web-сайтов, доменов, адресов электронной событий, а также имена в издании, вымышлены и не имеют никакого отношения к реальным компаниям, продуктам, Web-сайтам, доменам, адресам электронной почты, событиям и именам лиц.
й Оригинальное издание на английском Microsoft Corporation, й Перевод на русский язык, Microsoft Corporation, 2003- [SBN (англ.) й Оформление и подготовка к изданию, TSBN 5-7502-0238-0 торговый дом 2003- Оглавление Введение XX Кому адресована эта книга XXI Структура книги Загрузка и установка примеров приложений XX [I Системные требования Техническая поддержка [I Благодарности XXIII I БЕЗОПАСНОСТЬ ПРИЛОЖЕНИЙ СЕГОДНЯ Глава 1 Необходимость защиты систем Приложения в дикой Web-среде доверительных вычислений Танцуют б Тактичные методы пропаганды идей безопасности Запрещенные приемы Некоторые методы насаждения идей безопасности Убедите начальника к сотрудникам с заявлением на тему безопасности Возьмите в штат поборника безопасности Правила боя Правило защищающемуся приходится охранять все слабые места, а нападающему достаточно выбрать одно из них Правило №2: защищающийся готовится отразить известные атаки.
а нападающий может разработать новые методы взлома Правило № 3: оборону следует держать постоянно, удар же возможен когда угодно Правило №4: защищающему приходится соблюдать правила, а нападающему не возбраняется вести грязную Резюме VI Глава 2 Активный подход к безопасности при разработке приложений Совершенствование процессов Необходимость обучения Отношение сотрудников к обязательному обучению Непрерывность обучения Развитие науки о безопасности Образование позволяет избавиться от что пара глаз Ч всегда лучше А теперь доказательства! 2б Проектирование Беседуйте с потенциальными сотрудниками Определите цели защиты продукта Рассматривайте защиту как функцию программы Отведите на обеспечение безопасности достаточно времени Моделируйте опасности, грозящие системе С самого начала запланируйте процедуру удаления оказавшихся небезопасными Определите допустимое число ошибок Предусмотрите проверку группой по безопасности Разработка Очень осторожно предоставляйте права на внесение исправлений Перепроверяйте внесенные исправления Зб Создайте руководство по созданию безопасного кода Учитесь на предыдущих ошибках Поручите анализ безопасности приглашенным специалистам Разверните кампанию по Не утоните в потоке обнаруженных ошибок защиты Следите за уровнем ошибок Никаких неожиданностей и яиц! Тестирование Поставка и сопровождение Как узнать, что продукт готов Обратная связь Ответственность Резюме Глава 3 Принципы безопасности, которые следует взять на вооружение Принцип согласно проекту, по умолчанию при развертывании Безопасно согласно проекту Безопасно по умолчанию Безопасно при развертывании Принципы безопасности Учитесь на ошибках Оглавление VII Уменьшайте приложения, уязвимую для нападений Назначайте безопасные параметры в по умолчанию Защищайте все уровни Используйте наименьшие привилегии Будьте готовы к проблемам с обратной совместимостью Принимайте как аксиому, что внешние системы не защищены по определению Разработайте план действий на случай сбоев и отказов Предусмотрите безопасный сбой что возможности подсистемы безопасности Ч это не то же самое, что безопасные возможности системы Не стройте систему защиты на ограничении информации о приложении Разделяйте код и данные Корректно исправляйте ошибки в защите Резюме Глава 4 Моделирование опасностей Моделирование опасностей как средство проектирования защищенных приложений Создание группы моделирования опасностей Разложение программы на составляющие Определение опасностей, грозящих системе Распределение опасностей по мере убывания их серьезности Реакция на опасность Отбор методов для предотвращения опасности Методы защиты Аутентификация Авторизация Технологии защиты от несанкционированного доступа и обеспечение конфиденциальности Защищайте секретные данные, а лучше вообще не храните их Шифрование, хеши, и цифровые подписи Аудит Фильтрация, управление входящими запросами и качество обслуживания Минимальные привилегии Устранение опасностей, грозящих приложению расчета зарплаты Основные опасности и методы борьбы с ними Резюме МЕТОДЫ БЕЗОПАСНОГО КОДИРОВАНИЯ Глава 5 Враг переполнение буфера В Переполнение стека Переполнение кучи VIII Оглавление Ошибки индексации массива Ошибки в строках форматирования Несовпадение размеров буфера при использовании Unicode и ANSI Пример ошибки, связанной с Unicode Предотвращение переполнения буфера Безопасная обработка строк Пара слов об осторожности при работе со строковыми функциями Параметр /GS компилятора Visual C++ Резюме Глава б Выбор управления доступом Почему списки так важны Раздел не по теме: исправление кода доступа к реестру Из чего состоит ACL Как выбрать оптимальный ACL Эффективные запрещающие АСЕ-записи Создание ACL в Windows NT Создание ACL в Windows Создание ACL средствами Active Template Library Как правильно упорядочить АСЕ-записи Безопасность при использовании SID сервера терминалов и удаленного рабочего стола Нулевая и другие опасные типы АСЕ Нулевая DACL и аудит 1б Опасные типы АСЕ Что делать, если нельзя изменить нулевую DACL Другие механизмы управления доступом Роли в Framework Роли в СОМ+ IP-ограничения Триггеры и разрешения сервера SQL Server Пример приложения для поликлиники Важное замечание по поводу механизмов управления доступом Резюме Глава 7 Принцип минимальных привилегий Ущерб от вредоносного ПО Вирусы и троянцы Изменение страниц Web-сайтов Краткий в управление доступом Коротко о привилегиях Привилегия Привилегия SeRestorePrivilege Оглавление IX Привилегия Привилегия SeTcbPrivilege Привилегии и Privilege Привилегия Привилегия Привилегия Несколько слов о маркерах Как взаимодействуют маркеры, привилегии, SID, ACL и процессы Идентификаторы SID и доступом, а также привилегии и их проверка аргумента в пользу назначения приложению высоких привилегий Проблемы с ACL Проблемы с привилегиями Использование секретов Решение проблем, возникающих из-за предоставления высоких привилегий Решение проблемы ACL Решение проблем с привилегиями Решение проблем с Определение оптимального набора привилегий Этап 1: выясните, какие ресурсы нужны приложению Этап 2: выясните, какими системными API-функциями пользуется приложение Этап 3: определите, какая требуется учетная запись Этап 4: исследуйте содержимое маркера.... Этап 6: внесите изменения в маркер Учетные записи непривилегированных служб в Windows XP/.NET Server Привилегия олицетворения в Windows Server Отладка возникающих из-за ограничения привилегий Резюме Глава 8 Подводные камни криптографии Слабые случайные числа Проблема с функцией rand Случайные числа криптографического качества в Случайные числа криптографического качества в управляемом коде 2 Случайные криптографического качества на Web-страницах Создание криптографических ключей на основе пароля Оценка эффективной длины пароля Управление ключами 2 Долгосрочные и краткосрочные ключи Выбор длины ключа для защиты данных Выбор места хранения ключей Оглавление Проблемы обмена ключами Создание собственных криптографических функций Использование одного ключа потокового шифрования Зачем нужно шифрование Подводные камни потокового шифрования "Что когда необходимо использовать лишь один ключ Атаки на поточные шифры путем переворота бит Защита от атак переворота бит Что выбрать: хеш, хеш с ключом или цифровую подпись Повторное использование буфера для открытого и зашифрованного текста Криптография как средство защиты от атак Документируйте все случаи использования криптографии Резюме Глава 9 Защита секретных данных Атака на секретные данные Когда секрет хранить не обязательно Хеш с модификатором данных 5 для усложнения задачи Получение секретных данных от пользователя Защита секретов в Windows 2000 и следующих ОС семейства Частный случай: реквизиты пользователя в Windows XP Защита секретов в Windows 4 Защита секретов в Windows и Windows СЕ Получение информации об устройстве средствами РпР Слабость единого универсального Управление секретами в памяти Оптимизирующий компилятор... с подвохом Шифрование секретных данных в памяти Блокировка памяти для предотвращения выгрузки секретной информации на диск Защита секретных данных в управляемом коде Управление секретами в памяти в управляемом коде Поднимаем планку безопасности Хранение данных в файле на FAT-томе Применение встроенного ключа и операции XOR Применение встроенного ключа и алгоритма 3DES Использование для шифрования данных и хранение пароля в реестре Использование 3DES для шифрования данных и хранение пароля в защищенном разделе реестра Использование 3DES для шифрования данных, хранение пароля в надежном разделе реестра, а также защита самого файла и раздела реестра списками ACL Оглавление XI Шифрование данных по алгоритму 3DES, хранение пароля в надежном разделе реестра, требование ввести пароль, а также защита списками ACL файла и раздела реестра Компромиссы при защите секретных данных Резюме Глава Все входные данные Ч от лукавого! Суть проблемы Излишнее доверие Методы защиты от основанных на изменении входных данных Как проверять корректность данных 2 ) Осторожные переменные в Perl УЖ Регулярные выражения как средство проверки входящих данных Будьте внимательны с поиском (или проверкой) данных Регулярные выражения и Unicode камень регулярных выражений Регулярные выражения в Perl Регулярные выражения в управляемом коде Регулярные выражения в сценариях Регулярные выражения в C++ Хороший подход, но без использования регулярных выражений Резюме Глава Недостатки канонического представления Что означает и как это понятие создает проблемы Проблемы канонического представления имен файлов Обход фильтров имен файлов в сервисе Napster Брешь в Mac OS X и Apache Брешь в именах устройств DOS Брешь в символической ссылке на каталог /tmp в пакете компании Sun Стандартные ошибки в канонических именах Windows Проблемы приведения в канонический вид в Web Обход родительского контроля AOL Обход механизмов обеспечения безопасности еЕуе Зоны в Explorer 4. Ошибка без точек* связанная с потоком ::$DATA Internet Information Server 4. Две строки вместо одной 3 Еще одна напасть в Web Ч управляющие символы Атаки на основании визуального совпадения и атаки Предотвращение ошибок приведения в канонический вид Никогда не принимайте решений на основании имен Используйте регулярные выражения как метод контроля имени 3 Отключайте генерацию имен файлов в формате XII Оглавление Не полагайтесь на переменную PATH Ч указывайте полные имена файлов Самостоятельно приводим имена в канонический вид Безопасно вызывайте CreateFile Лекарства от приведения в канонический вид в Web Контроль правильности входных данных Исключительная осторожность с Ч между молотом и наковальней На закуску: проблемы приведения в канонический вид, не связанные с файлами Имена серверов Имена пользователей Резюме Глава 12 Ввод в базу данных проблемы Псевдосредство заключение вводимых данных в кавычки Псевдосредство №2: хранимые процедуры Средство никаких подключений к СУБД под учетной записью администратора Средство №2: построение безопасных SQL-выражений Создание безопасных хранимых Глубокая оборона Резюме Глава 13 Проблемы ввода в Web-среде сценарии: когда выходные данные превращаются в монстров Иногда взломщик обходится без тэга