В мире информационной безопасности угрозы для macOS традиционно остаются в тени по сравнению с атаками на Windows. Однако рост популярности устройств Apple в корпоративной среде делает защиту от macOS-вредоносного ПО (malicious software) все более актуальной. Одним из ключевых инструментов для обнаружения таких угроз являются YARA-правила, а платформа Spectra Analyze от ReversingLabs предлагает мощные возможности для их применения.
Описание
Что такое YARA и почему это важно?
YARA (Yet Another Recursive Acronym) - это инструмент для создания правил, которые описывают характеристики вредоносного ПО на основе строк, бинарных последовательностей и других паттернов. С помощью YARA исследователи могут точно классифицировать образцы, сокращая количество ложных срабатываний.
Качественное YARA-правило состоит из трех основных частей:
- Метаданные: информация об авторе, описании, дате создания и ссылках на источники.
- Строки (Strings): уникальные идентификаторы, такие как текстовые строки, шестнадцатеричные последовательности или регулярные выражения.
- Условия (Conditions): логические конструкции, определяющие, при каких условиях правило сработает.
Правило должно быть точным, читаемым и оптимизированным. Например, условие может начинаться с проверки заголовка файла, а заканчиваться исключением легитимного программного обеспечения (goodware).
Автоматические и ручные правила: плюсы и минусы
YARA-правила могут создаваться как вручную аналитиками, так и автоматически с помощью инструментов. Автоматически сгенерированные правила, такие как те, что создает yara-signator, обычно основываются на статических особенностях образца - строках, опкодах, последовательностях байтов. Их главное преимущество - скорость создания, что полезно при работе с большими объемами данных. Однако такие правила уязвимы к обфускации, которую часто применяют злоумышленники.
Ручные правила, напротив, часто включают динамические характеристики, такие как вызовы API, изменения в файловой системе или реестре. Это делает их более устойчивыми к изменениям в коде вредоносного ПО и позволяет обнаруживать новые угрозы. Например, правило от AlienVault Labs для macOS-вредоноса OceanLotus фокусируется на алгоритме XOR-декодирования, который сложнее замаскировать.
Практический пример: охота на Bundlore
Spectra Analyze позволяет исследователям применять YARA-правила к обширной базе образцов ReversingLabs, которая содержит более 422 миллиардов файлов. В качестве примера рассмотрим правило для обнаружения семейства macOS-вредоносов Bundlore, взятое из публичного репозитория Apple XProtect.
Правило включает строки, такие как "OffersInstallScriptUrl", "SoftwareInstallScriptUrl" и "Please wait while your software is being installed…", которые характерны для Bundlore. Однако при запуске ретроспективного поиска (Cloud Retrohunt) в Spectra Analyze было обнаружено всего восемь образцов, датированных восемью-девятью годами назад. Это указывает на то, что используемые в правиле строки устарели и не актуальны для современных версий вредоносного ПО.
Такой результат подчеркивает важность регулярного обновления правил и использования свежих данных для их создания.
Как использовать YARA в Spectra Analyze
Интерфейс Spectra Analyze интуитивно понятен: пользователи могут добавлять правила вручную, загружать файлы или импортировать их из онлайн-источников. Для ретроспективного поиска доступна опция Cloud Retrohunt, которая проверяет исторические данные на соответствие заданным условиям. Это особенно полезно для анализа ранее собранных образцов.
Кроме того, платформа позволяет включать автоматическое сканирование новых файлов, что обеспечивает постоянный мониторинг угроз.
Заключение
YARA остается незаменимым инструментом для охоты на вредоносное ПО, включая угрозы для macOS. Качественные правила должны быть точными, читаемыми и сочетать статические и динамические показатели. Автоматические правила удобны для быстрого реагирования, тогда как ручные - для обнаружения сложных и новых угроз.
Для достижения наилучших результатов рекомендуется комбинировать оба подхода - использовать автоматически сгенерированные правила для массового анализа и ручные - для целевой охоты на сложные угрозы.
Индикаторы компрометации
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | rule osx_oceanlotus_auto { meta: author = "Felix Bilstein - yara-signator at cocacoding dot com" date = "2020-10-14" version = "1" description = "autogenerated rule brought to you by yara-signator" tool = "yara-signator v0.5.0" signator_config = "callsandjumps;datarefs;binvalue" malpedia_reference = "https://malpedia.caad.fkie.fraunhofer.de/details/osx.oceanlotus" malpedia_rule_date = "20201014" malpedia_hash = "a7e3bd57eaf12bf3ea29a863c041091ba3af9ac9" malpedia_version = "20201014" malpedia_license = "CC BY-SA 4.0" malpedia_sharing = "TLP:WHITE" strings: $sequence_0 = { 48 8b85f0feffff 48 8d78e8 48 3b3d???????? 7417 } // n = 7, score = 200 // 48 | dec eax // 8b85f0feffff | mov eax, dword ptr [ebp - 0x110] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax // 3b3d???????? | // 7417 | je 0x19 $sequence_1 = { 8b85b8fdffff 48 8d78e8 48 3b3d???????? } // n = 5, score = 200 // 8b85b8fdffff | mov eax, dword ptr [ebp - 0x248] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax // 3b3d???????? | $sequence_2 = { 48 8b85b8fdffff 48 8d78e8 48 } // n = 5, score = 200 // 48 | dec eax // 8b85b8fdffff | mov eax, dword ptr [ebp - 0x248] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax $sequence_3 = { 8b85b8fdffff 48 8d78e8 48 } // n = 4, score = 200 // 8b85b8fdffff | mov eax, dword ptr [ebp - 0x248] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax $sequence_4 = { 8b85f0feffff 48 8d78e8 48 3b3d???????? 7417 } // n = 6, score = 200 // 8b85f0feffff | mov eax, dword ptr [ebp - 0x110] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax // 3b3d???????? | // 7417 | je 0x19 $sequence_5 = { e8???????? 48 8b85f8feffff 48 8d78e8 48 3b3d???????? } // n = 7, score = 200 // e8???????? | // 48 | dec eax // 8b85f8feffff | mov eax, dword ptr [ebp - 0x108] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax // 3b3d???????? | $sequence_6 = { 89de e8???????? 48 8b8508ffffff 48 8d78e8 } // n = 6, score = 200 // 89de | mov esi, ebx // e8???????? | // 48 | dec eax // 8b8508ffffff | mov eax, dword ptr [ebp - 0xf8] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] $sequence_7 = { e8???????? 48 8b85f8feffff 48 8d78e8 48 } // n = 6, score = 200 // e8???????? | // 48 | dec eax // 8b85f8feffff | mov eax, dword ptr [ebp - 0x108] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] // 48 | dec eax $sequence_8 = { 48 89de e8???????? 48 8b8508ffffff 48 8d78e8 } // n = 7, score = 200 // 48 | dec eax // 89de | mov esi, ebx // e8???????? | // 48 | dec eax // 8b8508ffffff | mov eax, dword ptr [ebp - 0xf8] // 48 | dec eax // 8d78e8 | lea edi, [eax - 0x18] $sequence_9 = { 90 55 48 89e5 5d e9???????? } // n = 6, score = 200 // 90 | nop // 55 | push ebp // 48 | dec eax // 89e5 | mov ebp, esp // 5d | pop ebp // e9???????? | condition: 7 of them and filesize < 308528 } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | rule osx_oceanlotus_w0 { meta:o author = "AlienVault Labs" type = "malware" description = "OceanLotus XOR decode function" source = "https://www.alienvault.com/blogs/labs-research/oceanlotus-for-os-x-an-application-bundle-pretending-to-be-an-adobe-flash-update" malpedia_reference = "https://malpedia.caad.fkie.fraunhofer.de/details/osx.oceanlotus" malpedia_version = "20170519" malpedia_license = "CC BY-NC-SA 4.0" malpedia_sharing = "TLP:WHITE" strings: $xor_decode = { 89 D2 41 8A ?? ?? [0-1] 32 0? 88 ?? FF C2 [0-1] 39 ?A [0-1] 0F 43 D? 4? FF C? 48 FF C? [0-1] FF C? 75 E3 } condition: $xor_decode } |
| 1 2 3 4 5 6 7 | private rule Macho { meta: description = "private rule to match Mach-O binaries" condition: uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | rule OSX_Bundlore_A { meta: description = "OSX.Bundlore.A" strings: $a1 = { 4F 66 66 65 72 73 49 6E 73 74 61 6C 6C 53 63 72 69 70 74 55 72 6C } $a2 = { 53 6F 66 74 77 61 72 65 49 6E 73 74 61 6C 6C 53 63 72 69 70 74 55 72 6C } $a3 = { 63 6F 6D 2E 67 6F 6F 67 6C 65 2E 43 68 72 6F 6D 65 } $a4 = { 2E 74 6D 70 6D 61 } $a5 = { 50 6C 65 61 73 65 20 77 61 69 74 20 77 68 69 6C 65 20 79 6F 75 72 20 73 6F 66 74 77 61 72 65 20 69 73 20 62 65 69 6E 67 20 69 6E 73 74 61 6C 6C 65 64 2E 2E 2E } condition: filesize < 500000 and Macho and 4 of ($a*) } |