На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Аппаратный вирус

Работая в ядре, мы получаем полный доступ к системе и можем взаимодействовать с любой частью адресного пространства. Помимо всего прочего, это означает, что мы можем читать и записывать данные в память BIOS на материнской плате или в периферийных устройствах.
В "прежние времена" память BIOS хранилась в постоянной памяти (ROM) или в памяти EEPROM, содержимое которых не могло изменяться с помощью программного обеспечения. В этих старых системах нужно было менять модули памяти или вручную стирать и перезаписывать память. Безусловно, это было не очень эффективно, поэтому в новых системах используется память EEPROM, которую еще называют флэш-памятью. Содержимое флэш-памяти можно изменять с помощью программного обеспечения.
На конкретном компьютере может использоваться до нескольких мегабайтов флэш-памяти на различных платах контроллеров и на материнской плате. Эта флэш-память практически никогда не используется в полном объеме, что оставляет огромные пространства памяти для записи программ "потайного хода" и вирусов. Неоспорим тот факт, что очень трудно осуществлять аудит этих областей памяти и содержимое этой памяти практически никогда нельзя просмотреть с помощью программных средств, запущенных на системе. Для доступа к аппаратной памяти требуется доступ на уровне драйвера. Более того, эта память совершенно не зависит от перезагрузки или переустановки системы.
Именно выживание "аппаратного вируса" после перезагрузки или переустановки системы является одним из его важнейших преимуществ. Даже при подозрении о компрометации системы, ее восстановление с магнитной ленты или с резервной копии не принесет пользы. Аппаратный вирус всегда был и останется одним из наиболее тщательно хранимых секретов "черной магии" хакеров. Однако у аппаратного вируса есть и существенный недостаток. Он работает только на конкретном компьютере. То есть конкретный аппаратный вирус должен быть написан для "заражения" конкретных аппаратных средств атакуемого компьютера. Это означает, что такой вирус не может легко распространяться на другие компьютеры (если вообще сможет распространяться). Однако для ведения информационных войн это не имеет серьезного значения. Много раз аппаратные вирусы использовались для создания конкретного "потайного хода" или для перехвата сетевого трафика. В таком случае от вируса не требуется самостоятельного распространения.
Простой аппаратный вирус может предназначаться для передачи подложных данных в систему или чтобы игнорировать определенные события. Представим себе противовоздушную радарную систему, в которой используется операционная система VX-Works. В системе есть несколько карт флэш-памяти. Внедренный в одну из карт вирус получает привилегированный доступ к шине. Вирус предназначен только для одной цели — заставить радар игнорировать цели определенных типов.
О вирусах было известно задолго до того, как они были реально выявлены и записаны в памяти BIOS на материнской плате. В конце 1990-х годов так называемая ошибка FOOF {FOOFbug) оказалась способна полностью вывести из строя переносной компьютер. Хотя средства массовой информации широко разрекламировали вирус CIH (также известный как вирус Чернобыль), но код, использовавшийся в BIOS, был опубликован задолго до появления вируса CIH3.
Память EEPROM широко используется на многих системах. Адаптеры Ethernet, видеокарты и периферийные устройства мультимедиа — во всех этих устройствах есть память EEPROM. В аппаратной памяти может содержаться флэш-прошивка, или прошивка может использоваться только для хранения данных. Для установки "потайного хода" предпочтительнее переписать прошивку, поскольку в данном случае на "потайной ход" не повлияют ни перезапуск, ни переустановка системы. Безусловно, задача перезаписи прошивки требует доскональных сведений о периферийных аппаратных средствах атакуемого компьютера. Однако в случае памяти BIOS на материнской плате процедура достаточно проста.
Операции чтения и записи для энергонезависимой памяти
Модули энергонезависимой памяти используются в огромном количестве устройств: в блоках дистанционного управления телевизором, в проигрывателях компакт-дисков, в беспроводных и мобильных телефонах, в факсах, камерах, радиоприемниках, в самоходных тележках, в одометрах, в пропускных системах, принтерах и ксероксах, модемах, пейджерах, в спутниковых телефонах, в устройствах сканирования штрих-кодов, в измерительных устройствах и тестерах.
Для доступа к флэш-памяти можно воспользоваться простыми командами in и out. Обычно на модуле флэш-памяти находится управляющий регистр и порт данных. В управляющем регистре размещаются управляющие сообщения, а порт данных используется для осуществления операций чтения и записи во флэш-память. В некоторых случаях используемая на чипе память "отображается" в физическую память, что означает возможность доступа как к простой последовательной памяти.
Обычно команда передается в чип ROM-памяти с помощью команды out. В зависимости от использованного языка, в формате команд in и out могут быть небольшие различия, но в целом они служат для выполнения аналогичных задач, как, например, показано ниже.
OUT( some_byte_value, eeprom_register_address );
В системе Windows NT есть блоки памяти в диапазоне адресов между F0000000 и FFFFFFFF, в которых могут присутствовать пустые места. Размер программ "потайного хода" или набора средств для взлома может составлять всего несколько сотен байтов, поэтому найти пустое место для размещения такого кода не составит особого труда. Эта область памяти используется различными периферийными уст­ройствами и материнской платой. В памяти по адресам между 0000 и FFFF обычно хранятся порты ввода-вывода различных устройств. Эта память может использоваться для настройки параметров и других подобных задач. Участок памяти между адресами F9000 и F9FFF размером в 4 Кбайт зарезервирован для памяти BIOS на материнской плате. Область между адресами А0000 и C7FFF используется для размещения буферов видеоданных и данных о конфигурации видеокарты.
Операции чтения и записи для памяти, встроенной в важнейшие устройства
В этом разделе мы продемонстрируем операции чтения из памяти и записи в память аппаратных средств с помощью набора средств для взлома. Кроме того, мы покажем, как перезагрузить компьютер с разрушением прежнего программного обеспечения (так называемая hard boot). Этот материал послужит прекрасной отправной точкой для тех, кто хочет научиться управлять сложными аппаратными средствами с помощью наборов средств для взлома.
Любопытная форма взаимодействия пользователя и компьютера может быть организована с помощью светодиодов на клавиатуре. Чип контроллера клавиатуры 8048 может использоваться для включения и выключения различных светодиодных лампочек на клавиатуре. Это можно считать скрытой формой взаимодействия между набором средств для взлома и пользователем терминала.
Мы добавили комментарии по ходу исполнения нашего кода.
// драйвер устройства для установки светодиодных ламп на клавиатуре // взят с сайта www.rootkit.com #include "ntddk.h" #include <stdio.h>
VOID rootkit_command_thread(PVOID context) ;
HANDLE gWorkerThread;
PKTIMER gTimer;
PKDPC gDPCP;
UCHAR g_key_bits = 0;
Далее приведены различные "определения" для операций с аппаратными средствами. Они взяты из документации по чипу контроллера клавиатуры 8042. "Портом" ввода-вывода является адрес 0x60 или 0x64, в зависимости от операции. Эти порты предназначены для проведения однобайтовых операций. Управляющий байт OxED указывает, что мы хотим установить светодиод.

IPITRUt. ■- WeUForKeybodidll] (
DrainOutpLtBulfer(I;
onj'tlntfj t, 253, "SendKeybcardCcmniand: ;от^ранлнем байт >И2Х t на порт 0хба\П". i.heCamir.and) ; □btjlTint ;
WR:7F:_P0R7_UCHAR I KEVBOARD_POR^GП, rheCcmreand ); Dbgrr I nr. C'SendKeyboa rdComimnd: : отпрэЕкз\п");
I
else f
Dbg Pr int ("SendKeyboardCo.Tijndi'.d: : время ожидания до освобождения 4$ клаьиатури\п."1 ;
return FALSE;
I
// TODOi ожидаем пакета АСК или RESEND от клавиатуры return TRUE;
I
Это удобная процедура, в которой используется специальная битовая маски для включения LED-индикаторов на клавиатуре. Для некоторых клавиатур включение индикатора Num Look означает переход ц этот режим. Это проблема, но мы оставим се решение для наших читателей.
void SetLED5[ UCHAR theLEDS )
(■
// подготовка для установки индикаторов LED if(FALSE — SendKeyboardCcmmandl OxED )) {
DbgPrint("SetlEDS::ошибка при отправке команды клавгатуре\п");
)
II отправляем флаги для светодирдра
if(FALSE SendKeyboardCommandf theLEDS ))
1
DbgPrint("SetLEDS:: ошибка при отправке команды клавиатуре\п") ;
1
1
VOID OnUnloadl IN PDRIVER OBJECT DriverObject ] \
DbgPrint("ROOTKIT: вызвана функция OnUn.oad\n");
KeCanceiTimerI gTimer 1;
ExFreePooiI gTimer I;
AJI= :, 9:ExFreePoo: Г gDPCF ) ,-
\
Эта процедура представляет собой обратный иызои. который происходит каждые 300 мс. Согласно этому вызову, мы изменяем шаблон включенных индикаторов клавиатуры. В результате мы можем наблюдать красивую картинку мигающих па клавиатуре индикаторов. После 100 циклов процедура перезагружает компьютер.
Эта процедура вызывается с помощью отложенного вызова процедуры. После выгрузки драйвера мы должны гарантировать отмену вызова отложенной процедуры с помощью KeCanceiTimer I).
// вызывается периодически VOID timerDPCt IN PKDPC Dpc,

Главная процедура набора средств для взлома инициализирует и запускает таймер с помощью вызова функции KeSetTimerEx (). Третий аргумент вызова (300) представляет собой количество миллисекунд между событиями таймера.
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN Л> PUNICODE_STRING theRegistryPath ) {
LARGE_INTEGER timeout;
theDriverObject->DriverUnload = OnUnload; // these objects must be nonpaged
gTimer = ExAllocatePool(NonPagedPool,sizeof(KTIMER)); gDPCP - ExAllocatePool(NonPagedPool,sizeof(KDPC));
timeout.QuadPart = -10;
KelnitializeTimer( gTimer ); KelnitializeDpc( gDPCP, timerDPC, NULL ) ;
if(TRUE == KeSetTimerEx( gTimer, timeout, 300, gDPCP)) // таймер 300 мс
{
DbgPrint("Таймер был уже поставлен в очередь..");
}
return STATUS_SUCCESS;
}
Этот листинг завершает наш пример по созданию драйвера устройства. Этот простой драйвер можно усовершенствовать для управления другими аппаратными средствами. Итак, помните, что небрежность в отношении аппаратных средств может привести к серьезному ущербу для компьютера.
Разрешение операций чтения и записи для памяти EEPROM
В данном примере мы использовали предположение, что на нашем компьютере используется материнская плата на основе чипсета 430ТХ. В качестве контроллера используется чип 82439ТХ (МТХС). Следующие регистры "отображаются" в доступное пользователю адресное пространство.
CONFADD 0xCF8 Configuration Register
CONFDATA OxCFC
Configuration Data Register
Регистр CONFADD управляет выбором PCI устройства. Каждое устройство на PCI-шине может иметь 256 8-битовых "регистров". Чтобы обратиться к регистру конфигурации, сначала в регистр CONFADD должно быть занесено число, в котором указываются номер устройства на шине, номер самого устройства, номер функции и адрес конфигурационного регистра искомого устройства. Затем регистр CONFDATA

превращается в "окно", в котором отображается около 4 байт конфигурационного пространства. Любое обращение в регистр CONFDATA преобразуется в команды чтения/записи для конфигурационного пространства согласно установкам в CONFADD регистре.
Интересно отметить, что сам чип МТХС может рассматриваться как устройство и вполне реально воспользоваться регистрами CONFADD /CONFDATA для настройки самого этого чипа. Чтобы получить таблицы управляющих кодов и доступных параметров чипа PCI, мы рекомендуем обратиться к официальной документации Intel.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика