Введение
Данная методология теста является результатом совместной работы и интеллектуальной собственностью экспертного сообщества Anti-Malware.ru.
В тестировании приняла участие 21 популярная программа комплексной защиты (класса Internet Security) и персональные фаерволы от различных производителей (таблица 1). Представленные ниже продукты актуальны на момент начала теста – 1.05.2013.
Таблица 1. Тестируемые продукты комплексной защиты и фаерволы
Продукт | Версия |
Avast! Internet Security | 8.0.1488 |
AVG Internet Security | 2013.0.3272 |
Avira Internet Security | 13.0.0.3499 |
BitDefender Internet Security | 16.29.0.1830 |
Comodo Internet Security | 6, 1, 276867, 2813 |
Dr.Web Security Space | 8.0 |
Eset Smart Security | 6.0.316.0 |
F-Secure Internet Security | 1.77 build 243 |
G DATA Internet Security | 1.0.13113.239 |
Jetico Personal Firewall | 2.0 |
Kaspersky Internet Security | 13.0.1.4190(g) |
McAfee Internet Security | 11.6.507 |
Microsoft Security Essentials + Windows Firewall | 4.2.223.0 |
Norton Internet Security | 20.3.0.36 |
Online Armor Premium Firewall | 6.0.0.1736 |
Outpost Security Suite Pro | 8.0 (4164.639.1856) |
Panda Internet Security | 18,01,01 |
PC Tools Internet Security | 9.1.0.2900 |
Trend Micro Titanium Internet Security | 6.0.1215 |
TrustPort Internet Security | 2013 (13.0.9.5102) |
Kingsoft Internet Security | 2009.05.07.70 |
Описание среды тестирования
Перед началом теста производилась подготовка среды тестирования. Для этого на чистый компьютер была установлена операционная система Windows 7 Enterprise SP1 x86 со всеми доступными на этот момент обновлениями, а также дополнительное программное обеспечение, необходимое для теста.
Ниже представлены основные характеристики компьютера, на котором проводился тест (см. таблицу 2).
Таблица 2: Платформа для проведения теста
Процессор | DualCore Intel Core 2 Duo E8400, 3000 Mhz |
Материнская плата | Gygabyte GA-G31MF-S2 |
Видеокарта | NVIDIA GeForce 9600 GT |
Оперативная память | 4096 MB |
Жесткий диск | WDC WD2500JS-22NCB1 |
Сеть | 100mbit/sec Ethernet (NVIDIA nForce Networking Controller) |
Также на стенд устанавливалось следующее программное обеспечение, необходимое для воспроизведения атак:
- Microsoft Visual C++ 2010 x86 Redistributable.
- Microsoft Office 2007 Enterprise.
- Denwer3_Base_PHP52_2012-09-16_a2.2.22_p5.2.12_zendoptimizer_m5.5.25_pma3.5.1_xdebug.exe
Тестирование производилось на двух типах настроек: рекомендуемых производителем стандартные (настройки по умолчания) и максимальных.
В первом случае использовались рекомендуемые производителей настройки по умолчанию и производились все рекомендуемые программой действия.
Во втором случае в дополнение все настройки, которые были отключены в режиме «по умолчанию», но при этом могли повлиять на исход тестирования, включались и/или приводились в максимальное положение (наиболее строгие настройки). Другими словами – под выставлением максимальных настроек понимается перевод всех доступных из графического интерфейса пользователя настроек всех модулей, связанных с детектированием вредоносной файловой или сетевой активности, к наиболее строгому варианту.
Методы тестирования
В зону ответственности фаервола входят следующие виды актуальных атак:
- Внешняя атака на хост со стороны сетевых червей, распространяющихся посредством автоматизированной массовой эксплуатации уязвимостей в сетевых службах по широким диапазонам сетевых адресов.
- Несанкционированная исходящая сетевая активность со стороны вредоносной программы, выполняющейся на хосте (загрузка дополнительного вредоносного модуля, коммуникация с сервером ботнета и т.п.).
Для осуществления несанкционированной исходящей сетевой активности вредоносными программами в настоящее время применяются следующие техники:
- Ограничение функционирования или полное отключение фаервола.
- Реализация поведения, проходящего мимо зоны реакции эвристических анализаторов фаервола.
- Использование «Белого списка» и механизмов исключений фаервола с целью маскировки под процесс, для которого разрешена исходящая сетевая активность.
Следует заметить, что в течение последних 2-3 лет технологии обхода фаерволов эволюционировали от многочисленных штучных техник, нацеленных на конкретные продукты и отдельные механизмы реализации фаерволов, к нескольким универсальным техникам. А именно, в настоящий момент наиболее популярны следующие техники обхода фаерволов:
- Выполнение кода в режиме ядра. Вредоносная программа, которой удалось загрузить свой драйвер в обход систем защиты, получает неограниченные привилегии с точки зрения контроля и обхода фаервола.
- Внедрение в стандартный системный процесс (напр. Services.exe). Поскольку сетевая активность таких процессов разрешена во всех фаерволах «по умолчанию», в результате успешной реализации этой техники вредоносный код получает доступ к сети, независимо от типа используемого фаервола.
Одного из двух перечисленных методов в большинстве случаев достаточно для обхода любого фаервола.
Основываясь на этом, для проведения тестирования специально были подготовлены тестовые утилиты для моделирования нужных методов атак, которые отбирались с учетом следующих критериев:
- Методы атак должны покрывать основные типы «внутренних» атак (см. выше).
- Методы должны отражать поведение реальных вредоносных программ.
Таким образом, для теста было отобрано 64 варианта внутренних атак и подготовлено 64 соответствующих тестовых утилит. Часть методов из прошлого теста не вошла в данный из-за того, что используемые в ним методы атак нельзя осуществить под Windows 7. Также было добавлен ряд новых методов для проверки защиты процессов от завершения. Все методы атак можно весьма условно разбить на два уровня сложности – базовый и повышенный.
Базовый уровень сложности:
1. Проверка защиты процессов от завершения.
Функции самозащиты представляют собой необходимый минимум функционала любого продукта, решающего задачи в области безопасности. При наличии возможности отключения защиты все остальные её функции теряют смысл. Таким образом, базовый тест самозащиты представляет собой минимальную проверку функций фаервола и служит фундаментом для остальных тестов. По сравнению с предыдущим тестом данный раздел был существенно расширен.
1.1. TerminateProcess - использование API функции TerminateProcess.
1.2. TerminateThreads - использование API функции TerminateThread.
1.3. TerminateProcessJob - использование API функции TerminateJobObject.
1.4. TerminateProcessDebug - использование native API функций NtCreateDebugObject/NtDebugActiveProcess.
1.5. SendMessage – использование API функции SendMessage.
1.6. SuspendProcess - использование native API функции NtSuspendProcess.
1.7. SuspendThreads - использование API функции SuspendThread.
1.8. StopServiceScm – остановка системных сервисов с использованием Service Control Manager API.
1.9. StopServiceNative - остановка системных сервисов с использованием native API функции NtUnloadDriver.
1.10. CreateRemoteThread - использование API функции CreateRemoteThread(ExitProcess).
1.11. CreateRemoteThread(DLL) - использование API функции CreateRemoteThread(LoadLibrary).
1.12. UnmapSection - использование native API функции NtUnmapViewOfSection.
1.13. VirtualProtect - использование API функции VirtualProtectEx.
1.14. UserApc - использование функции QueueUserAPC.
1.15. WndHook - использование API функции SetWindowsHookEx.
1.16. TerminateProcessTrusted – использование API функции TerminateProcess от имени доверенного процесса.
1.17. TerminateThreadTrusted – использование API функции TerminateThread от имени доверенного процесса.
1.18. ZwTerminateProcess - завершение процесса через ZwTerminateProcess.
1.19. ZwterminateThread - завершение процесса путём закрытия всех его потоков через ZwterminateThread.
1.20. Using remote thread - завершение процесса путём создания потока внутри завершаемого процесса через CreateRemoteThread.
1.21. Thread context modification - завершение процесса путём установки новой точки исполнения потока через ZwSetContextThread.
1.22. Resetting memory pages attributes - завершение процесса путём установки новых атрибутов страниц через ZwProtectVirtualMemory.
1.23. Rewriting memory data - завершение процесса путём заполнения нулями существующих страниц через ZwWriteVirtualMemory.
1.24. As part of a job - завершение процесса путём присоединения его к рабочему объекту ZwAssignProcessToJobObject и завершению его ZwTerminateJobObject
1.25. Using debugging - завершение процесса путём присоединения к отлдадчику через ZwDebugActiveProcess.
1.26. Using windows station - завершение процесса через WinStationTerminateProcess.
1.27. Using DLL injection method 1 - завершение процесса путём внедрения в него библиотеки через SetWindowsHookEx.
1.28. Using DLL injection method 2 - завершение процесса путём внедрения в него библиотеки через SetWinEventHook.
1.29. Sending WM_CLOSE - завершение процесса путём посылки в его окно сообщения WM_CLOSE.
1.30. Sending WM_QUIT - завершение процесса путём посылки в его окно сообщения WM_QUIT/
1.31. Sending WM_SYSCOMMAND - завершение процесса путём посылки в его окно сообщения WM_SYSCOMMAND с параметром SC_CLOSE.
1.32. Bruteforce window posting - завершение процесса путём посылки в его окно всех возможных сообщения в цикле.
1.33. Freeing virtual memory - завершение процесса путём удаления выделенной памяти через ZwFreeVirtualMemory
1.34. Unmapping virtual memory - завершение процесса путём удаления загруженных модулей через ZwUnmapViewOfSection.
1.35. Huge virtual memory allocation - завершение процесса путём выделения в процессе всей только возможной памяти через ZwAllocateVirtualMemory
1.36. Huge virtual memory mapping - завершение процесса путём выделения в процессе всей только возможной памяти через ZwMapViewOfSection.
1.37. Closing process handle's - завершение процесса путём удаления из него всех открытых описателей через ZwDuplicateObject
1.38. Huge process handle's allocation - завершение процесса путём забивания его открытыми описателями через ZwDuplicateObject
1.39. Terminate process via APC - завершение процесса путём передачи управления через механизм APC с помощью ZwQueueApcThread и ZwQueueApcThreadEx.
1.40. Terminate process via SetParent - завершение процесса путём установки нового parent-окна через SetParent и уничтожением оного через DestroyWindow.
1.41. Hang GUI via SetWindowLong - завершение процесса путём уничтожения базовых значений Window Long с помощью SetWindowLong
2. Защита от стандартных внутренних атак.
Задача данного этапа – тестирование фаерволов на стандартных, хорошо известных, простых и документированных техниках. В их число входят, с учётом современных требований к фаерволам и специфики актуальных угроз (см. раздел «Актуальные угрозы»), два класса техник: обход фаервола через доверенный процесс и загрузка драйвера режима ядра.
2.1. IECreateProcess – запуск скрытого процесса InternetExplorer с использованием функции API CreateProcess.
2.2. IEShellExecute - запуск скрытого процесса InternetExplorer с использованием функции API ShellExecute.
2.3. IECreateProcessCMD – запуск скрытого процесса InternetExplorer с использованием функции API CreateProcess с использованием командной строки.
2.4. URLOpenByExplorer – открытие URL адреса через Windows Explorer.
2.5. IWebBrowser2 - использование интерфейса IWebBrowser2.
2.6. IWebBrowser2 + VBS - использование интерфейса IWebBrowser2 из скрипта VBS.
2.7. RPC Call NetrJobAdd - использование RPC вызова NetrJobAdd.
2.8. ITaskScheduler - использование интерфейса ITaskScheduler.
2.9. AT.EXE - использование стандартной утилиты AT.EXE.
2.10. Schtasks - использование стандартной утилиты schtasks.EXE
2.11. BITS - загрузка произвольного файла из сети средствами стандартной службы Background Intelligent Transfer Service.
2.12. DrvLoad Service Control Manager API - загрузка драйвера с использованием Service Control Manager API.
2.13. DrvLoad Native API - загрузка драйвера с использованием native API.
2.14. SybvertPathValue - загрузка драйвера путём подмены значения параметра реестра ImagePath для службы легитимного драйвера.
2.15. SubvertImageFile - загрузка драйвера путём подмены исполняемого файла легитимного драйвера.
Повышенный уровень сложности:
3. Тестирование защиты от нестандартных утечек:
Задача данного этапа – оценить возможности защиты тестируемых продуктов от более сложных (недокументированных или малоизвестных) вариантов обхода фаерволов путем внедрения в процесс, используемых реальными вредоносными программами.
3.1. APCInject — инжектирование (внедрение) шеллкода в доверенный процесс с использованием функций NtCreateSection/NtMapViewOfSection для копирования памяти и QueueUserAPC для запуска кода на исполнение.
3.2. InterProcessInject - поэтапное инжектирование (внедрение) кода в доверенный процесс, при котором каждая операция (выделение памяти, копирование кода, создание потока, и т.д.) осуществляется из новой копии злонамеренного процесса.
3.3. Microsoft Word Inject - внедрение DLL в контекст процесса WORD.EXE (Microsoft Office Word) средствами встроенного в него интерпретатора VBS-сценариев. Создание нового документа Word из контекста злонамеренного процесса происходит с помощью COM-объекта "Word.Application".
4. Тестирование защиты от нестандартных техник проникновения в режим ядра:
Задача данного этапа – оценка способности тестируемых продуктов по блокировке выполнения неавторизованного кода в режиме ядра. Подобные функции, строго говоря, не относятся к зоне ответственности фаерволов. Вместе с тем, без защиты режима ядра фаервол легко обходится, и все остальные его функции оказываются бесполезными.
4.1. DrvInstall via InstallHinfSection - устанавливает драйвер режима ядра, используя .INF-файл и API функцию InstallHinfSection из SETUPAPI.DLL, вызываемую из контекста системного процесса RUNDLL32.EXE.
4.2. DrvInstall via Task Scheduler - выполнение установки драйвера режима ядра в виде отложенного задания Task Scheduler-а (служба планировщика заданий). Задание создаётся путём вызова функции NetrJobAdd через RPC сервер ATSvc.
4.3. DLL Inject via AddPrintProvidor - внедрение DLL в процесс службы диспетчера печати (SPOOLSV.EXE) используя документированную API функцию AddPrintProvidor. Внедрённая библиотека выполняет загрузку драйвера режима ядра.
4.4. DrvInstall via MoveFileEx (MOVEFILE_DELAY_UNTIL_REBOOT) - замена зарегистрированного в системе драйвера режима ядра с помощью API функции MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT, при использовании которого непосредственно операция копирования/перемещения файла будет отложена до следующей загрузки системы, в процессе которой отложенные файловые операции осуществляются диспетчером сессий (Session Manager).
4.5. OpenFile via OBJECT_ATTRIBUTES - принцип данной атаки заключается в том, что не все проактивные защиты корректно обрабатывают поле RootDirectory структуры OBJECT_ATTRIBUTES, благодаря чему становится возможным, к примеру, открыть на чтение/запись системный файл в обход правил проактивной защиты. Таким образом, ликтест осуществляет загрузку злонамеренного драйвера.
При этом полностью исключалась возможность сигнатурного детектирования тестовых утилит со стороны антивирусных компонент тестируемых комплексных продуктов.
Тестирование проводилось в максимально жёстких условиях, так как это повышает объективность результатов: фаервол, успешно отразивший атаки в жёстких условиях, гарантированно справится с ними и в более мягких условиях.
В частности, все тестовые утилиты запускались от имени локального администратора. Это оправдано в силу нескольких причин: многие пользователи работают с правами администратора по умолчанию; относительно несложно повысить привилегии до уровня администратора с использованием уязвимости в любых системных приложениях; для работы многих прикладных программ (онлайн-банкинг, бухгалтерские программы) требуются привилегии администратора.
Шаги проведения тестирования
- Установка операционной системы и ее обновление (создание образа чистой системы).
- Установка тестируемой программы на чистую машину со стандартными настройками, рекомендованными производителем, обновление модулей и антивирусных баз продукта, принудительная перезагрузка системы.
- Проверка успешной установки и работоспособности всех модулей программы.
- Создание образа системы с установленным продуктом.
- Запуск тестовых утилит и запись результатов их работы (после работы каждой тестовой утилиты производился откат системы к сохраненному образу со стандартными настройками).
- Изменения настроек продукта на «максимальные», создание нового образа системы.
- Повторный запуск тестовых утилит и запись результатов их работы (после работы каждой тестовой утилиты производился откат системы к сохраненному образу с максимальными настройками).
После каждой атаки обязательно проводилась проверка работоспособности функционала тестируемого продукта (его отдельных модулей, активных процессов, сервисов, драйверов).
Если в ходе тестов на завершение/модификацию процессов один из них завершался (т.е. атака на него удавалась), то все остальные процессы подвергались атаке повторно.