Как анализировать компьютерную программу
В Информатика, программный анализ [1] - это процесс автоматического анализа поведения компьютерных программ в отношении таких свойств, как правильность, надежность, безопасность и живучесть. Программный анализ сосредоточен на двух основных областях: оптимизация программы и правильность программы. Первый направлен на повышение производительности программы при одновременном сокращении использования ресурсов, а второй - на обеспечение того, чтобы программа выполняла то, что она должна делать.
Анализ программы можно проводить без выполнения программы (статический анализ программы), во время выполнения (динамический анализ программы) или их комбинацию.
Содержание
Статический анализ программы
Из-за того, что многие формы статического анализа неразрешимы с вычислительной точки зрения, механизмы его выполнения не всегда завершаются правильным ответом - либо потому, что они иногда возвращают ложноотрицательный результат («проблем не обнаружено», когда в коде действительно есть проблемы), либо ложное срабатывание, или потому что они никогда не возвращают неправильный ответ, но иногда никогда не прекращаются. Несмотря на свои ограничения, первый тип механизма может уменьшить количество уязвимостей, в то время как второй иногда может дать надежную гарантию отсутствия определенного класса уязвимостей.
Неправильная оптимизация крайне нежелательна. Итак, в контексте оптимизации программы есть две основные стратегии обработки неразрешимого с вычислительной точки зрения анализа:
- Оптимизатор, который, как ожидается, завершится за относительно короткий промежуток времени, например оптимизатор в оптимизирующем компиляторе, может использовать усеченную версию анализа, которая гарантированно завершится за конечный промежуток времени и гарантированно найдет только правильные оптимизации.
- Сторонний инструмент оптимизации может быть реализован таким образом, чтобы он никогда не производил неправильную оптимизацию, но также так, чтобы в некоторых ситуациях он мог продолжать работать бесконечно долго, пока не найдет его (что может никогда не произойти). В этом случае разработчик, использующий инструмент, должен будет остановить инструмент и избежать повторного запуска инструмента на этом фрагменте кода (или, возможно, изменить код, чтобы избежать отключения инструмента).
Однако есть и третья стратегия, которая иногда применима для языков, которые не полностью определены, например C. Оптимизирующий компилятор волен генерировать код, который делает что-либо во время выполнения - даже дает сбой - если он встречает исходный код, семантика которого не определена используемым языковым стандартом.
Поток управления
Целью анализа потока управления является получение информации о том, какие функции могут быть вызваны в различные моменты во время выполнения программы. Собранная информация представлена значком граф потока управления (CFG), где узлы представляют собой инструкции программы, а края представляют собой поток управления. Идентификация блоков кода и циклов CFG становится отправной точкой для оптимизаций, выполненных компилятором.
Анализ потока данных
Анализ потока данных - это метод, разработанный для сбора информации о значениях в каждой точке программы и о том, как они меняются с течением времени. Этот метод часто используется компиляторами для оптимизации кода. Одним из наиболее известных примеров анализа потока данных является проверка на заражение который заключается в рассмотрении всех переменных, которые содержат данные, предоставленные пользователем, которые считаются «испорченными», то есть небезопасными, и предотвращении использования этих переменных до тех пор, пока они не будут обработаны. Этот метод часто используется для предотвращения SQL-инъекция атаки. Проверка на заражение может выполняться статически или динамически.
Абстрактная интерпретация
Абстрактная интерпретация позволяет извлекать информацию о возможном выполнении программы без ее фактического выполнения. Эта информация может использоваться компиляторами для поиска возможных оптимизаций или для сертификации программы против определенных классов ошибок.
Системы типов
Системы типов связывают типы с программами, которые удовлетворяют определенным требованиям. Их цель - выбрать подмножество программ на языке, которые считаются правильными в соответствии с определенным свойством.
Проверка типов используется в программировании для ограничения того, как используется программный объект и что они могут делать. Это делает компилятор или интерпретатор. Проверка типов также может помочь предотвратить уязвимости, гарантируя, что значение со знаком не связано с беззнаковой переменной. Проверка типа может выполняться статически (во время компиляции), динамически (во время выполнения) или их комбинацией.
Информация о статическом типе (либо предполагаемый, или явно предоставленные аннотациями типов в исходном коде) также можно использовать для оптимизации, такой как замена упакованные массивы с распакованными массивами.
Системы эффектов
Системы эффектов - это формальные системы, предназначенные для представления эффектов, которые может иметь выполнение функции или метода. Эффект кодифицирует то, что делается, и то, что делается - обычно это называется типом эффекта и областью соответственно. [ требуется разъяснение ]
Проверка модели
Проверка модели относится к строгим, формальным и автоматизированным способам проверки наличия модель (что в данном контексте означает формальную модель части кода, хотя в других контекстах это может быть модель части аппаратного обеспечения) соответствует заданной спецификации. Из-за неотъемлемой природы конечного состояния кода, а также из-за того, что и спецификация, и код могут быть преобразованы в логические формулы, можно проверить, нарушает ли система спецификацию, используя эффективные алгоритмические методы.
Динамический анализ программы
Динамический анализ может использовать информацию о программе во время выполнения для повышения точности анализа, а также обеспечения защиты во время выполнения, но он может анализировать только одно выполнение проблемы и может ухудшить производительность программы из-за проверок во время выполнения.
Тестирование
Программное обеспечение следует тестировать, чтобы убедиться в его качестве и надежности, а также в том, что оно не создает конфликтов с другим программным обеспечением, которое может работать вместе с ним. Тесты выполняются путем выполнения программы с вводом и оценки ее поведения и полученного вывода. Даже если требования безопасности не указаны, дополнительные тестирование безопасности должны выполняться, чтобы гарантировать, что злоумышленник не может вмешаться в программное обеспечение и украсть информацию, нарушить нормальную работу программного обеспечения или использовать его в качестве опоры для атаки на своих пользователей.
Мониторинг
Мониторинг программ записывает и регистрирует различные виды информации о программе, например, об использовании ресурсов, событиях и взаимодействиях, чтобы ее можно было просмотреть для поиска или выявления причин ненормального поведения. Кроме того, его можно использовать для аудита безопасности. Автоматический мониторинг программ иногда называют проверка во время выполнения.
Программа нарезки
Для данного подмножества поведения программы нарезка программы заключается в приведении программы к минимальной форме, которая по-прежнему обеспечивает выбранное поведение. Уменьшенная программа называется «срезом» и является точным представлением исходной программы в пределах области указанного подмножества поведения. Как правило, поиск среза является неразрешимой проблемой, но, задав подмножество целевого поведения с помощью значений набора переменных, можно получить приблизительные срезы, используя алгоритм потока данных. Эти фрагменты обычно используются разработчиками во время отладки для определения источника ошибок.
Приветствую всех пользователей Хабра!
Данная статья возникла как полезный побочный продукт моих научных изысканий. Буду рад, если идеи, изложенные ниже, покажутся для вас интересными и полезными, а еще лучше, если получат своё применение и дальнейшее развитие в реально существующих проектах.
- в инженерных и научных разработках, где часто производятся сложные длительные вычисления, а процессорное время на кластерных системах дорого и ограничено;
- в web-приложениях, в которых время генерации страницы критично для пользователя и напрямую зависит от объемов серверных мощностей;
- в встраиваемых программных продуктах, и т.д.
- продуктивность – объем информации, обрабатываемой системой в единицу времени;
- реактивность – время между предъявлением системе входных данных и появлением соответствующей выходной информации.
- – время обработки информации;
- – все параметры (факторы или влияющие факторы), которые прямым или косвенным образом могут влиять на производительность системы;
- – область определения i-го фактора, являющаяся ограничением задачи.
- объем оперативной памяти компьютера;
- скорость доступа к жесткому диску;
- максимальная частота работы и средняя загрузка процессора;
- настройки СУБД, и т.д.
- полный перебор всех возможных комбинаций значений влияющих факторов;
- случайный выбор некоторого числа комбинаций и последующий выбор самого лучшего варианта;
- аналитическое исследование системы;
- применение специализированных программных средств;
- использование математических моделей.
- – число вариантов значений i-го фактора.
- чрезмерно большое время проведения измерений;
- опора на способности исследователя, делающего выводы на основе анализа программы;
- сложность применения и использования.
- воспроизводимость опытов;
- управляемость факторов;
- измеримость выходных характеристик и возможность выразить её одним числом;
- однозначность и совместимость факторов и т.д.
Этап 1. Анализ априорной информации.
- ПО является web-приложением, написанным на языке программирования PHP;
- ПО выполняется на web-сервере Apache, интерпретатор PHP подключен в качестве модуля;
- ПО использует СУБД MySQL для хранения данных;
- существует возможность включения кэширования данных средствами самого приложения.
Факторы с самыми большими значениями будут наибольшим образом влиять на выходную характеристику.
Этап 2. Выбор влияющих факторов.
В таблице 1 представлен набор влияющих факторов, выбранных в результате анализа априорной информации о ПО.
- web-сервер Apache + модуль PHP;
- web-сервер Nginx + php-fpm.
Этап 3. Выбор верхнего и нижнего уровня для факторов.
- +1 соответствует верхнему уровню фактора;
- -1 соответствует нижнему уровню фактора.
Этап 4. Составление матрицы планирования и проведение экспериментов.
В таблице 3 представлены результаты проведения серии экспериментов.
Таблица 3.
№ | y | № | y | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | -1 | -1 | -1 | -1 | -1 | 6,909456902 | 17 | +1 | -1 | -1 | -1 | -1 | 6,956250343 |
2 | -1 | -1 | -1 | -1 | +1 | 6,265920885 | 18 | +1 | -1 | -1 | -1 | +1 | 6,27117213 |
3 | -1 | -1 | -1 | +1 | -1 | 1,046864681 | 19 | +1 | -1 | -1 | +1 | -1 | 1,049605346 |
4 | -1 | -1 | -1 | +1 | +1 | 0,959287777 | 20 | +1 | -1 | -1 | +1 | +1 | 0,960128005 |
5 | -1 | -1 | +1 | -1 | -1 | 6,922491238 | 21 | +1 | -1 | +1 | -1 | -1 | 6,94905457 |
6 | -1 | -1 | +1 | -1 | +1 | 6,292138541 | 22 | +1 | -1 | +1 | -1 | +1 | 6,288483698 |
7 | -1 | -1 | +1 | +1 | -1 | 1,047327693 | 23 | +1 | -1 | +1 | +1 | -1 | 1,048429732 |
8 | -1 | -1 | +1 | +1 | +1 | 0,959178464 | 24 | +1 | -1 | +1 | +1 | +1 | 0,959984639 |
9 | -1 | +1 | -1 | -1 | -1 | 6,947828159 | 25 | +1 | +1 | -1 | -1 | -1 | 6,944574752 |
10 | -1 | +1 | -1 | -1 | +1 | 6,269961421 | 26 | +1 | +1 | -1 | -1 | +1 | 6,281574535 |
11 | -1 | +1 | -1 | +1 | -1 | 1,047032595 | 27 | +1 | +1 | -1 | +1 | -1 | 1,047937875 |
12 | -1 | +1 | -1 | +1 | +1 | 0,960076244 | 28 | +1 | +1 | -1 | +1 | +1 | 0,960813348 |
13 | -1 | +1 | +1 | -1 | -1 | 6,954160943 | 29 | +1 | +1 | +1 | -1 | -1 | 6,952602925 |
14 | -1 | +1 | +1 | -1 | +1 | 6,278223336 | 30 | +1 | +1 | +1 | -1 | +1 | 6,284795263 |
15 | -1 | +1 | +1 | +1 | -1 | 1,048019483 | 31 | +1 | +1 | +1 | +1 | -1 | 1,047952991 |
16 | -1 | +1 | +1 | +1 | +1 | 0,960559206 | 32 | +1 | +1 | +1 | +1 | +1 | 0,960591927 |
Этап 5. Анализ результатов.
Коэффициенты уравнения регрессии (3) могут быть найдены как
Результаты представлены в таблице 4 и на рис. 2.
Таблица 4.
3,97361211 | 0,0519711 | 0,0245041 | 0,0034686 | -2,9182692 | -0,2483070 |
Рис. 2. Коэффициенты уравнения регрессии.
Этап 6. Вывод.
Из рис. 2 видно, что основной вклад в время генерации web-страницы вносит фактор , характеризующий кэширование данных в приложении. Отрицательное значение коэффициента регрессии означает, что данный параметр уменьшает функцию отклика черного ящика. В нашем примере это означает уменьшение времени генерации страницы.
Строго говоря, такие результаты являются очевидными, так как включение кэширования данных приложением влечет за собой минимальное число запросов к СУБД. Таким образом, влияние параметров настройки СУБД становится несущественным. Полученные результаты подтверждают возможность использования МПЭ применительно к анализу производительности ПО.
В данной статье я попытался рассмотреть возможность применения существующего уже давно метода математического планирования эксперимента применительно к анализу производительности ПО. Такой подход позволяет преодолеть ряд трудностей, возникающих при анализе программных систем, выявить факторы, наиболее сильно влияющие на анализируемую характеристику, выявить зависимости между факторами.
Разумеется, представленная методология не претендует на замену существующих методов анализа производительности, например, профилирования. Однако существует ряд задач, в которых применение подобной техники способно существенно облегчить задачи исследователя.
Долгое время считалось, что динамический анализ программ является слишком тяжеловесным подходом к обнаружению программных дефектов, и полученные результаты не оправдывают затраченных усилий и ресурсов. Однако, две важные тенденции развития современной индустрии производства программного обеспечения позволяют по-новому взглянуть на эту проблему. С одной стороны, при постоянном увеличении объема и сложности ПО любые автоматические средства обнаружения ошибок и контроля качества могут оказаться полезными и востребованными. С другой – непрерывный рост производительности современных вычислительных систем позволяет эффективно решать все более сложные вычислительные задачи. Последние исследовательские работы в области динамического анализа такие, как SAGE, KLEE и Avalanche, демонстрируют, что несмотря на присущую этому подходу сложность, его использование оправдано, по крайней мере, для некоторого класса программ.
Динамический vs Статический анализ
- Возможен раздельный анализ отдельно взятых фрагментов программы (обычно отдельных функций или процедур), что дает достаточно эффективный способ борьбы с нелинейным ростом сложности анализа.
- Возможны ложные срабатывания, обусловленные либо тем, что при построении абстрактной модели некоторые детали игнорируются, либо тем, что анализ модели не является исчерпывающим.
- При обнаружении дефекта возникают, во-первых, проблема проверки истинности обнаруженного дефекта (false positive) и, во-вторых, проблема воспроизведения найденного дефекта при запуске программы на определенных входных данных.
- Для запуска программы требуются некоторые входные данные.
- Динамический анализ обнаруживает дефекты только на трассе, определяемой конкретными входными данными; дефекты, находящиеся в других частях программы, не будут обнаружены.
- В большинстве реализаций появление ложных срабатываний исключено, так как обнаружение ошибки происходит в момент ее возникновения в программе; таким образом, обнаруженная ошибка является не предсказанием, сделанным на основе анализа модели программы, а констатацией факта ее возникновения.
Применение
Автоматическое тестирование в первую очередь предназначено для программ, для которых работоспособность и безопасность при любых входных данных являются наиважнейшими приоритетами: веб-сервер, клиент/сервер SSH, sandboxing, сетевые протоколы.
Fuzz testing (фаззинг)
Фаззинг – методика тестирования, при которой на вход программы подаются невалидные, непредусмотренные или случайные данные.
Фаззеры нового поколения (обзор)
Логическим, но не таким простым продолжением идеи автоматического тестирования стало появление подходов и программ, позволяющих накладывать ограничения на мутируемые входные данные с учетом специфики исследуемой программы.
Отслеживание помеченных данных в программе
Вводится понятие символических или помеченных (tainted) данных – данных, полученных программой из внешнего источника (стандартный поток ввода, файлы, переменные окружения и т. д.). Распространенным решением этой задачи является перехват набора системных вызовов: open, close, read, write, lseek (Avalanche,KLEE).
Инструментация кода
Код исследуемой программы приводится к виду, удобному для анализа. Например, используется внутреннее независимое от аппаратной платформы представление valgrind (Avalanche) или анализируется удобный для разбора сам по себе llvm-байткод программы(KLEE).
Инструментированный код позволяет легко находить потенциально опасные инструкции (например, деление на ноль или разыменование нулевого указателя) и их операнды, а также инструкции ветвления, зависящие от помеченных данных. Анализируя инструкции, инструмент составляет логические условия на помеченные данные и передает запрос на выполнимость “решателю” булевских формул (SAT Solver).
Решение булевских ограничений
SAT Solvers – решают задачи выполнимости булевых формул. Отвечают на вопрос: всегда ли выполнена заданная формула, и если не всегда, то выдается набор значений, на котором она ложна. Результаты работы подобных решателей используется широким набором анализирующих программ, от theorem provers до анализаторов генетического кода в биоинформатике. Подобные программы интересны сами по себе и требуют отдельного рассмотрения. Примеры: STP, MiniSAT.
Моделирование окружения
Перебор путей в программе
Получив ответ от “решателя”, инструмент получает условие на входные данные для инвертирования исследуемого условного перехода или выясняет, что оно всегда истинно или ложно. Каждый вариант условия создает новый независимый путь в программе, и программе приходится рассматривать каждый путь и условия для его выполнения независимо, т.е. пути “форкаются” на каждой инструкции ветвления, зависящей от входных данных. Новые входные данные могут открыть ранее не открытые базовые блоки исследуемой программы и так далее. Для исчерпывающего тестирования необходим полный перебор всех возможных путей в программе. Так как скорость роста количества путей хоть и значительно снизилась по сравнению с методом грубой силы (~O(2^n), где n – количество условных переходов, зависящих от входных данных), но все еще остается значительной. Анализаторы вынуждены использовать различные эвристики для приоритезации анализа некоторых путей. В частности, различают выбор пути, покрывающего наибольшее количество непокрытых (новых) базовых блоков (Avalanche, KLEE) и выбор случайного пути (KLEE).
Avalanche
Avalanche – инструмент обнаружения программных дефектов при помощи динамического анализа. Avalanche использует возможности динамической инструментации программы, предоставляемые Valgrind, для сбора и анализа трассы выполнения программы. Результатом такого анализа становится либо набор входных данных, на которых в программе возникает ошибка, либо набор новых тестовых данных, позволяющий обойти ранее не выполнявшиеся и, соответственно, еще не проверенные фрагменты программы. Таким образом, имея единственный набор тестовых данных, Avalanche реализует итеративный динамический анализ, при котором программа многократно выполняется на различных, автоматически генерированных тестовых данных, при этом каждый новый запуск увеличивает покрытие кода программы такими тестами.
Общая схема работы
Инструмент Avalanche состоит из 4 основных компонент: двух модулей расширения (плагинов) Valgrind – Tracegrind и Covgrind, инструмента проверки выполнимости ограничений STP и управляющего модуля.
- В случае выполнимости условий для срабатывания опасных операций программа запускается управляющим модулем повторно (на этот раз без какой-либо инструментации) с соответствующим входным файлом для подтверждения найденной ошибки.
- Выполнимые условия для обхода непройденных частей программы определяют набор возможных входных файлов для новых запусков программы. Таким образом, после каждого запуска программы инструментом STP автоматически генерируется множество входных файлов для последующих запусков анализа.
- Далее встает задача выбора из этого множества наиболее “интересных” входных данных, т.е. в первую очередь должны обрабатываться входные данные, на которых наиболее вероятно возникновение ошибки. Для решения этой задачи используется эвристическая метрика – количество ранее не обойденных базовых блоков в программе (базовый блок здесь понимается в том смысле, как его определяет фреймворк Valgrind). Для измерения значения эвристики используется компонент Covgrind, в функции которого входит также фиксация возможных ошибок выполнения. Covgrind гораздо более легковесный модуль, нежели Tracegrind, поэтому возможно сравнительно быстрое измерение значения эвристики для всех полученных ранее входных файлов и выбор входного файла с ее наибольшим значением.
Ограничения
- один помеченный входной файл или сокет
- анализ ошибок ограничен разыменованием нулевого указателя и делением на ноль.
Результаты
- qtdump (libquicktime-1.1.3). Три дефекта связаны с разыменованием нулевого указателя, один – с наличием бесконечного цикла, еще в одном случае имеет место обращение по некорректному адресу (ошибка сегментации). Часть дефектов исправлена разработчиком.
- flvdumper (gnash-0.8.6). Непосредственное возникновение дефекта связано с появлением исключительной ситуации в используемой приложением библиотеке boost (один из внутренних указателей библиотеки boost оказывается равен нулю). Поскольку само приложение не перехватывает возникшее исключение, выполнение программы завершается с сигналом SIGABRT. Дефект исправлен разработчиком.
- cjpeg (libjpeg7). Приложение читает из файла нулевое значение и без соответствующей проверки использует его в качестве делителя, что приводит к возникновению исключения плавающей точки и завершению программы с сигналом SIGFPE. Дефект исправлен разработчиком.
- swfdump (swftools-0.9.0). Возникновение обоих дефектов связано с разыменованием нулевого указателя.
KLEE
- Вместо инструментации valgrind'а, которую использует Avalanche, KLEE анализурует программы в llvm-байткоде. Соответственно, это позволяет анализировать программу на любом языке программирования, для которого есть llvm-бэкэнд.
- Для решения задачи булевских ограничений KLEE так же использует STP.
- KLEE так же перехватывает около 50 системных вызовов, позволяя выполняться множеству виртуальных процессов параллельно, не мешая друг другу.
- Оптимизация и кэширование запросов к STP.
unsigned mod_opt ( unsigned x, unsigned y ) <
if ( ( y & −y ) == y ) // power of two?
return x & ( y− 1 ) ;
else
return x % y ;
>
unsigned mod ( unsigned x, unsigned y ) <
return x % y ;
>
int main ( ) <
unsigned x,y ;
make symbolic ( & x, sizeof ( x ) ) ;
make symbolic ( & y, sizeof ( y ) ) ;
assert ( mod ( x,y ) == mod_opt ( x,y ) ) ;
return 0 ;
>
Запустив KLEE на данном примере, можно убедится в эквивалентности двух функций во всем диапазоне входных значений (y!=0). Решая задачу на невыполнение условия в ассерте, KLEE на основе перебора всех возможных путей приходит к выводу об эквивалентности двух функций на всем диапазоне значений.
Результаты
Для получения реальных результатов тестирования авторы проанализировали весь набор программ пакета coreutils 6.11. Средней процент покрытия кода составил 94%. Всего программа сгенерировала 3321 набор входных данных, позволяющих покрыть весь указанный процент кода. Так же было найдено 10 уникальных ошибок, которые были признаны разработчиками пакета как реальные дефекты в программах, что является очень хорошим достижением, так как этот набор программ разрабатывается более 20 лет и большинство ошибок было устранено.
Ограничения
Предварительные выводы
Анализ вредоносного ПО напоминает игру в кошки-мышки: никаких правил, ситуация постоянно меняется. Поэтому в данном случае имеет смысл изучать лишь неустаревающие вещи и алгоритмы. Как только перед вами встает задача защитить сеть (или тысячу сетей), вы приступаете к такому анализу, и без этой книги вам попросту не обойтись.
Программы для загрузки и запуска ПО
Можно выделить два типа часто встречаемых вредоносов, предназначенных для загрузки и запуска ПО. Загрузчики (не путать с системными загрузчиками) просто загружают из Интернета дополнительный вредоносный код и запускают его на локальном компьютере. Они часто распространяются вместе с эксплойтом. Для загрузки и выполнения дополнительного вредоносного ПО они обычно используют два вызова Windows API, идущие один за другим: URLDownloadtoFileA и WinExec.
Пусковая программа (launcher) представляет собой исполняемый файл, который устанавливает вредоносные приложения для их скрытого выполнения (сразу или через какое-то время). Пусковые программы часто поставляются с ПО, которое они должны запускать. Мы обсудим их в главе 12.
Бэкдоры
Бэкдоры — это программы, которые предоставляют злоумышленнику доступ к компьютеру жертвы. Они являются самым обнаруживаемым типом вредоносного ПО, а их размер и набор возможностей может существенно варьироваться. Код бэкдора обычно самодостаточен и не требует загрузки дополнительных зараженных файлов.
Из главы 14 вы узнаете, как анализировать бэкдоры на уровне пакетов, создавая эффективные сетевые сигнатуры. А пока мы сосредоточимся на высокоуровневом взаимодействии.
Бэкдоры поставляются со стандартным набором функций: возможностью манипулировать ключами реестра, подсчитывать отображаемые окна, создавать каталоги, искать файлы и т. д. Чтобы понять, что именно из этого используется бэкдором, можно проверить, какие функции Windows API он импортирует. В приложении А приводится список распространенных функций с описанием того, что они могут сказать о вредоносной программе.
Обратная командная оболочка
Обратная командная оболочка — это соединение, которое инициирует зараженный компьютер, предоставляя командный доступ злоумышленнику. Это может быть как отдельная вредоносная программа, так и один из компонентов более сложного бэкдора. Находясь в обратной командной оболочке, злоумышленник может выполнять команды так, как будто все это происходит в его локальной системе.
Обратная командная оболочка Netcat
Программа Netcat, которую мы обсуждали в главе 3, может быть использована для создания командной оболочки, если ее запустить на двух компьютерах. Злоумышленники часто используют ее саму, а также дополняют ей другое вредоносное ПО.
Чтобы применить Netcat в таком качестве, удаленная система должна ожидать входящих подключений с помощью следующей команды:
Параметр -l переключает Netcat в режим прослушивания, а параметр -p определяет отслеживаемый порт. Далее компьютер жертвы инициирует исходящее соединение и предоставляет свою командную оболочку:
слушатель_ip 80 — это IP-адрес и порт удаленного узла. Параметр -e позволяет указать программу, которая будет запущена при установлении соединения. Ее стандартные ввод и вывод будут привязаны к сокету (как вы увидите далее, в Windows часто используется cmd.exe).
Обратная командная оболочка Windows
Злоумышленники используют две простые реализации обратной командной оболочки в Windows на основе cmd.exe: базовую и многопоточную.
Базовый метод популярен среди авторов вредоносного ПО, так как его проще реализовать и в целом он работает не хуже многопоточного подхода. Он основан на вызове CreateProcess и изменении структуры STARTUPINFO, которая ему передается. Сначала создается сокет и устанавливается соединение с удаленным сервером. Затем этот сокет привязывается к стандартным потокам (вводу, выводу и потоку ошибок) процесса cmd.exe. CreateProcess запускает cmd.exe в режиме без окна, чтобы скрыть его от жертвы. В главе 7 приводится пример этого приема.
Многопоточная версия обратной командной оболочки Windows подразумевает создание сокета, двух каналов и двух потоков выполнения (поэтому вам следует искать вызовы CreateThread и CreatePipe). Этот метод иногда используется авторами вредоносного ПО в рамках стратегии по изменению или кодированию данных, передающихся по сокету. Функцию CreatePipe можно использовать для привязки к каналу считывающего и записывающего концов, таких как стандартный ввод (stdin) и стандартный вывод (stdout). Функция CreateProcess позволяет привязать стандартные потоки к каналу, а не напрямую к сокету. После ее вызова вредонос создаст два потока выполнения: один для чтения из stdin канала и записи в сокет, а другой — для чтения из сокета и записи в stdout канала. Обычно эти потоки выполнения занимаются кодированием данных, о чем мы поговорим в главе 13. С помощью методов обратного проектирования вы можете исследовать ответвления, в которых потоки декодируют пакеты, полученные в ходе зашифрованной сессии.
Средства удаленного администрирования
Средства удаленного администрирования (remote administration tools, или RAT) используются для управления компьютером или компьютерами по сети. Их часто задействуют в узконаправленных атаках — например, при похищении информации или перемещении от компьютера к компьютеру.
На рис. 11.1 показана сетевая структура RAT. Сервер, запущенный в системе жертвы, снабжен вредоносным кодом. Клиент работает удаленно, так как управляющий модуль находится в распоряжении злоумышленника. Серверы сигнализируют клиенту, который их контролирует, чтобы тот инициировал соединение. Взаимодействие в RAT обычно происходит через стандартные порты, такие как 80 или 443.
Ботнеты
Ботнет — это набор зараженных сетевых узлов (зомби), управляемых централизованно, обычно с помощью сервера, который называют контроллером ботнета. Цель ботнета состоит в заражении как можно большего числа компьютеров и создании на их основе масштабной сети, которая может быть использована как для распространения другого вредоносного ПО или спама, так и для выполнения DDoS-атак (distributed denial-of-service — распределенный отказ в обслуживании). Если все зомби одновременно начнут атаковать определенный сайт, тот может стать недоступным.
Сравнение RAT и ботнетов
Между ботнетами и удаленными средствами администрирования существует несколько важных различий.
- Ботнеты известны тем, что заражают и контролируют миллионы узлов. RAT обычно управляют намного меньшим количеством компьютеров.
- Все участники ботнета управляются одновременно. RAT позволяет распределять ресурсы между разными жертвами, поскольку злоумышленник имеет возможность куда более тесного взаимодействия с зараженными системами.
- RAT используются в узконаправленных атаках, тогда как ботнеты отличаются своей массовостью.
Похищение учетных данных
Злоумышленники часто идут на всевозможные ухищрения, чтобы похитить учетные данные. Особенно это относится к трем видам вредоносного ПО.
- Программы, которые похищают учетные данные пользователя в момент, когда тот входит в систему.
- Программы, которые копируют информацию, хранящуюся в Windows (пароли, хеши и т. д.), для непосредственного использования или дальнейшей расшифровки.
- Программы, которые записывают нажатия клавиш.
Перехват GINA
В Windows XP для хищения учетных данных используется прием, состоящий в перехвате GINA (graphical identification and authentication — графическая идентификация и аутентификация). Система GINA создавалась для того, чтобы позволить сторонним приложениям адаптировать под себя процесс входа в систему, добавляя поддержку таких технологий, как аппаратная радиочастотная идентификация (radio-frequency identification, RFID) на основе маркеров или смарт-карт. Авторы вредоносного ПО пользуются этой возможностью для загрузки кода, который крадет учетные данные.
GINA реализуется в виде DLL под названием msgina.dll и загружается программой Winlogon во время входа в систему. Winlogon также поддерживает сторонние плагины, загружая их перед GINA DLL (как при атаке посредника). Для удобства Windows предоставляет следующую ветвь реестра, где Winlogon может найти и загрузить сторонние DLL:
Когда-то мы нашли там зараженный файл fsgina.dll, который оказался перехватчиком GINA.
На рис. 11.2 показан пример того, как данные для входа в систему попадают к вредоносной библиотеке, проходя от Winlogon к msgina.dll. Вредоносу (fsgina.dll) удается перехватить всю учетную информацию, которую пользователь вводит во время аутентификации. Он может записать ее на диск или передать по сети.
Поскольку библиотека fsgina.dll перехватывает поток взаимодействия между Winlogon и GINA, она должна передать его дальше в msgina.dll, чтобы система продолжила нормально функционировать. Для этого вредоносу приходится экспортировать все функции, которые требуются системе GINA, — их насчитывается больше 15, и большинство из них имеют префикс Wlx. Очевидно, что при обнаружении в DLL множества экспортных функций, которые начинаются с Wlx, можно с большой долей вероятности предположить, что это перехватчик GINA.
Большинство этих экспортных вызовов обращаются к реальным функциям внутри msgina.dll. В случае с fsgina.dll это относится ко всем функциям, кроме WlxLoggedOutSAS. В листинге 11.1 показан экспорт WlxLoggedOutSAS в fsgina.dll.
Листинг 11.1. Экспортная функция WlxLoggedOutSAS в GINA DLL, с помощью которой записываются похищенные учетные данные
Учетная информация сразу же передается в файл msgina.dll с помощью вызова, обозначенного как Call_msgina_dll_function (1). Эта функция динамически находит и запускает вызов WlxLoggedOutSAS из msgina.dll, который указывается в виде аргумента. Вызов в строке (2) выполняет запись данных. В качестве аргументов он принимает учетную информацию, строку форматирования, с помощью которой эта информация будет выводиться, и имя файла для записи. В итоге сведения о любом успешном входе в систему сохраняются в файл %SystemRoot%\system32\drivers\tcpudp.sys. Этот файл содержит имя пользователя, домен и два пароля — текущий и старый.
Сохранение хешей
Вредоносное ПО в Windows часто сохраняет системные хеши, чтобы получить доступ к учетным данным. После сохранения злоумышленники пытаются расшифровать эти хеши в автономном режиме или использовать их для атаки типа pass-the-hash. В ходе этой атаки хеши LM и NTLM применяются для удаленной NTLM-аутентификации, что не требует их расшифровки и получения соответствующего пароля.
Для сохранения хешей существуют программные пакеты Pwdump и Pass-the-Hash (PSH), которые распространяются бесплатно. Поскольку оба этих инструмента имеют открытый исходный код, на их основе создано множество вредоносного ПО.
У большинства антивирусов предусмотрены сигнатуры для стандартных скомпилированных версий этих утилит, поэтому злоумышленники часто пытаются скомпилировать собственные их вариации, чтобы избежать обнаружения. Примеры, приводимые в этой главе, являются разновидностями pwdump и PSH, с которыми мы сталкивались в реальных условиях.
Pwdump — это набор программ, которые выводят из диспетчера учетных записей безопасности (security account manager, SAM) хеши в формате LM i NTLM, принадлежащие локальным пользователям. Pwdump внедряет DLL внутрь процесса LSASS (local security authority subsystem service — сервер проверки подлинности локальной системы безопасности), более известного как lsass.exe. О внедрении DLL мы поговорим в главе 12, а пока что вам стоит знать лишь о том, что это прием, посредством которого вредоносное ПО выполняет библиотеки внутри других процессов, пользуясь всеми их привилегиями. Инструменты для сохранения хешей часто атакуют процесс lsass.exe, потому что он обладает достаточными привилегиями и доступом ко многим полезным API-функциям.
Стандартная версия Pwdump использует библиотеку lsaext.dll. При внедрении ее в lsass.exe она вызывает функцию GetHash, которая экспортируется из lsaext.dll, чтобы выполнить извлечение хешей. При этом используются недокументированные функции Windows, которые позволят получить порядковые номера всех пользователей в системе и незашифрованные хеши паролей каждого из них.
Столкнувшись с вариацией Pwdump, нужно проанализировать ее библиотеки, чтобы понять, как происходит сохранение хешей. Первым делом следует обратить внимание на экспортные функции. Из Pwdump по умолчанию экспортируется вызов GetHash, но злоумышленники могут легко поменять его имя, чтобы сделать его менее узнаваемым. Затем стоит попытаться определить функции, которые применяются в экспортных вызовах. Многие из них могут находиться динамически, поэтому в экспортных вызовах часто встречается многократное использование операции GetProcAddress.
В листинге 11.2 показан код экспортной функции GrabHash из DLL одной из версий Pwdump. Поскольку библиотека внедряется в lsass.exe, перед использованием многих символов ей сначала приходится находить их в ручном режиме.
Листинг 11.2. Уникальные АPI-вызовы, которые используются экспортной функцией GrabHash в одном из вариантов Pwdump
В листинге 11.2 показан код получения дескрипторов библиотек samsrv.dll (1) и advapi32.dll (2) помощью вызова LoadLibrary. Файл samsrv.dll содержит API для простого доступа к SAM, а файл advapi32.dll был найден для доступа к функциям, которые не импортированы в lsass.exe. Динамическая библиотека данной вариации Pwdump использует дескрипторы этих библиотек для поиска множества функций. Пять самых важных из них показаны в листинге (обратите внимание на вызовы GetProcAddress и их аргументы).
Из samsrv.dll импортируются такие интересные вызовы, как SamIConnect, SamrQueryInformationUser и SamIGetPrivateData. Вызов SamIConnect впоследствии используется для подключения к SAM, после чего для каждого пользователя в системе вызывается функция SamrQueryInformationUser.
Хеши извлекаются с использованием вызова SamIGetPrivateData, а затем расшифровываются с помощью функций SystemFunction025 и SystemFunction027, импортированных из advapi32.dll (строки (2) и (3)). Ни одна из API-функций в этом листинге не описана в официальной документации.
PSH Toolkit содержит программы, которые создают дампы хешей. Самый популярный из этих дампов известен под названием whosthere-alt. В нем хранится содержимое SAM, полученное путем внедрения DLL в lsass.exe. При этом, если сравнивать с Pwdump, используется совершенно другой набор API-функций. В листинге 11.3 показан код версии whosthere-alt, которая экспортирует функцию с именем TestDump.
Листинг 11.3. Уникальные API-вызовы, которые используются экспортной функцией TestDump версии whosthere-alt
Поскольку данная библиотека внедряется в lsass.exe, ее функция TestDump создает дамп хеша. Она динамически загружает файл secur32.dll и находит в нем вызов LsaEnumerateLogonSessions (1), чтобы получить список локальных уникальных идентификаторов (locally unique identifiers, LUID). В этом списке содержатся имена и домены, которые указывались при каждом входе в систему. Библиотека перебирает их, чтобы получить доступ к учетной информации. Для этого с помощью вызова GetModuleHandle (2) она ищет внутри msv1_0.dll неэкспортированную функцию, NlpGetPrimaryCredential, которая позволяет создавать дампы хешей NT и LM.
Об авторах
Майкл Сикорски — специалист по безопасности в компании Mandiant. Он занимается анализом вредоносного программного обеспечения в рамках расследования инцидентов и является консультантом правительства США в области информационной безопасности. Майкл разработал серию курсов по анализу вредоносного программного обеспечения (ПО) и преподает их для разнообразной аудитории, включая ФБР и Black Hat. До Mandiant он был сотрудником лаборатории Линкольна в Массачусетском технологическом институте и проводил исследования в области топологии пассивных сетей и проникающего тестирования. Кроме того, Майкл прошел трехгодичную междисциплинарную программу обучения по системам и сетям в АНБ. Во время обучения он участвовал в исследовании методик обратного проектирования и получил несколько наград в области сетевого анализа.
Эндрю Хониг занимает должность эксперта по обеспечению информационной безопасности в Министерстве обороны США. Он преподает анализ программного обеспечения, обратное проектирование и программирование для операционной системы (ОС) Windows в Национальной школе криптографии, являясь при этом сертифицированным специалистом по безопасности информационных систем. На счету Эндрю несколько эксплойтов нулевого дня для средств виртуализации VMware, а также инструменты для обнаружения инновационного вредоносного ПО, включая зараженные модули ядра. Имея за плечами десятилетний опыт аналитика в области компьютерной безопасности, он по праву считается экспертом в анализе и толковании как вредоносных, так и обычных программ.
В статье представлены особенности современного программного обеспечения для анализа данных и сравнительный анализ программных продуктов.
Ключевые слова : программа, анализ данных, SPSS, R, Python, MS Excel.
Инструменты анализа данных — программные продукты и приложения, которые используют исследователи для разработки и выполнения аналитических процессов, которые помогают принимать более обоснованные бизнес-решения с научной точки зрения при одновременном снижении затрат и увеличении прибыли.
Главной функцией программного обеспечения для анализа данных является выполнение трудоемкой работы и автоматизации процесса преобразования данных в аналитическую информацию. Программное обеспечение для обработки данных также выполняет ряд следующих действий:
— предоставляет необходимые инструменты для проведения качественного и количественного анализа;
— применяет статистические и аналитические возможности для принятия решений;
— обрабатывает и преобразует информацию для анализа корреляций между наборами данных;
— визуализирует наборы данных и результаты анализа.
Программные продукты для статистической обработки данных являются неотъемлемой частью современных исследований в различных сферах. Системы не только ускоряют процессы обработки, но и облегчают трудоемкие процессы анализа данных и помогают качественно визуализировать результаты исследований.
В качестве инструментального средства для реализации методов многомерной статистики используется распространенная программа обработки статистической информации — SPSS (аббревиатура от Statistical Package for the Social Science) [1].
MS SPSS Statistics компьютерная программа для статистической обработки данных, предназначенная для проведения прикладных исследований в социальных науках.
Хедли Халл, Норман Най и Дейл Бент создали первую версию системы в 1968 году. Далее данный пакет совершенствовался в рамках Чикагского университета. В 1970 году вышло первое пользовательское руководство издательстве McGraw-Hill. А с 1975 года проект отделился в собственную компанию SPSS Inc . В 1992 году вышла первая версия пакета под Microsoft Windows. На данный момент также существуют версии под Mac OS X и Linux.
Возможности статистического пакета SPSS [2]:
— первичная описательная статистика;
— использования переменных разных типов;
— частотность признаков, таблицы, графики, таблицы сопряжённости, диаграммы;
— анализ данных маркетинговых исследований.
Программный продукт SPSS предоставляет широкие возможности для статистического анализа данных. Набор аналитического функционала системы представлен на рисунке 1.
Рис. 1. Окно SPSS
Таким образом, SPSS является гибким инструментом для статистической обработки различных наборов данных.
Необходимым условием современного статистического анализа данных является эффективное использование компьютерных программ, от функциональной полноты и алгоритмической продуманности которых зависит итоговая интерпретация результатов исследования и надежность выводов. В настоящее время такой программой является система R, которая является наиболее полной, надежной и динамично развивающейся статистической средой, объединяющей язык программирования высокого уровня и библиотеки программных модулей для вычислительной и графической обработки данных.
R — это язык и среда для статистических вычислений и графики, который предоставляет широкий спектр статистических (линейное и нелинейное моделирование, классические статистические тесты, анализ временных рядов, классификация, кластеризация и т. Д.) и графических методов и обладает высокой степенью расширения [3].
Одной из сильных сторон R является легкость, с которой происходит визуализация графиков качества публикации, включая математические символы и формулы, где это необходимо.
Сегодня статистическая среда R является безусловным лидером среди некоммерческих систем статистического анализа и постепенно становится незаменимой при проведении научно-технических расчетов в большинстве западных университетских, научных центров и международных организаций. Расширение библиотек программных модулей за счет усилий множества разработчиков привело к возникновению распределенной системы хранения и распространения пакетов R, то есть “CRAN” (от «Comprehensive R Archive Network») которая обладает развитой системой информационной поддержки [4].
Всемерная поддержка научным сообществом данного проекта и широкое преподавание статистики на базе R обусловили приведение скриптов на данном языке постепенно становится общепризнанным мировым стандартом в научных публикациях.
В данном языке программирования существует множество пакетов и библиотек, предназначенных для выполнения различных задач статистической обработки данных. Пакеты Ggplot2, Data.table, Dplyr, Tidy, Shiny, Ploty, Knitr, Caret являются основными для анализа данных в среде R. В основе пакетов находятся функции, которые в свою очередь применяются для статистического анализа данных и визуализации. Данный язык прост в использовании и обеспечивает быструю и надежную платформу для обработки данных, визуализации, моделирования и статистического тестирования.
Другим распространенным инструментом для анализа данных является Python. Python-это интерпретируемый, интерактивный, и высокоуровневый язык программирования общего назначения, который был создан Гвидо ван Россумом в 1985–1990 годах. Исходный код Python доступен под лицензией GNU General Public License (GPL).
Основными характеристиками Python являются:
— Поддержка функциональных и структурированных методов программирования, а также объектно-ориентированное программирование.
— Использование в качестве языка сценариев или может быть скомпилирован в байт-код для создания больших приложений.
— Обеспечение и проверка высокоуровневых динамических типов данных.
— Возможность интеграции с C, C++, COM, ActiveX, CORBA и Java.
Для любых научных вычислений и анализа данных в среде программирования Python применятся NumPy, SciPy, Matplotlib, Pandas, Scikit Learn, Statsmodels, Seaborn, SymPy библиотеки.
Язык программирования Python предоставляет широкие возможности для визуализации как исходных данных, так и данных, которые были обработаны различными статистическим методами.
Другим популярным программным инструментом анализа данных является MS Excel. Анализ данных в MS Excel предполагает сама конструкция табличного процессора. Очень многие средства программы подходят для реализации этой задачи.
MS Excel позиционирует себя как лучший универсальный программный продукт в мире по обработке аналитической информации. MS Excel предлагает средства для анализа статистических данных. Такие встроенные функции, как СРЗНАЧ (AVERAGE), МЕДИАНА (MEDIAN) и МОДА (MODE), могут использоваться для проведения анализа данных. Если встроенных статистических функций недостаточно, необходимо обратиться к пакету Анализ данных.
Пакет Анализ данных, являющийся надстройкой, содержит коллекцию функций и инструментов, расширяющих встроенные аналитические возможности MS Excel. В частности, пакет Анализ данных можно использовать для создания гистограмм, ранжирования данных, извлечения случайных или периодических выборок из набора данных, проведения регрессионного анализа, получения основных статистических характеристик выборки, генерации случайных чисел с различным распределением, а также для обработки данных с помощью преобразования Фурье и других преобразований.
При анализе данных часто возникает необходимость определения различных статистических характеристик или параметров распределения. С помощью Microsoft Excel можно анализировать распределение, используя несколько инструментов: встроенные статистические функции, функции для оценки разброса данных, инструмент Описательная статистик, который предоставляет удобные сводные таблицы основных параметров распределения, инструменты Гистограмма, Ранг и Персентиль.
Таким образом, программный продукт MS Excel является отличным инструментом для работы с данными и включает различный набор.
Обеспечение выполнения анализа данных на максимально высоком уровне основывается на использовании инструментов и программного обеспечения, которые вычисляют наилучшие результаты.
В зависимости от целей исследования необходимо ориентироваться на возможности, и недостатки используемого программного продукта. Каждая из систем имеет свой определенный функционал, используемый для анализа данных, в связи с этим определение ключевых методов анализа в исследовании является основополагающим для выбора системы и набора пакетов. Сравнительная таблица исследуемого программного обеспечение для анализа данных представлена в таблице 1.
Программный продукт
Положительные черты
Отрицательные черты
— SPSS имеет широкий доступ к данным с различными типами переменных.
— SPSS R способен работать с не стандартизированными данными различной природы.
— SPSS помогает исследователям легко настроить модель, поскольку большая часть процесса автоматизирована.
— Инструментарий SPSS не требует дополнительного изучения синтаксиса, так как не является языком программирования.
— SPSS предлагает углубленные статистические возможности для анализа точных результатов и визуализации.
— Данное ПО не является бесплатными и требует лицензирования.
— Интерфейс системы не соответствует трендам создания ПО.
— Качество графики при визуализации требует улучшений.
Статистическая среда R
— Язык программирования R способен работать с не стандартизированными данными.
— Возможность загрузки данных на основе сторонних документов в различных форматах (MS Excel, текстовые документы)
— Язык программирования R имеет открытый исходный код.
— Использование платформ бесплатно и не требует лицензирования.
— Язык программирования R имеет широкую графическую библиотеку.
— Язык программирования R содержит более 10 000 пакетов, используемых для статистического анализа данных.
— Поддержка векторных вычислений.
— Язык программирования R не обладает базовой безопасностью, так как не встраивает веб-приложений.
— Необходимо первоначальное обучение основам синтаксиса языка программирования.
— Язык программирования Python позволяет совершать статистический анализ данных с минимальным написанием программного кода.
— Python имеет расширенную поддержку стандартных библиотек.
— Python является бесплатным программным продуктом.
— Возможность поддержки как процедурной, так и объектно-ориентированной парадигмы программирования.
— Поддержание высокой культуры документации.
— Редко используется для реализации приложений на базе смартфонов.
— Недостаточно развитые уровни доступа к базам данных.
— Необходимо первоначальное обучение основам синтаксиса языка программирования.
— Снижение скорости обработки данных при выполнении сложных операций.
— Содержит мощные инструменты фильтрации, сортировки и поиска.
— Широкий выбор встроенных функций для анализа данных, математической обработки.
— Большой выбор инструментов для визуализации графиков.
— Низкая скорость обработки большого объема данных.
— MS Excel использует аппроксимацию очень больших чисел с использованием неточных вычислений.
— Применение нескольких сложных формул при работе с системой могут привести снижению скорости обработки данных
— Так же одним из ограничивающих факторов при использовании MS Excel для управления данными является отсутствие доступа сразу нескольким пользователям.
Таким образом, каждый из рассмотренных программных продуктов имеет сильные и слабые стороны. Исследователь, ориентируясь на поставленную цель и задачи, а также на набор предусмотренного функционала, выбирает оптимальный программный продукт.
- Орлова И. В. Статистический анализ в экономических задачах: компьютерное моделирование в SPSS [Текст] / И. В. Орлова, Н. В. Концевая // Международный журнал прикладных и фундаментальных исследований. — 2014. — № 3. — С. 248–250.
- Наследов, А. Д. IBM SPSS Statistics 20 и Amos: Профессиональный статистический анализ данных [Текст]: практическое руководство / А. Д. Наследов. — СПб.: Питер, 2013 –C. 416.
- А. И. Шафоростов, В. В. Шумилин Возможности языка программирования «R» при проведении научно-исследовательских работ [Текст] / А. И. Шафоростов, В. В. Шумилин // Пожарная безопасность: проблемы и перспективы. — 2016. — № 1(7). — С. 284–286.
- В. В. Ивин Применение языка R и среды RStudio для статистического анализа данных [Текст] / В. В. Ивин // Педагогический опыт: от теории к практике. — 2018. — С. 47–53.
Основные термины (генерируются автоматически): SPSS, анализ данных, Язык программирования, статистический анализ данных, данные, набор данных, обработка данных, программное обеспечение, программный продукт, статистическая обработка данных.
Читайте также: