
Доказательство концепции Intel Management Engine JTAG
Вся информация предоставлена исключительно в образовательных целях. Следуйте этим инструкциям на свой страх и риск. Ни авторы, ни их работодатель не несут ответственности за любой прямой или косвенный ущерб или убытки, возникшие в результате действий или бездействия любого лица или организации на основе информации, содержащейся на этой странице.
Введение
Необходимое программное обеспечение
Генерация полезной нагрузки
Генерация токена разблокировки
Подготовка образа SPI Flash
Интеграция файлов в образ прошивки
Отключение подписи OEM
Сборка образа прошивки
Запуск основного CPU
Запись образа в SPI Flash
Подготовка USB-отладочного кабеля
Патчинг конфигурационных файлов OpenIPC
Расшифровка конфигурационных файлов OpenIPC
Добавление ядра LMT в конфигурацию
Установка переменной окружения IPC_PATH
Первичная проверка работоспособности JTAG
Отображение потока CPU ME
Остановка ядер
Отладка ME: краткое руководство
Чтение произвольной памяти
Чтение ROM
Почему TXE?
Список протестированных платформ
Авторы
Лицензия
Уязвимость INTEL-SA-00086 позволяет активировать JTAG для ядра Intel Management Engine. Мы разработали наш JTAG PoC для платформы Gigabyte Brix GP-BPCE-3350C. Хотя мы рекомендуем будущим исследователям использовать ту же платформу, платформы других производителей с чипсетом Intel Apollo Lake также должны поддерживать PoC (для версии TXE 3.0.1.1107).
Уязвимость INTEL-SA-00086 связана с переполнением буфера при обработке файла, хранящегося в MFS (внутренняя файловая система ME). Полный путь к файлу — /home/bup/ct. Вам потребуется интегрировать его в прошивку ME с помощью Intel Flash Image Tool (FIT) — одной из утилит Intel System Tools, предоставляемых Intel OEM-производителям оборудования на базе чипсетов Intel PCH. Вот структура корневого каталога пакета Intel System Tools:

Утилиты Intel ME (TXE, SPS) System Tools не предназначены для конечных пользователей, поэтому вы не найдете их на официальном сайте Intel. Однако некоторые OEM-производители публикуют их в составе обновлений программного обеспечения вместе с драйверами устройств. Итак, для интеграции нашего PoC вам понадобятся Intel TXE System Tools версии 3.x, которые можно найти в интернете.
Вам необходимо установить Intel System Studio, пробную версию которого можно загрузить с сайта Intel. В наших экспериментах мы использовали Intel System Studio 2018.
PoC нацелен на прошивку Intel TXE версии 3.0.1.1107. Образ SPI Flash для Gigabyte GB-BPCE-3350C версии F5 содержит необходимую версию прошивки.
Все наши скрипты написаны на Python. Мы рекомендуем использовать Python 2.7. Кроме того, скриптам требуется пакет pycrypto. Чтобы установить pycrypto, выполните следующую команду:
pip install pycrypto
Эта утилита необходима только в том случае, если вам нужно запустить CPU.
EFI Human Interface Infrastructure (HII) — это специальный механизм для создания пользовательского интерфейса в UEFI, а также обработки и управления пользовательским вводом. EFI HII определяет значения по умолчанию для всех опций, включая скрытые. Как только опция, связанная с DCI, найдена, её можно активировать в конфигурации по умолчанию, а DCI можно включить, восстановив заводские настройки BIOS. Для запуска основного CPU вам понадобится AMI BIOS Configuration Program версии 5.xx, которую также можно найти в интернете.
Запустите скрипт me_exp_bxtp.py:
me_exp_bxtp.py -f <file_name>
Скрипт генерирует необходимые данные и экспортирует их в указанный файл (укажите либо полный путь к файлу, либо, в пределах текущего каталога, просто имя; по умолчанию — ct.bin). Этот файл будет использоваться позднее программой FIT.
Запустите скрипт me_utok_bxtp.py:
me_utok_bxtp.py -f <file_name>
Скрипт генерирует необходимые данные и экспортирует их в указанный файл (укажите либо полный путь к файлу, либо, в пределах текущего каталога, просто имя; по умолчанию — utok.bin). Этот файл будет использоваться позднее программой FIT.
Пропустите этот шаг, если вам не нужно запускать CPU.
Чтобы активировать опцию DCI Enable, запустите утилиту AMIBCP и откройте в ней образ SPI-прошивки, поставляемый с вашей платформой. Для Gigabyte Brix GP-BPCE-3350C откройте файл, загруженный по указанной выше ссылке Gigabyte (путь к файлу образа в архиве: F5/image.bin).

Теперь нужно включить опцию HDCIEN на вкладке Setup Configuration.
Чтобы интегрировать файлы ct.bin и utok.bin, запустите утилиту FIT (fit.exe) и откройте в ней образ SPI-прошивки.

Если вы используете другую аппаратную платформу и у вас нет доступа к TXE 3.0.1.1107, вы можете загрузить образ SPI Flash для Gigabyte GB-BPCE-3350C версии F5 и извлечь раздел TXE через FIT. FIT при открытии образа извлекает различные разделы общего образа SPI (SPI-дескриптор, прошивку UEFI/BIOS, прошивку Intel ME и токен разблокировки) и сохраняет их в папке *"image_name"/Decomp *.

Таким образом, вы можете найти файл с необходимой прошивкой Intel TXE по пути /Decomp/TXE Region.bin Затем в FIT откройте образ SPI для вашей конкретной платформы и замените файл, содержащий прошивку Intel TXE, версией, полученной из образа GB Brix 3350c (поле "Intel(R) TXE Binary File" на вкладке Flash Layout):

Теперь нам нужно указать в FIT файлы, которые мы сгенерировали для /home/bup/ct и Unlock Token. На вкладке Debug в FIT можно указать Trace Hub Binary и Unlock Token для интеграции в прошивку. Это должны быть уже созданные нами файлы.

Просто удалите поле OEM Public Key Hash в FIT:

Соберите образ, выбрав Build Image в меню Build.

Проигнорируйте сообщение о настройках BootGuard (нажмите «Yes»):

Если к этому моменту всё было сделано правильно, процесс сборки должен завершиться успешно, и FIT выведет примерно такое консольное сообщение:

Пропустите этот шаг, если вам не нужно запускать CPU.
Для запуска CPU необходимо активировать режим HAP. Должен быть установлен 0-й бит байта по смещению +0x102:

Для записи образа в SPI flash настоятельно рекомендуем использовать программатор SPI.
Обязательно сделайте резервную копию исходной прошивки, чтобы можно было восстановить её в случае сбоя!
Для подключения к платформе вам понадобится отладочный кабель USB 3.0. Либо купите специально изготовленный для этой цели кабель, либо соберите свой собственный из кабеля USB 3.0 AM–AM, изолировав контакты D+, D- и Vcc.

Intel разрабатывает и предоставляет пользователям два программных пакета, которые можно использовать для JTAG-отладки платформ и основного CPU: DAL (DFx Abstraction Layer) и OpenIPC. И DAL, и OpenIPC входят в состав Intel System Studio. После установки Intel System Studio 2018 OpenIPC находится в следующем каталоге:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
Конфигурация OpenIPC зашифрована и не поддерживает ядро TXE. Поэтому расшифруйте конфигурацию и добавьте в неё описание TXE.
Чтобы расшифровать конфигурационные файлы, извлеките ключ из библиотеки StructuredData (Linux: libStructuredData_x64.so, Windows: StructuredData_x64.dll) в каталоге OpenIPC/Bin с помощью скрипта openipc_key_extract.py для IDA Pro. Передайте ключ (в нашем случае 4504fb02be0a9c4c84df2a89cf508bc3) скрипту config_decryptor.py вместе с путём к каталогу OpenIPC.
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
Поставляемая версия OpenIPC не содержит необходимой информации о ядре TXE. Поэтому нам нужно применить патч (patch.diff) к расшифрованным конфигурационным файлам OpenIPC. Вот как это сделать:
patch -p2 < patch.diff
После расшифровки и патчинга установите переменную окружения IPC_PATH в новый каталог OpenIPC, чтобы ipccli использовал модифицированную версию OpenIPC. Например:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
Активатор блокирует последующую загрузку, удерживая процесс BUP в цикле после активации JTAG. После запуска платформа не будет подавать признаков жизни (монитор не включается, индикаторы клавиатуры не загораются, звуковой сигнал BIOS POST не воспроизводится). Поэтому вам нужно будет проверить с помощью отладки DCI, что платформа «застряла» в модуле BUP.
Как и DAL, библиотека OpenIPC включает интерфейс командной строки (CLI), написанный на Python и предоставляемый в виде библиотеки для Python в составе Intel System Studio, который можно установить в систему с помощью pip. Установочный пакет для ipccli находится по следующему пути: Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl
Чтобы установить ipccli, выполните следующую консольную команду:
pip install ipccli-1.1740.544.100-py2.py3-none-any.whl
После установки ipccli доступен в среде выполнения соответствующей версии Python (той, из которой был вызван pip). Чтобы начать работу с OpenIPC, выполните в консоли Python следующие команды:
import ipccli
ipc = ipccli.baseaccess()
Механизм подключения к целевой платформе через DCI запускается, и в результате появляется следующее консольное сообщение:

Если подключение не устанавливается — например, платформа не включена или не подключена физически через DCI, — сообщения будут выглядеть примерно так:

Если подключение DCI успешно, убедитесь, что регистр PERSONALITY устройства DFX_AGGRAGATOR равен 3. Регистр PERSONALITY имеет код IR (Instruction Register), равный 0x54. Чтобы прочитать его, выполните следующие команды:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
Вот как должен выглядеть результат выполнения этой команды:

Утилита ipccli поставляется с довольно подробной HTML-документацией, которую можно найти в папке Python-пакета ipccli:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
Если предыдущие шаги выполнены правильно, то при подключении к платформе через ipccli ядро TXE доступно через CSE Tap, и ipccli позволяет получить к нему доступ, применив следующий путь ipccli:
ipc.devs.cse_c0.threads[0]
Но поскольку PoC блокирует загрузку платформы до инициализации основного CPU, его ядра недоступны через JTAG, и к ядру ME можно обратиться с помощью следующей команды:
ipc.threads[0]
Чтобы остановить выполнение инструкций процессора ME, выполните следующую команду:
me = ipc.devs.cse_c0.threads[0]
me.halt()
Чтобы остановить выполнение инструкций процессора CPU, выполните следующую команду:
core = ipc.threads[0]
core.halt()

В консоли отображается логический адрес инструкции, на которой была выполнена остановка.
OpenIPC позволяет читать память после остановки, например:
ipc.threads[0].mem("0xf0080004P", 4)
Можно указать логический адрес (sel:offset), линейный адрес (модификатор L) или физический адрес (модификатор P).
Системный агент ME (MISA) позволяет получить начальный физический адрес области ROM, которая включает вектор сброса ME. Вы можете получить адрес ROM через регистр Hunit ROM Memory Base (HROMMB) по смещению 0xe20 MISA MMIO (0xf0000000P):

ROM всегда располагается от ROMBASE до 0xffffffff. Чтобы скопировать ROM в файл, выполните следующую команду:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
Важно указать размер как 0x20001, а не 0x20000 (в противном случае OpenIPC сталкивается с проблемами из-за 64-битного доступа, который невозможен для 32-битного ядра ME). Последний байт файла можно отбросить, поскольку он не является частью ROM.
Платформа даёт больше возможностей для отладки без специального адаптера Intel CCA-SVT и позволяет отлаживать самые ранние стадии ядра TXE с помощью обычного отладочного кабеля USB.
Intel ME: путь статического анализа
Intel ME: объяснение файловой системы Flash
Как взломать выключенный компьютер или запустить неподписанный код в Intel Management Engine
Внутри Intel Management Engine
Отключение Intel ME 11 через недокументированный режим
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy at Positive Technologies
Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации (далее — «Программное обеспечение»), без ограничений использовать Программное обеспечение, включая, без ограничений, права на использование, копирование, изменение, слияние, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий: указанное выше уведомление об авторских правах и данное разрешение должны быть включены во все копии или значительные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КАКИЕ-ЛИБО ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В РЕЗУЛЬТАТЕ ИСПОЛНЕНИЯ ДОГОВОРА, ГРАЖДАНСКОГО ПРАВОНАРУШЕНИЯ ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ЕГО ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С НИМ.