Проникновение в BIOS ROM №1

В ранее опубликованной статье "Вирус в Shadow RAM" были рассмотрены уязвимости, позволяющие программно модифицировать выполняемый блок BIOS, находящийся в оперативной памяти. Очевидно, это дает вредоносным программам широкие возможности, но не вызывает повреждения оборудования, поскольку искажается не содержимое микросхемы BIOS, а его копия, находящаяся в ОЗУ и обновляемая при каждом перезапуске компьютера.

Продолжая начатую тему, рассмотрим и более тяжелый случай – искажение содержимого микросхемы BIOS. После такой атаки, материнская плата требует ремонта, а точнее – восстановления содержимого микросхемы BIOS.

Как известно, авторы вирусов начали использовать эту уязвимость еще около 10 лет назад, практически сразу после того, как в качестве носителя BIOS стали применяться микросхемы электрически перепрограммируемых ПЗУ (Flash ROM). В сложившейся ситуации, минимизация угрозы стала заботой не только авторов антивирусных программ, но и разработчиков аппаратного обеспечения, в частности, материнских плат. Отметим, что полностью исключить опасность несанкционированной модификации BIOS невозможно, так как для этого пришлось бы отказаться от "законной" возможности его обновления.

В предлагаемом материале, на уровне ассемблера и программирования конфигурационных регистров, рассматривается процесс программного доступа к функциям микросхемы Flash ROM, а также системные ресурсы, управляющие таким доступом и защищающие BIOS от несанкционированного искажения.

При таком глубоком исследовании, нам потребуется работать с регистрами, которые в каждом чипсете реализованы по-разному. Разумеется, в одной статье невозможно описать архитектуру всех чипсетов. Поэтому, для того, чтобы разговор был предметным, остановимся на одном из вариантов: в качестве примера рассмотрим платформу на чипсете Intel 815, детально описанном в [2-3], использующую микросхему BIOS SST 49LF004A, детально описанную в [18]. Перечислим все действия программы, выполняемые при стирании сектора и записи данных в микросхему Flash ROM для такой платформы. Протокол доступа к микросхеме Flash ROM, описанный ниже, используется как программами обновления BIOS, так и вредоносными программами, цель которых – искажение или стирание содержимого микросхемы BIOS.

В приложении к статье содержатся исходные тексты программы, осуществляющей доступ к функциям микросхемы Flash ROM.

Как это делается
1) Микросхема BIOS подключена к "южному мосту" чипсета посредством интерфейса LPC (Low Pin Count), детально описанного в [1]. Для доступа к содержимому BIOS на предмет чтения и записи, а также передачи управляющих команд и контроля текущего состояния микросхемы Flash ROM, используется 16-мегабайтный диапазон FF000000h-FFFFFFFFh в адресном пространстве памяти. Чтобы программные обращения к указанному диапазону транслировались в физические циклы чтения и записи на интерфейсе LPC, конфигурационные регистры "южного моста" чипсета должны быть установлены следующим образом.

В 16-битном регистре BIOS_CNTL (его координаты в конфигурационном пространстве Bus=0, Device=1Fh, Function=0, Register=4Eh-4Fh) бит 0 нужно установить в "1". Это снимает блокировку циклов записи и разрешает их трансляцию на интерфейс LPC.

В 8-битном регистре FWH Decode Enable 1 (его координаты в конфигурационном пространстве Bus=0, Device=1Fh, Function=0, Register=E3h) биты 7-0 нужно установить в "1". Это обеспечивает трансляцию циклов чтения и записи на интерфейс LPC для всех адресных диапазонов, используемых при взаимодействии с микросхемой BIOS. Подробности в [3]. Принципы построения конфигурационного пространства описаны в [15-16]. Протокол доступа к нему посредством функций PCIBIOS описан в [14].

2) Микросхема SST 49LF004A, используемая в качестве носителя BIOS, имеет объем 512 Кбайт и разделена на 8 блоков по 64 Кбайт. Каждый блок имеет свой регистр защиты записи (Block Locking Register). Например, для блока 0, расположенного по адресам FFF80000h-FFF8FFFFh, адрес регистра Block Locking Register равен FFB80002h. Для разрешения стирания и записи блока, бит 0 этого регистра должен быть установлен в "0". Адреса регистров защиты записи для каждого блока и другие подробности содержаться в [18]. Манипуляции с регистрами микросхемы Flash ROM, расположенными в пространстве памяти, выполняются с помощью стандартных инструкций архитектуры x86, обеспечивающих чтение и запись ячеек памяти, например MOV. Вопросы организации регистров, отображенных на память (Memory-mapped I/O) детально рассмотрены в ранее опубликованной статье "Устройства системной поддержки. Исследовательская работа № 7, 8 и 9".

3) Для запуска операции стирания блока или сектора требуется выполнить последовательность из шести циклов записи заданных байтов по заданным адресам. Последовательности приведены в [18] а также в исходном тексте программы, прилагаемом к статье. Использование многоцикловых последовательностей для запуска операций стирания и записи, снижает вероятность случайного искажения содержимого Flash в результате программного сбоя.

4) Для запуска операции записи байта требуется выполнить последовательность из четырех циклов записи заданных байтов по заданным адресам. Отметим, что перед выполнением записи, для сектора, в который выполняется запись, необходимо выполнить стирание.

Об аппаратной защите BIOS и ее эффективности
Как было показано выше, для перезаписи содержимого Flash ROM, программа должна выполнить три действия: перенастроить чипсет для обеспечения доступа к микросхеме BIOS, перенастроить регистры блокировки записи, входящие в состав самой микросхемы BIOS и, наконец, передать приказ записи или стирания. На каждом из этих трех этапов действуют механизмы защиты BIOS от несанкционированной модификации. Рассмотрим подробнее эти механизмы, а также причины, по которым они в ряде случаев оказываются неэффективными. Приведенная информация поможет выработать методику, позволяющую исследовать заданную материнскую плату на предмет наличия рассматриваемой уязвимости.

1) Регистр BIOS_CNTL, рассмотренный выше входит в состав "южного моста" чипсета, его бит 0 управляет блокировкой циклов записи, адресованных микросхеме BIOS. Бит 1 того же регистра (это бит BLE, BIOS Lock Enable) позволяет установить режим, при котором попытка снять защиту записи будет перехватываться BIOS, а точнее, при попытке установить бит 0 в "1" будет генерироваться прерывание SMI (System Management Interrupt) с передачей управления специальной процедуре, входящей в состав BIOS. Причем, если BIOS при старте установит такой режим перехвата, программно выключить его чипсет не позволяет, этот режим будет выключен только после аппаратного сброса (по сигналу RESET). Подробности в [3].

К сожалению, разработчики BIOS обычно не используют этот механизм, предоставляемый чипсетом. Во всех материнских платах, исследованных автором, бит BLE (бит 1 регистра BIOS_CNTL) установлен в "0", поэтому, попытки снятия защиты записи не перехватываются.

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

2) Регистры защиты записи Block Locking Register, также рассмотренные выше, входят в состав микросхемы Flash ROM SST 49LF004A. Здесь также предусмотрен бит защиты записи (бит 0) и бит, установка которого в "1" позволяет запретить снятие защиты записи (бит 1). Если биты 0 и 1 установлены в "1", микросхему BIOS программно вывести из состояния защиты записи невозможно, это произойдет только при аппаратном сбросе (по сигналу RESET). Подробности в [18].

К сожалению, и этот механизм обычно не используется разработчиками BIOS, а ведь его применение могло бы существенно улучшить защищенность. Во всех платах, исследованных автором, бит 1 в регистрах защиты блоков микросхем Flash ROM установлен в "0", то есть снятие защиты записи разрешено.

3) Третий уровень защиты, состоит в том, что для запуска операций стирания и перезаписи микросхемы BIOS, требуется своеобразный пароль, а именно, передача многоцикловых "ключевых" последовательностей со строго определенными адресами и данными. Так как у всех микросхем одного типа пароль одинаковый и его можно узнать из документации на микросхему, например [4-6], [17-24], такая мера может защитить только от случайного искажения содержимого BIOS при программном сбое и записи беспорядочных данных. Вредоносная программа, прочитав идентификаторы ROM Vendor ID и ROM Device ID, может распознать тип микросхемы BIOS и сформировать требуемые ключевые последовательности в соответствии с документацией на данную микросхему.

4) Большинство микросхем Flash ROM, используемых в качестве носителей BIOS, имеют специальные входы, для подачи сигналов управления защитой записи. У рассматриваемой микросхемы SST 49LF004A это сигналы WP# (Write Protect) и TBL# (Top Block Lock). Для варианта исполнения микросхемы в 32-контактном корпусе PLCC, это контакты с номерами 7 и 8 соответственно.

Сигнал WP# управляет защитой записи основного блока (первые 448 килобайт): 0=запись запрещена, 1=разрешена.

Сигнал TBL# управляет защитой записи Boot блока (старшие 64 килобайта): 0=запись запрещена, 1=разрешена. Подробности в [18].

С точки зрения использования этих сигналов, материнские платы бывают трех видов:

Первый вариант - сигналы защиты записи не используются, на линии WP# и TBL# постоянно подается уровень логической "1", разрешающий запись. Защиты нет.

Второй вариант – сигналы защиты записи формируются с помощью "перемычек" (jumpers), переключаемых пользователем. Здесь установкой и снятием защиты записи можно управлять вручную. Такая мера достаточно эффективна, так как при логическом нуле на линиях WP# и TBL#, программно исказить содержимое микросхемы BIOS невозможно. Неудобство в том, что на время выполнения операции обновления BIOS, а также при перезаписи блоков параметров, связанной с изменением конфигурации, запись требуется разрешать вручную.

Третий вариант - сигналы защиты записи формируются с помощью программно-доступного регистра, состоянием которого управляет BIOS. При этом пользователю не нужно переключать "перемычки", но защищенность будет хуже, так как в отличие от второго варианта, здесь есть возможность программного выключения защиты. Вместе с тем, это неплохой компромисс. Так как указанный программно-доступный регистр обычно реализуется специфическими ресурсами платы, "вирусописатель", располагая информацией только на чипсет и микросхему BIOS, но, не имея принципиальной электрической схемы материнской платы, не узнает о том, что и в какой регистр надо записать для снятия защиты на данной материнской плате.

(Продолжение следует)

Источники информации
Электронные документы, доступные на сайте developer.intel.com.
1) Intel Low Pin Count (LPC) Interface Specification. Revision 1.1. Document Number 251289-001.
2) Intel 815 Chipset Family: 82815EP and 82815P Memory Controller Hub (MCH) Datasheet. Document Reference Number 290693-002.
3) Intel 82801BA I/O Controller Hub 2 (ICH2) Datasheet. 290687-001.
4) Intel 28F002BC 2-MBIT (256K x 8) Boot Block Flash Memory. Order Number: 290578-004.
5) AB-60 Application Brief. 2/4/8-Mbit Smart Voltage Boot Block Flash Memory Family Overview. Order Number: 292154-004.
6) Intel 82802AB / 82802AC Firmware Hub (FWH) Datasheet. Order Number: 290658-002.

Электронные документы, доступные на сайте developer.amd.com.
7) BIOS and Kernel Developer’s Guide for AMD Athlon 64 and AMD Opteron Processors. Publication No. 26094.
8) BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors. Publication No. 32559.
9) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors. Publication No. 31116.
10) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 11h Processors. Publication No. 41256.
11) AMD-8131 HyperTransport PCI-X Tunnel Data Sheet. Publication # 24637.
12) AMD-8151 HyperTransport AGP3.0 Graphics Tunnel Data Sheet. Publication # 24888.
13) AMD-8111 HyperTransport I/O Hub Data Sheet. Publication # 24674.

Электронные документы, доступные на сайте pcisig.com.
Документы [15], [16] на сайте pcisig.com доступны только для членов PCI Special Interest Group. Воспользовавшись поисковыми системами, можно найти данные документы для свободной загрузки.

14) PCI BIOS Specification. Revision 2.1.
15) PCI Local Bus Specification. Revision 3.0.
16) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

Электронные документы, доступные на сайте http://www.superflash.com или ssti.com.
17) 2 Megabit (256K x 8) Multi-Purpose Flash SST39SF020 Data Sheet.
18) 2 Mbit / 4 Mbit Firmware Hub SST49LF002A / SST49LF004A Data Sheet.
19) 2 Mbit LPC Flash SST49LF020 Data Sheet.
20) 1 Mbit SPI Serial Flash SST25VF010 Data Sheet.
21) 2 Mbit / 4 Mbit SPI Serial Flash SST25VF020 / SST25VF040 Data Sheet.

Электронные документы, доступные на сайте winbond.com.tw.
22) W49V002FA 256K x 8 CMOS Flash Memory with FWH Interface Data Sheet.
23) W49V002A 256K x 8 CMOS Flash Memory with LPC Interface Data Sheet.

Электронные документы, доступные на сайте macronix.com.
24) MX28F1000P 1M-BIT [128K x 8] CMOS Flash Memory Data Sheet.

Электронные документы, доступные на сайте datakey.com.
25) SPI EEPROM Interface Specification. Part Number 223-0017-004 Revision H.

Электронные документы, доступные на сайте vtitechnologies.com.
26) SPI Interface Specification. Technical Note 15.

Книги
27) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование. Москва ТОО “ГРАНАЛ” 1993.
28) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В. Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM PC/XT/AT и PS/2. Москва “Радио и связь” 1995.