У раніше опублікованої статті "Вірус в 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.
вівторок, 13 січня 2009 р.
Підписатися на:
Дописати коментарі (Atom)



Немає коментарів:
Дописати коментар