Категорически не рекомендуется ставить эксперименты на основном рабочем
компьютере, лучше найти какую-нибудь старую плату, оставшуюся, например, с
прошлого апгрейда или частично исправную и собрать на ее базе "полигон".

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

Как известно, микросхемы такого типа используются в современных компьютерах
не только в качестве носителей BIOS. Практически все модули оперативной памяти
(DIMM), начиная от PC66 SDRAM, содержат микросхему SPD (Serial Presence
Detect)
, в которой хранятся параметры модуля. При старте, BIOS считывает
содержимое SPD и таким образом определяет количество модулей DIMM, их
расположение по разъемам, размер, архитектуру, быстродействие и другие
параметры. В соответствии с прочитанной информацией выполняется инициализация
контроллера памяти. Содержимое SPD также считывают диагностические утилиты и
именно благодаря этому, они могут определить, память какого производителя
установлена в компьютере.

Механизм доступа к SPD поддерживает не только чтение, но и перезапись
содержимого микросхем. Именно в этом и состоит уязвимость, описанию которой
посвящена данная статья. Материал проиллюстрирован исходными текстами программ,
выполняющих чтение и запись SPD.

 

Технические подробности

В качестве устройства SPD, устанавливаемого на модулях памяти, используется
микросхема 24C02 фирмы Atmel, детально описанная в [13], либо аналоги. Ее размер
– 256 байт. Назначение каждого байта определяется стандартами, описанными в
документах [14-18]. Для каждого типа памяти, от SDRAM до DDR3 используется свой
стандарт на содержимое SPD. Отметим, что "классические" документы [14-18]
нормируют использование младших 128 байт SPD. Старшие 128 байт (байты с адресами
128-255) резервируются для производителя модуля или компьютера. Один из
вариантов их применения – хранение так называемых "оверклокерских профилей", то
есть информации, необходимой при "разгоне" подсистемы памяти.

Доступ к микросхемам SPD осуществляется по 2-проводной последовательной шине
SMBus (System Management Bus), детально описанной в [11-12]. Контроллер этой
шины находится в составе "южного моста" чипсета. Примеры реализаций в [1-7].
Некоторые типы "южных мостов", например VIA VT82C586B, описанный в [5] вместо
полноценного контроллера SMBus поддерживают только набор сигнальных линий,
состояние которых можно считывать и устанавливать. При этом протокол шины
реализуется программно.

Шина SMBus также используется для доступа к регистрам тактового генератора,
некоторых видов термодатчиков и других устройств. Некоторые подробности ее
функционирования рассмотрены в ранее опубликованной статье
"Тактовый генератор и
разгон" №1
и №2.

 

Механизм доступа к SPD

Рассмотрим последовательность действий, которую должна выполнить программа
для чтения или записи микросхем SPD, находящихся на модулях памяти. Как было
показано выше, доступ к ним осуществляется посредством контроллера System
Management Bus. В каждом чипсете этот контроллер реализован по-разному, и,
разумеется, в рамках одной статьи невозможно описать все варианты его
реализации. Поэтому рассмотрим конкретный пример – чипсет Intel 845PE,
использующий "южный мост" Intel ICH4 (82801DB), описанный в [2]. Используя
документацию на микросхемы чипсета, например [1-7], заинтересованный читатель
сможет самостоятельно разработать процедуры для поддержки других платформ, либо
адаптировать приведенную процедуру, для реализаций, несущественно отличающихся
от рассмотренной. Отметим, что в рассматриваемом чипсете (как и во многих других
чипсетах) набор программно-доступных регистров контроллера SMBus содержит два
блока регистров.

Первый блок - конфигурационные регистры, используемые для выделения системных
ресурсов контроллеру (диапазон ввода-вывода, номер линии запроса на прерывание)
и задания некоторых опций его функционирования. Эти регистры находятся в
конфигурационном пространстве, подробности в [9-10]. Использование функций
PCIBIOS для доступа к конфигурационному пространству описано в [8].

Второй блок – операционные регистры, непосредственно управляющие операциями
чтения и записи на шине SMBus. Эти регистры находятся в пространстве
ввода-вывода.

Для чтения SPD необходимо выполнить следующие действия.

1) Программирование конфигурационных регистров LPC Bridge. Локализуем в
конфигурационном пространстве блок регистров с координатами Bus=0, Device=1Fh,
Function=0. Это устройство LPC Bridge, входящее в состав "южного моста" Intel
ICH4. Его идентификаторы: Vendor ID = 8086h, Device ID = 24C0h. В этом блоке, по
адресу 00F2h расположен 8-битный регистр Function Disable Register. Бит 3
указанного регистра управляет разрешением доступа к конфигурационным регистрам
контроллера SMBus: 0=доступ разрешен, 1=доступ запрещен. Устанавливаем указанный
бит в "0", то есть, разрешаем доступ. Это необходимо, так как в некоторых
платах, BIOS перед загрузкой ОС оставляет этот бит в состоянии "1" , при этом
доступ к контроллеру SMBus по умолчанию запрещен. Подробности в [2].

2) Программирование конфигурационных регистров контроллера SMBus. Локализуем
в конфигурационном пространстве блок регистров с координатами Bus=0, Device=1Fh,
Function=3. Это устройство SMBus Controller, входящее в состав "южного моста"
Intel ICH4. Его идентификаторы: Vendor ID = 8086h, Device ID = 24C3h. Назначаем
диапазон портов ввода-вывода для контроллера SMBus, для этого записываем
значение базового адреса диапазона в регистр SMB_BASE по адресу 0020h. В
регистре Command Register, расположенном по адресу 0004h устанавливаем бит 0
(I/O Space Enable bit) в "1", что обеспечивает разрешение доступа к диапазону
портов ввода-вывода контроллера SMBus. Разрешаем функционирование контроллера
SMBus, для этого устанавливаем в "1" бит 0 регистра по адресу 0040h (это бит
SMBus Host Enable регистра SMBus Host Configuration). Если BIOS, перед загрузкой
ОС, оставил контроллер SMBus в разрешенном состоянии (это можно определить по
состоянию разрешающих битов, описанных выше), программа не должна повторно
выполнять его разрешение, в этом случае пропускаем данные действия. Подробности
в [2].

3) Начинаем взаимодействие с контроллером SMBus через его диапазон портов
ввода-вывода. Базовый адрес этого диапазона, присвоенный контроллеру на шаге 2,
ниже обозначен как SMB_Base. Если контроллер уже был включен на момент запуска
программы и шаг 2 был пропущен, то в качестве SMB_Base используем исходное
значение базового адреса (установленное процедурой BIOS POST). Обнуляем
статусные биты в регистре Host Status (SMB_Base+0) для подготовки контроллера к
очередной операции. Биты этого регистра используют дисциплину Read/Write Clear,
и обнуляются при записи "1" в них. Подробности в [2].

4) Передаем 8-битный адрес ячейки микросхемы SPD, которую требуется
прочитать. Он записывается в регистр Host Command (SMB_Base+3). При выполнении
транзакции на шине SMBus, значение этого регистра передается в поле Command.
Подробности в [11-12].

5) Передаем 8-битный адрес микросхемы SPD, к которой выполняется обращение.
Он записывается в регистр Transmit Slave Address (SMB_Base+4). При выполнении
транзакции на шине SMBus, значение этого регистра передается в поле Slave
Address. Формат адреса устройства: биты 7-4 при адресации SPD всегда равны
1010b. Биты 3-1 определяют номер микросхемы SPD для одного из восьми модулей
DIMM: 000b=DIMM0 … 111b=DIMM7. Бит 0 определяет тип операции: 0=запись,
1=чтение.

Пример: для чтения SPD модуля DIMM2 необходимо установить 10100101b = A5h.

6) Запускаем выполнение транзакции, параметры которой были подготовлены на
шагах 4 и 5. Для этого необходимо записать код операции в регистр Host Control
(SMB_Base+2). В соответствии с документом [2], для запуска операции передачи
байта используется код 01001000b = 48h. Отметим, что направление передачи байта
(чтение или запись), определяется битом 0 регистра Transmit Slave Address,
установленного на шаге 5.

7) После выполнения шага 6, контроллер SMBus начинает операцию чтения байта
из SPD. Программа должна ожидать завершения операции. Опрашиваем состояние бита
Host Busy, это бит 0 регистра Host Status (SMB_Base+0). По значению Host Busy=1
определяем момент начала операции, затем ожидаем Host Busy=0, то есть завершения
операции. Отсутствие ожидаемого события в течение заданного интервала (около 50
мс) интерпретируется как ошибка – таймаут шины.

8) Считываем из регистра Host Data 0 (SMB_Base+5) байт, прочитанный из SPD.
Его значение достоверно только при отсутствии ошибок.

9) Проверяем отсутствие ошибок. Для этого считываем регистр Host Status
(SMB_Base+0) и анализируем статусные биты. Согласно документу [2], после
успешного завершения транзакции, состояние битов 4-1 должно быть 0001b.
Маскируем указанное битовое поле и проверяем его значение.

 

Процедура записи SPD

Большинство шагов этой процедуры аналогичны соответствующим шагам процедуры
чтения SPD, описанной выше. Поэтому, чтобы избежать повторений, рассмотрим
только различия.

На шаге 5, при передаче адреса микросхемы SPD, для операции чтения, бит 0
регистра Transmit Slave Address устанавливается в "1". Для операции записи он
устанавливается в "0".

Между шагами 5 и 6 необходимо передать значение записываемого байта в регистр
Host Data 0 (SMB_Base+5).

Шаг 8, на котором из контроллера считывается байт, прочитанный из SPD, для
процедуры записи не выполняется.

После выполнения транзакции, микросхема 24C02 выполняет внутреннюю процедуру
записи полученного байта в одну из 256 ячеек, адрес которой был передан на шаге
4. В соответствии с принципами функционирования Flash ROM, после завершения
записи, информация не разрушается при снятии напряжения питания и для ее
изменения нужна повторная запись. Подробности в [13].

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

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) Intel 82371AB PCI-TO-ISA / IDE XCELERATOR (PIIX4) Datasheet. Order Number
290562-001.
2) Intel 82801DB I/O Controller Hub 4 (ICH4) Datasheet. Document Number
290744-001.
3) Intel I/O Controller Hub 6 (ICH6) Family Datasheet. Document Number
301473-001.

Электронные документы, доступные на сайте
developer.amd.com.

4) AMD-8111 HyperTransport I/O Hub Data Sheet. Publication # 24674.

Электронные документы, доступные на сайте
datasheetarchive.com.

(Информация на данном сайте более полная, чем на "родных" сайтах
производителей указанных микросхем.)

5) VIA VT82C586B PIPC PCI Integrated Peripheral Controller. Для поиска
документа набирать строку "VT82C586B".
6) VIA VT82C686A South Bridge Datasheet. Revision 1.54. Для поиска документа
набирать строку "VT82C686".
7) VIA VT82C686B South Bridge Datasheet. Revision 1.71. Для поиска документа
набирать строку "VT82C686".

Электронные документы, доступные на сайте
pcisig.com.

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

8) PCI BIOS Specification. Revision 2.1.
9) PCI Local Bus Specification. Revision 3.0.
10) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

Электронные документы, доступные на сайте
smbus.org.

11) System Management Bus (SMBus) Specification. Version 2.0.

Электронные документы, доступные на сайте

semiconductors.philips.com
.

12) The I2C-Bus Specification. Version 2.1.

Электронные документы, доступные на сайте
atmel.com.

13) AT24C01A/02/04/08/16 2-Wire Serial CMOS E2PROM Data Sheet.

Электронные документы, доступные на сайте
jedec.org.

14) JEDEC Standard No. 21-C. Page 4.1.2.5-1. Appendix E: Specific PD’s for
Synchronous DRAM (SDRAM).
15) JEDEC Standard No. 21-C. Page 4.1.2.4-1. Appendix D: DDR Synchronous DRAM
(DDR SDRAM). 16) JEDEC Standard No. 21-C Page 4.1.2.10-1. Appendix X: Serial
Presence Detects for DDR2 SDRAM (Revision 1.2).
17) JEDEC Standard No. 21-C. Page 4.1.2.11-1. Appendix K: Serial Presence Detect
(SPD) for DDR3 SDRAM Modules. SPD Revision 1.0.
18) DDR2 FB-DIMM SPD 1.0. Appendix X: Serial Presence Detect (SPD) for Fully
Buffered DIMM (Revision 1.0).
19) JEDEC Standard No. 21-C. Page 4.5.4-1. 168-pin Unbuffered SDRAM DIMM family.
20) JEDEC Standard No. 21-C. Page 4.5.10-1. 184-pin Unbuffered DDR SDRAM DIMM
family.
21) JEDEC Standard No. 21-C. Page 4.5.14-1. 240-pin Unbuffered and Registered
DDR2 SDRAM DIMM family.
22) JEDEC Standard No. 21-C. Page 4.20.19-1. 240-pin
PC3-6400/PC3-8500/PC3-10600/PC3-12800 DDR3 SDRAM Unbuffered DIMM Design
Specification.

 

Книги

23) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО "ГРАНАЛ" 1993.
24) В.Г. Артюхов, А.А. Будняк. В.Ю. Лапий. С.М. Молявко, А.И. Петренко.
Проектирование микропроцессорной электронно-вычислительной аппаратуры.
Справочник. Киев "Тэхника" 1988.
25) К. Г. Самофалов, О.В. Викторов. Микропроцессоры. Библиотека инженера. Киев
"Тэхника" 1989.
26) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В.
Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM
PC/XT/AT и PS/2. Москва "Радио и связь" 1995.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии