Статья Атаки на Intel ME и AMD PSP

1771850714578.webp


Сегодня поговорим о том, о чём техноблогеры обычно молчат или пересказывают пресс-релизы Intel и AMD. А именно – о Management Engine (ME) от Intel и Platform Security Processor (PSP) от AMD. Если ты думаешь, что твой компьютер начинается с кнопки включения и заканчивается выключением питания – ты глубоко заблуждаешься. Внутри каждого современного x86-процессора (и не только) живёт свой собственный микро-компьютер, который просыпается, как только на материнку подаётся дежурное напряжение, и не засыпает до самого обесточивания. И вот про то, как этот «компьютер внутри компьютера» можно не только подглядывать, но и контролировать, и главное – как защитить себя от такого контроля (или самому получить контроль, если уж очень хочется) – наша сегодняшняя простыня.

1. Введение: Что за зверь и с чем его едят?​

Чтобы понять, с чем мы имеем дело, давай нырнём в историю. В конце 90-х и начале 2000-х корпоративный сектор (читай: крупные компании с парком из тысяч компьютеров) столкнулся с проблемой: как управлять всем этим зоопарком, если сотрудники находятся в разных офисах, а компьютеры выключены? Нужно было решение, которое позволяло бы удалённо включать машины, переустанавливать на них ОС, сбрасывать забытые пароли, даже если основной процессор не работает.

Intel предложила технологию Active Management Technology (AMT). Поначалу это был отдельный чип на материнской плате, который имел свой сетевой стек и питался от дежурного напряжения. Но отдельный чип - это лишние деньги и место. Инженеры рассудили гениально (с точки зрения бизнеса) и пугающе (с точки зрения приватности): а давайте засунем этот управляющий компьютер прямо в чипсет, а потом и в сам процессор. Так родился Management Engine.

Сначала это был простой 8-битный контроллер на ядре 8051. Он умел только базовые вещи: крутить вентиляторы, следить за температурой и изредка отвечать на AMT-запросы. Но прогресс не стоял на месте. С каждым новым поколением процессоров ME обрастал мышцами. К 2010-му году это уже был 32-битный процессор на архитектуре ARC, а потом и x86. У него появилась своя оперативная память (которую он отжирает у системы), своя файловая система и, как выяснилось в 2017 году благодаря исследователям из Positive Technologies, своя полноценная операционная система - MINIX 3.

Да-да, та самая учебная микроядерная ОС, которую Эндрю Таненбаум писал для студентов, живёт внутри твоего Intel Core i7. И она не просто живёт - она работает в самом привилегированном режиме, который только возможен. Хакеры называют этот уровень Ring -3. Для справки: твои приложения работают на Ring 3, ядро ОС - на Ring 0, гипервизоры (вроде VirtualBox) - на Ring -1, а система управления питанием (SMM) - на Ring -2. ME находится ниже плинтуса, ниже всего, что ты можешь себе представить. Это настоящий «бог» машины.

Что же такого страшного в этом ME/PSP?​

«Это для безопасности! Это аппаратный корень доверия (Root of Trust)! ME проверяет цифровые подписи загрузчика, обеспечивает шифрование дисков (через TPM) и защищает ваш компьютер от зловредов на самом низком уровне». Звучит красиво, правда?

Да, эти функции действительно есть. Но цена, которую мы за них платим, - абсолютная потеря контроля. ME - это чёрный ящик. Intel никогда не публиковала его исходный код. Сообщество годами выцарапывало крупицы информации методом реверс-инжиниринга. Мы не знаем, что именно он делает в каждый момент времени. Мы знаем только то, что он может делать:
  1. Полный DMA-доступ. ME может читать и писать в любую ячейку оперативной памяти, минуя процессор и операционную систему. Хочешь украсть пароли из памяти браузера? ME может. Хочешь перехватить сеанс Telegram? ME может.
  2. Сетевая независимость. В версиях с поддержкой vPro (Intel) или DASH (AMD) этот сопроцессор имеет прямой доступ к сетевой карте. Он может принимать и отправлять пакеты, даже когда основная ОС выключена. Ты думаешь, что компьютер выключен, а он на самом деле просто спит и слушает сеть.
  3. Доступ к периферии. Через различные шины (LPC, SPI) ME может читать данные с клавиатуры (кейлоггер на аппаратном уровне), общаться с жёстким диском (даже если он зашифрован, ключи-то в памяти) и перехватывать видео.
  4. Неубиваемость. Поскольку ME находится в отдельном домене, антивирусы и сканеры руткитов из основной ОС его просто не видят. Даже если ты переустановишь Windows, сотрёшь все разделы на диске, ME останется на своём месте, в микросхеме SPI Flash, и продолжит работу. Единственный способ до него добраться - физический программатор.

От паранойи к действию​

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

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

2. Историческая справка: Как мы дошли до жизни такой​

Давай перенесёмся в конец 90-х. Windows 98 правит бал, интернет только начинает проникать в дома, а в офисах уже стоят сотни компьютеров, и их нужно как-то обслуживать. Представь себе сисадмина в крупной корпорации: у него тысяча машин, разбросанных по этажам, и каждая может вырубиться в любой момент. Причём вырубиться так, что даже по сети не достучаться - потому что питание отключено или ОС упала в синий экран.

Что делает админ? Он идёт к начальству и говорит: «Дайте мне денег на нормальное управление». А Intel смотрит на это и думает: «О, ниша! Надо сделать чип, который будет работать независимо от основной системы, питаться от батарейки или дежурки и позволит админу включать комп, переустанавливать винду и сбрасывать пароли удалённо».

Так родилась технология Active Management Technology (AMT). Изначально это был отдельный чип на материнке, который подключался к сетевухе и имел свой собственный стек TCP/IP. Он не зависел от основного процессора, потому что у него был свой маленький мозг. Но отдельный чип - это дополнительные траты на производство, место на плате и сложности с сертификацией.

И тут инженеры Intel (и чуть позже AMD) сделали гениальный, с точки зрения экономии, и пугающий, с точки зрения пользователя, шаг: «А давайте засунем этот управляющий компьютер прямо в чипсет, а потом и в сам процессор! Места там много, питание дежурное есть, а себестоимость копейки».

2.2 Первое поколение: 8-битные младенцы (2008–2010)​

В 2008 году, с выходом чипсетов Intel Series 4 (например, ICH10), в массы пошло первое поколение Management Engine. Это был скромный 8-битный микроконтроллер на ядре 8051 (архаика, но надёжная). Его задача была простой, как три копейки:
  • Обрабатывать запросы AMT (если материнка поддерживала vPro).
  • Следить за питанием и температурой.
  • Крутить вентиляторы (да, первые версии ME уже начинали подменять Super I/O).
Прошивка ME хранилась в отдельном регионе SPI Flash и занимала смешные по нынешним меркам 512 килобайт или 1 мегабайт. Никакой MINIX там, конечно, не было - просто голый код на ассемблере, который крутился в бесконечном цикле и ждал команд. Тогда ещё никто не паниковал. Ну подумаешь, маленький контроллер - что он может натворить?

2.3 Эра 32 бит: ME становится зрелым (2010–2013)​

С приходом архитектуры Nehalem (первые Core i7) и чипсетов 5-й серии (P55, H55 и т.д.) ME резко повзрослел. 8-битного 8051 перестало хватать. Нужно было больше функций: управление питанием ядер процессора (P-states), поддержка новых стандартов безопасности, более сложные сценарии AMT. Intel перевела ME на 32-битную архитектуру - сначала на ядра ARC (DesignWare ARC), а позже добавила и собственные x86-ядра (на базе Intel Quark).

Что изменилось?
  • Объём прошивки вырос до нескольких мегабайт.
  • Появилась настоящая операционная система. Да, не просто голый цикл, а многозадачная среда с драйверами и памятью.
  • ME начал резервировать часть системной RAM для себя (обычно 16-32 МБ), и эта память становилась невидимой для основной ОС.
Именно в этот период (примерно 2010-2012 годы) в недрах ME зародилась та самая MINIX. Почему MINIX? Потому что это микроядро, которое легко портировать на разные архитектуры, оно имеет понятную лицензию (не GPL, что важно для проприетарного кода), и его легко кастомизировать. Инженеры Intel взяли MINIX 3 (версию, разработанную Эндрю Таненбаумом), обкорнали её под свои нужды, добавили проприетарные драйверы и модули - и получили идеальную среду для запуска своих «движков».

2.4 Эпоха MINIX: 2013–2017 (и далее)​

С выходом чипсетов 8-й серии (Lynx Point) для Haswell, ME окончательно оформился как «компьютер внутри компьютера». Прошивка ME 8.x и 9.x содержала полноценную файловую систему (MinixFS), разделы с модулями (BUP, Kernel, SYS, MIA и т.д.) и даже возможность динамической загрузки сервисов.

Именно тогда сообщество начало подозревать неладное. Появились первые утилиты для анализа (например, me-tools), люди начали ковырять прошивки, извлекать бинарники. Но настоящий прорыв случился в 2017 году, когда исследователи из Positive Technologies (отдельный респект им за смелость и упорство) фактически вскрыли ME и показали миру: «Пацаны, там внутри MINIX работает!».

На конференции Black Hat USA 2017 и затем на 34C3 (Chaos Communication Congress) они представили доклады, где детально рассказали об архитектуре ME, его уязвимостях и даже показали инструменты для отладки. Это был момент истины. Оказалось, что:
  • Внутри каждого современного процессора Intel работает ОС, о которой никто не знал.
  • Эта ОС имеет доступ ко всему и не подчиняется пользователю.
  • В ней полно багов и уязвимостей (включая ту самую SA-00086 с пустым паролем AMT).
Реакция сообщества была бурной. С одной стороны, Intel пыталась успокоить: «Это для безопасности!». С другой стороны, хакеры и энтузиасты открытого ПО (проекты coreboot, libreboot) получили мощнейший аргумент: нужно с этим что-то делать. Так на свет появился me_cleaner - инструмент, позволяющий вырезать из прошивки ME всё лишнее, оставляя только минимальный загрузчик.

2.5 AMD PSP: ARM-версия той же песни​

Пока Intel разворачивала свою MINIX-империю, AMD не сидела сложа руки. В 2013 году, с выходом архитектуры Jaguar (которая использовалась в консолях PlayStation 4 и Xbox One), AMD представила Platform Security Processor (PSP).

Зачем он им понадобился? По тем же причинам:
  • Управление питанием и тактовыми частотами.
  • Безопасная загрузка (Secure Boot на уровне платформы).
  • Криптографические функции.
  • Удалённое управление (DASH - аналог AMT).
Но AMD пошла другим путём. Они не стали городить MINIX, а взяли проверенное ARM-ядро - Cortex-A5. Это 32-битный ARM-процессор, который стоит копейки, имеет низкое энергопотребление и при этом достаточно мощный для задач PSP. Прошивка PSP хранится в SPI Flash и состоит из нескольких уровней загрузчиков (L1, L2, L3), которые проверяют подписи друг друга.

Проблема PSP в том, что он ещё более закрыт, чем Intel ME. Документации практически нет, а сообщество только недавно начало всерьёз его ковырять. В 2018 году компания CTS Labs опубликовала сенсационный отчёт, где описала 13 уязвимостей в процессорах Ryzen, включая критические дыры в PSP. Оказалось, что через эти дыры можно выполнить свой код на ARM-процессоре и получить полный контроль над системой. AMD тогда быстро выпустила патчи, но осадок, как говорится, остался.

2.6 Война уязвимостей: 2017–2020​

Период с 2017 по 2020 год стал золотым веком для охотников за багами в ME и PSP. Одна за другой появлялись уязвимости:
  • CVE-2017-5689 (Intel SA-00086): Удалённая аутентификация с пустым паролем в AMT. Админы по всему миру схватились за голову.
  • CVE-2017-5705, CVE-2017-5708 и др.: Локальные уязвимости, позволяющие повысить привилегии до уровня ME.
  • Intel SA-00115: Ошибка в ME 11.x, дающая доступ к памяти.
  • AMD PSP-уязвимости от CTS Labs: Возможность выполнить код на PSP через интерфейсы SMM.
Каждая такая находка подтверждала: мы не зря параноим. Этот «чёрный ящик» не просто потенциально опасен - он реально дырявый. И самое печальное, что многие из этих уязвимостей нельзя закрыть обновлением ОС. Нужно обновлять прошивку BIOS/UEFI, а производители материнских плат часто забрасывают поддержку старых моделей.

2.7 Реакция сообщества: Рождение инструментов​

В ответ на закрытость и уязвимости сообщество создало целый зоопарк инструментов для исследования и нейтрализации.
  • me_cleaner (автор - Nicola Corna) - главный герой нашей статьи. Скрипт на Python, который анализирует прошивку ME и вырезает из неё всё, кроме минимального загрузчика.
  • psptool (от команды PSPReverse) - попытка сделать то же самое для AMD.
  • UEFITool - швейцарский нож для разбора UEFI-образов, без него никуда.
  • flashrom - легендарная утилита для чтения/записи флешек, работает с кучей программаторов.
  • ifdtool - часть coreboot, для работы с Intel Flash Descriptor.
Эти инструменты позволили обычным пользователям (не супер-хакерам) начать модифицировать свои прошивки. Конечно, риск превратить компьютер в кирпич остаётся, но теперь это осознанный риск, а не лотерея.

2.8 Настоящее и будущее​

На сегодняшний день Intel выпустила ME вплоть до 15-й версии (CSME - Converged Security and Management Engine). Архитектура стала ещё сложнее, добавились новые регионы, усилилась проверка подписей. me_cleaner работает с версиями до 12.x, но для новых платформ (Coffee Lake Refresh и новее) требуются доработки. Сообщество не сдаётся - регулярно появляются форки и патчи.

AMD продолжает развивать PSP. В новых Ryzen PSP уже интегрирован так глубоко, что без него процессор просто не запустится. Полностью отключить его пока невозможно, но с помощью psptool можно хотя бы посмотреть, что внутри.

Параллельно развиваются проекты открытых прошивок: coreboot и libreboot. Они позволяют заменить проприетарный UEFI BIOS на минималистичную открытую прошивку, где ME или PSP сведены к необходимому минимуму. Но даже там требуется бинарная прошивка ME/PSP (так называемый «blob»), потому что без неё процессор не инициализируется.

2.9 Почему история важна?​

Если ты думаешь, что всё это - просто технические детали для гиков, ты ошибаешься. История ME и PSP - это история о том, как корпорации, заботясь о своём удобстве и безопасности (корпоративной!), создали тотальную платформу для наблюдения, которая оказалась в руках миллиардов пользователей. И теперь мы вынуждены с этим жить.

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

Так что теперь, когда мы знаем, откуда взялся этот зверь, давай перейдём к анатомии - посмотрим, как именно он устроен изнутри. Это поможет нам понять, куда бить, чтобы обезвредить, но не убить.

3. Архитектура «чёрного ядра»: Анатомия ME и PSP​

Давай заглянем под капот. Без понимания архитектуры мы не сможем ничего модифицировать. Всё сложно, но я постараюсь разжевать.

3.1 Intel ME: от ARC к Minix​

В процессорах Intel, начиная с серии 5/6/7 серии (Nehalem, Sandy Bridge, Ivy Bridge) и до актуальных (Alder/Raptor Lake), ME представляет собой отдельный микроконтроллер, интегрированный в чипсет (Platform Controller Hub, PCH) или в сам процессор (в однокристальных системах). В современных поколениях ME уже называется Converged Security and Management Engine (CSME), но суть та же.

Аппаратная часть:
  • Ядро: Изначально использовались ядра ARC (DesignWare ARC), потом добавились x86 (на базе Quark). В новых поколениях, скорее всего, кастомные ядра. Это 32-битные процессоры со своим кэшем, MMU, поддержкой виртуализации.
  • Память: У ME есть своя небольшая внутренняя память (SRAM), но основная оперативная память для него – это часть твоей системной RAM. При загрузке BIOS резервирует некоторый объём памяти (обычно около 16-32 МБ) для эксклюзивного использования ME. Эта память недоступна основной ОС и защищена от доступа через DMA со стороны других устройств (с помощью IOMMU). Но сам ME имеет полный DMA-доступ ко всей остальной памяти. То есть он может читать и писать куда угодно.
  • Периферия: ME подключён к множеству шин внутри чипсета: DMI (связь с процессором), PCIe (для доступа к сетевым картам и другим устройствам), LPC (для доступа к Super I/O и legacy-устройствам), SPI (для доступа к флеш-памяти BIOS). Также у него есть доступ к контроллерам Ethernet (MAC) для реализации функций AMT (в моделях с поддержкой vPro).
Программная часть:
  • Boot ROM: При подаче питания ME стартует с внутренней маскированной памяти (Boot ROM). Код в Boot ROM неизменяем (hard-coded) и отвечает за начальную инициализацию, проверку подписей следующих ступеней загрузки и загрузку основной прошивки из SPI Flash.
  • Прошивка (Firmware): Хранится в области SPI Flash, которая называется «Intel Engine Region» (или просто регион ME). Эта прошивка имеет сложную структуру: она содержит несколько модулей (BUP, Kernel, SYS, MIA, и т.д.), файловую систему (MinixFS), и исполняемые файлы. Именно эту прошивку мы и будем ковырять.
  • ОС: Это модифицированное микроядро MINIX. Там есть планировщик, драйверы, менеджер памяти. Поверх ядра запущены различные сервисы (динамически загружаемые модули), которые реализуют функции: управление питанием (Power Management), управление тактовой частотой (P-State), работа с датчиками температуры, и, конечно, AMT (если активирован). Эти сервисы называются Engines (например, Power Management Engine, AMT Engine).
Важно: ME работает в отдельном домене безопасности. У него есть свой набор регистров, своя память, и он изолирован от основной системы аппаратно. Но эта изоляция не абсолютна – зная уязвимости, можно из основной ОС выполнить код на ME, и наоборот, из ME можно влиять на основную ОС.

3.2 AMD PSP: ARM в сердце x86​

У AMD всё немного иначе, но концептуально похоже. PSP – это 32-битный процессор на архитектуре ARM Cortex-A5 (в более старых – ARM7). Он также встроен в кристалл процессора и имеет доступ ко всей системе.

Аппаратная часть:
  • Ядро: ARM Cortex-A5 с поддержкой TrustZone? (спорный момент). Работает на частотах порядка сотен мегагерц.
  • Память: Как и у Intel, PSP резервирует часть системной RAM (через механизм AMD-Vi, аналог Intel VT-d). Есть своя внутренняя память и кэш.
  • Периферия: Подключен к шинам для доступа к SPI Flash, DMA-контроллеру, возможно к USB и Ethernet.
Программная часть:
  • Boot ROM: Находится внутри процессора, загружает первую ступень прошивки из SPI.
  • Прошивка: Хранится в области SPI Flash, в регионе PSP (обычно называется "AMD CBS" или просто регион PSP). Формат прошивки – это кастомный контейнер с различными уровнями (Level 1, Level 2 bootloaders) и подписанными бинарниками. AMD использует собственную криптографию для проверки подписей (корни доверия в Boot ROM). В отличие от Intel, где прошивка ME – это файловая система Minix, у AMD это просто набор бинарных образов, которые загружаются по очереди. Но внутри этих бинарников тоже может быть своя логика и, возможно, какая-то ОС (FreeRTOS или что-то подобное).
  • Функции: PSP отвечает за раннюю инициализацию платформы (до основной x86), проверку подписей UEFI BIOS (Secure Boot на уровне платформы), управление питанием (совместно с другими контроллерами), криптографические операции (например, для шифрования дисков). В некоторых процессорах PSP также участвует в работе технологии AMD Secure Processor (для виртуализации).

3.3 Общие черты: полный доступ, DMA, изоляция​

Итак, что мы имеем в сухом остатке:
  • Привилегии Ring -3. Если основная ОС работает на уровне Ring 0 (kernel), гипервизор – на Ring -1, SMM (System Management Mode) – на Ring -2, то ME/PSP находится на Ring -3. Это означает, что они имеют доступ ко всему и могут контролировать даже SMM.
  • DMA-мастер. Оба процессора могут самостоятельно инициировать транзакции DMA в любую область памяти, обходя ограничения ОС. То есть они могут читать пароли из памяти браузера, ключи шифрования, содержимое экрана.
  • Сетевая независимость. В версиях с поддержкой vPro (Intel) или DASH (AMD) эти процессоры имеют доступ к сетевому контроллеру на аппаратном уровне. Они могут принимать и отправлять сетевые пакеты даже когда основная ОС выключена (благодаря тому, что сетевуха подключена к дежурному питанию и к шине, доступной ME). Это позволяет удалённо включать компьютер, переустанавливать ОС, а также ... выполнять другие команды.
  • Изоляция от пользователя. Ты не можешь зайти в диспетчер задач и увидеть процесс ME. Ты не можешь остановить его службу. Ты даже не можешь прочитать его код, потому что регион SPI, где он хранится, обычно защищён от чтения из основной ОС (хотя на некоторых материнках защита снята, или её можно обойти).
Вот такая красивая картина. А теперь к самому интересному – к тому, как это всё ломать.

4. Проблемы безопасности и конфиденциальности: Паранойя или реальность?​

Прежде чем мы начнём атаковать, давай разберёмся, насколько обоснован наш интерес. Может быть, эти ребята из Intel и AMD действительно всё предусмотрели, и ME/PSP – это абсолютно безопасный чёрный ящик?

Спойлер: нет.

4.1 Известные уязвимости​

За последние годы было опубликовано множество уязвимостей в ME и PSP. Вот лишь некоторые, самые громкие:
  • CVE-2017-5689 (Intel SA-00086) – пожалуй, самая известная. Уязвимость в аутентификации AMT позволяла удалённо авторизоваться на любой машине с активным AMT, используя пустой пароль. То есть любой, кто имеет доступ к сети, мог зайти на компьютер жертвы, даже если на нём не установлена ОС, и получить полный контроль (KVM-доступ, переустановка ОС и т.д.). Это был не просто баг, а архитектурный просчёт. Затронуты были миллионы устройств. Intel тогда выпустила патчи, но если материнка старая и больше не получает обновлений – дыра остаётся навсегда.
  • CVE-2017-5705, CVE-2017-5708, CVE-2017-5711, CVE-2017-5712 – целая серия уязвимостей в ME, позволяющих локальному аутентифицированному пользователю выполнить произвольный код на ME (через интерфейсы ядра). То есть, если на твоей машине запущен вредонос, он может перепрыгнуть в ME и там закрепиться, оставаясь незаметным даже после переустановки ОС.
  • Intel SA-00115 – уязвимость в ME 11.x, позволяющая повысить привилегии и выполнить код.
  • AMD PSP тоже не лыком шит. В 2018 году компания CTS Labs опубликовала отчёт с 13 уязвимостями в Ryzen (включая PSP), среди которых были критические: возможность выполнить код в PSP, доступ к защищённой памяти и даже установка бэкдора в прошивку. AMD тогда всё пофиксила, но осадочек остался.
Важно понимать: наличие уязвимостей в таком сложном коде – это норма. Код пишут люди, люди ошибаются. Проблема в том, что этот код находится в привилегированном положении, и его ошибки ведут к катастрофическим последствиям. При этом сам код закрыт, и сообщество не может его проверить.

4.2 Технические бэкдоры или особенности архитектуры?​

Конспирологи любят говорить, что ME и PSP – это специально встроенные бэкдоры АНБ или других спецслужб. Доказательств этому нет, но есть косвенные признаки:
  • Абсолютная закрытость и сложность реверс-инжиниринга.
  • Наличие в прошивке ME кода для работы с криптографией и сетевыми протоколами.
  • Возможность дистанционного управления даже выключенным компьютером (через AMT).
Но даже если это не бэкдор, архитектура такова, что она идеально подходит для бэкдора. Представь: ты агент, которому нужно внедрить вредонос на неубиваемый уровень. Ты ищешь уязвимость в ME, эксплуатируешь её, загружаешь свой код. Дальше твой код переживёт любую переустановку Windows, замену жёсткого диска, потому что он живёт в SPI Flash, защищённый от записи из ОС. И при этом имеет доступ ко всему. Мечта шпиона.

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

5. Инструментарий хакера: что нам понадобится​

Прежде чем приступать к практике, нужно собрать арсенал. Мы будем работать с прошивкой BIOS/UEFI, которая хранится на микросхеме флеш-памяти (SPI Flash) на материнской плате. Чтобы её прочитать и записать, нам понадобятся специальные инструменты. Также нужен софт для анализа и модификации.

5.1 Программаторы и софт​

Программатор SPI Flash:
  • CH341A – самый народный выбор. Китайский программатор за 3-5$, который умеет читать/писать большинство распространённых микросхем SPI (25-й серии). Минус: качество контактов, возможные глюки с напряжением (некоторые версии работают на 5В, что может убить 3.3В микросхему, нужно убедиться, что у тебя версия с переключателем 3.3/5В или купить специальный переходник). Но для разовых экспериментов – самое то.
  • Dediprog – профессиональный программатор, который используют в сервисных центрах. Дорогой, но надёжный.
  • Raspberry Pi – можно использовать как программатор, подключив пины GPIO к SPI флешке. Есть софт (flashrom), который работает на RPi. Это дешёвый и гибкий вариант.
Софт для прошивки:
  • flashrom – легендарная утилита с открытым кодом. Умеет читать, писать, стирать и верифицировать огромное количество флешек и программаторов. Работает из-под Linux, Windows (с драйверами), macOS. Именно её мы будем использовать для снятия дампа и записи обратно.
Софт для анализа прошивки:
  • UEFITool – незаменимая вещь для разбора UEFI-образов. Позволяет открыть файл BIOS, увидеть все разделы (FVs, FFS, файлы), извлечь нужные регионы (например, регион ME). Есть графическая версия и консольная (UEFIExtract).
  • binwalk – инструмент для поиска встроенных файлов и файловых систем в бинарных образах. Помогает найти сжатые данные, файлы, сигнатуры.
  • HxD / любой шестнадцатеричный редактор – для ручного просмотра и редактирования бинарных данных.
  • me_cleaner – главный инструмент для нейтрализации ME. Написан на Python, работает с образом региона ME. Умеет вырезать лишние модули, оставляя только минимально необходимый код.
  • me-tools – набор скриптов от сообщества для разбора прошивки ME (извлечение модулей, анализ версий).
  • psptool – аналог me_cleaner, но для AMD PSP. Исследует образ PSP, показывает структуру, позволяет извлечь компоненты.

5.2 Физический доступ​

Важно: для модификации прошивки ME/PSP нам потребуется физический доступ к материнской плате. В большинстве случаев мы не сможем перепрошить регион ME из-под самой ОС, потому что он защищён аппаратными блокировками (хотя есть исключения). Поэтому придётся лезть внутрь корпуса, находить микросхему SPI Flash (обычно 8-ногая SOIC-8), подключать к ней программатор.

5.3 Дополнительное оборудование​

  • Зажим Pomona SOIC-8 – чтобы не выпаивать микросхему. Цена около 10-15$, но он очень облегчает жизнь. Цепляется прямо на ножки микросхемы на плате.
  • Паяльник – на случай, если зажим не поможет (микросхема мелкая или припаяна плотно). Иногда проще выпаять, прошить и впаять обратно.
  • Мультиметр – проверить напряжение, прозвонить контакты.

5.4 Подготовка рабочей среды​

Лучше всего работать в Linux. flashrom, me_cleaner, UEFITool – всё это нативно работает там. Можно создать загрузочную флешку с Ubuntu или использовать LiveCD. Главное – чтобы система видела программатор (драйвера для CH341A есть в ядре).

6. Практика: Нейтрализация Intel ME с помощью me_cleaner​

Теперь самое интересное. Мы будем учиться обезвреживать Intel ME. Процесс не очень сложный, но требует аккуратности. Один неверный шаг – и материнка может не запуститься. Но мы не ищем лёгких путей. Поехали.

6.1 Определяем цель и готовимся​

Что нам нужно знать перед началом?
  • Какая у тебя материнская плата и процессор? me_cleaner работает с ME версий от 1.x до 12.x. Для совсем новых (13+ на платформе Coffee Lake Refresh и новее) могут быть нюансы, но обычно тоже работает.
  • Где находится микросхема SPI Flash на материнке? Обычно это 8-ногая микросхема с маркировкой Winbond, Macronix, GigaDevice и т.д. Можно найти по даташиту на материнку или просто визуально.
  • Какой у тебя программатор? Настроил ли ты его? Подключил?
Важно: перед любыми действиями обязательно сохрани оригинальный дамп BIOS в нескольких экземплярах (на флешку, на комп, в облако). Это твоя страховка. Если что-то пойдёт не так, ты всегда сможешь восстановиться.

6.2 Снятие дампа BIOS​

  1. Обесточь компьютер. Отключи питание от сети. Сними батарейку CMOS (чтобы обесточить дежурное питание? Необязательно, но для спокойствия можно).
  2. Найди микросхему SPI Flash на плате. Обрати внимание на ключ (точку или выемку) на корпусе – это первый вывод.
  3. Подключи зажим Pomona к микросхеме, соблюдая распиновку. Распиновка стандартная: 1 - CS, 2 - DO (SO), 3 - WP (не обязательно), 4 - GND, 5 - DI (SI), 6 - SCK, 7 - HOLD (не обязательно), 8 - VCC (3.3V). Проверь мультиметром, что контакты зажима совпадают с выводами. Очень важно не перепутать питание и землю, иначе можно спалить микросхему.
  4. Подключи программатор к компьютеру. Если используешь CH341A, убедись, что перемычка (джампер) стоит на 3.3V (иногда это переключатель 3.3/5V).
  5. Запусти терминал в Linux. Проверь, видит ли система программатор: lsusb – должен появиться устройство CH341A.
  6. Прочитай дамп: sudo flashrom -p ch341a_spi -r backup.bin. Если программатор другой, соответственно меняй параметр -p.
  7. Если чтение прошло успешно, сохрани копию: cp backup.bin backup2.bin.
  8. Рекомендуется прочитать дамп ещё раз и сравнить: sudo flashrom -p ch341a_spi -r backup3.bin && diff backup.bin backup3.bin. Если они идентичны, значит, чтение было стабильным.

6.3 Анализ дампа и извлечение региона ME​

Теперь у нас есть файл backup.bin – полный образ BIOS. Нужно найти в нём регион ME.

Способ 1: Использовать UEFITool.
  • Открываем backup.bin в UEFITool (графическая версия).
  • Ищем разделы с типом "GUID" или "Subregion". Регион ME часто имеет имя "Intel Engine" или GUID 1A478BEC-9A1F-45F9-B48B-67B5B5C3F2B0 (для ME) или похожий. Может быть несколько.
  • Если UEFITool распознаёт структуру UEFI, можно найти файл с именем ftpr или подобным. Это и есть образ ME.
  • Извлекаем его через контекстное меню.
Способ 2: Использовать ifdtool (часть coreboot).
Утилита ifdtool умеет разбирать Intel Flash Descriptor (специальная область в начале флешки, которая описывает разделы: Descriptor, ME, GbE, BIOS). Если твоя флешка содержит дескриптор (обычно так и есть), то можно:

Bash:
ifdtool -x backup.bin

Эта команда извлечёт все регионы: flashregion_0_descriptor.bin, flashregion_1_me.bin, flashregion_2_gbe.bin, flashregion_3_bios.bin. Нас интересует flashregion_1_me.bin.

Поздравляю, мы извлекли прошивку ME.

6.4 Запуск me_cleaner​

Теперь у нас есть файл me.bin (или flashregion_1_me.bin). Запускаем me_cleaner.

Базовая команда для анализа:

Bash:
me_cleaner.py -c me.bin

Эта команда покажет информацию о прошивке: версию, список модулей, их размеры, и главное – какие модули можно безопасно удалить. Будет выведено что-то вроде "This firmware is probably manageable" или "It contains some removable modules".

Теперь самое важное – нейтрализация. У me_cleaner есть несколько опций:
  • -S (или --soft-disable): удаляет все модули, кроме минимально необходимого набора для загрузки. Это то, что нам нужно.
  • -r (или --remove): удаляет разделы с кодом, но оставляет загрузчик. По сути то же, что и -S.
  • -t (или --truncate): пытается оставить только загрузчик, обрезая остальное. Может сэкономить место, но иногда вызывает проблемы.
  • -w (или --whitelist): позволяет указать список модулей, которые нужно оставить (для продвинутых).
Для большинства случаев достаточно:

Bash:
me_cleaner.py -S -O me_cleaned.bin me.bin

Эта команда создаст файл me_cleaned.bin, в котором удалены все лишние модули. Также будет создан файл me_cleaned.bin.log, где написано, что было удалено.

Что происходит внутри? me_cleaner анализирует структуру прошивки ME, которая включает в себя разделы (partitions) и модули. Он находит загрузчик (BUP – BringUp partition) и удаляет все остальные разделы (основное ядро, драйверы, движки). Загрузчик остаётся, и когда ME стартует, он загружает этот минимальный код. По идее, загрузчик просто инициализирует минимум для работы платформы и уходит в бесконечный цикл или останавливается. ME фактически становится "пустышкой".

6.5 Сборка нового образа BIOS​

Теперь нам нужно поместить очищенный регион ME обратно в полный образ BIOS, на место старого. Есть несколько способов:

Способ 1: Использовать ifdtool для замены региона.

Bash:
ifdtool -n me_cleaned.bin backup.bin

Эта команда заменит регион ME в файле backup.bin на содержимое me_cleaned.bin и создаст новый файл backup.bin.new. Это и будет наш модифицированный BIOS.

Способ 2: Вручную заменить в UEFITool.
  • Открыть backup.bin в UEFITool.
  • Найти регион ME (тот же GUID, что и при извлечении).
  • Правой кнопкой -> "Replace as is..." и выбрать me_cleaned.bin.
  • Сохранить новый образ через "Save image file...".
Способ 3: Просто записать очищенный ME поверх старого, но это рискованно, так как нужно точно знать смещение. Лучше использовать ifdtool или UEFITool.

Получаем файл newbios.bin.

6.6 Прошивка обратно​

Теперь самый ответственный момент – запись модифицированного BIOS обратно на флешку.
  1. Убедись, что программатор подключён, зажим сидит правильно.
  2. Выполни команду стирания (некоторые программаторы делают это автоматически при записи, но лучше явно):

    Bash:
    sudo flashrom -p ch341a_spi -E

  3. Или запиши с опцией -w, которая включает стирание перед записью.

    Bash:
    sudo flashrom -p ch341a_spi -w newbios.bin

  4. После успешной записи проверь верификацию (обычно flashrom сам проверяет после записи). Если есть ошибки верификации, значит, что-то пошло не так – возможно, плохой контакт или проблемы с напряжением. Попробуй перезаписать ещё раз.
  5. Отключи программатор, сними зажим.
  6. Верни батарейку CMOS (если снимал).
  7. Включи компьютер.

6.7 Первый запуск и проверка​

Компьютер должен включиться. Если всё хорошо – ты увидишь привычный POST и загрузку ОС. Если нет – экран чёрный, вентиляторы крутятся – возможно, у тебя кирпич. Не паникуй. В большинстве случаев это происходит из-за того, что нейтрализованный ME не работает с данной платформой (редко, но бывает). У тебя же есть оригинальный дамп! Просто перепрошивай его обратно.

Как проверить, что ME действительно нейтрализован?
  • Зайди в ОС (Linux). Выполни команду lspci | grep -i "management". Если ты увидишь устройство "Intel Management Engine Interface" – оно всё ещё присутствует в PCI-конфигурации, но это интерфейс для связи с ME. Сам факт его наличия не говорит о том, что ME активен. Чтобы проверить, активен ли код ME, можно попытаться прочитать его версию через специальные утилиты (например, intelmetool из coreboot). Если он нейтрализован, утилиты не смогут с ним связаться или вернут ошибку.
  • Также можно проверить, загружается ли модуль ядра mei (Intel MEI). Если он не может инициализироваться, скорее всего ME не отвечает.
  • На некоторых материнках после нейтрализации может увеличиться скорость загрузки (так как ME не тратит время на инициализацию своих движков) и немного снизиться энергопотребление в выключенном состоянии.

6.8 Риски и предупреждения​

  • Кирпич. Самый главный риск. Даже с me_cleaner это возможно, если платформа требует каких-то специфических модулей ME для работы (например, для управления памятью или питанием на некоторых серверных платформах). Для большинства десктопных и ноутбучных систем Sandy Bridge, Ivy Bridge, Haswell, Broadwell, Skylake, Kaby Lake (и частично Coffee Lake) это безопасно. Но на свой страх и риск.
  • Потеря функций. Ты потеряешь функции vPro/AMT (удалённое управление), Intel TXT (Trusted Execution Technology), возможно, некоторые возможности энергосбережения. Но для обычного пользователя это не нужно.
  • Необратимость. Формально, всегда можно перепрошить обратно. Но если ты вырезал слишком много, ME может вообще не запуститься, и материнка не покажет признаков жизни до восстановления стоковой прошивки программатором.

7. Углублённый реверс-инжиниринг прошивки ME​

Для тех, кому мало просто нейтрализации, и кто хочет копать глубже, – следующий уровень. Мы можем не просто удалить всё подчистую, а попытаться понять, что именно там внутри, и, возможно, даже написать свой код для ME.

7.1 Структура прошивки ME​

Прошивка ME (регион) имеет сложную структуру. Она состоит из:
  • FTPR (FTP Region)– основной регион с кодом. Внутри него находятся:
    • BUP (Bring Up partition) – загрузчик. Он инициализирует железо ME и загружает ядро.
    • Kernel – само ядро MINIX.
    • Modules – различные драйверы и сервисы (бинарные файлы в формате .bin, но это не просто бинарники, они могут быть сжаты или зашифрованы).
  • MFS (Minix File System) – файловая система, где лежат конфигурационные файлы, прошивки для других контроллеров, возможно, скрипты.
  • NVM (Non-Volatile Memory) – область для хранения параметров (MAC-адрес для AMT, лицензии и т.д.).
В новых версиях (ME 11+) появились дополнительные регионы: DCC (Dynamic Configuration and Calibration), VSS (Virtualization Support System) и другие.

7.2 Инструменты для анализа​

  • me-tools(от сообщества coreboot) – набор скриптов для разбора образов ME.
    • me_extract.py – извлекает все компоненты из FTPR.
    • me_parser.py – выводит информацию о структуре.
  • BurntToast (от Positive Technologies) – утилита для анализа и модификации прошивок ME (уже устарела, но идеи полезны).
  • binwalk – для поиска сжатых данных. Часто модули ME сжаты простым zlib.
  • IDA Pro / Ghidra – для дизассемблирования кода. Код ME компилируется под архитектуру ARC или x86 (в зависимости от версии). Есть скрипты для загрузки в IDA.
  • QEMU – можно эмулировать ME? Теоретически да, но сложно из-за привязки к железу.

7.3 Поиск уязвимостей​

Как ищут уязвимости в ME?
  1. Извлекают прошивку.
  2. Распаковывают все модули.
  3. Загружают модули в дизассемблер.
  4. Анализируют код на предмет типичных ошибок: переполнение буфера, использование небезопасных функций (strcpy и т.д.), неправильная проверка аутентификации.
  5. Ищут интерфейсы, доступные из основной ОС (через PCI-конфигурационное пространство, MMIO, HECI-интерфейс). Эти интерфейсы – основная поверхность атаки.
  6. Пытаются отправить специально сформированные команды и наблюдают за поведением (фаззинг).
Самые известные уязвимости (например, в аутентификации AMT) были найдены именно таким образом.

7.4 Модификация прошивки: что можно сделать?​

Если ты решил не просто нейтрализовать ME, а написать свой код, то перед тобой открываются интересные возможности:
  • Свой бэкдор. Можно внедрить код, который будет перехватывать нажатия клавиш, делать скриншоты и отправлять по сети. Правда, для этого нужно преодолеть механизмы проверки подписей (а они есть). Но если есть уязвимость, которая позволяет выполнить код на этапе загрузки, то можно подменить модуль.
  • Исправление багов. Теоретически можно пропатчить прошивку, чтобы исправить какие-то проблемы, не дожидаясь официальных обновлений от Intel.
  • Улучшение совместимости. Например, для работы coreboot на некоторых платформах требуется определённая версия ME. Можно попытаться её модифицировать.
Но предупреждаю сразу: это тёмный лес. Документации нет, отладка сложная, и любой неверный байт может привести к неработоспособности. Но если ты упёртый – дерзай.

8. AMD PSP: Тёмная лошадка​

С AMD всё сложнее. Во-первых, информации о PSP в открытом доступе намного меньше. Во-вторых, архитектура прошивки менее документирована сообществом. Но и там есть свои инструменты и методы.

8.1 Что известно о PSP​

PSP – это ARM-процессор, который выполняет свою прошивку. Прошивка хранится в регионе SPI, обычно называется "AMD PSP" или "AMD Firmware". У неё тоже есть многоуровневая загрузка:
  • Level 1 Bootloader (L1) – встроен в Boot ROM процессора, загружает L2 из SPI.
  • Level 2 Bootloader (L2) – проверяет подписи следующих ступеней.
  • Level 3 Bootloader (L3) – собственно ОС или среда выполнения.
  • Application Firmware – различные приложения (Secure OS, Trusted OS, драйверы).
PSP также имеет доступ ко всей памяти, DMA, сетевому контроллеру (на некоторых платформах). Он участвует в механизме AMD Secure Boot (не путать с UEFI Secure Boot) и Platform Secure Boot.

8.2 Инструменты: psptool​

psptool (GitHub - PSPReverse/PSPTool: Display, extract, and manipulate PSP firmware inside UEFI images) – это набор скриптов на Python для анализа прошивок PSP. Он умеет:
  • Извлекать компоненты прошивки из образа.
  • Определять типы образов (L2, L3, приложения).
  • Распознавать подписи.
  • Декомпрессировать сжатые части (если знаешь алгоритм).
Процесс работы с PSP похож на работу с ME, но менее автоматизирован. Сначала нужно получить образ BIOS (например, с сайта производителя или снять дамп). Затем найти регион PSP (обычно с помощью UEFITool). Потом запустить psptool:

Bash:
psptool.py -f psp_region.bin

Он покажет структуру и позволит извлечь компоненты.

8.3 Можно ли отключить PSP?​

На данный момент полного аналога me_cleaner для PSP не существует. Причина в том, что PSP более тесно интегрирован в процесс загрузки процессора. Если ME можно "вырезать", оставив загрузчик, то на некоторых платформах AMD отключение PSP приводит к тому, что процессор просто не запускается. Однако есть исследования, показывающие, что можно модифицировать прошивку, удалив некоторые модули, но это очень опасно.

Проект coreboot для некоторых платформ AMD (например, семейства "Stoney Ridge" или "Picasso") включает поддержку PSP, но там используется официальная бинарная прошивка от AMD, которая загружается как есть. Coreboot не пытается её нейтрализовать, а просто передаёт управление PSP в нужный момент.

В сообществе ведутся работы по реверс-инжинирингу PSP, но до простого инструмента типа me_cleaner ещё далеко. Поэтому на данный момент для большинства пользователей AMD единственный способ – надеяться, что PSP не содержит критических уязвимостей (что, как мы видели, не всегда так) и использовать платформы с открытыми прошивками, где PSP сведён к минимуму (например, некоторые Chromebook на AMD).

9. Атаки на ME/PSP через уязвимости​

До сих пор мы говорили о "легальной" модификации своей собственной прошивки. Но есть и другая сторона медали – использование уязвимостей в ME/PSP для получения контроля над чужой системой. Это уже территория пентеста и, возможно, злого хакинга. Мы рассмотрим это как демонстрацию опасности, а не как руководство к действию.

9.1 Удалённые атаки (CVE-2017-5689)​

Классика. Если на целевой машине включён Intel AMT (обычно на корпоративных ноутбуках и десктопах с vPro), и администратор не сменил пароль по умолчанию (или есть уязвимость в аутентификации), злоумышленник может подключиться к порту 16992 (или 16993 для HTTPS) и получить полный удалённый доступ. AMT предоставляет веб-интерфейс, через который можно:
  • Удалённо включать/выключать/перезагружать компьютер.
  • Перенаправить консоль (KVM – клавиатура, видео, мышь).
  • Подключать ISO-образы как виртуальные CD-ROM.
  • Переустанавливать ОС.
И всё это – в обход установленной ОС. Если компьютер подключён к сети, и AMT активен, он доступен даже когда ОС выключена (благодаря дежурному питанию сетевой карты и ME). Уязвимость 2017 года позволяла зайти с пустым паролем. Сейчас её, конечно, закрыли патчами, но сколько машин до сих пор не обновлено?

9.2 Локальные эксплойты​

Уязвимости типа CVE-2017-5705 позволяют локальному пользователю с правами администратора выполнить код на ME. Как это работает? Через интерфейс HECI (Host Embedded Controller Interface) – это PCI-устройство, через которое основная ОС общается с ME. Если в драйверах ME или в самом протоколе есть ошибка, можно передать специальную команду, которая приведёт к переполнению буфера в коде ME и выполнению шелл-кода.

Такой эксплойт может быть использован для установки руткита на уровне ME, который будет неуязвим для антивирусов и переживёт переустановку ОС.

9.3 Использование уязвимостей для реверс-инжиниринга​

Исследователи часто используют уязвимости, чтобы получить отладочный доступ к ME/PSP. Например, найдя способ выполнить код, они могут затем загрузить свой отладчик и изучать внутренности системы. Это этичный взлом, который приносит пользу сообществу.

10. Заключение: Владей своим кремнием​

Мы начали с подозрения, что внутри нашего компа живёт «чёрный ящик». Закончили мы тем, что научились этот ящик вскрывать, читать его содержимое и выкидывать оттуда лишнее. Это колоссальный сдвиг.

«Мне нечего скрывать, пусть работают» --- «Я хочу знать, что работает, и имею право это контролировать».

Мы никогда не избавимся от ME или PSP полностью, пока пользуемся современным железом. Boot ROM внутри процессора не перепрошить. Но мы можем сделать так, чтобы этому «компьютеру внутри компьютера» было просто нечем заняться. Мы превратили потенциально опасного соглядатая в овощ, который тупо крутится в пустом цикле и не лезет в наши пароли.

И это победа. Не абсолютная, но важная.
 
  • Нравится
Реакции: Luxkerr
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab