Pull to refresh

Устройство файла UEFI BIOS, часть первая: UEFI Capsule и Intel Flash Image

Reading time7 min
Views206K
Выпуск материнских плат на чипсетах Intel шестой серии (P67 и его братьях) принес на массовый рынок ПК новый вариант BIOS — UEFI. В этой статье мы поговорим об устройстве файлов UEFI Capsule и Intel Flash Image.
Структура EFI Firmware Volume и полезные в хозяйстве патчи будут описаны во второй части.

UEFI Capsule


В качестве примера файла UEFI Capsule возьмем образ BIOS для ASUS P8Z77-V версии 2003.
Это типичный представитель семейства AMI Aptio4 UEFI с несколькими расширениями ASUS, не сильно влияющими на его формат. В качестве примера он взят потому, что в нем присутствуют все составляющие файла UEFI Capsule, о которых я хотел бы рассказать сегодня.

Для работы с этим файлом в первой части статьи нам понадобятся:
  • Hex-редактор на ваш вкус, я буду использовать HxD
  • Утилита Intel Flash Image Tool подходящей версии, для чипсетов 7 серии — это версия 8.xx

Распаковав архив, получаем файл размером 0х800800 байт с расширением CAP.
Это файл UEFI Capsule, формат которого был описан AMI на одной из конференций UEFI Plugfest и выглядит так:

Открываем файл hex-редактором и проверяем его на соответствие этому формату, в нашем случае заголовок выглядит так:

Размер заголовка действительно 0x0000001C, общий размер файла действительно 0x00800800, начало образа FFS действительно находится по смещению 0x800 — сомнений не остается.
Сразу же возникает соблазн разобраться досконально, как именно устроены блоки FW Certificate и OEM Header, но это не нужно. Закрытого ключа ASUS у нас пока нет, а без него подписать модифицированный файл невозможно, даже зная формат блока FW Certificate, а взламывать RSA2048 и SHA256 — дело гиблое.
На самом деле, формат этот в секрете никто и не держит, он описывается знакомой знатокам PE32+ структурой WIN_CERTIFICATE, описание которой можно найти, например, здесь, но в нашем случае это все не важно.
Ни одного байта из этого двухкилобайтного заголовка в микросхему BIOS'а не попадает, и используется этот заголовок только для проверки валидности файла перед прошивкой стандартными утилитами ASUS. При прошивке аппаратным программатором, а также низкоуровневыми утилитами вроде Intel Flash Programming Tool или flashrom этот заголовок нужно просто удалить.
Более того, микроконтроллер, осуществляющий прошивку по технологии UBF, хоть и проверяет наличие этого заголовка, но не проверяет при этом сертификаты и прошивает модифицированные файлы ничуть не хуже оригинальных.
Поэтому, если для прошивки не будет использоваться UBF, смело отрезаем 0x800 байт заголовка и сохраняем получившийся файл с расширением ROM.
Если в файле вашего BIOS'а заголовка UEFI Capsule не оказалось, значит он либо достаточно старый, например для платы на P67 или Z68, либо производитель не пожелал его использовать, несмотря на настойчивые рекомендации Intel. Считайте, что производитель уже удалил его за вас и читайте дальше.

А дальше могут быть несколько вариантов.
Если у вас десктопная плата на Intel, как в нашем примере, то получившийся файл будет состоять из нескольких регионов: дескриптора, региона GbE при наличии встроенной сетевой карты Intel, региона ME и региона BIOS.
Если у вас десктопная плата или ноутбук на AMD, то из всего вышеперечисленного остается только регион BIOS.
Если у вас ноутбук на Intel, то в файле BIOS'а, который вы можете скачать с сайта производителя и использовать для обновления, содержатся чаще всего образ только региона BIOS и прошивка для EC, хранящаяся обычно в отдельной микросхеме flash. Сам файл может быть при этом достаточно хитро структурирован или зашифрован, но при этом в микросхеме BIOS он хранится в том же виде, что и на десктопных платах, поэтому все эксперименты лучше проводить не с файлом обновления, а с дампом уже имеющегося BIOS'а, который можно снять при помощи FPT.

Intel Flash Image


AMD'шники могут смело пропустить весь текст ниже и читать вторую часть этой статьи, а мы продолжаем разбирать получившийся файл ROM.
Intel рассказывает о структуре своих BIOS'ов на страницах даташита на соответствующие чипсеты. Для всех чипсетов, начиная с 6 серии, этот формат в общем не менялся, поэтому его можно смело взять оттуда. Файл делится на 3-5 регионов:

Необязательными являются регионы GbE (используется совместно с встроенными сетевыми картами Intel начального уровня) и PDR (предназначен для данных OEM, но я ни разу не видел, чтобы он где-то использовался).

Descriptor

Этот регион должен находится в первой (из двух поддерживаемых) микросхеме flash по нулевому адресу и подразделяется на 11 секций, суммарный размер которых не должен превышать 4 килобайта. Устроен он так:

Первые 16 байт не используются и всегда равны 0xFF, за ними следует сигнатура 0x0FF0A55A, затем секция Descriptor Map, указывающая смещение начальных пяти секций и их размер.
Секция Component содержит информацию об используемых микросхемах flash: их количество (1 или 2), плотность (от 512 Кб до 16 Мб), запрещенные команды (такие как chip erase, например) и частоты чтения, быстрого чтения и стирания/записи.
Секция Region содержит смещения и размеры других регионов.
Секция Master содержит настройки доступа каждого из трех возможных мастеров (BIOS, ME, GbE) к пяти возможным регионам.
Секции PCH/PROC Straps содержат параметры конфигурации процессора и северного моста.
Секция Upper Map содержит смещение и размер таблицы VSCC.
Таблица VSCC содержит идентификаторы JEDEC и данные VSCC всех поддерживаемых Management Engine микросхем flash.
Секция OEM может быть заполнена OEM-производителями по своему усмотрению, но я не видел её заполнения ни разу.

Проверим теперь структуру полученного нами файла ROM на соответствие вышеприведенной:

Легко видно, что структура вполне себе соответствует, но угадать, за что именно отвечает каждый байт каждой секции будет непросто.
К счастью, Intel избавил нас от угадывания, выпустив утилиту FITC, которая позволяет настроить дескриптор (и не только его) и содержит подсказки по каждому доступному для редактирования пункту. Утилита эта входит в набор для разработчиков материнских плат и не предназначена для конечных пользователей, но ссылку на нее всегда можно найти на форумах, посвященных модификации BIOS'ов.
Открываем наш файл ROM в FITC 8.xx и все настройки дескриптора как на ладони:

Я крайне не рекомендую ничего менять, кто не знает, зачем он это делает.
Самыми часто изменяемыми настройками здесь являются настройки доступа к регионам (выделены зеленым на скриншоте hex-редактора), которые в дикой природе встречаются двух видов: вышеприведенные «всем можно всё» и стандартные настройки Intel. Иногда открытость записи в регион МЕ помогает справится с нарушением его работоспособности, просто перезаписав его полностью. На платах со стандартными настройками это невозможно без получения доступа к МЕ, которое на разных платах реализовано по разному и может потребовать достаточно нетривиальных манипуляций (замыкания ног аудиочипа во время загрузки, например).
Обратная сторона открытости — вредоносный код может делать что угодно с дескриптором и всем остальным содержимым микросхемы BIOS. Почему-то об этом говорить не принято, при том, что абсолютно все платы ASUS на P67 с BIOS'ам версий 3ххх и все платы ASUS на Z68 имеют открытый дескриптор. И security никакая, и с obscurity проблемы, о чем инженеры думали — не знаю.
Вторая полезная настройка — плотность микросхемы BIOS, которую приходится менять в случае восстановления испорченного BIOS'а платы с микросхемой большого объема, используя работоспособную плату с микросхемой меньшего.

GbE

Присутствует только на платах со встроенными сетевыми картами Intel начального уровня, вроде 82579.
В даташите на этот чип в разделе 10 имеется описание структуры NVM, которая и хранится в регионе GbE целиком.
Главная настройка, которую может быть интересно изменить — MAC-адрес, находящийся в самом начале региона, в первых 6 байтах. Если вдруг вам нужно сменить аппаратный MAC своей встроенной карты Intel, и регион GbE на вашей плате имеется — вы знаете что делать.
В нашем примере регион GbE находится по смещению 0x1000 от начала и содержит стандартный MAC для всех образов NVM, выпускаемых Intel в качестве обновления — 88:88:88:88:87:88:

При прошивке стандартными средствами регион GbE не обновляется вообще, несмотря на присутствие обновленного NVM в файле с обновлением BIOS'а, поэтому Intel пришлось выпустить отдельную утилиту NVM Update, когда в результате ошибки в версии 1.3 карта переставала работать нормально после установки Windows 8.
Регион содержит кучу других настроек, о которых можно прочесть в указанном выше даташите.

ME

Здесь находится Management Engine Firmware и ее настройки. Про ME можно писать бесконечно, потому что там чего только нет. Лучшее описание структуры этого региона и возможных векторов атаки на него вы можете прочесть в докладе Игоря Скочински на Breakpoint 2012.
Для тех, кто еще не ушел читать его — краткая выжимка:
В чипсетах Intel имеется микроконтролер с архитектурой ARCompact, получающий питание от дежурной линии ATX, имеющий доступ ко всем устройствам, к RAM, собственный сетевой стек и работающий под управлением ОСРВ ThreadX. Вот он то и обеспечивает все рекламируемые Intel технологии, вроде Active Management, AntiTheft, Identity Protection, Rapid Start, Smart Connect, Protected Audio Video Path и так далее и тому подобное. А при помощи Dynamic Application Loader на нем можно даже Java-апплеты запускать.
На наше счастье, с безопасностью МЕ все более или менее в порядке, и пока я не слышал о случаях успешного внедрения вредоносного кода, но само по себе наличие в чипсете МК, исполняющего неизвестные никому, кроме Intel, программы и имеющего полный доступ к RAM и сети — уже повод для паранойи у склонных к ней людей.
Изменить доступные настройки МЕ можно при помощи той же Intel FITC:

В нашем примере регион ME начинается со смещения 0x3000 и имеет размер 1,5 Мб, что указывает на плату без поддержки AMT.

BIOS

Регион состоит из одного или нескольких EFI Firmware Volume, о структуре которых я напишу во второй части этой статьи.
Там же мы затронем процесс загрузки UEFI и полезные в некоторых случаях патчи.

Platform Data Region

Регион предназначен для описания каких-либо зависящих от платформы возможностей и по плану должен использоваться OEM-производителями, но по факту я не видел его ни разу.

Источники информации


  1. Secure Firmware Update, UEFI Plugfest presentation by Zachary Bobroff (AMI)
  2. Intel 6 Series Chipset and Intel C200 Series Chipset Datasheet
  3. Intel 82579 Gigabit Ethernet PHY Datasheet
  4. Rootkit in your laptop, Breakpoint 2012 presentation by Igor Skochinsky (Hex-Rays)

P.S.


Не знаю, в какой хаб следовало бы поместить эту статью. Может быть НЛО создаст для нас хаб UEFI?
Жду ваших комментариев и прошу прощения за возможные ошибки, о которых прошу докладывать в личном сообщении.
Спасибо за внимание и до встречи во второй части.
Tags:
Hubs:
Total votes 75: ↑74 and ↓1+73
Comments16

Articles