Обновление микрокода процессора без перепрошивки BIOS

Обновление микрокода CPU без перепрошивки BIOS возможно с помощью использования специальных утилит, которые позволяют загрузить новый микрокод непосредственно в оперативную память системы. Этот процесс часто применяют для исправления ошибок или повышения безопасности, минимизируя риск возникновения проблем, связанных с неправильной прошивкой BIOS.

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

Модификация UEFI BIOS, часть вторая: полезные модификации

В данной статье я намерен обсудить самые известные и практичные модификации UEFI BIOS, условия их использования и методы поиска. Кроме того, первой утилитой, о которой шла речь — UEFITool, мир модификаций не ограничивается, поэтому также будут рассмотрены и другие инструменты, предназначенные для изменения UEFI BIOS различных брендов. Если вам это интересно — переходите к основному тексту.

Введение и еще один отказ от ответственности

Не хочу снова говорить о важности SPI-программатора и о том, что все изменения вы осуществляете на свой страх и риск. Если вдруг вы не ознакомились с этой информацией, рекомендую прочитать ее и вернуться. С этого момента я предполагаю, что у вас нет проблем с восстановлением после неудачной прошивки и что вы уже знакомы с UEFITool, поэтому не буду задерживаться на технических вопросах, таких как «Как извлечь файл из образа» и «Как его затем вернуть обратно».

Необходимые инструменты

  1. Выберите любой hex-редактор.
  2. Используйте редактор образов UEFI; по понятным причинам я предпочитаю UEFITool, но вы также можете обратиться к PhoenixTool (универсальный и хорошо налаженный, хотя с определенными ограничениями) или MMTool (в основном работает только с образами AMI Aptio).
  3. Если для нужной модификации не удается найти постоянный шаблон, может понадобиться ассемблер и дизассемблер, поддерживающие архитектуру x86-64. Ассемблер можно использовать онлайн, но хороший дизассемблер необходим, иначе процесс поиска точки модификации займет много времени. К сожалению, бесплатная версия IDA Pro не позволяет разбирать 64-битные PE-файлы, поэтому для Windows я рекомендую использовать утилиту dumpbin из состава компиляторов Microsoft, а для MacOS X — objdump или пробную версию Hopper Disassembler.
  4. Когда модификация может быть осуществлена с помощью утилиты, разработанной производителем UEFI-платформы, лучше воспользоваться именно ей — это более надежно по сравнению с ручным выполнением. К сожалению, «узкий круг этих новаторов далеки от народа», поэтому в большинстве случаев подходящей утилиты от производителя оказывается недоступной.

Модификации

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

CPU PM патч, удаление блокировки MSR 0xE2

Что: обход установки бита LOCK (0x0F) в регистр MSR_PMG_CST_CONFIG_CONTROL (0xE2) после прохождения POST Зачем: открытый регистр 0xE2 необходим для работы подсистемы CPU Power Management в MacOS X, при закрытом происходит kernel panic. Если вы не планируете её уставновку или в вашем UEFI BIOSе присутсвует настройка «Unlock C-State MSR» — эта модификация вам не нужна. Где искать: в UEFI-драйверах, относящихся к CPU PM. В старых БИОСах код установки лока находится в модуле CpuPei, в новых — в модуле PowerManagement (может также называться PowerManagement2.efi или PowerMgmtDxe.efi). Способ модификации: В CpuPei код, который нужно модифицировать, выглядит примерно так:

81 FB D0 06 02 00 cmp ebx,206D0h 75 0C jne FFFE426E 0D 00 80 00 18 or eax,18008000h ; Здесь устанавливается бит 15 (LOCK) EB 05 jmp FFFE426E 0D 00 80 00 00 or eax,8000h ; Либо здесь 6A FF push 0FFFFFFFFh 6A F8 push 0FFFFFFF8h 6A 00 push 0 50 push eax 56 push esi E8 DC 0F 00 00 call FFFE5257 ; Внутри этой функции вызывается wrmsr

Чтобы обойти установку лока, необходимо заменить в указанных местах 00800018 на 00000018 и 00800000 на 00000000.

В PowerManagement код выглядит иначе, чаще всего вот так:

80 FB 01 cmp bl,1 ; Если BL равен 1 75 08 jne 0000000180002700 ; Перепрыгнуть через следующие две команды 0F BA E8 0F bts eax,0Fh ; Установить 15-й бит (LOCK) 89 44 24 30 mov dword ptr [rsp+30h],eax ; Записать результат в переменную на стеке 48 8B 54 24 30 mov rdx,qword ptr [rsp+30h] ; Извлечь значение из этой переменной в RDX B9 E2 00 00 00 mov ecx,0E2h ; Поместить номер MSR в ECX E8 79 0C 00 00 call 0000000180003388 ; Вызвать функцию с wrmsr внутри

Можно заменить JNE на JMP, BTS на BTR или полностью «занопать» процесс установки лока. Наиболее простое — это первое, то есть изменить 75 08 на EB 08.

Если вам не удалось найти данный код в вашем UEFI BIOS, обратите внимание на драйверы, касающиеся управления питанием процессора, ищите значение 0xE2 и проверяйте весь код на наличие установки 15-го бита. В новых версиях BIOS для ряда современных настольных материнских плат AMI производители больше не блокируют этот регистр, так что такого кода там уже не встречается — считайте, что производитель уже выполнил эту модификацию за вас.

Отключение AES NI

Что это: обход установки бита LOCK (0x02) в регистре MSR 0x13C Зачем это нужно: для активации аппаратного ускорения AES на системах с экспортными ограничениями Где искать: в UEFI-драйверах, связанных с управлением питанием процессора, чаще всего в разделе PowerManagement Способ модификации: по сути, мало чем отличается от патча PM (и уже был описан на хабре), поэтому подробно останавливаться на нем не буду.

Удаление белого списка

  1. Вставьте несовместимую карту в ноутбук, дождитесь уведомления о невозможности загрузки и запомните его содержание.
  2. Отыщите это уведомление в одном из FFS-файлов.
  3. Найдите код, который отсылает к этому уведомлению.
  4. Изучите этот код и постарайтесь модифицировать его так, чтобы проверка всегда проходила успешно. Это можно сделать двумя способами: либо переписать переход, либо внести свои Vendor ID и Device ID в белый список.

44 38 0D F0 0F 00 00 cmp byte ptr [00001BF0h],r9b 75 18 jne 0000000000000C1A E8 35 FD FF FF call 000000000000093C 48 85 C0 test rax,rax 4C 8B C8 mov r9,rax 0F 88 77 FF FF FF js 0000000000000B8A C6 05 D6 0F 00 00 01 mov byte ptr [00001BF0h],1 49 8B C1 mov rax,r9 E9 68 FF FF FF jmp 0000000000000B8A

Все обращения к данному коду должны быть преобразованы в безусловные, а в самом коде следует «закрыть» первые две строки, что обеспечит успешное завершение проверки.

Удаление блокировки BIOS

Что: снятие защиты от прошивки модифицированных образов UEFI встроенным программатором. Зачем: при большом количестве экспериментов с UEFI доставать каждый раз программатор быстро надоедает, да и прошивка встроенным программатором происходит быстрее (засчет работы по протоколу QuadSPI вместо обыкновенного SPI в случае внешнего программматора). Где искать: в драйверах чипсета, чаще всего в PchInitDxe (другой вариант мода — в BiosWriteProtect) Способ модификации: вариант модификации PchInitDxe полностью описан здесь на английском, поэтому я приведу только идею. Необходимо найти запись бита BIOS Lock Enable (BLE) в регистр BIOS_CNTL чипсета и предотвратить её. Сделать это можно в нескольких местах, например, вот здесь:

48 8B 4C 24 40 mov rcx,qword ptr [rsp+40h] ; Поместить в RCX адрес структуры PchPlatformData 48 8B 41 50 mov rax,qword ptr [rcx+50h] ; В RAX — адрес вложенной структуры LockdownConfig F6 00 10 test byte ptr [rax],10h ; Проверить, активирован ли пятый бит (BiosLock) 74 25 je 0000000180001452 ; Если не активирован, перейти мимо остального кода 8A 50 01 mov dl,byte ptr [rax+1] B9 B2 00 00 00 mov ecx,0B2h ; E8 A2 5A 00 00 call 0000000180006EDC 4C 8D 87 DC 00 00 00 lea r8,[rdi+000000DCh] ; В RDI хранится базовый адрес регистров LPC чипсета, а 0xDC — смещение к регистру BIOS_CNTL 33 C9 xor ecx,ecx 4C 8B CD mov r9,rbp 33 D2 xor edx,edx 4C 89 44 24 20 mov qword ptr [rsp+20h],r8 E8 AA 76 00 00 call 0000000180008AFC ; Установить лок

Можно заменить JE на JMP, но иногда вместо короткого прыжка происходит длинный, при котором нужно дополнительно рассчитывать смещение. Поэтому предпочтительнее заменить test на любую команду, которая устанавливает флаг ZF, например на xor rax, rax (48 31 C0). А возможные различия в размерах команд следует компенсировать добавлением NOP’ов. Если в PchInitDxe необходимый код не был найден, можно модифицировать драйвер BiosWriteProtect, чтобы обойти регистрацию SMI-обработчика, который устанавливает бит BLE при попытке его сброса. Затем для разблокировки прошивки достаточно будет сбросить этот бит. У меня отлично работает описанный выше метод, поэтому я пока не пробовал этот вариант и не буду подробно рассказывать о нем.

Разблокировка расширенных настроек

Что: активация доступа к скрытым параметрам BIOS Setup. Зачем: в этих параметрах может скрываться что-то любопытное, однако их обычно скрывают не без причины. Где искать: для Phoenix и Insyde меню размещено в HII-файлах с названиями типа SetupMain, SetupAdvanced и тому подобное. Для AMI меню находится в файле Setup, а настройки — в AMITSE.

Более того, AMI предоставляет пороизводителям end-user продуктов свою программу AMIBCP, версии которой частенько утекают в публичный доступ. Работа с ней достаточно проста, поэтому описывать её я не вижу смысла — скачайте и попробуйте. Способ модификации: для AMI — открываем образ в AMIBCP, меняем настройки по умолчанию, сохраняем, прошиваем, выполняем сброс настроек, готово.

Для Insyde и Phoenix ситуация немного сложнее. Если доступ к записи в NVRAM не ограничен, можно воспользоваться методом товарища Falseclock, упомянутым в его статье. Однако, если доступа нет, потребуется внести изменения в прошивку. Необходимо будет изучить формат HII Form File либо вручную, либо с помощью скрипта, описанного в вышеуказанной статье, или воспользоваться утилитой Universal IFR Extractor, которую нужно направить на извлеченные из образа UEFI файлы HII. После этого достаточно отредактировать извлеченный файл HII Form так, чтобы условия SUPPRESS_IF никогда не выполнались, и все меню станут доступны.

Обновление микрокода CPU, OptionROM, драйверов и образов

Что: обновление микрокодов CPU, прошивок различных переферийных устройств, EFI-драйверов и отображаемых при загрузке и в BIOS Setup картинок. Зачем: иногда обновление помогает исправить ошибки в работе системы, иногда добавляет поддержку важной фичи (работу TRIM для SSD в RAID0, к примеру), но чаще всего обновление производится потому, что наконец вышла новая версия.

Где искать: сильно зависит от производителя. EFI-драйверы можно обнаружить по их названию (например, SataDriver), микрокод следует искать по Model ID соответствующего процессора, OROM можно найти по VID/DID устройств, которые они поддерживают. Изображения в формате JPEG можно идентифицировать по строке «JFIF», в GIF — по «GIF8» и так далее. Метод модификации: проще простого — нужно найти новую версию в свободном доступе, затем выяснить, где в образе находится старая версия, и заменить её на новую.

Для AMI коллега LS_29 создал пакет автоматического обновления, использующий утилиту MMTool, который можно загрузить из нашей темы на оверах. Что касается автоматизированных решений для Phoenix или Insyde, мне пока ничего о таком не известно. Замена изображений может осуществляться как с помощью утилит, таких как AMI ChangeLogo, так и вручную, однако в большинстве случаев неподготовленное изображение может вызвать зависание, поскольку декодеры для форматов изображений часто имеют значительные ограничения. В общем, лучше заранее удалить данные EXIF.

Обновление микрокода cpu без перепрошивки bios

Микрокодом называют прошивку центрального процессора компьютера. Хотя микрокоды и содержатся в прошивке материнской платы (BIOS или UEFI), ядро Linux имеет возможность обновлять микрокод центрального процессора на начальном этапе загрузки системы. Обновление микрокода позволяет как исправить ошибки, допущенные на этапе проектирования центрального процессора компьютера, так и в некоторой мере оптимизировать его работу. Сами же обновления микрокодов выпускаются в формате обычных файлов и размещаются в специальной директории для прошивок устройств в рамках файловой системы Linux.

В этом руководстве представлено описание процедуры обновления микрокодов ЦП, произведённых фирмами Intel и AMD.

Диагностика

Для того, чтобы определить, какая версия микрокода используется в данный момент, проще всего прочитать содержимое виртуального файла с информацией о центральном процессоре:

$ cat /proc/cpuinfo grep microcode microcode : 0xa microcode : 0xa microcode : 0xa microcode : 0xa

Несколько строк в выводе обусловлены тем, что данный файл содержит отдельную секцию для каждого ядра центрального процессора, а также для каждого процессора в системе.

После этого следует определиться в том, осуществляется ли обновление микрокода на этапе загрузки системы вообще с помощью команды dmesg:

$ sudo dmesg | grep microcode [ 0.000000] микрокод: микрокод обновлен на раннем этапе до версии 0xa, дата = 2018-05-08 [ 0.146477] MDS: Уязвимость: Попытка очистки кэш-памяти ЦП, микрокод отсутствует [ 1.383534] микрокод: sig=0x106e5, pf=0x2, версия=0xa [ 1.383655] микрокод: Драйвер обновления микрокода: v2.2.

Из вывода видно, что на начальном этапе загрузки микрокод центрального процессора был обновлен до версии 0xa от 08.05.2018. Если строки формата "microcode: microcode updated early to revision . date = . " не обнаруживается в выводе, то обновление микрокода средствами Linux попросту не выполяется. В этом нет ничего страшного — возможно, прошивка материнской платы вашего компьютера содержит его новейшую версию. В любом случае, строка формата "microcode: sig=. pf=. revision=. " будет содержать информацию об используемой версией микрокода (значение параметра revision).

Микрокоды из репозиториев дистрибутива

Известные дистрибутивы Linux включают в себя пакеты с актуальными микрокодами для процессоров, производимых компаниями Intel и AMD. В дистрибутивах Linux Mint, Ubuntu и Debian эти пакеты называются intel-microcode и amd64-microcode (первый предназначен для процессоров Intel, а второй — для процессоров AMD). В Fedora Workstation имена пакетов другие: linux-firmware и microcode_ctl (в первый пакет входят прошивки для всего оборудования, а также микрокоды для процессоров Intel и AMD, во второй — инструменты для обновления микрокодов). Обычно их установка и обновление происходят одновременно с обновлениями ядра Linux, но если вы не производите регулярные обновления, рекомендуется вручную обновить их с помощью следующей команды:

Linux Mint/Ubuntu/Debian

sudo apt upgrade intel-microcode amd64-microcode

Рабочая станция Fedora

sudo dnf update linux-firmware microcode_ctl

Если будет доступно обновление, необходимо перезагрузить компьютер и подтвердить, прошло ли обновление микрокода, используя команды, описанные в предыдущем разделе.

Микрокоды от производителей процессоров

Не рекомендуется устанавливать микрокоды от производителей ЦП без острого повода — чаще всего версии микрокодов, доступные в официальных репозиториях дистрибутивов, являются наиболее подходящими. Однако вы имеете возможность самостоятельно скачать опубликованные производителями микрокоды из репозиториев и поместить их в файловую систему. Для процессоров Intel необходимо загрузить содержимое репозитория https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/tree/main/intel-ucode и скопировать файлы в каталог /lib/firmware/intel-ucode. Для процессоров AMD нужно загрузить содержимое репозитория https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/amd-ucode и разместить файлы в каталоге /lib/firmware/amd-ucode. После этого необходимо пересоздать начальную файловую систему initrd с помощью следующей команды:

Linux Mint/Ubuntu/Debian

sudo update-initramfs -c

Fedora Workstation

sudo dracut —regenerate-all —force

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

Хотите ознакомиться с дополнительными советами?

Хотите узнать о других настройках и приемах работы с Linux-системами? На данном веб-сайте размещено большое количество подобных материалов.

Оцените статью
LeeReload
Добавить комментарий