В раніше опублікованій статті «Вірус в 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 Developers Guide for AMD Athlon 64 and AMD Opteron Processors. Publication No. 26094.
8) BIOS and Kernel Developers Guide for AMD NPT Family 0Fh Processors. Publication No. 32559.
9) BIOS and Kernel Developers Guide (BKDG) For AMD Family 10h Processors. Publication No. 31116.
10) BIOS and Kernel Developers 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.
Електронні документи, доступні на сайті 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.