SEC

UEFI

SEC (Security phase) — самая первая стадия работы прошивки UEFI: тот код, который процессор начинает выполнять сразу после сброса. Именно с SEC начинается POST.

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

Что делает SEC

  1. Точка входа. Процессор после сброса всегда начинает с одного и того же адреса — FFFFFFF0h, последние 16 байт адресного пространства. Там лежит команда перехода на код SEC — его называют SEC core (подробнее — в статье POST).
  2. Проверка целостности прошивки. Если включён Intel Boot Guard или аналогичная технология, здесь проверяется подпись первого исполняемого модуля. Не сошлась — загрузка останавливается, и дальше ничего не выполняется.
  3. Временная память. Оперативной памяти ещё нет, поэтому SEC настраивает Cache-as-RAM — кэш процессора работает как память, чтобы было где держать стек и переменные.
  4. Перевод процессора в защищённый режим — тот минимум, без которого нельзя выполнять обычный код на C.
  5. Передача управления. SEC формирует первые HOB — структуры с описанием платформы — и передаёт управление стадии PEI.

Ниже — подробно про пункты 2–5.

Проверка прошивки: как это устроено на Intel

Технология называется Intel Boot Guard. Её задача — сделать так, чтобы процессор отказался работать с прошивкой, которую изменил кто-то посторонний, даже если эту прошивку записали в микросхему SPI-флеша напрямую, программатором.

Корень доверия — в кремнии

Проверять подписи бессмысленно, если можно подменить сам проверяющий код. Поэтому в Boot Guard проверяет не прошивка и не «процессор вообще», а маленький модуль ACM (Authenticated Code Module), который выпускает Intel. Его подпись проверяется по ключу, зашитому в кремний, — такой ключ не изменить никакой прошивкой. ACM выполняется ещё до вектора сброса (тот же механизм используется в Intel TXT).

Что записано в перемычках

В чипсете есть блок одноразовых перемычек — FPF (Field Programmable Fuses). Их «пережигают» один раз, на заводе, и вернуть обратно нельзя.

Производитель (OEM/ODM) записывает в них хеш своего открытого ключа — не хеш прошивки. Рядом лежит бит «Boot Guard включён» и профиль работы. Закрытый ключ остаётся у производителя и служит для подписи прошивок.

Что лежит в прошивке

В образе прошивки рядом с кодом лежат манифесты — структуры с ключами, хешами и подписями:

  • Key Manifest (KM) — открытый ключ, которым подписан следующий манифест;
  • Boot Policy Manifest (BPM) — хеши и размеры IBB и ключ для проверки его подписи;
  • IBB (Initial Boot Block) — первый исполняемый блок прошивки: в UEFI это код SEC и начало PEI.

Цепочка проверки

  1. Процессор запускает ACM — его подлинность проверена кремнием.
  2. ACM берёт из прошивки Key Manifest, считает хеш открытого ключа из него и сравнивает с хешем в перемычках.
  3. Совпало — этим ключом проверяется подпись Boot Policy Manifest.
  4. По данным BPM проверяется IBB: хеш кода должен совпасть, подпись — сойтись.
  5. Только после этого управление передаётся в SEC.

Получается цепочка доверия: перемычки → ключ производителя → подпись политики → код IBB. Разорвать её нельзя: хеш ключа в перемычках изменить невозможно, а подделать подпись без закрытого ключа производителя — тоже.

Два профиля

Профиль Что делает при несовпадении
Verified Boot Останавливает загрузку — компьютер не стартует
Measured Boot Записывает измерение в TPM и продолжает загрузку

Первый — «не пущу», второй — «запомню, и потом можно проверить». На ноутбуках обычно включён Verified Boot.

Что здесь важно не перепутать

  • Перемычки хранят хеш открытого ключа производителя, а не хеш прошивки. Смысл проверки — «подписана ли эта прошивка моим ключом».
  • «Перемычки» — не переключатели, а одноразовые предохранители в чипсете: прожигаются на заводе и не восстанавливаются.
  • Публичный ключ не «прикладывают отдельным файлом»: он внутри манифестов в образе прошивки.
  • У других производителей устроено похоже: у AMD — Platform Secure Boot, у ARM — свои цепочки доверия. В бизнес-моделях ноутбуков (в том числе Dell Latitude) Boot Guard обычно включён ключами самого производителя — именно поэтому на них нельзя просто так залить модифицированную прошивку.

Cache-as-RAM: память до памяти

Задача простая: код должен где-то хранить стек и переменные, а оперативной памяти ещё нет — её только предстоит инициализировать, и это самая долгая часть загрузки (см. PEI). Пока контроллер памяти не настроен, писать по адресам DRAM некуда.

Решение — использовать сам кэш процессора как память. Кэш переводят в особый режим — без заполнения (no-fill; у Intel есть и своё название — NEM, No-Eviction Mode):

  • обращения к выделенной области обслуживаются кэшем;
  • строки кэша никогда не вытесняются и не пишутся в память;
  • снаружи это выглядит как небольшая оперативная память: можно читать и писать.

Дальше прошивка использует эту область как обычную память — там лежат стек, глобальные переменные и структуры ранних модулей.

Что это даёт. Без Cache-as-RAM ранний код мог бы пользоваться только регистрами процессора, а на одних регистрах программу на C не напишешь. С ней SEC и начало PEI работают как нормальная программа: вызывают функции, хранят структуры, передают данные следующей стадии.

Сколько её. Столько, сколько отдал кэш, — обычно от десятков до сотен килобайт. Отсюда и компактность ранних стадий: модули PEI специально делают маленькими, чтобы всё уместилось.

Когда заканчивается. Как только память инициализирована, прошивка переезжает: переносит стек и данные из кэша в DRAM, а кэш возвращает в обычный режим работы.

Практический признак: если компьютер «висит» на обучении памяти (индикатор DRAM горит дольше обычного или вообще не гаснет), до этого момента он работал именно на Cache-as-RAM.

Защищённый режим: от чего защищает

После сброса процессор x86 находится в реальном режиме (real mode): 16-битные регистры, адресация до 1 МиБ через пару «сегмент:смещение», никакой защиты — программа может обратиться куда угодно.

Первое, что делает SEC, — переводит процессор в защищённый режим (protected mode). Это тот режим, в котором процессоры работают и сегодня; его 64-битная версия называется long mode.

Что даёт защищённый режим:

Механизм Что делает
Сегменты и таблицы дескрипторов (GDT/LDT) у каждого сегмента памяти есть база, граница и права доступа
Кольца привилегий (0–3) код с низкими правами не может выполнять привилегированные команды и трогать чужие структуры
Страницы (paging) память делится на страницы с правами: чтение, запись, выполнение, доступ из пользовательского кода
Таблица прерываний (IDT) обработчики прерываний назначаются только защищённым кодом

От чего это защищает. От того, что программа выйдет за свои границы: запишет в чужую память, выполнит данные как код, залезет в память другой программы или выполнит привилегированную команду. На этой защите держится вся изоляция в операционной системе — ядро и приложения, процесс от процесса.

Важная оговорка про SEC. Прошивке защита от злоумышленника не нужна: она и так работает с максимальными правами (кольцо 0). Защищённый режим ей нужен по другой причине — реальный режим просто не годится для нормального кода: только в защищённом режиме можно адресовать больше 1 МиБ, включить плоскую модель памяти и писать на C. Поэтому SEC включает его сразу, как только появляется временная память.

А когда 64 бита? SEC и большая часть PEI работают в 32-битном защищённом режиме. В long mode прошивка переходит в конце PEI — это делает отдельный модуль (в реализациях на базе EDK II он называется DXE IPL). Поэтому стадия DXE уже 64-битная.

HOB: как стадии передают друг другу платформу

HOB (Hand-Off Block) — структура данных, которой одна стадия прошивки передаёт следующей то, что успела выяснить о железе. Набор таких структур называют списком HOB.

Зачем это нужно: PEI работает «на голом железе» — там нет ни драйверов, ни сервисов, ни протоколов. А DXE должен знать, где и сколько памяти, какие блоки прошивки найдены, в каком режиме идёт загрузка. Всё это PEI складывает в HOB и передаёт дальше.

  • SEC создаёт самый первый HOB — PHIT (Phase Handoff Information Table). В нём записано, где начинается и где заканчивается свободная память, то есть где следующей стадии можно размещаться.
  • PEI добавляет к списку всё, что узнал: диапазоны памяти, найденные блоки прошивки, режим загрузки, указатели на таблицы для операционной системы.
  • DXE список только читает: для него это справочник о платформе. Часть данных оттуда потом попадает в таблицы ACPI и SMBIOS, которые прошивка отдаёт операционной системе.

Сами HOB лежат в памяти, которую выделяют по ходу: сначала — в Cache-as-RAM, после инициализации памяти — уже в DRAM.

Практическое следствие: ошибка в HOB (например, неверно указанная граница памяти) проявится не там, где её создали, а позже — в DXE или даже в операционной системе.

Почему стадия называется «security»

Потому что проверять подписи имеет смысл только в самом начале. Если злоумышленник подменит прошивку, то все последующие проверки бессмысленны: проверяющий код уже скомпрометирован. SEC — последняя точка, где доверие ещё можно установить.

Отсюда и цепочка доверия целиком: кремний проверяет модуль Intel (ACM) → тот проверяет прошивку по ключу производителя → прошивка (при включённом Secure Boot) проверяет загрузчик → загрузчик проверяет ядро.

Итог стадии

К концу SEC: процессор работает в защищённом режиме, есть временная память, прошивка проверена (если это настроено), сформированы первые HOB. Дальше начинается PEI — инициализация настоящего железа и оперативной памяти.

Смотрите также

  • UEFI — общая картина стадий
  • PEI — следующая стадия
  • POST — инициализация железа целиком, началом которой является SEC
  • Прошивка — что такое прошивка и как она устроена
Оценка статьи 0

Комментарии

Пока комментариев нет.