BASS — фреймворк для автоматического синтеза антивирусных сигнатур

Автор оригинала: Йонас Цаддах (Jonas Zaddach) и Мариано Грациано (Mariano Graziano)
  • Перевод
Всем привет. До старта курса «Реверс-инжиниринг» остается меньше десяти дней, в связи с этим хотим поделиться еще одним интересным переводом по теме. Поехали!



Краткий обзор




Картина угроз стремительно меняется — постоянно появляются новые кибератаки, а старые становятся изощреннее. В этих условиях перед специалистами по безопасности встают все более сложные задачи. Ежедневно им приходится обрабатывать и анализировать миллионы образцов ранее неизвестного и совершенно нового вредоносного ПО, разрабатывать эффективные антивирусные сигнатуры для описания целых семейств вредоносных программ, обеспечивать масштабируемость инструментов по мере увеличения числа образцов для анализа. При этом приходится учитывать ограниченность ресурсов на средства автоматизации анализа вредоносных программ. Чтобы помочь ИТ-специалистам справиться с этими разнообразными сложностями, Talos предлагает новую платформу с открытым кодом под названием BASS.

BASS (читается как «бэс») — это фреймворк для автоматической генерации антивирусных сигнатур на основе образцов из ранее сформированных кластеров вредоносного кода. Он призван снизить потребление ресурсов ядром ClamAV за счет увеличения доли сигнатур на базе шаблонов относительно хэш-сигнатур, а также упростить работу аналитиков, разрабатывающих сигнатуры на основе шаблонов. Благодаря поддержке контейнеров Docker фреймворк хорошо масштабируется. 

Стоит отметить, что пока доступна только альфа-версия BASS и многое еще предстоит доработать. У этого проекта открытый исходный код, и мы активно работаем над ним, поэтому будем рады любым отзывам сообщества и рекомендациям по его улучшению. Исходный код BASS доступен здесь.

Проект BASS был анонсирован в 2017 году на конференции REcon в Монреале, Канада.

Актуальность


Специалисты Talos ежедневно получают более 1,5 млн уникальных образцов. В большинстве своем они относятся к известным угрозам и сразу же отсеиваются сканером вредоносного ПО (ClamAV). Однако после сканирования остается немало файлов, которые все же нуждаются в дальнейшем анализе. Мы запускаем их в песочнице и проводим динамический анализ, позволяющий разделить их на вредоносные и безопасные. Отобранные на этом этапе вредоносные образцы мы обрабатываем, чтобы на их основе создать сигнатуры ClamAV, которые помогут в дальнейшем отфильтровывать эти угрозы на более раннем этапе, во время сканирования.



За три месяца, с февраля по апрель 2017 года, базу данных ClamAV пополнили 560 000 новых сигнатур, то есть прирост составлял 9500 сигнатур в день. Значительную часть из них мы получили автоматически в виде хэш-сигнатур. У таких сигнатур есть один существенный недостаток по сравнению с сигнатурами на основе шаблонов или байт-кода (это два других типа, поддерживаемых ядром ClamAV): одна хэш-сигнатура соответствует только одному файлу. Кроме того, рост числа хэш-сигнатур приводит к тому, что база ClamAV занимает больше памяти. Именно поэтому мы предпочитаем сигнатуры на основе шаблонов. Ими гораздо проще и быстрее управлять, чем байт-кодовыми, и в то же время они позволяют описывать целые кластеры файлов.

BASS


Фреймворк BASS призван облегчить создание сигнатур ClamAV на основе шаблонов. Он автоматически генерирует их, обрабатывая сегменты двоичного исполняемого кода.  



BASS берет за основу кластеры вредоносного кода, но не включает средства их создания. За счет этого технология остается удобной и гибкой. Мы намеренно сделали входной интерфейс универсальным, чтобы его легко было адаптировать к новым источникам кластеров. Сейчас мы используем несколько таких источников, в том числе кластеры на основе индикаторов компрометации (IoC) из нашей песочницы, структурное хэширование (когда у нас есть заведомо вредоносный исполняемый файл и мы ищем дополнительные образцы, схожие с ним по структуре) и вредоносное ПО, полученное из спам-кампаний.

На первом этапе вредоносные экземпляры проходят через распаковщики ядра ClamAV. Оно может распаковывать архивы различных форматов и сжатые исполняемые файлы (например, UPX), а также извлекать встроенные объекты (такие как файлы EXE внутри документов Word). Полученные артефакты тщательно анализируются, идет сбор информации. Сейчас для следующего этапа, фильтрации, мы используем их размеры и магическую строку UNIX.

Затем кластер вредоносного кода проходит фильтрацию. Если файлы не соответствуют требованиям BASS (пока платформа работает только с исполняемыми файлами PE, но не составит труда добавить поддержку двоичных файлов ELF и MACH-O), они удаляются из кластера либо, если объектов осталось слишком мало, кластер забраковывается полностью.

Отфильтрованный кластер переходит на этап генерации сигнатур. Сначала производится дизассемблирование двоичных файлов. Для этого мы используем IDA Pro, но его можно без проблем заменить на другой дизассемблер со схожими возможностями, например на radare2. 



После дизассемблирования необходимо выявить в образцах общий код, чтобы на его основе сгенерировать сигнатуры. Этот шаг важен по двум причинам. Во-первых, алгоритм создания сигнатур требует значительных вычислительных ресурсов и лучше работает с короткими сегментами кода. Во-вторых, предпочтительнее получать сигнатуры из образцов кода, которые схожи не только синтаксически, но и семантически. Для сравнения кода мы используем утилиту BinDiff. Опять же, ее тоже легко заменить, и в будущем мы, возможно, интегрируем в фреймворк другие утилиты для сравнения.

Если кластер небольшой, BinDiff сравнивает каждый исполняемый файл со всеми остальными. В противном случае охват сравнения сокращается, иначе процесс может слишком затянуться. На основе полученных результатов строится граф, где вершины обозначают функции, а ребра — их схожесть. Чтобы найти хорошую общую функцию, достаточно найти связный подграф с высоким общим показателем схожести.



Подграф ƒ1, ƒ2, ƒ4, ƒ6 с высокими показателями схожести вершин (см. рисунок выше) — отличный кандидат на роль общей функции.

Как только набирается несколько таких кандидатов, мы сопоставляем их с белым списком, чтобы избежать создания сигнатур на основе рядовых функций библиотек, статически связанных с образцом. Для этого функции направляются в экземпляр Kam1n0, базу данных которого мы предварительно наполнили функциями из заведомо чистых образцов. Если обнаруживается клон какой-либо функции, процедура отбора подграфа повторяется, с тем чтобы выбрать наиболее подходящий из оставшихся. Если проверка ничего не выявляет, набор функций передается на следующий этап.

Тогда и начинается непосредственно генерация сигнатуры. Сигнатуры ClamAV на основе шаблонов призваны выявлять подпоследовательности в двоичных данных. Поэтому мы применяем ко всем извлеченным функциям алгоритм поиска наибольшей общей для них подпоследовательности (LCS, Longest Common Subsequence). 

C вычислительной точки зрения этот алгоритм достаточно затратен даже для двух образцов и заметно тяжелее для нескольких, поэтому мы применяем его эвристическую разновидность, описанную Кристианом Бличманом (Christian Blichmann). Результат может выглядеть примерно так: 



Наконец, перед публикацией сигнатуры ее нужно протестировать. Мы автоматически проверяем сигнатуру с помощью нашего набора тестов на ложноположительные срабатывания. Для большей достоверности мы применяем Sigalyzer — новую возможность нашего подключаемого модуля CASC IDA Pro ClamAV для генерации и анализа сигнатур (он будет обновлен позднее). Sigalyzer помечает участки двоичного файла, которые совпали с сигнатурой ClamAV, сработавшей для него. Таким образом формируется наглядное визуальное представление сигнатуры.

Архитектура


BASS реализован в виде кластера контейнеров Docker. Фреймворк написан на Python и взаимодействует со всеми необходимыми инструментами через веб-сервисы. Архитектура создана по аналогии с проектом VxClass, который также генерировал сигнатуры ClamAV с помощью IDA Pro и BinDiff, но впоследствии бы закрыт и, в отличие от BASS, недоступен широкой публике.



Ограничения


BASS работает исключительно с двоичными исполняемыми файлами, поскольку сигнатура генерируется из кода образца. Кроме того, он анализирует только исполняемые файлы x86 и x86_64. Поддержка других архитектур может появиться в будущем. 

Пока что BASS плохо справляется с файловыми вирусами, которые встраивают небольшие и очень непохожие друг на друга сниппеты кода в заражаемые объекты, и с бэкдорами, в основном состоящими из невредоносного двоичного кода (зачастую украденного), который дополнен вредоносными функциями. Мы боремся с этими недостатками, работая над оптимизацией этапа кластеризации.

И еще раз хотим напомнить, что BASS находится на стадии альфа-тестирования, и пока не все работает гладко. Но мы надеемся, что принесем пользу сообществу, развивая этот фреймворк как проект с открытым исходным кодом, и будем рады любым идеям и критике.

Приложение


Разница между наибольшей общей подстрокой и наибольшей общей подпоследовательностью

На следующей иллюстрации показана разница между наибольшей общей подстрокой и наибольшей общей подпоследовательностью. Наибольшая общая подпоследовательность обозначена в нашей публикации английской аббревиатурой LCS.



На этом все. А уже 20 июня можно будет подробно ознакомиться с программой курса на дне открытых дверей, который пройдет в режиме вебинара.
  • +13
  • 1,3k
  • 2
OTUS. Онлайн-образование
628,06
Цифровые навыки от ведущих экспертов
Поделиться публикацией

Комментарии 2

    0

    Ну то есть реально в 19 году сигнатуры?

      0
      А какие ещё идеи, если кроме защиты и лечения, пользователь ожидает диагностики (точное название вируса, который обнаружен в исследуемом файле).

      Как предлагаете без сигнатур выбрать один из сотен тысяч диагнозов?

      Можно, конечно, представить бессигнатурный антивирус на эвристиках, который пишет: я тут нашёл какой-то вирус и вылечил. Но это против ожиданий пользователей.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое