Michael Howard David LeBlank WRITING SECURE CODE Second Edition Microsoft 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, Редмонд, Вашинг тон, США.
Active Directory, ActiveX, Autbenticode, Hotmail, JScript, Microsoft, Microsoft Press, MSDN, MS-DOS, Visual Basic. Visual C++, Visual Studio, Win32. Windows, и Windows NT являются товарными знака ми или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все другие товарные знаки являются собственностью соответствующих фирм.
Все названия компаний, организаций, продуктов, Web-сайтов, доменов, адресов электронной почты, событий, а также имена лиц, используемые в настоящем издании, вымышлены и не имеют никакого отношения к реальным компаниям, организациям, продуктам, Web-сайтам, доменам, адресам электронной почты, событиям и именам лиц.
й Оригинальное издание на английском языке, Microsoft Corporation, й Перевод на русский язык, Microsoft Corporation, 2003- [SBN 0-7356-1722-8 (англ.) й Оформление и подготовка к изданию, шдательско TSBN 5-7502-0238-0 торговый дом Русская Редакция*, 2003- Оглавление Введение XX Кому адресована эта книга XXI Структура книги XX (I Загрузка и установка примеров приложений XX [I Системные требования XXII Техническая поддержка XXI [I Благодарности XXIII ЧАСТЬ I БЕЗОПАСНОСТЬ ПРИЛОЖЕНИЙ СЕГОДНЯ Глава 1 Необходимость защиты систем Приложения в дикой Web-среде Необходимость доверительных вычислений Танцуют все!* б Тактичные методы пропаганды идей безопасности Запрещенные приемы Некоторые методы насаждения идей безопасности Убедите начальника обратиться к сотрудникам с заявлением на тему безопасности Возьмите в штат поборника безопасности Правила боя Правило №1: защищающемуся приходится охранять все слабые места, а нападающему достаточно выбрать одно из них Правило №2: защищающийся готовится отразить известные атаки.
а нападающий может разработать новые методы взлома Правило № 3: оборону следует держать постоянно, удар же возможен когда угодно Правило №4: защищающему приходится соблюдать правила, а нападающему не возбраняется вести грязную игру* IS Резюме... VI Оглавление Глава 2 Активный подход к безопасности при разработке приложений Совершенствование процессов Необходимость обучения Отношение сотрудников к обязательному обучению Непрерывность обучения Развитие науки о безопасности Образование позволяет избавиться от заблуждения, что лишняя пара глаз Ч всегда лучше А теперь доказательства! 2б Проектирование Беседуйте с потенциальными сотрудниками Определите цели защиты продукта Рассматривайте защиту как неотделимую функцию программы Отведите на обеспечение безопасности достаточно времени Моделируйте опасности, грозящие системе С самого начала запланируйте процедуру удаления функций, оказавшихся небезопасными Определите допустимое число ошибок Предусмотрите проверку группой по безопасности Разработка Очень осторожно предоставляйте права на внесение исправлений Перепроверяйте внесенные исправления Зб Создайте руководство по созданию безопасного кода Учитесь на предыдущих ошибках Поручите анализ безопасности приглашенным специалистам Разверните кампанию по безопасности Не утоните в потоке обнаруженных ошибок защиты Следите за уровнем ошибок Никаких неожиданностей и пасхальных яиц! Тестирование Поставка и сопровождение -. Как узнать, что продукт готов Обратная связь Ответственность Резюме Глава 3 Принципы безопасности, которые следует взять на вооружение Принцип SD': безопасно согласно проекту, по умолчанию и при развертывании.... Безопасно согласно проекту Безопасно по умолчанию Безопасно при развертывании Принципы безопасности Учитесь на ошибках.... Оглавление VII Уменьшайте площадь приложения, уязвимую для нападений Назначайте безопасные параметры в конфигурации по умолчанию Защищайте все уровни Используйте наименьшие привилегии Будьте готовы к проблемам с обратной совместимостью Принимайте как аксиому, что внешние системы не защищены по определению Разработайте план действий на случай сбоев и отказов Предусмотрите безопасный сбой Помните, что возможности подсистемы безопасности Ч это не то же самое, что безопасные возможности системы Не стройте систему защиты на ограничении информации о приложении.... Разделяйте код и данные Корректно исправляйте ошибки в защите Резюме Глава 4 Моделирование опасностей Моделирование опасностей как средство проектирования защищенных приложений Создание группы моделирования опасностей Разложение программы на составляющие Определение опасностей, грозящих системе Распределение опасностей по мере убывания их серьезности Реакция на опасность Отбор методов для предотвращения опасности Методы защиты Аутентификация Авторизация Технологии защиты от несанкционированного доступа и обеспечение конфиденциальности Защищайте секретные данные, а лучше вообще не храните их Шифрование, хеши, МАС-коды и цифровые подписи Аудит Фильтрация, управление входящими запросами и качество обслуживания.... Минимальные привилегии Устранение опасностей, грозящих приложению расчета зарплаты Основные опасности и методы борьбы с ними Резюме ЧАСТЬ II МЕТОДЫ БЕЗОПАСНОГО КОДИРОВАНИЯ Глава 5 Враг №1: переполнение буфера 1С В Переполнение стека Переполнение кучи Оглавление VIII Ошибки индексации массива Ошибки в строках форматирования Несовпадение размеров буфера при использовании Unicode и ANSI Пример ошибки, связанной с Unicode Предотвращение переполнения буфера Безопасная обработка строк Пара слов об осторожности при работе со строковыми функциями Параметр /GS компилятора Visual C++.NET Резюме Глава б Выбор механизма управления доступом Почему списки ACL так важны Раздел не по теме: исправление кода доступа к реестру Из чего состоит ACL Как выбрать оптимальный ACL Эффективные запрещающие АСЕ-записи Создание ACL Создание ACL в Windows NT 4 Создание ACL в Windows 2000 Создание ACL средствами Active Template Library Как правильно упорядочить АСЕ-записи Безопасность при использовании SID сервера терминалов и удаленного рабочего стола Нулевая DACL и другие опасные типы АСЕ Нулевая DACL и аудит 1б Опасные типы АСЕ Что делать, если нельзя изменить нулевую DACL Другие механизмы управления доступом Роли в.NET Framework Роли в СОМ+ IP-ограничения Триггеры и разрешения сервера SQL Server Пример приложения для поликлиники Важное замечание по поводу механизмов управления доступом Резюме Глава 7 Принцип минимальных привилегий Ущерб от вредоносного ПО Вирусы и троянцы Изменение страниц Web-сайтов Краткий экскурс в управление доступом Коротко о привилегиях Привилегия SeBackupPrivilege Привилегия SeRestorePrivilege Оглавление IX Привилегия SeDebugPrivilege Привилегия SeTcbPrivilege Привилегии SeAssignPrimaryTokenPrivilege и SelncreaseQuota Privilege Привилегия SeLoadDriverPrivilege Привилегия SeRemoceShutdownPrivilege 1- Привилегия SeTakeOwnershipPrivilege Несколько слов о маркерах Как взаимодействуют маркеры, привилегии, SID, ACL и процессы Идентификаторы SID и травление доступом, а также привилегии и их проверка Три аргумента в пользу назначения приложению высоких привилегий Проблемы с ACL 1 - Проблемы с привилегиями Н Использование секретов LSA 1 ' Решение проблем, возникающих из-за предоставления высоких привилегий 1Ю Решение проблемы ACL 1[) Решение проблем с привилегиями Решение проблем с LSA 1 ' Определение оптимального набора привилегий 1 Х.) Этап 1: выясните, какие ресурсы нужны приложению Этап 2: выясните, какими системными API-функциями пользуется приложение Этап 3: определите, какая требуется учетная запись Этап 4: исследуйте содержимое маркера Этап 5: выясните необходимость всех привилегий и SID-идентификаторов.... Этап 6: внесите изменения в маркер Учетные записи непривилегированных служб в Windows XP/.NET Server 2003 Привилегия олицетворения в Windows.NET Server 2003 Отладка ошибок, возникающих из-за ограничения привилегий Резюме Глава 8 Подводные камни криптографии Слабые случайные числа Проблема с функцией rand Случайные числа криптографического качества в Win32 Случайные числа криптографического качества в управляемом коде 2 Случайные чиста криптографического качества на Web-страницах Создание криптографических ключей на основе пароля Оценка эффективной длины пароля Управление ключами 2 Долгосрочные и краткосрочные ключи Выбор длины ключа для защиты данных Выбор места хранения ключей 2 Оглавление Проблемы обмена ключами Создание собственных криптографических функций Использование одного ключа потокового шифрования Зачем нужно потоковое шифрование Подводные камни потокового шифрования "Что делать, когда необходимо использовать лишь один ключ Атаки на поточные шифры путем переворота бит Защита от атак переворота бит Что выбрать: хеш, хеш с ключом или цифровую подпись Повторное использование буфера для открытого и зашифрованного текста Криптография как средство защиты от атак Документируйте все случаи использования криптографии Резюме Глава 9 Защита секретных данных Атака на секретные данные Когда секрет хранить не обязательно Хеш с модификатором данных 2 Применение PKCS* 5 для усложнения задачи вааомщика Получение секретных данных от пользователя Защита секретов в Windows 2000 и следующих ОС семейства Частный случай: реквизиты пользователя в Windows XP Защита секретов в Windows NT 4 Защита секретов в Windows 95/98/Ме и Windows СЕ Получение информации об устройстве средствами РпР Слабость единого универсального решения Управление секретами в памяти Оптимизирующий компилятор... с подвохом Шифрование секретных данных в памяти Блокировка памяти для предотвращения выгрузки секретной информации на диск Защита секретных данных в управляемом коде Управление секретами в памяти в управляемом коде Поднимаем планку безопасности Хранение данных в файле на FAT-томе Применение встроенного ключа и операции XOR Применение встроенного ключа и алгоритма 3DES Использование 3DES для шифрования данных и хранение пароля в реестре Использование 3DES для шифрования данных и хранение пароля в защищенном разделе реестра Использование 3DES для шифрования данных, хранение пароля в надежном разделе реестра, а также защита самого файла и раздела реестра списками ACL Оглавление XI Шифрование данных по алгоритму 3DES, хранение пароля в надежном разделе реестра, требование ввести пароль, а также защита списками ACL файла и раздела реестра Компромиссы при защите секретных данных Резюме Глава 10 Все входные данные Ч от лукавого! Суть проблемы 2М Излишнее доверие 2:)б Методы защиты от атак, основанных на изменении входных данных Как проверять корректность данных 2 ) Осторожные переменные в Perl УЖ Регулярные выражения как средство проверки входящих данных Будьте внимательны с поиском (или проверкой) данных Регулярные выражения и Unicode Розеттский камень регулярных выражений Регулярные выражения в Perl Регулярные выражения в управляемом коде Регулярные выражения в сценариях Регулярные выражения в C++ Хороший подход, но без использования регулярных выражений 3Ю Резюме Глава 11 Недостатки канонического представления Что означает <Х канонический и как это понятие создает проблемы Проблемы канонического представления имен файлов Обход фильтров имен файлов в сервисе Napster Брешь в Mac OS X и Apache Брешь в именах устройств DOS Брешь в символической ссылке на каталог /tmp в пакете StarOffice компании Sun Стандартные ошибки в канонических именах Windows Проблемы приведения в канонический вид в Web Обход родительского контроля AOL Обход механизмов обеспечения безопасности еЕуе Зоны в Internet Explorer 4. Ошибка IP-адрес без точек* Брешь, связанная с потоком ::$DATA в Internet Information Server 4.0 Две строки вместо одной 3 Еще одна напасть в Web Ч управляющие символы Атаки на основании визуального совпадения и томографические атаки ? Предотвращение ошибок приведения в канонический вид Никогда не принимайте решений на основании имен Используйте регулярные выражения как метод контроля имени 3 Отключайте генерацию имен файлов в формате л8.3 XII Оглавление Не полагайтесь на переменную PATH Ч указывайте полные имена файлов Самостоятельно приводим имена в канонический вид Безопасно вызывайте CreateFile ЗЗб Лекарства от болезни приведения в канонический вид в Web Контроль правильности входных данных Исключительная осторожность с UTF-8 LSAP1 Ч между молотом и наковальней На закуску: проблемы приведения в канонический вид, не связанные с файлами Имена серверов Имена пользователей Резюме Глава 12 Ввод в базу данных Суть проблемы Псевдосредство № 1: заключение вводимых данных в кавычки Псевдосредство №2: хранимые процедуры Средство № 1: никаких подключений к СУБД под учетной записью администратора Средство №2: построение безопасных SQL-выражений Создание безопасных хранимых процедур Глубокая оборона Резюме Глава 13 Проблемы ввода в Web-среде Кросс-сайтовые сценарии: когда выходные данные превращаются в монстров Иногда взломщик обходится без тэга