В этом документе будет кратко рассказано о некоторых особенностях фаервола от фирмы Agnitum, будет дано начальное представление о достоинствах и недостатках, будут приведенны некоторые технические детали, подтверждающие правомерность точки зрения автора.
Цели публикации этого документа.
В этом документе будет кратко рассказано о некоторых особенностях фаервола от фирмы Agnitum, будет дано начальное представление о достоинствах и недостатках, будут приведенны некоторые технические детали, подтверждающие правомерность точки зрения автора. Автора удивляет сложившаяся ситуация, когда пользователи программного обеспечения, выбирают тот или иной программный продукт основываясь на сведениях, полученных из рекламной информации. Приведенные сведения часто не соответствуют действительности, такая ситуация понижает потенциальную защищенность компьютеров, тем самым недобросовестные производители программного обеспечения приносят в жертву интересы потребителей, получая в замен финансовую прибыль.
Особенности защиты.
Методы защиты, применяемые фаерволом Outpost Firewall Pro, достаточно разнообразны. Основную часть работы по защите компьютера берет на себя filtnt.sys – драйвер режима ядра. Этот модуль является сердцем фаервола, он также реализует систему плагинов (расширений), что обеспечивает наращивание функциональности, без существенного изменения самого ядра. Расширение файлов-плагинов ofp, предположительно происходит от “Outpost Firewall Plugin”. На моем компьтере я обнаружил следующие плагины:
Для обеспечения работы этих плагинов filtnt.sys активно взаимодействует с частями плагинов, работающих в режиме ядра:
Краткое описание способов фильтрации, используемых Outpost Firewall Pro.
Более менее подробное описание методов фильтрации в ОС MS WINDOWS вы найдете на http://ntoskrnl.com Применительно к Outpost Firewall Pro картина выглядит так. Драйвер filtnt.sys грузится сразу же после tcpip.sys. Увериться в этом, вы можете с помощью утилиты LoadOrder от Марка Руссиновича или же написав драйвер режима ядра, который зарегистрирует процедуру обратного вызова с помощью функции:
NTSTATUS PsSetLoadImageNotifyRoutine(
IN PLOAD_IMAGE_NOTIFY_ROUTINE
);
VOID (*PLOAD_IMAGE_NOTIFY_ROUTINE) (
IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId,
IN PIMAGE_INFO ImageInfo
);
Причем, драйвер должен грузиться как SERVICE_BOOT_START (параметр dwStartType функции
CreateService()). Драйвер перехватывает функции из библиотеки NDIS методом изменения таблицы экспортов:
Таким образом, фильтрующий модуль задействует два метода перехвата – NDIS Hooking Filter Driver и NDIS Intermediate Driver Сведения о NDIS можно получить из DDK. Также устанавливаются фильтры на устройства:
\Device\RawIp, \Device\Udp, \Device\Tcp, \Device\Ip.
реализуя так называемый TDI-filter driver. Получить дополнительные сведения об этом интерфейсе можно в DDK, кроме того, существует простой фаервол в открытом коде tdi_fw.Для MS Windows XP и выше контролируется IpFilterDriver – встроенный интерфейс для фильтрации. Между прочим, его использует встроенный фаервол (брандмауэр), входящий в состав ОС начиная с WinXp. Получить более полную информацию можно по адресу – http://microsoft.com Существует взаимосвязь между NDIS-пакетами и TDI-IRP. Таким образом, даже если даже ваш драйвер сможет обойти TDI-фильтр, то посланные вами IRP настоящему устройству \Device\Tcp, не будут пропущены в сеть. Кроме всего этого, Outpost Firewall Pro перехватывает функцию:
NTSTATUS ZwWriteVirtualMemory (
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL
);
методом подмены обработчика в Service Descriptor Table. Узнать более об этом методе перехвата вы можете, изучив исходные коды утилиты RegMon, которую можно получить из http://www.sysinternals.com Таким образом, обеспечивается контроль адресного пространства доверенных процессов. Но как кажется автору, этого явно мало. Фаервол от компании ZoneLabs, перехватывает больше потенциально опастных функций:
NTSTATUS PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE
IN BOOLEAN
);
причем прототип функции обратного вызова должен быть таким:
VOID (*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
Именно таким способом драйвер filtnt.sys узнает о создании и завершении процесов. Если посмотреть внимательно на реализацию функции PsSetCreateProcessNotifyRoutine, то мы увидим примерно следующее:
for (i=0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++) {
if (Remove) {
if (PspCreateProcessNotifyRoutine[i] == NotifyRoutine) {
PspCreateProcessNotifyRoutine[i] = NULL;
PspCreateProcessNotifyRoutineCount -= 1;
return STATUS_SUCCESS;
}
} else {
if (PspCreateProcessNotifyRoutine[i] == NULL) {
PspCreateProcessNotifyRoutine[i] = NotifyRoutine;
PspCreateProcessNotifyRoutineCount += 1;
return STATUS_SUCCESS;
}
}
}
Т.е. в массиве PspCreateProcessNotifyRoutine содержатся адреса зарегистрированных функций обратного вызова, которые вызываються при создании и удалении процессов. Такая реализация этой функции полностью справедлива для ОС до и включая MS Windows 2000, в следующих версия реализация немного другая, но смысл существенно не изменился. Что бы могло дать удаление этих обработчиков из этого массива? Т.е. обнуление элементов массива PspCreateProcessNotifyRoutine? Очевидный ответ – ничего, так как драйвер фаервола не смог бы определять факты создания/удаления процессов, но есть “список доверенных приложений”, и пропускать в сеть нужно только их. Но на самом деле дело обстоит так: после таких манипуляций с сеть могут проходить пакеты всех приложений, т.е. фаервол ведет себя как в режиме бездействия. Что же это? Тактическая ошибка или преступная халатность? Однозначного ответа нет, но этот факт говорит не в пользу фирмы Agnitum.
Реализация.
Для демонстрации необходимо будет написать обыкновенный драйвер режима ядра (LEGACY). Самое трудное в данном драйвере, это нахождение адреса массива PspCreateProcessNotifyRoutine, дело в том, что эта переменная, не экспортируемая и ее адрес отличается в разных версиях ОС семейства MS Windows NT. Собственно, в рамках данной статьи и не ставилось цель написать драйвер для всех версий ОС, поэтому будет принято ограничение – драйвер должен работать стабильно в ОС MS Windows XP, так как это самая популярная ОС из этого семейства на сегодняшний день. Так же необходим дизаассемблер длин инструкций, работающий в режиме ядра. Был выбран ldasm, так как он отвечает необходимым требованиям к задаче. Максимальное число элементов массива PspCreateProcessNotifyRoutine равно 8, причем там могут содержаться процедуры обратного вызова не только для Outpost Firewall Pro, но и для других полезных программ, антивирусов, AntiSpyware-программ. Так, что используя драйвер предложенный автором вы признаете, что автор не несет никакой ответственности за возможный урон, принесенный использованием данного драйвера. Предупреждая вопрос к автору, почему предложенный им драйвер, имеет ряд недоработок и мягко говоря, не доделан до конца, автор замечает, что его целью не была помощь авторам вредоносных программ.
И так отрывок дизасемблированной функции выглядит так:
В регистр EDI, заноситься адрес так необходимой нам переменной. Бинарный код выглядит так – 0xBF00E0548057, где 0x80540E00, адрес переменной, который копируется в регистр EDI. На этих предположениях основан эвристический метод определения адреса массива PspCreateProcessNotifyRoutine. Что и отражено в процедуре getPspCreateProcessNotifyRoutine():
PVOID getPspCreateProcessNotifyRoutine( )
{
PUCHAR _ptr;
PUCHAR cPtr, pOpcode;
ULONG Length;
__asm {
pushad
mov eax, PsSetCreateProcessNotifyRoutine
mov eax, [eax+2]
mov eax, [eax]
mov _ptr, eax
popad
}
for (cPtr = (PUCHAR)_ptr;
cPtr < (PUCHAR)_ptr + PAGE_SIZE;
cPtr += Length)
{
Length = SizeOfCode(cPtr, &pOpcode);
if (!Length) break;
if (*(PUSHORT)cPtr == 0xBF && *(pOpcode + 5) == 0x57)
{
return *(PVOID **)(pOpcode + 1);
}
}
return NULL;
}
Во входной процедуре DriverEntry(), проверяется версия ОС (напоминаю, что, так как метод поиска интересующей нас переменной тестировался только для MS Windows XP, то если версия ОС другая, то никаких действий предпринимать не будем), далее элементы массива просто обнуляются. Так же в архиве , прилагаемом к статье, вы найдете, приложение, которое установит и запустит драйвер (обратите внимание, на то, что для этого необходимы права администратора ), и если манипуляции с переменной ядра прошли успешно, скачает с нашего сайта файл readme с помощью IE, конечно его в начале опыта стоит перенести в список блокируемых приложений.
Вывод.
Не смотря на достаточно развитые средства фильтрации сетевого траффика, Outpost Firewall Pro не соответствует современным требованиям безопасности, хотя и являеться наиболее популярным персональным фаерволом, на территории СНГ.
[C] Kumbayo, http://omegacm.spb.ruОдно найти легче, чем другое. Спойлер: это не темная материя