
Механизм теневой памяти или Shadow RAM, появившийся более 20 лет назад в системах класса PC/AT 286, сегодня является обязательным атрибутом персональных платформ. Как используя в качестве носителей BIOS недорогие микросхемы ROM с разрядностью 8-бит и временем выборки сотни наносекунд не жертвовать производительностью? Ответ простой — при старте компьютера сделать копию содержимое ROM в оперативную память и использовать ее в течение всего рабочего сеанса. Напомним, что скорость работы последней существенно выше. Для современных систем, использование памяти Shadow RAM не опционально, а обязательно, так как основной блок BIOS или UEFI firmware хранится в ROM в упакованном виде, соответственно, его необходимо распаковывать в RAM.
Для корректной эмуляции ROM и предотвращения модификации процедур BIOS Runtime, системная логика использует механизм защиты записи Shadow RAM.
Постановка задачи
Для детального исследования персональных платформ и отладки процедур BIOS может потребоваться выключить защиту записи Shadow RAM и внести изменения в содержимое блоков BIOS Runtime. Эта задача успешно решалась в нашей тестовой лаборатории для целого ряда платформ на основе процессоров Intel и AMD.
Сегодня поэкспериментируем на плате ASUS Z87-K на основе системной логики Intel Z87 для процессоров Socket 1150. Процессор — Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz. Тестируемая платформа оснащена UEFI BIOS производства American Megatrends, в частности — Aptio IV.
Для примера возьмем 32-килобайтный регион F8000h-FFFFFh (это часть области System BIOS Shadow). Путем несложной модификации приведенных процедур можно выполнить аналогичную операцию для региона Video BIOS Shadow или включить доступ к оперативной памяти в любом незадействованном регионе Shadow RAM.
План решения задачи
Для превращения Read-Only памяти Shadow RAM в обычную Read/Write память, требуется перенастроить два системных регистра:
- Регистр PAM (Programmable Attribute Map), управляющий трансляцией шинных циклов для заданного диапазона памяти. Регистры PAM адресуются в PCI-конфигурационном пространстве и относятся к блоку регистров северного моста, интегрированного в процессор. Как следует из документации, для установки режима Normal DRAM в диапазоне F0000h-FFFFFh, в регистр PAM0 требуется записать число 00110000b=30h.
- Регистр MTRR (Memory Type and Range Register), задающий дисциплину кэширования для заданного диапазона памяти. Регистры MTRR адресуются в пространстве Model-Specific регистров процессора. Для установки режима Write-Through в диапазоне F8000h-FFFFFh, в регистр IA32_MTRR_FIX4K_F8000 требуется записать 0404040404040404h. Адрес этого регистра в пространстве MSR равен 0000026Fh.
Решение задачи
Просматриваем дамп System BIOS Shadow до манипуляций с системными регистрами, пробуем перезаписать содержимое и убеждаемся, что запись не работает:
Рис 1. Запись не работает
Подготавливаем параметры для записи в регистр PAM0 и выполняем запись:
Рис 2. Выполняем запись в регистр PAM0
Адрес регистра в пространстве PCI: Bus=0, Device=0, Function=0, Register=80h. Данные записи: Data=30h.
Рис 3. Подготавливаем параметры для записи в регистр IA32_MTRR_FIX4K_F8000 и выполняем запись
Адрес регистра в пространстве MSR: 0000026Fh. Данные записи: Data=0404040404040404h.
Рис 4. Просматриваем дамп System BIOS Shadow после манипуляций с системными регистрами, пробуем записать код 11h вместо 5 байт по адресу 000FFFF0h
Убеждаемся в успешном результате (см. нижнюю строку дампа).
Измеряем время выполнения операций
Как было показано выше, включение защиты записи для заданного диапазона Shadow RAM, приводит к трансляции циклов записи, выполняемых в этот диапазон, на шину DMI (Direct Media Interface). Для диапазона, запись в который разрешена, циклы транслируются на шину оперативной памяти. Очевидно, в первом случае время выполнения циклов будет больше. Проверим это.
Рис 5. Подготовка параметров (адрес и данные) для измерения времени выполнения циклов записи
Рис 6. Результат для DMI forwarding: время выполнения 64-битного цикла записи в память – около 480 наносекунд
Рис 7. Результат для DRAM forwarding: время выполнения 64-битного цикла записи в память – около 34 наносекунд
Резюме
В отличие от описанного эксперимента с Shadow RAM, аналогичные попытки проникновения в SMRAM на той же плате ASUS Z87-K пока успехом не увенчались. Память SMRAM защищена лучше, чем Shadow RAM и причина этого очевидна, для доступа к стратегическим ресурсам платформы, первая значительно важнее.
С другой стороны, корпорация Intel, свою часть работы по защите Shadow RAM выполнила. Об этом свидетельствует комментарий “This register is locked by Intel TXT” в описании регистра PAM0. И уязвимость, которой мы сегодня успешно воспользовались, существует только потому, что UEFI BIOS от American Megatrends не активировал технологию Intel Trusted Execution Technology, во всяком случае, для тех режимов загрузки ОС, которые мы использовали.
Эксперименты осуществлялись в среде DOS, но попытка перезаписи регистра PAM0 была также успешно выполнена в UEFI Shell с использованием встроенной команды “MM”.
Подчеркнем, что мы редактировали блок BIOS Runtime, находящийся в оперативной памяти, а не BIOS ROM, поэтому описанные опыты не связаны с риском выведения из строя платформы из-за искажения BIOS. Вместе с тем, самостоятельное и безопасное повторение описанных экспериментов возможно только при наличии соответствующей подготовки в области цифровой схемотехники и системного программирования.