среда, 16 ноября 2011 г.

Руткит в сетевой карте, возможно ли это?


Представь себе фантасмагорию: твоя сетевая карта (или процессор, или видеокарта) живет отдельной жизнью шизофреника. И дружит она (или все эти компьютерные потроха тут же) против тебя. Вероятно ли такое восстание машин, инициированное силами хакеров или, скажем, изготовителей железа? Давай пофантазируем!
Начнем с того, что каждый сетевой пакет, пришедший из недр сети, до того как дойти до твоего браузера или иного сетевого приложения, прежде всего будет обработан твоей сетевой картой, а после - именно ядром операционной системы. А вдруг этот наиболее пакет будет нести вместе с собою какие-то инструкции, которые тут же подчинят себе всю машину? Ведь для этого не необходимо писать эксплоиты, искать уязвимости, для того чтоб ввести зловредный код... Просто... отправь пакет на какой-нибудь открытый порт. И - все... Ты уже не хозяин собственному компьютеру. И плакали крокодильими слезами создатели антивирусных программ и систем проактивной защиты - помочь они ничем не смогут.
Поехали!

Скажу лишь одно - есть в сети примеры (внимание!) веб и SSH-серверов, базирующихся на ресурсах одной только графической или сетевой карты. Да-да, использующих ресурсы (микропроцессор и оперативную память) таких наиболее карт (prooflink: alchemistowl.org/arrigo/Papers/Arrigo-Triulzi-PACSEC08-Project-Maux-II.pdf, и radioradar.net/news/electronics_news/avr_crumb644_net.html). Если ты до сих пор не осознал, о чем речь, повторю: не нужна ос, не необходимо ядро, все что необходимо - микропроцессор сетевой карты, который будет обрабатывать приходящие пакеты из сети и нечто там отправлять обратно. Представь себе мини-Apache, который реализован вне контроля ядра за самой машиной, ведь сетевая карта, как железка, висит где-то на PCI-шине и ей подвластно все ядро операционки.









Жутко, однако это еще цветки, мой дорогой друг. Основное - уяснить то, что создатели отдельных важных железок в твоем компьютере, будь то сетевая плата или видеокарта, в глубоком секрете удерживают все скрытые возможности своих разработок. Просто вспомни, что такое недокументированные возможности операционной системы. Или процессора. Или еще какой-либо железки, полные возможности которой хранятся в глубокой тайне от нас, программистов.
Лезем в недра

А сейчас представь себе эксплойт, который живет не в операционной системе, а, скажем, в той же самой сетевой карточке. Впрочем такое претворить в жизнь по силам только разработчикам самого железа, мы попробуем установить себя на их место и поглядеть, вероятно ли целиком контролировать железо в твоем компьютере или нет? Сейчас мы попытаемся рассмотреть эту интересную тематику с позиции системного программиста. Мы попробуем ответить на вопрос, как "глубока кроличья нора", как глубоко возможно залезть в недра операционной системы. Бороться с руткитами, живущими в firmware железяк твоего компьютера, вероятно, все-таки бессмысленно. Хотя ковыряние во внутренностях ядра и железа, как ты теперь увидишь, раскроет перед тобой немало всяких интересных подробностей.
Так схематично проходит процесс обработки сетевых пакетов на уровне NIC <===> PCI

Обыкновенный перехват сетевого трафика в современных файрволах сводится к установкам TDI-NDIS-фильтров и перехвате важных NDIS-функций, подобных, как, скажем, NDISREGISTERPROTOCOL. Есть 2 подхода к перехвату сетевого трафика. I-е - поставить, скажем, TDI-фильтр или NDIS IM-драйвер и жить себе спокойно. Однако этот подход не защитит минипорт сетевой карты, который является своеобразным форпостом, ибо далее - ресурсы сетевой карты и сеть.

Перехват ключевых функций в структуре NDIS_MINIPORT_BLOCK может гарантировать твоей зверюшке уверенный контроль или модификацию сетевого трафика, если бы не одно "однако" - заполучить указатель на NDIS_MINIPORT_BLOCK ой как трудно! 1 из наиболее распространенных способов получить указатель на минипорт - регистрировать собственный сетевой протокол в ядре вызовом NDISREGISTERPROTOCOL, однако файрволу довольно перехватить эту функцию, чтоб обломать все попытки это сделать.

Как же быть?

Кажется, способов контроля сети современному руткиту остается слегка, хотя в данной ситуации мало кто вспоминает о таком волшебном слове, как PCI. Ведь сетевая карта "сидит" на PCI-шине, взаимодействует (читай "передает данные") с ядром операционной системы именно при помощи тех ресурсов, которые PCI-шина ей выделяет.

Сетевая карта (физически) состоит из 2-х блоков - PHY-блок и MAC-блок. I отвечает за непосредственное "переваривание" сигналов с RJ45-кабеля в набор байт, которые для дальнейшей обработки передаются в MAC-блок. Этот блок всерьез любопытнее, так как именно он именно отвечает за взаимодействие с драйвером сетевой карты (минипортом). Он обладает одним или 2-мя ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР, EEPROM-памятью, своей SRAM-памятью и набором регистров, при помощи которых управляется "устройство" сетевой карты. В EEPROM, обычно, содержится информация о производителе, MAC-адрес сетевой карты, образ прошивки. Структура любого конкретного EEPROM имеет недокументированный формат и зависит только от фантазии девелоперов самой сетевой карты. SRAM-память содержит копию прошивки firmware, структуры сетевых пакетов, и временные буферы для хранения приходящих/уходящих сетевых пакетов. Регистры, в собственную очередь, позволяют целиком контролировать сетевую карту и руководить ею. Сколько их, и для чего они служат в каждом конкретном случае - к тому же зависит от фантазии разработчика, по этой причине чаще всего часть из них имеет недокументированный формат.

Главный вопрос статьи - возможно ли получить доступ к EEPROM, SRAM или регистрам? Ответ - да, возможно. И сделаем мы это ч/з PCI-интерфейс. PCI-шина поддерживает способ передачи данных, называемый "linear burst" (способ линейных пакетов). Этот способ предполагает, что пакет информации считывается (или записывается) "одним куском", то есть адрес автоматически растет для следующего байта. Естественным образом при этом растет скорость передачи собственно данных за счет уменьшения количества передаваемых адресов. Шина PCI является той черепахой, на которой стоят слоны, поддерживающие "Землю" - архитектуру Plug and Play (PNP). Спецификация шины PCI определяет 3 типа ресурсов: 2 рядовых ("диапазон памяти" и "диапазон ввода/вывода", как их называет компания Майкрософт) и configuration space - "конфигурационное пространство".

Более детально о шине PCI ты сможешь прочитать в замечательной книжке "PCI Bus Demystified" от товарища Doug Abbott, ее ты сможешь отыскать на диске к журналу.

Именно PCI-шина, благодаря собственным "фундаментальным" особенностям, даст возможность нам получить доступ ко всем ресурсам не только лишь сетевой карты, но еще и любого иного устройства, которое сидит на PCI-шине. И при этом мы, находясь в трезвом уме и не совсем трезвой памяти :), не задевая подобные уровни сетевой инфраструктуры, как TDI или NDIS, где сидят сторожа файрволов, тут же залезем в глотку сетевой карте. И никто нам в этом не помешает: все, что необходимо будет сделать - засандалить драйвер в систему.

Ос для взаимодействия с устройствами на PCI-шине задействует механизм ввода-вывода, основанный на проекции участков памяти (memory-mapped I/O). Подобный участок памяти, чаще всего, имеет размер в 64 килобайта. I-е 32 килобайта использованы для проекции регистров устройства, вторые 32 килобайта представляют собою "окошко" с возможностями чтения/записи в SRAM-память сетевой карты. В общей сложности этого весьма хватит, чтоб получить контроль над любым из устройств, присутствующих на PCI-шине.

Перечислим все устройства на PCI-шине

for (Busnumber = 0; !Adapterfound && Morebuses; Busnumber++)

{


for (Devicenumber = 0;
!Adapterfound && Devicenumber < PCI_MAX_DEVICES;
Devicenumber++) {


Slotnumber.u.bits.Reserved = 0;


Slotnumber.u.bits.DEVICENUMBER = Devicenumber;


Slotnumber.u.bits.FUNCTIONNUMBER = 0;


length = HALGETBUSDATA(PCICONFI guration,
Busnumber,
Slotnumber.u.ASULONG,
confi Ginfo,
sizeof(PCI_COMMON_CONFIG) );


}

}



Осталась наиболее малость - разобраться, в смысле, отреверсить EEPROM сетевой карты, так как в нашем случае EEPROM - все. Что здесь нужно иметь в виду? В первую очередь, EEPROM содержит в себе non-volatile-данные. Во-вторых, эти данные доступны для чтения и записи ч/з набор регистров сетевой карты. Ну и в-третьих, нужно помнить, что формат EEPROM почти никем из изготовителей сетевых карт не документируется. Что мы знаем о EEPROM? Он содержит в себе, чаще всего, заголовок загрузчика, метаданные "устройства" сетевой карты, данные о конфигурации сетевой карты, подобные как MAC-адрес, и самое основное - набор firmware-имиджей, то есть: код загрузчика, дефолтный стиль, PXE (Preboot Execution Environment, хрень для возможности "загрузки компьютера с использованием сетевого интерфейса") и немало в общей сложности прочего.

Сейчас нужно ответить на вопрос, как стиль frimware грузится из EEPROM в память? Весьма просто - нужно перегрузить сетевую карту и остановить процессор поскорее! Конечно же, делать это нужно с использованием ПО, поддерживающего эмуляцию физических устройств :). Что в итоге? В итоге возможно увидеть, что всегда, когда случается подключение сетевой карты (или перезагрузка PCI-шины):

а. Процессор инициализирует EEPROM и и загружает загрузчик firmware (простите за тавтологию) из EEPROM.

б. Выполняет код загрузчика firmware, то есть конфигурирует ядро сетевой карты, настраивая часы, потребление энергии и прочее; затем загружает на выполнение "вторую очередь" firmware, которая - дефолтный основным имиджем сетевой карты; затем настраивает все остальное - MAC-адрес и прочие особенности сетевой карточки.

Вот, в принципе, и все, что необходимо знать и процессе загрузки имиджа сетевой карты. И наконец, отвечу на вопрос, который, вероятно, много времени назад крутится у тебя в уме: возможно ли сделать подобный руткит, который сумеет заразить сетевую или графическую карту? Ответ прост: да, это возможно сделать, впрочем и весьма-весьма трудно. Невзирая на то, что подобный руткит будет вполне опасным и живучим, он сумеет жить только на конкретной марке сетевой карты от одного изготовителя. Для разработки подобного руткита необходимо сдампить firmware, отреверсить его, разобраться в принципах работы регистров...

А после написать свое собственное firmware, которое и будет заменено на оригинальное. Сделать это крайне трудно, впрочем и вероятно. В сети, если хорошенько поискать, есть реальные примеры программулек, которые могут заставить сетевую карту жить двойной жизнью. Хотя, повторюсь, это лишь только POC, который привязан к конкретной модели сетевой карты.

А что по поводу контроля за сетевыми картами без варианта инсталляции руткита? Ненамного легче! Универсального метода, который бы дал возможность нагнуть все сетевые карты разом, нету. Изготовителей большое число, и запилить программу, которая будет контролировать все сетевые карты к ряду, нереально. Для этого, как ты уже осознал, необходимо знать конкретные особенности конкретной сетевой карты - ведь сколько девелоперов, столько и различных форматов EEPROM, регистров, ну и, конечно же, firmware. Необходимо неплохо разбираться в принципах действия шины PCI и самой операционной системы.





БОНУС - 5 Gb "облачного" хранилища free неограниченное время!

DROPBOX - 2GB "БИПЛАТНО", РЕФСИСТЕМА ДО 8GB!

Комментариев нет:

Отправить комментарий