SEC
SEC (Security phase) — самая первая стадия работы прошивки UEFI: тот код, который процессор начинает выполнять сразу после сброса. Именно с SEC начинается POST.
Название отражает суть: это единственная стадия, где прошивка может проверить саму себя до того, как что-либо ещё успело выполниться.
Что делает SEC
- Точка входа. Процессор после сброса всегда начинает с одного и того же адреса —
FFFFFFF0h, последние 16 байт адресного пространства. Там лежит команда перехода на код SEC — его называют SEC core (подробнее — в статье POST). - Проверка целостности прошивки. Если включён Intel Boot Guard или аналогичная технология, здесь проверяется подпись первого исполняемого модуля. Не сошлась — загрузка останавливается, и дальше ничего не выполняется.
- Временная память. Оперативной памяти ещё нет, поэтому SEC настраивает Cache-as-RAM — кэш процессора работает как память, чтобы было где держать стек и переменные.
- Перевод процессора в защищённый режим — тот минимум, без которого нельзя выполнять обычный код на C.
- Передача управления. 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.
Цепочка проверки
- Процессор запускает ACM — его подлинность проверена кремнием.
- ACM берёт из прошивки Key Manifest, считает хеш открытого ключа из него и сравнивает с хешем в перемычках.
- Совпало — этим ключом проверяется подпись Boot Policy Manifest.
- По данным BPM проверяется IBB: хеш кода должен совпасть, подпись — сойтись.
- Только после этого управление передаётся в 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 — инициализация настоящего железа и оперативной памяти.
Комментарии
Пока комментариев нет.