Содержание статьи
- Info
- Анализ бинарников/сборок
- BinScope Binary Analyzer
- AppVerifier
- Attack Surface Analyzer Beta
- Анализ кода
- Code Analysis for C/C++
- Microsoft Code Analysis Tool .NET (CAT.NET)
- FxCop
- Библиотеки
- Anti-Cross Site Scripting (Anti-XSS) Library
- SiteLock ATL Template
- banned.h
- Проектирование
- SDL Threat Modeling Tool
- SDL Process Template
- Фаззеры
- MiniFuzz File Fuzzer
- SDL Regex Fuzzer
Как разрабатывать безопасные приложения? В любой крупной софтверной компании есть свои методологии и рекомендации, но, как правило, они никогда не разглашаются. Microsoft делится со всеми не только своим подходом к созданию безопасных приложений, но и конкретными инструментами, которые ты можешь использовать.
Не успел я в прошлой "Колонке редактора" вспомнить про Microsoft и их наработки в области безопасности, как в Москву прилетел Стив Липнер. Это удивительный человек. Сложно представить, но свой первый отчет об уязвимостях в программном обеспечении он написал 40 (!) лет назад. Сейчас Стив работает в Microsoft и отвечает за стратегию безопасности разработки ПО, в основе которой лежит принятая компанией в 2004 году политика SDL (Security Development Lifecycle).
По сути, SDL — это набор практик, проверенных временем подходов и инструментальных средств, которые позволяют разрабатывать безопасный код. Мы уже рассказывали об этой концепции в материале "SDL, или безопасность по Microsoft" пару лет назад, и сейчас не будем подробно на этом останавливаться. Так что, когда я буду упоминать этот термин, можно воспринимать его просто как набор правильных требований и рекомендаций от профессионалов.
Особый интерес во время знакомства с SDL для меня представляли конкретные инструменты для безопасного написания кода и тестирования приложения на наличие уязвимостей. Многие из них вышли из недр внутреннего использования Microsoft и стали публично доступными. Но самое главное, что их может использовать каждый из нас, прямо с сегодняшнего дня. Большинство из утилит пригодятся не только разработчикам, но и вообще всем, кто занимается информационной безопасностью. Меня приятно удивили слова Стива, который рассказал, что за последние два года их стало гораздо больше. Я обобщил наш разговор и подготовил для тебя подборку как раз таких инструментов, разбив их на несколько тематических разделов.
Info
Подробная информация и файлы всех упомянутых утилит можно найти на официальном сайте Secure Lifecycle Development: microsoft.com/security/sdl.
Анализ бинарников/сборок
BinScope Binary Analyzer
Недаром мы уделяем много времени обходу защит DEP и ASLR. Это действительно серьезный барьер для создателей сплойтов, который кардинальным образом влияет на возможность эксплуатации найденной уязвимости. Чтобы понимать, что представляют собой требования SDL, вот в качестве примера одно из них: "Любое приложение должно быть в обязательном порядке защищено как DEP, так и ASLR". Для этого исходник должен быть собран соответственно с флагами /NXCOMPAT и /DYNAMICBASE. Но это лишь одно из требований, а с помощью анализатора Binscope SDL можно выяснить, использует ли приложение все рекомендации и требования SDL. Программа проверяет, были ли установлены требуемые правилами SDL флаги компилятора/сборщика, использовались ли самые последние версии инструментария и так далее. Помимо этого Binscope сообщает об использовании опасных конструкций, который являются запрещенными или нежелательными (к примеру, использование указателей на глобальные функции).
AppVerifier
Application Verifier — это тоже анализатор, но предназначен для динамического исследования native-кода и обнаружения программерских ошибок, которые сложно отловить во время обычной процедуры тестирования приложения. Динамический подход подразумевает, что программа анализируется прямо во время ее выполнения (это называется runtime-тестированием). AppVerif отслеживает работу программы и проверяет, не выполняет ли оно действий, опасных с точки зрения безопасности. Например, если исследуемое приложение создаст объект без дескриптора безопасности или небезопасным образом передает параметры в API, то выдается предупреждение.
Attack Surface Analyzer Beta
Определение поверхности атаки — задачка для Attack Surface Analyzer. Это один из самых последних инструментов из лаборатории Microsoft, о котором я рассказывал в "Колонке редактора" прошлого номера. Анализатор позволяет отследить изменения в системе, произошедшие в результате каких-то определенных действий. Например, сделав snapshot’ы до и после установки исследуемого приложения и сравнив их, можно определить все произошедшие изменения: появление новых файлов, ключей реестра, сервисов, ActiveX-компонентов, открытых портов, изменения в ACL-списках и так далее.
Анализ кода
Code Analysis for C/C++
Автоматизированное исследование исходных кодов на наличие признаков уязвимостей называется статическим тестированием. В свою очередь, Code Analysis for C/C++ является стандартным статическим анализатором кода и по умолчанию входит в состав некоторых редакций Visual Studio. Продуманные механизмы позволяют автоматизировать поиск в native-коде утечек памяти, неотловленных исключений, проблем с быстродействием и, конечно же, уязвимостей в области безопасности.
Microsoft Code Analysis Tool .NET (CAT.NET)
Это тоже утилита для статического анализа, но упоминание .NET в названии программы неслучайно: она производит анализ управляемого кода (C#, Visual Basic .NET, J#). Основная специализация — веб-приложения. CAT.NET выявляет слабые места, которые могут быть впоследствии эксплуатированы через такие векторы атак как Cross-Site Scripting (XSS), SQL Injection и XPath Injection. До публичного релиза это был исключительно внутренний инструмент в компании Microsoft.
FxCop
Это тоже статический анализатор управляемого кода. По сути, он проверяет сборки .NET на соответствие рекомендациям по проектированию библиотек .NET Framework. Правда, он тестирует не исходник, а компилированный объектный код. FxCop использует разбор CIL (промежуточный язык, разработанный Microsoft для платформы .NET) и анализ графа вызовов для проверки сборок на наличие более чем двухсот различных дефектов.
Библиотеки
Anti-Cross Site Scripting (Anti-XSS) Library
Многие из уязвимостей можно заранее предупредить, если предложить разработчикам соответствующие инструменты. К примеру, Anti-XSS разработана специально для того, чтобы уменьшить вероятность осуществления XSS-атак на веб-приложения. Важно, что решение включает в себя что-то вроде WAF (файрвол для веб-приложения) — так называемый Security Runtime Engine (SRE). Это движок, запущенный в виде HTTP-модуля, который обеспечивает дополнительный уровень защиты для веб-приложения без необходимости перекомпилирования.
SiteLock ATL Template
Если ты читал статью Алексея Синцова "Глумимся над объектами: взлом ActiveX", то должен хорошо понимать, чем грозят ошибки в ActiveX-компонентах. Библиотека SiteLock Active Template не поможет избавиться от оставленных в коде багов, зато на порядок снизит риск их эксплуатации. Дело в том, что с помощью ATL можно ограничить запуск ActiveX-компонентов, используя заранее определенный список доменных имен и зон безопасности. Можно сделать так, чтобы ActiveX-компонент выполнялся только в интранете (то есть в локальной сети), но не работал на страничках в интернете. Ограничивая возможности по эксплуатации уязвимостей, мы заметно снижаем поверхность возможной атаки.
banned.h
Если говорить о разработке на C/C++, то особый риск в коде представляют команды, позволяющие выполнить buffer overflow и другие похожие типы атак. Таких команд очень много: функции для работы со строками (xstrcpy(), strcat(), gets(), sprintf(), printf(), snprintf(), syslog()), системные команды (access(), chown(), chgrp(), chmod(), tmpfile(), tmpnam(), tempnam(), mktemp()), а также команды системных вызовов (exec(), system(), popen()). Вручную исследовать весь код (особенно если он состоит из нескольких тысяч строк) довольно утомительно. Это проверяют статические анализаторы, но есть еще один вариант — использовать специальный заголовочный файл, который не допустит использования функций, давно не рекомендуемых к использованию (и, естественно, запрещенных SDL).
Проектирование
SDL Threat Modeling Tool
Важной частью проектирования будущего программного продукта является моделирование угроз. Результатом моделирования является схема основных элементов будущей системы и обозначенные на ней границы доверия. Так вот SDL Threat Modeling Tool позволяет экспертам в области, не связанной с безопасностью, создавать и анализировать модели угроз. Используя полученные диаграммы, можно распознать возможную опасность и выполнить ее смягчение. SDL Threat Modeling Tool сама предлагает подсказки во время построения диаграмм и указывает на возможные просчеты.
SDL Process Template
Для Visual Studio (что неудивительно) доступен специальный шаблон, который автоматически интегрирует политику, процесс и средства, связанные с руководством по процессу Microsoft SDL непосредственно в среду разработки. Таким образом, создавая проект на основе этого шаблона, придется выполнять все условия SDL. И это очень правильно.
Фаззеры
MiniFuzz File Fuzzer
Согласно SDL, в качестве одного из обязательных этапов проверки приложения (на стадии верификации) должен использоваться фаззинг, то есть тестирование случайными входными данными. Minifuzz File Fuzzer — основное средство нечеткого тестирования, разработанное для упрощения поиска проблем, которые могут привести к уязвимости системы безопасности в коде обработки файлов. Тулза генерирует различные варианты содержания файла и "скармливает" его приложению, пытаясь выявить необрабатываемые исключения.
SDL Regex Fuzzer
Средство нечеткого тестирования регулярных выражений (Regex) — это еще один фаззер, который опубликовала Microsoft. SDL Regex Fuzzer позволяет выполнять проверку регулярных выражений на наличие потенциальных уязвимостей типа "отказ в обслуживании". Это неспроста. Регулярные выражения (особенно в нагруженных участках кода) нужно использовать очень аккуратно. Регулярные выражения, содержащие паттерны, которые выполняются за экспоненциальное время (например, повторение фрагментов, которые сами являются повторяющимися), могут быть использованы злоумышленниками для осуществления DoS-атаки. Фаззер, в свою очередь, позволяет прямо во время разработки выявить возможные уязвимости в регекспах.