Msr lock control bios что это
В этом разделе описываются практически все (по мере создания) параметры, устанавливаемые в программе SETUP для BIOS фирмы AWARD Software International Inc. В конкретной материнской плате каких-то из описываемых параметров может и не быть. Одни и те же параметры могут называться по разному в зависимости от производителя материнской платы, поэтому здесь в некоторых случаях приведено несколько вариантов.
Для просмотра и корректировки установок chipset в BIOS вашего компьютера рекомендуем воспользоваться прелестной программой TweakBIOS. С помощью этой программы можно изменять установки в BIOS "на лету", а также увидеть, правильно ли программа SETUP выполнила установки.
ПРИМЕЧАНИЕ: Программа запускается и под различными Windows, но использовать ее можно только в DOS.
Содержание:
Раздел BIOS FEATURES SETUP
Раздел CHIPSET FEATURES SETUP
Раздел PnP/PCI Configuration Setup
Раздел Power Management Setup
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Yes - освободить IRQ 6
- No — не освобождать (независимо от того, есть ли флоппи-дисковод или нет)
- Enabled - разрешено
- Disabled - запрещено
Раздел CHIPSET FEATURES SETUP
Установка параметров для FPM DRAM, EDO DRAM и Synchronous DRAM
Конфигурирование шин PCI, AGP, портов ввода/вывода и установка параметров IDE контроллера
-
(Режим кэширования для видеопамяти) — параметр действителен только для процессоров архитектуры Pentium Pro (Pentium II, Deshutes и т.п.). В процессоре Pentium Pro была предусмотрена возможность изменять режим кэширования в зависимости от конкретной области памяти через специальные внутренние регистры, называемые Memory Type Range Registers — MTRR. С помощью этих регистров для конкретной области памяти могут быть установлены режимы UC (uncached — не кэшируется), WC (write combining — объединенная запись), WP (write protect — защита от записи), WT (write through — сквозная запись) и WB (write back — обратная запись). Установка режима USWC (uncached, speculative write combining — не кэшировать, режим объединенной записи) позволяет значительно ускорить вывод данных через шину PCI на видеокарту (до 90 MB/c вместо 8 MB/c). Следует учесть, что видеокарта должна поддерживать доступ к своей памяти в диапазоне от A0000 — BFFFF (128 kB) и иметь линейный буфер кадра. Поэтому лучше установить режим USWC, но в случае возникновения каких-либо проблем (система может не загрузиться) установить значение по умолчанию UC. Может принимать значения:
- UC - uncached — не кэшируется
- USWC — uncached, speculative write combining — не кэшировать, режим объединенной записи.
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Normal — обычный интерфейс принтера, также называется SPP
- ECP — порт с расширенными возможностями
- EPP — расширенный принтерный порт
- ECP + EPP- можно использовать оба режима
- SPP — обычный интерфейс принтера, также называется SPP
- ECP — порт с расширенными возможностями
- EPP — расширенный принтерный порт
- EPP 1.9 — версия 1.9 исполнения интерфейса
- EPP 1.7 — версия 1.7 исполнения интерфейса
- 1 — канал 1
- 3 - канал 3
- Disabled - запрещено использовать DMA
- Primary - разрешена работа только первого канала
- Secondary - разрешена работа только второго канала
- Both - разрешена работа обеих каналов
- Disable - запрещена работа обеих каналов
- Enable - контроллер разрешен
- Disable - контроллер запрещен
- PNP OS Installed(установлена ли операционная система с поддержкой режима Plug&Play?) - Установить Yes, если операционная система поддерживает Plug&Play (например, Windows 95) и No в противном случае.
- Resources Controlled By(как управляются ресурсы) - Если выбрано AUTO, то BIOS сам автоматически назначит прерывания и каналы DMA всем устройствам, подключенным к шине PCI и эти параметры не будут появляться на экране. В противном случае все эти параметры следует установить вручную. В некоторых вариантах BIOS этот параметр может устанавливаться индивидуально для каждого PCI слота и выглядеть так: Slot 1 IRQ, Slot 2 IRQ и т.д. (сброс конфигурационных данных) — Рекомендуется устанавливать его в Disabled. При установке Enabled BIOS будет очищать область Extended System Configuration Data (Расширенные данные о конфигурации системы — ESCD), в которой хранятся данные о конфигурировании BIOS`ом системы, поэтому возможны аппаратные конфликты у "брошенных" таким образом на произвол судьбы устройств. (прерывание с номером n назначено на. ) — Каждому прерыванию системы может быть назначен один из следующих типов устройств:
- Legacy ISA (классические ISA карты) — Обычные карты для ISA, такие как модемы или звуковые карты без поддержки Plug&Play. Эти карты требуют назначения прерываний в соответствии с документацией на них.
- PCI/ISA PnP (устройства для шины PCI или устройства для шины ISA с поддержкой Plug&Play) — этот параметр устанавливается только для устройств на шине PCI или ISA карт с поддержкой Plug&Play.
- Legacy ISA (классические ISA карты) — Обычные карты для ISA, такие как модемы или звуковые карты без поддержки Plug&Play. Эти карты требуют назначения каналов DMA в соответствии с документацией на них.
- PCI/ISA PnP (устройства для шины PCI или устройства для шины ISA с поддержкой Plug&Play) — этот параметр устанавливается только для устройств на шине PCI или ISA карт с поддержкой Plug&Play.
- Level (уровень) — контроллер прерываний реагирует только на уровень сигнала.
- Edge (перепад) - контроллер прерываний реагирует только на перепад уровня сигнала.
- PCI IDE IRQ mapping (используется для PCI IDE)
- PC AT (ISA) (используется для ISA)
- Enabled - разрешено
- Disabled - запрещено
- No/ICU (нет/конфигурационная утилита для ISA) — если установлено это значение, то BIOS может распоряжаться этим прерыванием по своему усмотрению. Для DOS настройка параметров в этом случае может также выполняться с помощью программы ISA Configuration Utility от Intel.
- Yes (да) - означает принудительное освобождение прерывания для какой-либо карты на шине ISA, не поддерживающей режим Plug&Play. Рекомендуется всегда указывать Yes для таких карт и нужных им прерываний, так как в противном случае BIOS может назначить прерывание, жестко используемое какой-либо картой на ISA, другой карте, что может вызвать даже прекращение нормальной работы компьютера.
- No/ICU (нет/конфигурационная утилита для ISA) — если установлено это значение, то BIOS может распоряжаться этим каналом DMA по своему усмотрению. Для DOS настройка параметров в этом случае может также выполняться с помощью программы ISA Configuration Utility от Intel.
- Yes (да) - означает принудительное освобождение канала DMA для какой-либо карты на шине ISA, не поддерживающей режим Plug&Play. Рекомендуется всегда указывать Yes для таких карт и нужных им каналом DMA, так как в противном случае BIOS может назначить канал, жестко используемый какой-либо картой на ISA, другой карте, что может вызвать даже прекращение нормальной работы компьютера.
- No/ICU (нет/ICU) - оставляет управление этим параметром на усмотрение BIOS или программы ICU.
- C800, CC00, D000, D400, D800 и DC00 - указывается адрес блока памяти. Кроме этого, появляется дополнительный параметр ISA MEM Block SIZE (размер блока памяти), который нужен в том случае, если таких ISA карт несколько и этот параметр может принимать значения 8K, 16K, 32K, 64K
- AUTO (автоматически) — Разрешен поиск SCSI контроллера Adaptec и запуск BIOS для него.
- Disabled (запрещено) — Устанавливается в это значение при отсутствии SCSI карты.
- Yes - разрешено
- No — запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- AUTO (автоматически) — Разрешен поиск SCSI контроллера и запуск BIOS для него.
- Disabled (запрещено) — Устанавливается в это значение при отсутствии SCSI карты.
- Enabled - разрешено
- Disabled - запрещено
- PCI/AGP - сначала BIOS PCI видеокарты, затем AGP
- AGP/PCI - сначала BIOS AGP видеокарты, затем PCI
- OS — поддержка через операционную систему
- BIOS - поддержка через BIOS
Раздел Power Management Setup
- Power Management(управление энергопотреблением) — позволяет либо разрешать BIOS'у снижать энергопотребление компьютера, если за ним не работают, либо запрещать. Может принимать значения:
- User Define (определяется пользователем) — при установке этого параметра вы можете самостоятельно установить время перехода в режим пониженного энергопотребления.
- Min Saving (минимальное энергосбережение) — при выборе этого параметра компьютер будет переходить в режим пониженного энергопотребления через время от 40 мин. до 2 часов (зависит от конкретного BIOS материнской платы)
- Max Saving (максимальное энергосбережение) — компьютер перейдет в режим пониженного энергопотребления через 10 — 30 с. после прекращения работы пользователя с ним.
- Disable (запрещение энергосбережения) — запрещает режим энергосбережения.
- Enabled - разрешено
- Disabled - запрещено
- Susp, Stby -> Off (выключение в режиме Suspend И Standby) — монитор перейдет в режим пониженного энергопотребления при наступлении либо режима Suspend, либо Standby.
- All modes -> Off (выключение во всех режимах) — монитор будет переведен в режим пониженного энергопотребления в любом режиме.
- Always On (всегда включен) — монитор никогда не будет переведен в режим пониженного энергопотребления
- Suspend -> Off (выключение в режиме Suspend) — монитор перейдет в режим пониженного энергопотребления при наступлении режима Suspend.
- DPMS OFF - снижение энергопотребления монитора до минимума
- DPMS Reduce ON - монитор включен и может использоваться
- DPMS Standby - монитор в режиме малого энергопотребления
- DPMS Suspend — монитор в режиме сверхмалого энергопотребления
- Blank Screen - экран пуст, но монитор потребляет полную мощность
- V/H SYNC+Blank - снимаются сигналы разверток — монитор переходит в режим наименьшего энергопотребления.
- Enabled - разрешено
- Disabled - запрещено
-
(частота процессора в режиме Standby) - определяет коэффициент деления тактовой частоты в режиме Standby (ожидания работы).
- HDD Power Down(выключение жесткого диска) - устанавливает либо время, через которое при отсутствии обращения жесткий диск будет выключен, либо запрещает такое выключение вообще. Параметр не оказывает влияние на диски SCSI. Может принимать значения:
- От 1 до 15 минут
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
-
— разрешение этого параметра приведет к "пробуждению" компьютера от модема или мыши, подключенных к COM2. Может принимать значения:
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Soft Off (программное выключение) — кнопка работает как обычная кнопка включения/выключения питания компьютера, но при этом разрешается программное выключение компьютера (например, при выходе из Windows 95).
- Suspend (временная остановка) — при нажатии на кнопку питания на время менее 4 секунд компьютер переходит в стадию Suspend снижения энергопотребления.
- No Function (нет функций) — кнопка Power становится обычной кнопкой включения/выключения питания.
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Everday (ежедневно) — при вводе времени компьютер будет включаться ежедневно в назначенное время. Время вводится в поле Time (hh:mm:ss) Alarm в порядке часы:минуты:секунды либо клавишами PgUp, PgDn, либо непосредственным вводом чисел.
- By Date (по дате) - компьютер включится в заданный день и в заданное время. При выборе этого параметра появляется поле для ввода времени (такое же, как и для Everyday) и поле для ввода дня месяца Date of Month Alarm — день месяца — в этом поле вводится число в месяце. Это автоматически означает, что запрограммировать включение компьютера можно только внутри одного месяца.
- Disabled - запрещено
- вы не можете запускать виртуалки с более, чем одним процессором
- вы не можете запускать 64-битные гостевые операционные системы внутри 32-битной хост ОС.
- оригинальный BIOS для нашего нетбука с сайта производителя.
- IDA
- phoenixtool210.zip (гугл знает, где скачать)
- HHD Hex Editor Neo или любой другой HEX Editor
- FAR Manager :)
- nasm — для дизассемблирования
- Знание о том, как залить BIOS аварийным способом
- отформатить USB HDD в FAT16 с партицией мегов на 100 (FAT32 не понимает)
- залить туда один файл со сжатым биосом (ZE6.fd в моем случае)
- выключить ноут, потом вынуть все USB устройства и аккумулятор
- вынуть шнур питания
- подключить USB HDD
- нажать и удерживать Esc+Fn
- воткнуть питание и через 5 сек нажать кнопку включения питания
- отпустить кнопки клавиатуры
-
— при разрешении этого параметра компьютер не "засыпает", если подключенное к порту COM2 устройство используется. Может принимать значения:
-
(он же Soft-of By PWR-BTTN) (кнопка питания нажата менее 4 секунд) - управляет функциями кнопки Power на системном блоке компьютера. Может принимать значения:
В следующих секциях BIOS только сообщает характеристики некоторых устройств компьютера. Разрешение параметров в этих секциях позволяет отслеживать BIOS'у эти параметры и сообщать об их выходе за пределы допустимого.
Секция Voltage Monitor (наблюдение за напряжениями питания). В этой секции индицируются как напряжения питания, подаваемые на материнскую плату источником питания, так и вырабатываемые на материнской плате. Разъяснения эти параметры не требуют, кроме VCORE — это напряжение питания ядра процессора. Это напряжение вырабатывается, как правило, на материнской плате.
В данной статье мы расскажем вам пошагово о том, как допилить напильником свой нетбук или ноутбук, в котором по какому-то недоразумению выключен и залочен в таком состоянии бит 2 в MSR 0x3A — попросту говоря, у вас есть в процессоре поддержка виртуализации, но она заблокирована биосом.
ПРЕДУПРЕЖДЕНИЕ: всё, описанное в этой статье, рассчитано на то, что вы знаете, что делаете. Всё на свой страх и риск! Если не уверены — не пытайтесь повторить это дома.
Итак, в чем же проблема?
Можно ли вылечить это?
На этот вопрос можно ответить, проверив некоторые биты в некоторых словах состояния процессора. Самый простой способ убедиться, что в вашем случае проблема лечится — это посмотреть на то, что показывает программа SecurAble. В моем случае это выглядело так:
Итак, если у вас программа показывает такую же картинку, как показанная выше, то вы можете вылечить эту проблему. Однако нюанс заключается в том, что это установить нужный бит в регистре процессора можно только в БИОСе, поскольку вредный БИОС вашего ноутбука его выставляет в ноль, потом включает блокирующий бит и изменение этого бита более невозможно (до перезагрузки компа, где БИОС во время POST опять его сбросит и залочит).
Биос на нетбуке Acer Aspire производства Insyde, настройки его очень скудны и по F2 естественно мы не можем зайти в программу редактирования настроек БИОСа и включить виртуализацию там. Это было бы слишком просто.
Поэтому, мы будем дизассемблировать БИОС и менять его код, чтобы у нас бит был выставлен в 1. Если готовы, то читаем далее.
Что нужно знать до начала работы
Итак, некоторая техническая информация — чтобы понимать, что мы делаем и зачем.
Современные процессоры, по крайней мере многие из них, имеют поддержку виртуализации. За нее отвечает бит №5 в слове ECX при вызове команды CPUID с параметром EAX=01H. Именно этот способ проверки — единственно верный, поскольку, как показывает практика, сайт Intel врет, например, для моего процессора Intel Atom N570. По этой ссылке написано:
Но это еще не все. Чтобы гипервизоры второго типа смогли пользоваться командами поддержки виртуализации (VMX), необходимо явным образом разрешить эти инструкции в MSR (специальном регистре процессора) номер 0x3A. Вот что говорит нам документация по этому регистру на стр. 237:
регистр 3Ah: IA32_FEATURE_CONTROL
Бит 0: lock bit — если он выставлен, то дальнейшие модификации этого регистра не допускаются, до следующей перезагрузки.
Бит 1: VMX в SMX — safer mode extensions. Работа функций виртуализации в SMX допускается только тогда, когда процессор поддерживает SMX — это указывается в соседнем слева, 6-м бите в ECX при вызове команды CPUID.01H — на картинке выше этот бит равен нулю, наш процессор Atm N570 не поддерживает SMX — поэтому и в MSR 0x3A бит №1 должен быть нулевым.
Бит 2: VMX не в SMX — это, собственно, и есть бит, отвечающий за поддержку виртуализации. Он соответствует обведенному в кружочек биту в CPUID и именно он должен быть выставлен в 1.Как проверить содержимое MSR 0x3A
Чтобы убедиться, что мы все про наш компьютер поняли верно, нужно посмотреть, что на самом деле у нас хранится в MSR 0x3A. Для этого я использовал пакет msr-tools в Debian (реальном, не виртуальном. В виртуальном результат неверный). Вот так вы сможете проверить значение этого бита:
— ребутаемся в Debian, потом:
Девять. Девять это 00001001. Как видим, наш BIOS использует недокументированный бит №3 в специальном слове регистра 0x3A — по документации, этот бит Reserved. Но это не суть. Суть в том, что у нас включен lock bit и выключен наш VMX бит №2 — так что все верно, программа SecurAble не врет и у нас действительно поддержка виртуализации отключена на уровне BIOS, хотя и поддерживается процессором.Почему эту проблему нужно решать
Дело в том, что при отключенной поддержке виртуализации (VMX) в процессорном слове 0x3A ваши виртуальные машины в VirtualBox работают в режиме паравиртуализации. Они, не имея возможности перевести гипервизор в VMX Root и виртуальную машину в VMX Non-root operation, вынуждены делать трансляцию процессорных инструкций НА ЛЕТУ. Проблему представляют 17 инструкций процессора, которые не «VM-safe», т.е. они используют единственные на весь компьютер регистры или блоки данных (таблицы) в процессоре. Эти команды: SGDT, SIDT, SLDT, SMSW, PUSHF/POPF, LAR, LSL, VERR/VERW, CALL, JMP, INT n, INTO, RET, STR и даже банальная MOV! Все эти инструкции изменяются на лету, чтобы виртуальная машина выполнила их в безопасном для системы виде. Подробнее про эту проблему описано тут (англ.). Из-за этого страдает быстродействие виртуальной машины.
Что нам потребуется
Я проверил этот способ, залив таким образом стандартный биос с сайта производителя (другой версии, чем стоял у меня до этого) — действительно, работает, версия биоса обновилась.
Таким же способом я решил в итоге заливать в систему и прохаченный биос.Итак, начинаем:
Распаковываем биос из SFX-архива, скачанного с сайта производителя. Сам иос будет иметь имя файла что-то вроде ZE6.fd и иметь размер 2 мегабайта ровно.
Далее нам необходимо распаковать БИОС, поскольку он сжат. Для этого используется программа PhoenixTool.exe. В первое поле в ее окошке мы указываем этот сжатый биос, и программа сама его декомпиляет на, в моем случае, целых 609 исходных файлов, имеющих имена в формате GUID.ext. Часть из этих файлов — конфигурационные, а часть — двоичные, но все с расширением ROM. Некоторые двоичные файлы содержат программы со стандартным виндовским PE заголовком.Наша задача — среди этих 609 файлов найти файл, содержащий нужную нам инструкцию
оказалось, что искать команду MOV EAX, 3AH перед командой WRMSR бессмысленно — в моем биосе WRMSR оформлена как отдельная функция и принимает параметры через стек. Поэтому я делал это так (мне показалось то проще, чам в IDA): установил на Linux пакет nasm, который включает в себя ndisasm. Потом дизассемблировал все файлы *.ROM командой
И потом простым поиском нашел команду wrmsr в них — таких файлов оказалось 29. Потом пришлось каждый из ни загружать в IDA и искать там нужный код, который лочит регистр 3AH.
По определению, код, который лочит регистр, делает это один раз. Потому это самое удачное место для того, чтобы сделать наш хак: меняем цифру 1 на цифру 5 в инструкции:
Менять будем не совсем в файле *.ROM, а в оплетке *.MOD, которая содержит этот файл. Для этого нужно в программе PhoenixTool.exe, которая у нас уже открыта и биос в нее уже загружен, нажать на кнопку Structure, и инайти ветку с нашим именем файла:
Нажимаем кнопку Extract, получаем файл *.MOD (который состоит из заголовка + тела файла *.ROM), и правим наш бит именно в этом файле MOD. Смотрим в IDA, какой двоичный код соответствует окрестности инструкции, которую мы меняем, и в HEX редакторе открываем файл, ищем это место в коде, и меняем всего 1 байт с 01 на 05. Сохраняем модифицированный файл *.MOD. Потом в PhoenixTool нажимаем Replace, выбираем модифицированный MOD, и нажимаем Exit. Всё. Программа сама пересобрала биос и упаковала его для нас, при этом назвала его тем же именем, что и было (старый файл сохранен с расширением OLD).Всё. Теперь заливаем единственный файл с новым биосом на USB HDD (можно и на USB флешку), и выполняем описанную выше процедуру аварийного восстановления биоса. Она прошьет комп этом новым биосом и всё будет готово.
Вот как теперь выглядит вывод программы SecurAble:
Теперь VirtualBox запускает виртуалки с 4 ядрами (а не с одним, как было раньше). Теперь я из-под своей основной 32-разряной операционной системы могу запускать 64-битные операционки в виртуалках.
И, что самое главное, теперь виртуалки на самом деле виртуализованные (гипервизор использует инструкции VMX), а не паравиртуализованные.Продолжаем начатый в прошлом посте разговор о безопасности UEFI, об угрозах и имеющихся защитах от них.
В этот раз речь пойдет об SMM, о том, как он устроен и работает, и почему является желанной целью для атаки.
Пропустившим нулевую и первую части сего опуса — рекомендую прочесть сначала их, остальных покорно прошу под кат.
Часть вторая. SMM
Немножечко ликбеза
Аппаратное SMI
Писать про него особенно нечего: подаем напряжение на ногу — имеем прерывание. Сейчас используется редко, т.к. почти на всех системах теперь имеются мультифункциональные GPIO, которые могут генерировать события, не прерывая работу ОС, плюс не нужна дополнительная логика для определения, кто же конкретно сгенерировал аппаратное SMI, ведь устройств много, а нога — одна.
Системные SMI
Программные SMI
Программные SMI генерируются чаще всего либо прошивкой, либо драйверами, но ничего не мешает атакующему с правами администратора в ОС (точнее, необходимы права на исполнение инструкции out) тоже генерировать их.
Программное SMI генерируется при записи в CPU IO-порт APM_CNT (чаще всего это порт 0xB2), в качестве параметра в регистре AL передается его номер. Таким образом, максимальное количество различных обработчиков программных SMI в системе — 256, но реально их от 0-5 на специализированных системах, подготовленных для работы с RTOS, до 15-20 на системах с кучей разного железа, которым надо управлять без вмешательства ОС.Как реализован SMM
Для кода SMM-диспетчера и обработчиков SMI выделяется 1-3 области физической памяти, которую во всех «обычных» режимах исполнения чипсет помечает как область MMIO с несуществующим устройством, т.е. для всего остального мира эти области — сплошная череда 0xFF, которые невозможно перезаписать. Первая область, называемая обычно ASEG (т.е. «сегмент А»), предназначена для т.н. legacy SMM code, т.е. старых 16-битных обработчиков SMI, которых на современных системах уже нет. Имя сегменту досталось за то, что он находится по фиксированным физическим адресам 0xA0000 — 0xBFFFF. Вторая область с фиксированными адресами — HSEG (т.е. «высокий сегмент»), раньше находилась на 0xFEDA0000 — 0xFEDBFFFF, но на современных системах не используется, т.к. имеется гораздо более удобный сегмент с настраиваемыми адресом и размером — TSEG (т.е. «топовый сегмент»), в котором и находятся сейчас 99% кода, исполняемого в SMM, а в ASEG остается только небольшая заглушка для совместимости.
При переходе в SMM процессор сохраняет практически весь контекст (т.е. содержимое практически всех регистров, какие именно не сохраняются — зависит от конкретной микроархитектуры), причем к сохраненному контексту у обработчиков SMI есть полный доступ, и потому он может общаться с системой через изменение сохраненных значений.
Для ОС вызов SMM кода выглядит как волшебное изменение содержимого регистров и памяти, и хотя отследить длительность нахождения в SMM все же можно по косвенным признакам, а факт перехода в него — по непосредственным, при помощи чтения регистра MSR_SMI_COUNT до и после вызова инициации программного прерывания, но повлиять на длительность обработчика SMI ОС не может, поэтому SMM плохо совместим с hard-RTOS (стоит отметить, что вся архитектура x86 совместима с ними весьма через раз, но это другая история).
При настройках по умолчанию работающий в SMM код имеет полный доступ ко всей физической памяти на чтение и запись, полный доступ ко всем подключенным устройствам, в общем — может практически все, и при этом независим от ОС и недоступен из нее даже на чтение, что сильно затрудняет его анализ и делает код обработчиков SMI весьма привлекательной целью для атаки. Более того, если атакуемой системе доступна из SMM запись на SPI-микросхему (а она доступна во всех случаях, кроме систем с включенной PFAT, которые не найти с огнем, систем с Read-only BIOS'ом, которые встречаются еще реже, и систем с защитой через PR-регистры), то успешная атака может закончиться записью своего кода в BIOS, с последующем воровством, убийством и непотребством с гусями. Именно поэтому защитить SMM от вставки туда вредоносного кода — жизненно необходимо.Атаки на SMM и защита от них
Забытый D_LOCK
Код в SMRAM не появляется там самостоятельно, сначала саму SMRAM нужно настроить, инициализировать физическую память, настроить TSEG так, чтобы все обработчики туда влезли, скопировать туда код SMM-диспетчера и обработчиков, настроить там таблицы дескрипторов — в общем, навести строгий уставной порядок, после чего обязательно снять бит D_OPEN, чтобы никто больше там ничего не испортил, и установить бит D_LOCK, чтобы D_OPEN нельзя было поставить назад. На некоторых старых системах установить D_LOCK забывали, и там SMM был отрыт всем ветрам, но во времена UEFI этого уже не происходит, так что этот вектор атаки ушел в историю.
SMM cache poisoning
Еще одна историческая атака — отравление кэша SMRAM, которую в 2009 году опубликовали Rafal Wojtczuk и Joanna Rutkowska. Суть атаки коротко — меняем тип памяти для региона SMRAM на Write-Back, организуем запись в регион SMRAM своего кода, запись в память не происходит, но при этом наш код остается в кэше второго уровня, после чего генерируем программное SMI и процессор читает данные не из SMRAM, а из кэша, и выполняет наш вредоносный код. Проблема решилась радикально — производители CPU запретили ставить режим WB на SMRAM, и потому системе с UEFI этой уязвимости не подвержены.
SMM call-out, она же SMM incursion attack
Но достаточно истории, перейдем к «современным» атакам. Начнем, пожалуй, с той самой SMM Incursion Attack, о которой тов. maseal упомянул в комментарии к первой части. Я специально поставил слово «современные» в кавычки, ибо этой атаке — сто лет в обед, впервые о ней сообщали еще в 2008 году как проблему тогдашних BIOS'ов, но в 2015 ее вновь переоткрыли Corey Kallenberg и Xeno Kovah. Атака простая как мычание — если обработчик SMI вызывает какой-либо код, находящийся вне SMRAM, то атакующий с правами на запись в физическую память может подменить вызываемый код на свой, и выполнить его таким образом в режиме SMM. А т.к. разработчики UEFI привыкли к доступности EFI Runtime-сервисов, то эти самые сервисы стабильно вызывались из обработчиков SMI на каждый чих (чаще всего это были вызовы GetVariable, SetVariable и ResetSystem). Уязвимости оказалось подвержено столько систем, что проще сказать, где их не было. По моей грубой оценке, если ваш UEFI старше мая-июня 2015 года по build date, в нем гарантированно имеется пара уязвимых к этой атаке обработчиков SMI. Вычистить систему от таких глючных обработчиков достаточно сложно, и т.к. раньше такое поведение вообще не считалось уязвимостью («какой дурак полезет сервисы хукать то?!») и о том, что так делать нельзя, не было известно простым IBV 'шным кодерам — даже сейчас периодически приходят обновления для runtime-драйверов, подверженные этой проблеме. Все очень грустно, в общем.
Для защиты от вызова внешнего по отношению к SMRAM кода инженеры Intel добавили специальный MSR_SMM_FEATURE_CONTROL, после установки определенного бита в котором вызов такого кода генерирует немаскируемое и невосстановимое MCE , но есть такой MSR только в Haswell и более новых CPU, да и включается эта возможность только на время отладки прошивки, иначе за непонятные зависания на ровном месте пользователи могут к дверям отдела R&D прийти с вилами и дубьем — большинству нужно, чтобы работало и сейчас, а эта ваша безопасность вся — overhyped. Для обладателей более старых систем и систем на базе процессоров AMD инженеры Phoenix нашли по своему гениальное решение — использовать NX-бит, настроив память для SMM-кода таким образом, чтобы вызов кода вне SMRAM заканчивался Page Fault'ом, который затем можно обработать, а не висеть намертво на MCE. Каюсь, я у себя пока еще это решение не внедрил, но когда дойдут руки — обязательно это сделаю.
Простому же пользователю от этой атаки можно защититься только не допуская исполнение непонятного кода от рута, но это, к сожалению, на современных ОС практически нереально — вариантов локального повышения прав как было море, так и остается, сколько таких 0day-эксплоитов на руках и в обороте, сказать невозможно. Остается только процитировать вышеупомянутого Xeno Kovah:DMA attack
SMM cross-buffer attack
Представленная специалистами из Intel ATR атака на обработчики SMI, которые принимают в качестве параметра указатель и размер буфера, и производят запись в него. Атакующий может передать указатель и размер таким образом, чтобы буфер пересекал границу RAM-SMRAM, а т.к. обработчик SMI имеет доступ к SMRAM, то он перепишет какую-то часть данных вначале SMRAM. При удачном стечении обстоятельств (т.е. приблизительно после 500 часов отладки минимум) обработчик может переписать служебные структуры диспетчера SMM или других обработчиков нужным атакующему образом, и он получит возможность выполнения произвольного SMM-кода. Атака адски сложная и целевая, но вполне возможная, поэтому с начала 2015 года все обработчики SMI, принимающие указатели на буфер, обязаны валидировать его перед использованием. На более старых системах атака будет работать, но вероятность того, что именно вас через нее взломают — невелика.
Заключение
Ну вот, теперь разобрались более или менее и с SMM, в следующей части поговорим об атаках на S3 BootScript.
Спасибо за внимание, безопасных вам прошивок.P.S.
Не могу не поблагодарить тов. d_olex за его статьи об SMM и атаках на него — раз и два. Для интересующихся темой и умеющих читать по-английски — обе обязательны к прочтению.
Итак, первым у нас идет функция Roboost Graphic Booster. Назначение ее вытекает из ее же названия - повышение производительности видеокарты. Естественно, самым идиотским способом - повышением частоты PCI-E ну и еще там по мелочи (вот меня всегда убивало: что за бред, ведь в 99.99% случаев производительность видео упирается в свойства и характеристики кристалла и памяти, но определенно не в ПС самой шины. На кой пихать этот бесполезный хлам ). В общем, обчыному пользователю она не нужна, а оверклокеру и подавно - смело ставим на Стандарт или авто и не забиваем себе мозги.
Далее идет CPU Clock Ratio. Ну тут нужно быть уже полным "дубом" чтобы не понять назначение сей функиции - изменение множителя. Удобно, что множитель задается цифрой вручную. Однако, дробный множитель мы там выставить не сможем, он выставляется с помощью следующей функции (сие применимо только для 45-нм процессоров Yorkfield и Wolfdale).
Ну далее мы видим значение частоты процессора при выбранном множителе и частоте шины, в общем понятно
CPU Host Clock Control - функция, которая блокирует и разблокирует ручное управление частотой шины процессора, PCI-E. Овеклокерам обзятельно включать
CPU Host Frequency - сие дело жизненно необходимо для овера - оно позволяет выставить значение чатоты шины FSB процессора (глюкобайт опять задал бесконечно здоровый диапазон значений - бсегда это бесило )
PCI Express Frequency - оно и понятно, задает частоту шины PCI-E. При разгоне желательно (да какое там, "желательно", - обязательно! фиксировать в пределах 100-103 МГц (многие оверы предпочитают ставить на значении 101, якобы это добавляет стабильности. Однако это все зависит от самой платы. Некоторые, например, ставили и 107. )). В противном случае посыпятся жесткие диски (а в очень, очень редких случаях может сыпануться и видеокарта, если значение частоты будет слишком большое).
C.I.A. 2 - обыному пользователю, неискушенному в оверклокерскому деле, но желающему повысить быстродействие компьютера может пригодиться - данная фигня позволяет включить динамический рагон при наргузке процессора. Естественно, есть несколько пресетов, отличающихся степенью разгона. Нам оверам, она на (censoured) не нужна, поэтому отключаем ее. (к слову сказать она и без того кривая).
Perfomance Enchance - сия функция для ленивых оверов, которым лень подбирать минимальные значения таймингов и Perfomance Level, заставляя маму делать это самой. Однако я лично ни разу не пользовался ею, помня тот кошмар с выставлением таймингов, который был у плат от глюкобайта раньше, предпочитая выставлять все вручную.
System Memory Multiplier - выставление частоты памяти и значения FSB страпа (грубо выражаясь, страп - это такая дрянь, которая понижает ПСП памяти при преодолении определенной частоты фронтальной шины). Частоты памяти показывается рядом и вычисляется по формуле FSBxMultiplier. Значений мнеодителя и страпа много, поэтому можно тонко настроить производительность памяти.
DRAM Timing Selectable - отключение/включение ручного управления таймингами памяти.
Далее идет целый раздел настроек тамингов памяти. Весь я его описывать не буду, ибо каждые значения для разного комплекта модулей памяти свои. Однако внимательный читатель наверняка заметил отсутствие в списке очень важного параметра: Perfomance level, серьезно влияющего на ПСП. Не стоит негодовать и поливать грязью платы, просто инженеры Гигабайт решили замаскировать этот параметр под ничего не говорящей неискушенному позователю функцией Static tREAD Value. Хитро, правда?
Далее идет раздел управления параметрами тактового генератора - Clock Driving & Skew Control.
Сии "прричендалы" понадобятся Вам только в тонкой настройке системы после разгона, для повышения стабильности системы, да и то при существенном разгоне. В основном, их можно оставить в покое.
Далее идет раздел управления напряжением, с главным "выключателем" System Voltage Control, у которого есть два значения: ручное и Авто. На авто я настоятельно не рекомендую ставить значения напруг - при разгоне плата устанавливает их просто баснословными. лучше все вручную.
DDR2 Voltage Control - оно и дураку понятно - позволяет овысить напряжение на памяти. Инженеры Гигабайт даже подсветили значения, что они считают небезопасными, розовым и красным цветом.
PCI-E Voltage Control - то же самое, только напруги для PCI-E.
FSB Overvoltage control - повышение напряжения на фронтальную шину FSB, понадобится при больших значениях оной (как минимум, за 400-420)
(G) MCH OverVoltage Control - добавление напруги на северный мост. Нужно для достижений больших значений FSB и частоты памяти.
ВНИМАНИЕ! Настоятельно советую (владельцам плат на на базе Х38/Х48 в особенности) поменять термоинтерфейс северника! Ибо то, что глюкобайтовци туда нацепили - это издевательство над здравым смыслом.
К слову, не советую владельцам плат на наборе логики Х38/Х48 особо увлекаться - мосты и без того раскалются а тут еще дополнительная напруга.СPU Voltage Control - позволяет повышать/понижать напряжение на процессоре.
Loadline Calibration - эта весчь позволяет избежать процседания напряжения на процессоре при нагрузке. Теоретически. Фактически она реализовна у Гигабайта настолько отвратительно, что при даже включенной функции просадки достигают 0.05-0.06 В!! В случае двуядерных процессоров жить еще можно, но когда речь идет о четырехьядерных. Хоть намыливай веревку и вешайся. Ужас!
Ранее господа от глюкобайта любили применять так называемую "защиту от дурака", которая скрывала бы функции разгона в БИОСе, при этом же распихивали все функции куда только можно. Сейчас, как видите, все сосредоточено в одном разделе, но и при этом господа инженеры не удержались от искушения. С помощью комбинации клавиш Ctrl+F1, нажатой в основном окне БИОС, в разделе M.I.T. открываются еще две функции: CPU GTLREF1 Voltage control и CPU GTLREF2 Voltage Control. Я долго не мог понять для чего они нужны, и тем более зачем их нужно было скрывать, пока не понял, что они позволяют более тонку управлять напругой, подаваемой на процессор. Дело в том, что шаг подаваемой напруги на процессор не постоянный - он постепенно увеличвается со значением напряжения достигая значения 0.05-0.1 В при большbх значениях VCore. Поэтому для более тонкого управления напругой используются сии функции.
Ну, в общем-то и все. Надеюсь кому-то этот маразм старца, что я написал, да и поможет.
Подпишитесь на наш канал в Яндекс.Дзен или telegram-канал @overclockers_news - это удобные способы следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Материнские платы MSI серии B460 позволяют процессору работать на более высоких частотах за счет увеличения лимита мощности.
Впрочем, чтобы процессор Core i5, i7 или i9 не страдал от перегрева, для него может потребоваться специальная система охлаждения, поскольку стандартный кулер от Intel будет недостаточно эффективным при тяжелых нагрузках, например, при запуске бенчмарков Blender или CineBench. Иными словами, для стандартного кулера нужен более низкий лимит мощности. Какой именно? И какой лимит следует задавать для мощных систем воздушного и водяного охлаждения, чтобы суметь раскрыть весь скоростной потенциал того или иного процессора?
Специалисты MSI разработали новую функцию, которая дает пользователю рекомендации по настройке лимита мощности в зависимости от используемой системы охлаждения. Называется она CPU Cooler Tuning – «Настройка процессорного кулера», пользоваться ей легко и просто. При первой загрузке компьютера (или всякий раз после очистки настроек BIOS) материнская плата предлагает указать типа процессорного кулера и задает соответствующий лимит мощности. Функция эта доступна на материнских платах MSI с чипсетами Intel Z490, B460 и H410.
В качестве примера возьмем плату MAG B460M Mortar WIFI. Она предлагает выбрать из трех типов процессорных кулеров: боксовый (65 Вт), башенный воздушный (255 Вт) и водяной (255 Вт). Не забудьте нажать клавишу F10, чтобы сохранить настройки и выйти из BIOS после выбора. Заданная настройка лимита мощности вступит в силу при следующей перезагрузке.
Power Limit 1 / Power Limit 2 Текущий предел Коробочный кулер 65W / 134W 140A Воздушная система охлаждения Tower 255W / 255W 210A Жидкостной кулер 255W / 255W 210A Если нужно изменить тип кулера и соответствующую настройку лимита мощности, просто зайдите в интерфейс BIOS и выберите нужное значение в выпадающем меню CPU Cooler Tuning.
Если стандартные значения вам не подходят, можете настроить лимит мощности вручную. Это осуществляется в разделе Overclocking / Advanced CPU Configuration (Разгон / Расширенные настройки процессора).
Как лимит мощности влияет на температуру и производительность процессора?
Возможно, вы задаетесь вопросом, как именно лимит мощности влияет на температуру и производительность. Ниже представлены результаты тестов в бенчмарке Blender BMW 2.7 со стандартным процессорным кулером Intel. При этом использовались процессор Intel Core i5-10600 и материнская плата MAG B460M Mortar.
Как видно из приведенной ниже диаграммы, при использовании боксового кулера с лимитом мощности 65 Вт температура процессора удерживается на отметке в 70 градусов за счет снижения производительности. Если лимит мощности увеличен до 95 Вт, производительность растет, а температура достигает 89 градусов. При еще большем увеличении лимита мощности (до 255 Вт) температура повышается до 100 градусов, что не рекомендуется для повседневной работы компьютера. Таким образом, для боксового кулера Intel оптимальным будет лимит мощности в 65 Вт.
Для выявления наилучшего значения лимита мощности рекомендуется протестировать компьютер с теми приложениями, которые вы используете чаще всего. Если же вы затрудняетесь с выбором, то функция CPU Cooler Tuning – отличный способ быстро задать подходящее значение лимита мощности в зависимости от вашей системы охлаждения.
Читайте также: