Принцип «безопасность через неясность» не один год критикуется специалистами, но это не мешает крупным производителям электроники под предлогом защиты интеллектуальной собственности требовать подписания соглашений о неразглашении для получения технической документации. Ситуация ухудшается из-за возрастающей сложности микросхем и интеграции в них различных проприетарных прошивок. Это фактически делает невозможным анализ таких платформ для независимых исследователей, что ставит под удар как обычных пользователей, так и производителей оборудования.
Примером может служить технология Intel Management Engine (Intel ME), а также ее версии для серверных (Intel SPS) и мобильных (Intel TXE) платформ (подробнее об этой технологии см. [5], [6]. В этой статье мы расскажем, как используя недокументированные команды (если термин «документированный» вообще применим к Intel ME), можно перезаписать память SPI flash и реализовать самый страшный сценарий — локальную эксплуатацию уязвимости в ME (INTEL-SA-00086). Корнем данной проблемы оказался недокументированный режим работы Intel ME — Manufacturing Mode.
Что такое Manufacturing Mode
Intel ME Manufacturing Mode — сервисный режим работы, предназначенный для конфигурирования, настройки и тестирования конечной платформы на стадии производства; он обязательно должен быть отключен перед поступлением оборудования в продажу и отгрузкой пользователю. Ни этот режим, ни его потенциальные риски не описаны в публичной документации Intel. Обычный пользователь не имеет возможности выключить его самостоятельно, так как утилита для управления им из пакета Intel ME System Tools официально не доступна. Отметим, что никакие программные средства защиты не способны защитить пользователя, в случае если этот режим оказался включенным, или хотя бы оповестить его об этом. Даже утилита Chipsec [2], которая специально предназначена для выявления ошибок конфигурации чипсета и процессора на уровне прошивки UEFI (в частности, неправильного конфигурирования прав доступа к регионам SPI flash), ничего не знает об Intel Manufacturing Mode.
Этот режим позволяет задавать критически важные параметры платформы, хранящиеся в однократно записываемой памяти (FUSES). Примером таких параметров, которые «зашиваются» во FUSES, являются параметры BootGuard (режим, политики, контрольная сумма ключа цифровой подписи для модулей ACM и UEFI). Часть из них называются FPF (Field Programmable Fuses). Список FPF, которые могут быть записаны в FUSES (неполный, на самом деле ряд FPF нельзя задать напрямую), можно получить через утилиту FPT (Flash Programming Tool) из пакета Intel ME System Tools.
Рис 1. Результат работы опции –FPFs утилиты FPT
Следует отметить, что на долю FPFs приходится лишь часть общего массива FUSE, а большая часть этой памяти используется самой Intel для хранения множества параметров платформы. Например, часть пространства этого массива называется IP Fuses и предназначена для хранения конфигурационных параметров отдельных аппаратных модулей (Intelligent Property). Так, специальное устройство DFx Aggregator хранит во FUSE признак того, является ли платформа серийной или тестовой.
Помимо FPF, в Manufacturing Mode производитель оборудования имеет возможность задавать параметры прошивки Intel ME, которые хранятся во внутренней файловой системе прошивки — MFS, на носителе SPI flash. Эти параметры могут быть изменены в случае перепрограммирования SPI flash. Они носят название CVARs (Configurable NVARs, Named Variables).
За установку CVARs отвечает модуль прошивки Intel ME — mca_server. MCA — это аббревиатура Manufacture-Line Configuration Architecture, общего названия процесса конфигурации платформы на этапе производства. CVARs, так же как и FPF, могут быть заданы и прочитаны с использованием FPT.
Рис 2. Список CVARs, выводимых утилитой FPT для платформы Broxton P
Список переменных CVARs зависит от платформы и версии прошивки Intel ME. Для чипсетов, поддерживающих технологию Intel AMT, одной из таких переменных является пароль для входа в MEBx (ME BIOS Extension).
Установка FPFs и практически всех переменных CVARs возможна только в том случае, если прошивка Intel ME функционирует в Manufacturing Mode. Сам процесс установки FPFs разделен на два этапа: задание значений FPFs (которые сохраняются во временную память) и перенос значений FPFs в массив фьюзов. При этом первый этап возможен только в Manufaturing Mode, а реальный «прожиг» происходит автоматически, после выхода из Manufacturing Mode, если во время работы в этом режиме производитель задал значения FPF и при этом соответствующий диапазон в массиве фьюзов еще никогда не записывался. Таким образом, если система функционирует в Manufacturing Mode, переменные FPF, скорее всего, не инициализированы.
Признак отключения Manufacturing Mode хранится в файле /home/mca/eom на MFS, таким образом при перезаписи SPI flash прошивкой c базовой файловой системой (подробнее в [9]) платформа имеет возможность опять функционировать в Manufacturing Mode (но перезаписать FUSES уже не получится).
OEM public key
Таким образом, процедура конфигурации платформ Intel довольно сложна и состоит из нескольких этапов. Если производитель оборудования нарушил или изменил последовательность, то платформа подвергается серьезному риску. Даже если Manufacturing Mode завершен, производитель мог не записать FUSES, что даст возможность злоумышленнику сделать это за него, записав свои значения вместо ключа для подписи стартового кода модулей BootGuard (AСM) и UEFI и таким образом позволив загружаться платформе только с его вредоносным кодом, причем на постоянной основе. Это приведет к безвозвратной потере оборудования, так как мошеннический ключ будет прописан в постоянную память, навсегда (подробности этой атаки можно найти в исследовании Александра Ермолова «Safeguarding rootkits: Intel BootGuard» [8]).
В новых системах (Apollo Lake, Gemini Lake, Cannon Point) в FPF хранится не только ключ для BootGuard, но и открытый ключ OEM (вернее, SHA-256 от RSA OEM public key), на который опираются сразу несколько механизмов защиты ME. Например, в специальном разделе SPI flash, называемом Signed Master Image Profile (SMIP), хранятся заданные производителем PCH Straps (аппаратная конфигурация PCH). Этот раздел подписан на ключе, SHA-256 от которого помещен в специальный файл на SPI flash. Этот файл называет oem.key, находится в разделе FTPR и содержит разные публичные ключи, поставляемые OEM, для подписи самых разных данных. Приведем полный список наборов данных, которые подписываются производителем, каждый на уникальном ключе, для платформы Cannon Point:
Рис 3. Список подписываемых OEM данных платформы CNP
Сам файл oem.key подписан общим корневым ключом OEM, хеш-сумма которого должна быть записана в FPFs.
Рис 4. OEM Signing
Обход блокировки записи в ME-регион
До недавнего времени (до Intel Apollo Lake) прошивка Intel ME находилась в отдельном SPI-регионе, который имел независимые права доступа для CPU, GBE и ME. Таким образом, при правильной конфигурации атрибутов доступа со стороны CPU (основной системы) невозможно было ни прочитать, ни записать прошивку ME. Однако современные SPI-контроллеры чипсетов Intel, имеют специальный механизм Master Grant. Эта технология закрепляет за каждым SPI-мастером строго определенную часть SPI flash, этот мастер является владельцем своего региона, вне зависимости от прав доступа указанных в SPI-дескрипторе. Каждый мастер имеет возможность предоставить доступ (на чтение или на запись) к своему (и только своему) региону другому мастеру, какому пожелает.
Рис 5. Отрывок документации Intel, описывающий SPI Master Grant
Таким образом, даже если в SPI-дескрипторе прописан запрет на доступ к SPI-региону ME со стороны хоста, ME может все равно предоставить доступ к своим данным. На наш взгляд, это сделано для возможности обновления прошивки Intel ME в обход стандартного алгоритма.
Host ME Region Flash Protection Override
В прошивке Intel ME реализована специальная HECI-команда, которая позволяет открыть доступ на запись к ME-региону SPI со стороны CPU. Она называется HMR FPO (Host ME Region Flash Protection Override). В одном из наших предыдущий исследований мы подробно описывали эту команду [5]. У нее есть несколько особенностей.
После получения команды HMR FPO прошивка откроет доступ к своему региону только после перезагрузки. В самом МЕ также предусмотрена защита: команда воспринимается только в период выполнения UEFI BIOS, до так называемого момента End of Post (EOP). EOP — это еще одна HECI-команда, которую посылает UEFI BIOS до передачи управления операционной системе (ExitBootServices). В некоторых BIOS Setup можно найти опцию, которая и обеспечивает отправку команды HMRFPO до EOP.
Рис 6. Открытие ME-региона в BIOS
После получения EOP прошивка ME игнорирует HMR FPO, возвращая соответствующий статус. Но это происходит только после завершения режима Manufacturing Mode. Таким образом, прошивка ME в Manufacturing Mode воспринимает HMR FPO в любое время, вне зависимости от End of Post. Если производитель не закрыл режим Manufacturing Mode, злоумышленник (формально говоря, для этого нужны права администратора, но ведь даже ядро ОС изначально не может перезаписывать прошивку ME) может в любое время изменить прошивку ME. На этом этапе атакующий может перезаписывать образ МЕ, например для эксплуатации уязвимости INTEL-SA-00086. При этом возникает необходимость перезагрузки, но это не является помехой на практически всех платформах, кроме MacBook. Именно на компьютерах Apple существует дополнительная проверка в UEFI, которая осуществляется в момент старта и блокирует запуск системы, если регион ME открыт с помощью HMRFPO. Однако, как мы покажем далее, этот механизм защиты преодолевается, если прошивка ME функционирует в Manufacturing Mode.
Перезагрузка ME без перезагрузки основного CPU
В современных компьютерах существует несколько вариантов перезагрузки платформы. Из них задокументированы: глобальная перезагрузка и перезагрузка только основного CPU (без перезагрузки ME). Однако, если существует способ перезагрузить МЕ без перезагрузки основного CPU (предварительно выполнив также команду HMRFPO), доступ к региону откроется, а основная система продолжит функционировать.
Рис 7. Управление типом перезагрузки
Исследовав внутренние модули прошивки ME, мы обнаружили, что существует HECI-команда («80 06 00 07 00 00 0b 00 00 00 03 00», подробнее об отправке команд см. [5]) для перезагрузки только (!) ядра Intel ME, которая в Manufacturing Mode может быть послана также в любое время, даже после EOP.
Рис 8. Листинг дизассемблера функции, выполняющей обработку HECI-команд перезагрузки ME
Таким образом, злоумышленник, послав эти две HECI-команды, открывает ME-регион и может писать туда любые данные, без перезагрузки платформы. При этом совершенно неважно, чтó содержит SPI-дескриптор, то есть правильные атрибуты защиты SPI-регионов не защищают прошивку ME от изменения, если система функционирует в Manufacturing Mode.
Практический случай: уязвимость CVE-2018-4251
Мы проанализировали несколько платформ разных производителей. Среди них были ноутбуки компании Lenovo и Apple MacBook Prо. В исследованных компьютерах из линейки Yoga и ThinkPad мы не нашли каких-либо проблем, связанных с Manufacturing Mode, зато ноутбуки компании Apple, основанные на чипсетах Intel, функционируют в Manufacturing Mode. После передачи этой информации в компанию Apple данная ошибка (CVE-2018-4251) была исправлена в обновлении ОС macOS High Sierra 10.13.5.
Локальная эксплуатация INTEL-SA-00086
Итак, используя уязвимость CVE-2018-4251, злоумышленник может записывать старые версии прошивки ME, содержащие уязвимость INTEL-SA-00086, и при этом ему не нужен ни SPI-программатор, ни доступ к перемычке HDA_SDO (то есть физический доступ). Таким образом реализуется самый опасный — локальный — вектор этой уязвимости (выполнение произвольного кода в прошивке ME). Примечательно, что в пояснениях к бюллетеню безопасности INTEL-SA-00086 Intel не упоминает открытый Manufacturing Mode как средство для эксплуатации данной уязвимости локально, без физического доступа, а говорит лишь о том, что локальная эксплуатация возможна только при неправильной настройке доступа к SPI-регионам, что не соответствует действительности. Для защиты пользователей мы решили описать, как проверить наличие Manufacturing Mode и как его отключить.
Как защититься
В пакет системных утилит для разработчиков оборудования на основе чипсетов и процессоров Intel (Intel System Tools) входит утилита MEInfo (TXEInfo, SPSInfo для мобильных и серверных платформ соответственно), которая предназначена для того, чтобы получить расширенную диагностическую информацию о текущем состоянии прошивки Management Engine и всей платформы в целом. Мы демонстрировали эту утилиту в одном из наших предыдущих исследований, посвященном отключению ME и недокументированному режиму HAP (High Assurance Platform) [6]. Эта утилита, вызванная с флагом –FWSTS, выдает подробное описание статусных HECI-регистров и сообщает статус Manufacturing Mode (установленный 4-й бит статусного регистра FWSTS сигнализирует о том, что Manufacturing Mode активен).
Рис 9. Пример вывода утилиты MEInfo
Мы также разработали программу [7], с помощью которого можно проверить статус Manufacturing Mode, если у пользователя по какой-либо причине нет доступа к Intel ME System Tools.
Рис 10. Пример работы скрипта mmdetect
Возникает вопрос, как самостоятельно завершить Manufacturing Mode, если оказалось так, что производитель не сделал этого. Для завершения Manufacturing Mode утилита FPT имеет специальную опцию, –CLOSEMNF, которая, кроме своего основного назначения, также позволяет установить рекомендуемые права доступа к регионам SPI flash в дескрипторе.
Рис 11. Результат работы утилиты FTP с опцией –CLOSEMNF
В данном примере мы использовали параметр NO опции –CLOSEMNF для того, чтобы не выполнять перезагрузку платформы, которая производится по умолчанию сразу после завершения Manufacturing Mode.
Заключение
Наше исследование показывает, что проблема Manufacturing Mode прошивки Intel ME существует и даже такие крупные производители, как Apple, способны ошибаться при конфигурации платформ Intel. Хуже всего, что нет никакой публичной информации на эту тему и конечные пользователи даже не догадываются о такой серьезной проблеме, способной привести к потере конфиденциальной информации, появлению неудаляемых руткитов и безвозвратному выводу оборудования из строя.
Кроме того, у нас есть подозрения, что возможность перезагружать ME без перезагрузки основного CPU может повлечь за собой и другие проблемы в безопасности из-за рассинхронизации состояний BIOS/UEFI и ME.
Авторы: Марк Ермолов и Максим Горячий
[1] Intel Management Engine Critical Firmware Update, Intel-SA-00086
[2] GitHub — chipsec/chipsec: Platform Security Assessment Framework
[4] Fast, secure and flexible OpenSource firmware, Coreboot
[5] Mark Ermolov, Maxim Goryachy, How to Become the Sole Owner of Your PC, PHDays VI, 2016
[6] Mark Ermolov, Maxim Goryachy, Disabling Intel ME 11 via undocumented mode, Positive Technologies’ blog
[7] Intel ME Manufacturing Mode Detection Tools
[8] Alexander Ermolov, Safeguarding rootkits: Intel BootGuard
[9] Dmitry Sklyarov, Intel ME: Flash File System. Explained
Автор: h0t_max