19 смертных грехов, угрожающих безопасности программ
Реклама. ООО «ЛитРес», ИНН: 7719571260.
Оглавление
Группа авторов. 19 смертных грехов, угрожающих безопасности программ
Об авторах
О научных редакторах
Предисловие
Благодарности
Введение
Структура книги
Кому предназначена эта книга
Какие главы следует прочитать
Грех 1. Переполнение буфера
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность C/C++
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CVE–1999–0042
CVE–2000–0389 – CVE–2000–0392
CVE–2002–0842, CVE–2003–0095, CAN–2003–0096
CAN–2003–0352
Искупление греха
Замена опасных функций работы со строками
Следите за выделениями памяти
Проверьте циклы и доступ к массивам
Пользуйтесь строками в стиле С++, а не С
Пользуйтесь STL–контейнерами вместо статических массивов
Пользуйтесь инструментами анализа
Дополнительные защитные меры
Защита стека
Запрет исполнения в стеке и куче
Другие ресурсы
Резюме
Грех 2. Ошибки, связанные с форматной строкой
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность C/C++
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CVE–2000–0573
CVE–2000–0844
Искупление греха
Искупление греха в C/C++
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 3. Переполнение целых чисел
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность С и С++
Операции приведения
Преобразования при вызове операторов
Арифметические операции
Операции сравнения
Поразрядные операции
Греховность С#
Ключевые слова checked и unchecked
Греховность Visual Basic и Visual Basic .NET
Греховность Java
Греховность Perl
Где искать ошибку
Выявление ошибки на этапе анализа кода
C/C++
С#
Java
Visual Basic и Visual Basic .NET
Perl
Тестирование
Примеры из реальной жизни
Ошибка в интерпретаторе Windows Script позволяет выполнить произвольный код
Переполнение целого в конструкторе объекта SOAPParameter
Переполнение кучи в HTR–документе, передаваемом поблочно, может скомпрометировать Web–сервер
Искупление греха
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 4. Внедрение SQL–команд
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность С#
Греховность PHP
Греховность Perl/CGI
Греховность Java
Греховность SQL
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CAN–2004–0348
CAN–2002–0554
Искупление греха
Проверяйте все входные данные
Никогда не применяйте конкатенацию для построения SQL–предложений
Искупление греха в С#
Искупление греха в PHP 5.0 и MySQL версии 4.1 и старше
Искупление греха в Perl/CGI
Искупление греха в Java с использованием JDBC
Искупление греха в ColdFusion
Искупление греха в SQL
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 5. Внедрение команд
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CAN–2001–1187
CAN–2002–0652
Искупление греха
Контроль данных
Если проверка не проходит
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 6. Пренебрежение обработкой ошибок
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Раскрытие излишней информации
Игнорирование ошибок
Неправильная интерпретация ошибок
Бесполезные возвращаемые значения
Обработка не тех исключений, что нужно
Обработка всех исключений
Греховность C/C++
Греховность C/C++ в Windows
Греховность С++
Греховность C#, VB.NET и Java
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CAN–2004–0077 do_mremap в ядре Linux
Искупление греха
Искупление греха в C/C++
Искупление греха в C#, VB.NET и Java
Другие ресурсы
Резюме
Грех 7. Кросс–сайтовые сценарии
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховное ISAPI–расширение или фильтр на C/C++
Греховность ASP
Греховность форм ASP. NET
Греховность JSP
Греховность PHP
Греховность Perl–модуля CGI.pm
Греховность mod–perl
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
Уязвимость IBM Lotus Domino для атаки с кросс–сайтовым сценарием и внедрением HTML
Ошибка при контроле входных данных в сценарии isqlplus, входящем в состав Oracle HTTP Server, позволяет удаленному пользователю провести атаку с кросс–сайтовым сценарием
CVE–2002–0840
Искупление греха
Искупление греха в ISAPI–расширениях и фильтрах на C/C++
Искупление греха в ASP
Искупление греха в ASP. NET
Искупление греха в JSP
Искупление греха в PHP
Искупление греха в Perl/CGI
Искупление греха в mod–perl
Замечание по поводу HTML–кодирования
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 8. Пренебрежение защитой сетевого трафика
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
TCP/IP
Протоколы электронной почты
Протокол E*Trade
Искупление греха
Рекомендации низкого уровня
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 9. Применение загадочных URL и скрытых полей форм
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Загадочные URL
Скрытые поля формы
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CAN–2000–1001
Модификация скрытого поля формы в программе MaxWebPortal
Искупление греха
Противник просматривает данные
Противник воспроизводит данные
Противник предсказывает данные
Противник изменяет данные
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 10. Неправильное применение SSL и TLS
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
Почтовые клиенты
Web–браузер Safari
SSL–прокси Stunnel
Искупление греха
Выбор версии протокола
Выбор семейства шифров
Проверка сертификата
Проверка имени хоста
Проверка отзыва сертификата
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 11. Использование слабых систем на основе паролей
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Политика управления сложностью пароля
Смена и переустановка пароля
Протоколы проверки паролей
Ввод и хранение паролей
Тестирование
Примеры из реальной жизни
CVE–2005–1505
CVE–2005–0432
Ошибка в TENEX
Кража у Пэрис Хилтон
Искупление греха
Многофакторная аутентификация
Хранение и проверка паролей
Рекомендации по выбору протокола
Рекомендации по переустановке паролей
Рекомендации по выбору пароля
Прочие рекомендации
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 12. Пренебрежение безопасным хранением и защитой данных
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Слабый контроль доступа к секретным данным
ACL и ограничение прав
Греховность элементов управления доступом
Встраивание секретных данных в код
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CVE–2000–0100
CAN–2002–1590
CVE–1999–0886
CAN–2004–0311
CAN–2004–0391
Искупление греха
Использование технологий защиты, предоставляемых операционной системой
Искупление греха в C/C++для Windows 2000 и последующих версий
Искупление греха bASP.NET версии 1.1 и старше
Искупление греха в С# на платформе . NET Framework 2.0
Искупление греха в C/C++ для Mac OS X версии v10.2 и старше
Искупление греха без помощи операционной системы (или «храните секреты от греха подальше»)
Чтение из файловой системы из PHP–сценария в Linux
Чтение из файловой системы с помощью ASP.NET (С#)
Чтение из файловой системы с помощью ASP (VBScript)
Чтение из реестра с помощью ASP.NET (VB.NET)
Замечание по поводу Java и Java KeyStore
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 13. Утечка информации
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Побочные каналы
Слишком много информации!
Правильно ли имя пользователя
Детальная информация о версии
Информация о сетевом хосте
Информация о приложении
Информация о пути
Информация о структуре стека
Модель безопасности информационного потока
Греховность С# (и других языков)
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Имитация кражи ноутбука
Примеры из реальной жизни
Атака с хронометражем Дэна Бернстайна на шифр АЕS
CAN–2005–1411
CAN–2005–1133
Искупление греха
Искупление греха в С# (и других языках)
Учет локальности
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 14. Некорректный доступ к файлам
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность C/C++ в Windows
Греховность C/C++
Греховность Perl
Греховность Python
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CAN–2005–0004
CAN–2005–0799
CAN–2004–0452 и CAN–2004–0448
CVE–2004–0115 Microsoft Virtual PC для Macintosh
Искупление греха
Искупление греха в Perl
Искупление греха в C/C++для Unix
Искупление греха в C/C++для Windows
Получение места нахождения временного каталога пользователя
Искупление греха в .NET
С#
VB.NET
Managed С++
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 15. Излишнее доверие к системе разрешения сетевых имен
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховные приложения
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CVE–2002–0676
CVE–1999–0024
Искупление греха
Другие ресурсы
Резюме
Грех 16. Гонки
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность кода
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
CVE–2001–1349
CAN–2003–1073
CVE–2004–0849
Искупление греха
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 17. Неаутентифицированный обмен ключами
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
Атака с «человеком посередине» на Novell Netware
CAN–2004–0155
Искупление греха
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 18. Случайные числа криптографического качества
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Греховность некриптографических генераторов
Греховность криптографических генераторов
Греховность генераторов истинно случайных чисел
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Когда следует использовать случайные числа
Выявление мест, где применяются PRNG–генераторы
Правильно ли затравлен CRNG–генератор
Тестирование
Примеры из реальной жизни
Браузер Netscape
Проблемы в OpenSSL
Искупление греха
Windows
Код для .NET
Unix
Java
Повторное воспроизведение потока случайных чисел
Дополнительные защитные меры
Другие ресурсы
Резюме
Грех 19. Неудобный интерфейс
В чем состоит грех
Подверженные греху языки
Как происходит грехопадение
Каков круг ваших пользователей?
Минное поле: показ пользователям информации о безопасности
Родственные грехи
Где искать ошибку
Выявление ошибки на этапе анализа кода
Тестирование
Примеры из реальной жизни
Аутентификация сертификата в протоколе SSL/TLS
Установка корневого сертификата в Internet Explorer 4.0
Искупление греха
Делайте интерфейс пользователя простым и понятным
Принимайте за пользователей решения, касающиеся безопасности
Упрощайте избирательное ослабление политики безопасности
Ясно описывайте последствия
Помогайте пользователю предпринять действия
Предусматривайте централизованное управление
Другие ресурсы
Резюме
Приложения
Приложение А. Соответствие между 19 смертными грехами и «10 ошибками» OWASP
Приложение В. Сводка рекомендаций
Грех 1. Переполнение буфера
Грех 2. Ошибки, связанные с форматной строкой
Грех 3. Переполнение целых чисел
Грех 4. Внедрение SQL–команд
Грех 5. Внедрение команд
Грех 6. Пренебрежение обработкой ошибок
Грех 7. Кросс–сайтовые сценарии
Грех 8. Пренебрежение защитой сетевого трафика
Грех 9. Применение загадочных URL и скрытых полей форм
Грех 10. Неправильное применение SSL и TLS
Грех 11. Использование слабых систем на основе паролей
Грех 12. Пренебрежение безопасным хранением и защитой данных
Грех 13. Утечка информации
Грех 14. Некорректный доступ к файлам
Грех 15. Излишнее доверие к системе разрешения сетевых имен
Грех 16. Гонки
Грех 17. Неаутентифицированный обмен ключами
Грех 18. Случайные числа криптографического качества
Грех 19. Неудобный интерфейс
Отрывок из книги
Алан Крассовски работает главным инженером по безопасности программного обеспечения в компании Symantec Corporation. Он возглавляет группу по безопасности продуктов, в задачу которой входит оказание помощи другим группам разработчиков в плане внедрения безопасных технологий, которые сокращают риски и способствуют завоеванию доверия со стороны клиентов. За последние 20 лет Алан работал над многими коммерческими программными проектами. До присоединения к Symantec он руководил разработками, был инженером–программистом и оказывал консультативные услуги многим компаниям, занимающим лидирующее положение в отрасли, в частности Microsoft, IBM, Tektronix, Step Technologies. Screenplay Systems, Quark и Continental Insurance. Он получил научную степень бакалавра в области вычислительной техники в Рочестерском технологическом институте, штат Нью–Йорк.
Дэвид А. Уилер много лет занимается совершествованием практических методов разработки программ для систем с повышенным риском, в том числе особо крупных и нуждающихся в высокой степени безопасности. Он соавтор и соредактор книги «Software Inspection: An Industry Best Practice» («Инспекция программ: передовой опыт»), а также книг «Ada95: The Lovelace Tutorial» и «Secure Programming for Linux and UNIX HOWTO» («Рецепты безопасного программирования для Linux и UNIX»). Проживает в Северной Вирджинии.
.....
Эти ошибки в реализации системы Kerberos производства МТИ документированы в бюллетене CERT СА–2000–06 по адресу www.cert.org/advisories/CA–2000–06.html. Хотя исходные тексты открыты уже несколько лет и проблема коренится в использовании опасных функций работы со строками (strcat), отчет о ней появился только в 2000 году.
Из CVE–2002–0842:
.....