38,2
рейтинг
6 июля 2013 в 00:33

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

Выпуск материнских плат на чипсетах 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?
Жду ваших комментариев и прошу прощения за возможные ошибки, о которых прошу докладывать в личном сообщении.
Спасибо за внимание и до встречи во второй части.
Николай Шлей @CodeRush
карма
183,0
рейтинг 38,2
Firmware Engineer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (14)

  • +6
    CodeRush, спасибо дружище, мы попросили (в той ветке) пост — ты его сделал.

    Отличная статья. Я не думаю что комментариев много будет, этот пост академического характера, тут нечего обсуждать и не о чем спорить, это чистое знание.
    И кстати, я голосую за хаб UEFI. Хоть он и будет чисто академическим наверное. Странно, что INTEL не взяла на себя возжи описания UEFI в своем профильном хабе. Ну и ладно, у нас есть CodeRush. Я подписываюсь.
    • +1
      Не думаю, что хаб UEFI будет чисто академическим, с учетом идущих вокруг SecureBoot холиваров.
      На самом деле, эта статья — не чистое знание, а чистое «чуть чуть прошелся по верхам, и оборвал на самом интересном месте».
      Тема UEFI очень обширная, тут и процесс загрузки, и разнообразие форматов исполняемых файлов, и схожесть структур данных в UEFI и Windows, и EDK, и UEFI Shell, и сборка своих исполняемых файлов для UEFI, и написание DXE-драйверов, и NVRAM, и SMM, и безопасность, и виды защит от прошивки, и это половина процента всего, что можно написать про UEFI, и что не будет выглядеть так скучно, как эта статья.
      Если интересно — можно продолжать, если не сильно — можно написать пост со списком того, что стоило бы почитать на эту тему и остановиться на этом.
      • +3
        Очень интересно — конечно же продолжайте!

        И да, поддерживаю идею хаба UEFI.
      • +4
        CodeRush, много людей за популяризацию того, что вы знаете, просто не будет обсуждений, потому-что фактические знания, с ними не поспоришь.
        Вам может показаться обидным, что не будет обсуждения в посте, и не будет дискуссий — забейте, и не опускайте руки! Через год в гугле наберите вопрос и увидите, сколько кросс-постов и ссылок будет, и все на ваш пост на хабре. Ответы на некотоые вопросы — это просто факты, и нет места для обсуждений.
        Я очень жду продолжения поста про UEFI! Вы начали очень круто!
  • 0
    Интересно было бы почитать про Runtime Services и EBC
    • 0
      Напишу, но чуть позже.
  • +3
    А как реализована загрузка процессора? В старых BIOS'ах он прыгал на определённый адрес, где начинался код инициализации оперативки и распаковки собственно образа BIOS'а в память. Тут примерно так же, или в процессор добавились какие-то новые инструкции/микрокоды/etc, и он как-то понимает, что вставлен в материнскую плату с UEFI?
    • +1
      Во второй части я расскажу о процессе загрузки UEFI. Сейчас RAM инициализируется в конце второй фазы загрузки, а вся работа до этого происходит в кэше процеессора. А вообще, процесс начальной загрузки изменился не сильно, но переход в защищенный режим происходит теперь гораздо раньше.
    • +1
      Написал, вот она.
      Часть получилась не вторая, а полуторная, т.к. информации, если ее расписывать подробно, оказывается слишком много для одной статьи, приходится делить.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Файл с UEFI Shell нужно положить либо на EFI System Partition, либо на внешний носитель с ФС FAT32 и назвать либо shell.efi, либо shell64.efi, либо чаще всего shellx64.efi, после чего подключить носитель и выбрать эту опцию. На всех платах, которые у меня есть — работает, но не все версии UEFI Shell запускаются, приходится скачивать и пробовать разные.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          Начать можно здесь, а вот здесь уже есть ссылки на несколько разных версий.
          • НЛО прилетело и опубликовало эту надпись здесь

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.