Прогосударственые хакерские группы уже давно и успешно используют буткиты — специальный вредоносный код для BIOS/UEFI, который может очень долго оставаться незамеченным, контролировать все процессы и успешно пережить как переустановку ОС, так и смену жесткого диска. Благодаря тому, что подобные атаки сложно выявить (вендорам ИБ удалось лишь дважды самостоятельно обнаружить такие угрозы!), наблюдается рост интереса к подобному методу заражения компьютеров и среди финансово мотивированных преступников —  например, операторов TrickBot. Семен Рогачев, специалист по исследованию вредоносного кода Group-IB, рассказывает как охотиться за подобными угрозами в локальной сети и собрать свой тестовый стенд с последним из обнаруженных UEFI-буткитов Mosaic Regressor. Бонусом - новые сетевые индикаторы компрометации, связанные с инфраструктурой Mosaic Regressor, и рекомендации по защите в соответсвии с MITRE ATT&CK и MITRE Shield.  Давайте начнем с небольшой исторической справки.  ► В 2013 году Себастьен Качмарек (Sébastien Kaczmarek) из QuarksLab создал PoC-буткит Dreamboot, использующий UEFI для атаки на загрузчик ОС. Его исходный код доступен на GitHub. Следует отметить, что данный буткит работал только при отключенном механизме Secure Boot, и в том же году на конференции BlackHat USA 2013 был представлен доклад "A Tale of One Software Bypass of Windows 8 Secure Boot", в котором авторы описали первый публичный способ обхода этого механизма.  ► В 2014 году Рафаль Войтчук (Rafal Wojtczuk) и Кори Калленберг (Corey Kallenberg) опубликовали информацию об уязвимости Darth Venamis в механизме S3 Resume. Это механизм, определяющий продолжение работы компьютера после выхода из состояния сна. В результате исследования выяснилось, что область памяти, в которой хранится S3 BootScript (список команд, проводящих инициализацию устройств после выхода из состояния сна), не защищена от модификации, что приводит к различным уязвимостям. Эта же уязвимость использовалась, предположительно, ЦРУ для установки имплантов. Почитать об этом можно здесь, здесь и здесь. ► В 2015 году Кори Калленберг и еще один исследователь, Ксено Ковах (Xeno Kovah), представили LightEater — руткит, позволяющий получать различную важную информацию (ключи шифрования и прочее) за счёт прямого доступа к физической памяти и постраничного поиска с использованием сигнатур.  ► В том же году, после утечки данных из компании HackingTeam, был обнаружен фреймворк Vector-EDK, разработанный для внедрения имплантов в UEFI-based прошивки. Этот же фреймворк использовался для разработки Mosaic Regressor. ► В 2016 году Дмитро Олексюк (Dmytro Oleksiuk) создал PeiBackdoor — первый публично доступный UEFI-руткит, загружаемый на этапе PEI (Pre-EFI Initialization). ► В том же году из-за утечки документов Equation Group (по некоторым источникам, связана с АНБ США) появилась информация о существовании BIOS-модуля BANANABALLOT, загружающего некий имплант для взаимодействия с роутерами CISCO. ► В 2017-м WikiLeaks опубликовали информацию о DerStarke — UEFI-версии бэкдора Triton для macOS. ► В 2018-м компания ESET нашла и проанализировала UEFI-руткит LoJax — первый UEFI-буткит, обнаруженный ИБ-компаниями in the wild. ► В октябре 2020 года Лаборатория Касперского в процессе расследования атаки обнаружила Mosaic Regressor — UEFI-буткит, созданный с использованием инструментов, полученных из утечки данных HackingTeam. ► В декабре 2020-го  зафиксирована новая версия TrickBot, которая обладает функциональными возможностями по внедрению кода UEFI. На данный момент нет свидетельств активного внедрения UEFI-имплантов in the wild TrickBot’ом, но сам факт появления подобного функционала говорит о том, что злоумышленники интересуются подобными атаками. Даже этот неполный список прекрасно демонстрирует, насколько актуальны и опасны атаки, связанные с UEFI. В последние несколько лет количество публично выявленных уязвимостей в прошивках удваивается каждый год, что приводит к явному увеличению интереса со стороны киберпреступников и активному росту количества выявленных таргетированных атак. Mosaic Regressor состоит из нескольких модулей, которые описаны в таблице.  Имя модуля GUID Тип модуля Описание SmmInterfaceBase F50258A9-2F4D-4DA9-861E-BDA84D07A44C DXE-драйвер Драйвер, запускающий приложение SmmAccessSub перед передачей управления загрузчику ОС (после получения события EFI_EVENT_GROUP_READY_TO_BOOT) Ntfs F50258A9-2F4D-4DE9-86AE-BDA84D07A41C DXE-драйвер Драйвер, позволяющий взаимодействовать с файловыми системами формата NTFS SmmReset EAEA9AEC-C9C1-46E2-9D52-432AD25A9B0C EFI-приложение Приложение, создающее индикатор заражения прошивки — UEFI-переменную «fTA» SmmAccessSub EAEA9AEC-C9C1-46E2-9D52-432AD25A9B0B EFI-приложение Приложение, сохраняющее файл IntelUpdate.exe (вредоносная нагрузка) в директорию %PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup Для создания тестового стенда произведем заражение прошивки виртуальной машины QEMU, в которой для эмуляции прошивки используется Open Virtual Machine Firmware, представленный файлом OVMF_CODE.fd.  Таким образом, чтобы модифицировать прошивку виртуальной машины, необходимо внести изменения в файл OVMF_CODE.fd. Для этого используем кроссплатформенную утилиту с открытым исходным кодом UEFITool. Она позволяет проводить анализ прошивки, извлекать из неё модули и многое другое. Для заражения прошивки надо добавить в неё два DXE-драйвера и два UEFI-приложения. Сначала находим раздел, в котором содержатся все используемые DXE-драйверы (в данном случае раздел с GUID 8C8CE578-8A3D-4F1C-9935-896185C32DD3 в формате FFSv2): Перед записью каждый из имеющихся EFI-файлов надо представить в виде файла FFS (Firmware File System). Каждый файл в формате FFS состоит из секций (для создания стенда — из двух). Первая будет содержать исполняемый код, вторая — имя модуля в понятном для человека виде. Все драйверы будут собраны в файлы типа EFI_FV_FILETYPE_DRIVER, все приложения — в файлы типа EFI_FV_FILETYPE_APPLICATION. Для сборки используем утилиты GenSec и GenFfs из EDK II (доступны в репозитории EDK II). Генерация секции с кодом: GenSec.exe -o pe32.sec .\Ntfs.efi -S EFI_SECTION_PE32 Генерация секции с именем: GenSec.exe -o name.sec -S EFI_SECTION_USER_INTERFACE -n "NTFS" Создание из секций файла в формате FFS: GenFfs -g "F50258A9-2F4D-4DE9-86AE-BDA84D07A41C" -o ntfs_driver.ffs -i pe32.sec -i name.sec -t EFI_FV_FILETYPE_DRIVER При создании секции с именем необходимо изменять имя файла, передаваемое после аргумента -n, а при создании секции с кодом — путь до EFI-файла (в примере — .\Ntfs.efi). При создании FFS-файлов надо менять GUID (аргумент -g), тип создаваемого файла (аргумент -t для драйверов должен принимать значение EFI_FV_FILETYPE_DRIVER, а для приложений — EFI_FV_FILETYPE_APPLICATION) и имя выходного файла (аргумент -o).  В результате мы получим четыре файла в формате FFS, которые можно добавить в прошивку с использованием UEFITool. При добавлении нужно убедиться, что в разделе хватает свободного места. В результате модифицированная прошивка выглядит приблизительно так: После замены файла прошивки и запуска виртуальной машины происходит создание файлов Mosaic Regressor’ом, что указывает на успешную модификацию прошивки. Это файлы %WINDIR%\setupinf.log и %PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup\IntelUpdate.exe. Первый является индикатором компрометации компьютера (файл IntelUpdate.exe будет создан, только если файла setupinf.log не существует), второй скачивает полезную нагрузку с сервера: Несмотря на то, что в данном случае производилось заражение виртуальной машины, схожим способом возможно заражать компьютеры с некорректной конфигурацией и за счет этого добиваться гарантированного запуска вредоносных программ на компьютере. Выявить Mosaic Regressor можно несколькими способами: поиск индикаторов в прошивке или сравнение с эталонным образом UEFI; поиск индикаторов на уровне ОС;  анализ сетевой активности. Разберем каждый способ подробнее. После анализа EFI-файла SmmReset мы получили индикатор компрометации прошивки. Этот исполняемый файл создаёт NVRAM-переменную с именем "fTA". Переменная с таким же именем и функциональной нагрузкой использовалась в rkloader, разработанном HackingTeam, поэтому поиск по этому индикатору позволит найти и Mosaic Regressor, и rkloader, и другие буткиты, основанные на rkloader. Для поиска этого и других индикаторов компрометации можно использовать многофункциональную утилиту Chipsec, распространяемую и поддерживаемую компанией Intel. Она умеет проверять прошивки на защищённость, получать дампы прошивок и многое другое. Утилиту Chipsec можно использовать из ОС или загрузившись в UEFI Shell, в данном случае был выбран второй вариант. Для создания загрузочного флеш-накопителя, с которого будет запускаться Chipsec, надо выполнить следующие действия: Отформатировать флеш-накопитель в файловую систему FAT-32; Сохранить на него UEFI Shell, который будет получать управление после загрузки компьютера. Для этого необходимо скачать файл UEFI Shell и сохранить его в директорию /efi/boot под именем "Bootx64.efi". Скачать репозиторий Chipsec. Извлечь содержимое архива _instal_/UEFI/chipsec_uefi_x64.zip в корневую директорию флеш-накопителя. Оставшееся содержимое репозитория скопировать в корневую директорию флеш-накопителя. После загрузки в UEFI Shell выполняем команду mount, которая покажет список доступных устройств. В данном случае флеш-карта обозначена как FS0 (это можно понять по надписи "USB" в описании устройства): После перехода в директорию Chipsec, с помощью команды python chipsec_util.py uefi var-find fTA можно проверить, есть ли переменная с таким именем в прошивке. Если эта переменная существует — её дамп будет сохранён в файл: Если нужен более глубокий анализ прошивки, Chipsec позволяет получить её дамп. Для этого нужно выполнить команду python chipsec_util.py spi dump rom.bin: Полученный дамп можно открыть в уже упомянутом UEFITool и, например, извлечь модули, которые кажутся подозрительными: Если есть эталонный образ прошивки, Chipsec позволяет использовать его для поиска модификаций в прошивке. Для этого сначала нужно сгенерировать список модулей эталонного образа с помощью команды python chipsec_main.py -i -m tools.uefi.scan_image -a generate,list_of_variables.json,firmware.bin, где list_of_variables.json — файл, в который будет записан результат выполнения команды, а firmware.bin — дамп эталонной прошивки.  После получения данных об эталоне можно проводить сравнение с помощью команды python chipsec_main.py -i -m tools.uefi.scan_image -a check,list_of_variables.json,suspected_firmware.bin, гдеsuspected_firmware.bin — имя файла дампа проверяемой прошивки. Как мы уже сказали, утилиту Chipsec можно использовать из ОС. Для этого нужно установить драйвер Chipsec, после чего можно запускать .py-файлы с помощью интерпретатора Python. Таким образом можно автоматизировать сбор образов прошивок для их дальнейшего анализа.  В этом разделе уделим немного внимания тому, как детектировать заражение прошивки Mosaic Regressor’ом на уровне операционной системы. После загрузки операционной системы полезная нагрузка Mosaic Regressor'а — файл IntelUpdate.exe — ведёт себя как самая обычная вредоносная программа. Для её детектирования можно использовать данные, полученные при анализе EFI-файлов — хеш файла, сохраняемого в %PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup, его имя и прочие индикаторы. Однако стоит отметить, что поиск события создания файла не увенчается успехом, поскольку файл создается до загрузки ОС, а значит, событие не будет обнаружено с помощью EDR или аналогичных решений (одним из вариантов детектирования создания файлов видится сохранение информации о состоянии файловой системы перед выключением или гибернацией компьютера и сравнение сохраненного состояния с состоянием после загрузки ОС). Аналогичная ситуация наблюдается с файлом %WINDIR%\setupinf.log, который используется Mosaic Regressor’ом как дополнительный индикатор заражения — наряду с переменной UEFI. Файл IntelUpdate.exe будет сохранен, только если файла setupinf.log не существует. С помощью следующего запроса в Huntbox можно обнаружить следы запуска полезной нагрузки, которую сохранил EFI-модуль Mosaic Regressor'а: event_type: "Process creation" AND Payload.CommandLine: "Microsoft\Windows\Start Menu\Programs\Startup\IntelUpdate.exe" Файл IntelUpdate.exe создается с немодифицированными временными атрибутами, поэтому если вы видите запуск файла из автозагрузки без событий созданий этого файла, то это хороший повод для проведения дальнейшего исследования.  Все создаваемые файлы в автозагрузке следует проверять в песочницах или системах детонации вредоносных файлов. В нашем случае Huntpoint отправит файлы на анализ в Polygon, где он будет обнаружен как вредоносный, и, как следствие, запуск этого файла будет блокироваться на всех хостах.  Использование комбинации систем класса EDR и Malware Detonation — достаточно универсальное решение, но не всегда есть возможность устанавливать агенты на всех рабочих местах. В этом случае поможет анализ сетевого трафика на наличие соединений с уже известными вредоносными хостами.  А таким образом можно проверить наличие сетевых соединений с сервером, отдающим полезную нагрузку: event_type: "Network connection opening"  AND Payload.RemoteAddress: "103.56.115.69" dns_query: "myfirewall.org" Для более эффективного обнаружения таких угроз в трафике необходимы качественные индикаторы. Для этих целей в Group-IB мы создали систему External Threat Hunting, которая позволяет выявлять аналогичную инфраструктуру атакующих за счет анализа уже известных вредоносных хостов. Все новые найденные хосты автоматически конвертируются в правила для обнаружения этой угрозы в сетевом трафике. Более расширенный список сетевых индикаторов мы приводим в конце, в разделе «Индикаторы».  Существует 3 варианта заражения UEFI: Удалённое заражение. Заражение при наличии физического доступа. Заражение через цепочку поставок. Для удалённого заражения атакующему надо получить повышенные привилегии, позволяющие установить полезную нагрузку, которая будет работать на уровне ядра ОС. После этого он должен проэксплуатировать уязвимость SMM (например, такую). Это позволит исполнять код в режиме SMM, обходить различные механизмы защиты прошивки (Flash Write Protection) и получить прямой доступ к памяти прошивки. В случае заражения при наличии физического доступа злоумышленник может проэксплуатировать ошибки в конфигурации UEFI (например, такие) или механизме обновления прошивки.  В случае заражения цепочки поставок преступник может добавить собственный имплант в прошивку или её обновление, что позволит обойти существующие методы защиты. Для подобной атаки необходимо скомпрометировать производителя и, например, получить доступ к исходным кодам прошивки. Утилиту Chipsec также можно использовать для базовой проверки UEFI на предмет неправильной конфигурации или наличия уязвимостей. Для этого достаточно запустить основной модуль командой python chipsec_main.py, которая запустит различные проверки безопасности, например, проверку на защиту от перезаписи. Следует отметить, что успешное прохождение данного теста не значит, что ваша система не заражена, поскольку Chipsec предоставляет лишь базовый набор проверок безопасности. Однако провал теста свидетельствует о том, что нужно как минимум поставить последние обновления UEFI или разобраться, почему базовые механизмы безопасности прошивки нарушены. Угрозы UEFI являются одними из самых серьезных, и индустрия безопасности только начинает адаптировать свои решения для качественного обнаружения этих угроз.  Точно не стоит ждать серебряной пули или уповать на встроенные механизмы доверенной загрузки операционной системы. Чтобы защитить свою инфраструктуру и эффективно охотиться за такими угрозами, необходимо использовать данные киберразведки. Кроме коммерческих продуктов, реализующих компенсационные меры, можно использовать и бесплатные аналоги, например, Chipsec, которая расширяет возможности охоты по индикаторам и позволяет проверять правильность конфигурации UEFI. Нужно больше информации? Подпишитесь на остросюжетный Telegram-канал Group-IB (https://t.me/Group_IB) об информационной безопасности, хакерах, APT, кибератаках, мошенниках и пиратах. Расследования по шагам, практические кейсы с применением технологий Group-IB и рекомендации, как не стать жертвой. Подключайтесь! Имя модуля GUID MD5 РЕ-файла из EFI_SECTION_PE32-секции SmmInterfaceBase F50258A9-2F4D-4DA9-861E-BDA84D07A44C F5B320F7E87CC6F9D02E28350BB87DE6 Ntfs F50258A9-2F4D-4DE9-86AE-BDA84D07A41C DD8D3718197A10097CD72A94ED223238 SmmReset EAEA9AEC-C9C1-46E2-9D52-432AD25A9B0C 91A473D3711C28C3C563284DFAFE926B SmmAccessSub EAEA9AEC-C9C1-46E2-9D52-432AD25A9B0B 0C136186858FD36080A7066657DE81F5 9F13636D5861066835ED5A79819AAC28 FA0A874926453E452E3B6CED045D2206 72C514C0B96E3A31F6F1A85D8F28403C 0D386EBBA1CCF1758A19FB0B25451AFE B53880397D331C6FE3493A9EF81CD76E 7B213A6CE7AB30A62E84D81D455B4DEA A69205984849744C39CFB421D8E97B1F 08ECD8068617C86D7E3A3E810B106DCE 89527F932188BD73572E2974F4344D46 9E182D30B070BB14A8922CFF4837B94D 61B4E0B1F14D93D7B176981964388291 7908B9935479081A6E0F681CCEF2FDD9 3D2835C35BA789BD86620F98CBFBF08B 1732357D3A0081A87D56EE1AE8B4D205 233B300A58D5236C355AFD373DABC48B 36B51D2C0D8F48A7DC834F4B9E477238 DC14EE862DDA3BCC0D2445FDCB3EE5AE 0EFB785C75C3030C438698C77F6E960E 1C5377A54CBAA1B86279F63EE226B1DF 328AD6468F6EDB80B3ABF97AC39A0721 AE66ED2276336668E793B167B6950040 E2F4914E38BB632E975CFF14C39D8DCD C63D3C25ABD49EE131004E6401AF856C 12B5FED367DB92475B071B6D622E44CD B23E1FE87AE049F46180091D643C0201 7C3C4C4E7273C10DBBAB628F6B2336D8 3B58E122D9E17121416B146DAAB4DB9D 70DEF87D180616406E010051ED773749 88750B4A3C5E80FD82CF0DD534903FC0 D273CD2B96E78DEF437D9C1E37155E00 3B3BC0A2772641D2FC2E7CBC6DDA33EC AFC09DEB7B205EADAE4268F954444984 6E949601EBDD5D50707C0AF7D3F3C7A5 92F6C00DA977110200B5A3359F5E1462 D197648A3FB0D8FF6318DB922552E49E 74DB88B890054259D2F16FF22C79144D 449BE89F939F5F909734C0E74A0B9751 67CF741E627986E97293A8F38DE492A7 CFB072D1B50425FF162F02846ED263F9 %PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup \IntelUpdate.exe %TEMP%\RepairC.dll %APPDATA%\Microsoft\Windows\SendTo\load.dll %APPDATA%\Microsoft\Windows\load.rem %APPDATA%\Microsoft\Internet Explorer\FileD.dll %TEMP%\wrtreg_32.dll %APPDATA%\Microsoft\Internet Explorer\FileOutA.dat %APPDATA%\Microsoft\Internet Explorer\%Computername%.dat %COMMON_APPDATA%\Microsoft\Windows\user.rem %TEMP%\RepairB.dll %APPDATA%\sdfcvb.dll %TEMP%\RepairA.dll %APPDATA%\Microsoft\subst.tbl %appdata%\return.exe %APPDATA%\Microsoft\Windows\SendTo\cryptui.sep %appdata%\dwhost.exe %appdata%\msreg.exe %APPDATA%\newplgs.dll %APPDATA%\Microsoft\Windows\LnkClass.dat %APPDATA%\Microsoft\Internet Explorer\FileB.dll %APPDATA%\rfvtgb.dll %APPDATA%\Microsoft\Network\DFileC.dll %APPDATA%\Microsoft\Internet Explorer\FileA.dll %APPDATA%\Microsoft\exitUI.rs %APPDATA%\Microsoft\Network\subst.sep %APPDATA%\Microsoft\Network\DFileD.dll %TEMP%\BeFileA.dll %APPDATA%\Microsoft\Network\DFileA.dll %APPDATA%\Microsoft\sppsvc.tbl %APPDATA%\msreg.dll %TEMP%\wrtreg_64.dll %APPDATA%\Microsoft\Internet Explorer\FileC.dll %APPDATA%\Microsoft\WebC.dll %appdata%\winword.exe %APPDATA%\Microsoft\Windows\mapisp.dll %APPDATA%\Microsoft\WebB.dll %APPDATA%\Microsoft\WebA.dll %APPDATA%\Microsoft\Credentials\MSI36C2.dat %TEMP%\BeFileC.dll %TEMP%\RepairD.dll  set instance state single UI Office Module foregrounduu state process attach Module Известные индикаторы Дополнительные индикаторы от Group-IB External Threat Hunting menjitghyukl.myfirewall[.]org 103[.]39[.]109[.]252 117[.]18[.]4[.]6 103[.]229[.]1[.]26 43[.]252[.]228[.]252 103[.]82[.]52[.]18 103[.]195[.]150[.]106 43[.]252[.]230[.]180 43[.]252[.]228[.]179 144[.]48[.]241[.]32 43[.]252[.]228[.]84 150[.]129[.]81[.]21 43[.]252[.]228[.]75 103[.]30[.]40[.]116 103[.]39[.]109[.]239 103[.]243[.]26[.]211 103[.]56[.]115[.]69 103[.]39[.]110[.]193 103[.]243[.]24[.]171 103[.]30[.]40[.]39 144[.]48[.]241[.]167 103[.]215[.]80[.]1 103[.]229[.]126[.]101 103[.]229[.]126[.]246 103[.]39[.]109[.]231 103[.]56[.]113[.]61 103[.]96[.]72[.]148 103[.]96[.]74[.]144 122[.]10[.]82[.]30 144[.]48[.]240[.]101 144[.]48[.]240[.]145 185[.]216[.]117[.]91 212[.]64[.]6[.]161 216[.]241[.]155[.]120 43[.]224[.]248[.]143 43[.]251[.]17[.]187 43[.]252[.]229[.]32 43[.]252[.]229[.]33 43[.]252[.]230[.]146 43[.]252[.]231[.]135 45[.]116[.]78[.]238 45[.]116[.]79[.]186 45[.]64[.]75[.]178 52[.]174[.]139[.]136 69[.]6[.]23[.]85 Тактика Техника Описание Методы защиты и противодействия Продукты Group-IB, позволяющие защититься от подобных угроз Persistence/Defence Evasion T1542.001 - Pre-OS Boot: System Firmware  Модули SmmInterfaceBase, Ntfs, SmmReset и SmmAccessSub являются частью UEFI и выполняются перед загрузкой ОС M1046 - Boot Integrity M1026 - Privileged Account Management M1051 - Update Software  Persistence T1547.001 - Registry Run Keys / Startup Folder Файл IntelUpdate.exe сохраняется в директорию %PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup EFI-приложением SmmAccessSub  Threat Hunting Framework Execution T1559.001 - Inter-Process Communication: Component Object Model   Файл IntelUpdate.exe использует COM-библиотеки M1048 - Application Isolation and Sandboxing M1026 - Privileged Account Management Threat Hunting Framework Defense Evasion T1197 - BITS Jobs Mosaic Regressor использует BITS для получения и передачи данных M1037 - Filter Network Traffic M1028 - Operating System Configuration M1018 - User Account Management Threat Hunting Framework Defense Evasion T1027 - Obfuscated Files or Information  Часть строк в файле IntelUpdate.exe зашифрованы M1049 - Antivirus/Antimalware Threat Hunting Framework Command and Control T1105 - Ingress Tool Transfer  Файл IntelUpdate.exe скачивает DLL-файлы и вызывает в них функции CallA, CallB, CallC, CallD и CallE M1031 - Network Intrusion Prevention Threat Hunting Framework