Подходы к созданию песочниц
На сегодняшний день можно выделить два подхода к созданию песочниц. Первый — агентный анализ. В этом случае система представляет собой агента, который запущен в гостевой ОС для сбора событий. Обычно в качестве агента выступает драйвер Windows или модуль ядра Linux. Второй подход — безагентный анализ. Здесь система работает не в гостевой ОС, а на уровне гипервизора. Само собой, у каждого из них есть свои преимущества и недостатки — остановимся на них подробнее.
Главный плюс агентного анализа — производительность. Для сравнения: в безагентной системе на каждый перехватываемый метод происходит вызов vmexit, который останавливает виртуальную машину. Да, буквально на микросекунды, но при большом количестве событий это ощутимо. В агентной системе такого нет, но она оставляет в ОС различные артефакты, с помощью которых атакующие могут выявить песочницу и своевременно остановить запуск вредоносного кода. Например, злоумышленники могут отслеживать имена запущенных процессов, специальные пути в файловой системе и т. д. — техник полно.
Среди плюсов безагентного анализа выделим возможность отслеживать все, что происходит в операционной системе, — от загрузки ОС до запуска исследуемого приложения. Такой подход, к примеру, позволяет анализировать буткиты. Из минусов отметим уже упомянутые проблемы с производительностью.
Хочется отметить, что при разработке агента (драйвера или модуля ядра) разработчики фактически пишут руткит. Это логично, ведь агент должен скрывать себя в системе и заметать все следы, чтобы злоумышленник его не обнаружил. Например, в Linux агент должен убрать информацию о себе из специальной цепочки, в которой ядро ОС хранит данные о ядерных модулях. А также из файлов в sysfs, содержащих информацию о драйвере.
Но что будет, если злоумышленник запустит свой драйвер в агентной системе анализа? Важно понимать, что задача песочницы заключается не в том, чтобы не допустить самого запуска драйвера. Цель Sandbox — обнаружить подозрительное поведение, которое к этому приводит. Так, перед загрузкой кода на уровне ядра всегда будет цепочка подозрительной активности, которую и должна обработать песочница. Проще говоря, агент и код злоумышленника могут повоевать друг с другом, но ничего плохого в этом нет :)
Бесфайловые угрозы
Это одна из самых популярных техник злоумышленников. Для ее реализации не нужен записанный на диск файл — вся информация хранится в оперативной памяти. В случае с Windows можно выделить следующие подходы:
- запись скриптов Powershell в автозагрузку;
- запись кода в ветки реестра;
- использование WMI (Windows Management Instrumentation);
- использование планировщика задач для запуска кода через определенное время.
В Linux применяются другие методы. К примеру, системный вызов memfd_create, который создает файл, живущий только в оперативной памяти. Также можно воспользоваться специальной директорией /dev/shm (shm расшифровывается как SHared Memory). Фактически это обычная директория, в которой можно создавать файлы и запускать что-либо, но все это будет происходить в оперативной памяти и не затронет диск. Кроме того, в Linux есть схожая с /dev/shm директория /tmp. Стоит отметить, что она не всегда будет представлять собой tmpfs (временная файловая система, которая живет в оперативной памяти). Некоторые популярные дистрибутивы могут монтировать ее как ext2 и ext3 (находятся на диске).
Неперехватываемые Syscall'ы
Разработчики операционных систем не стоят на месте — API расширяются, а значит, появляются и новые системные вызовы. К примеру, Ex2, Ex3, Ex15 и др. в Windows, которые открывают новые возможности для злоумышленников и создают определенные трудности для песочниц. Само собой, эксперты и разработчики не успевают уследить за всеми новинками — всегда есть вероятность пропустить один образец из тысячи. Но это не должно быть проблемой для песочницы, потому что она живет не только поведенческим анализом. В арсенале Sandbox есть целая совокупность инструментов: статический анализ, дампы памяти, извлечение файлов и т. д. Кроме того, песочницы постоянно развиваются: когда злоумышленники начинают активно использовать новый системный вызов, на него оперативно ставится перехват.
Буткиты
Буткит — это вредоносный код, который запускается до загрузки ОС. Его основная цель — закрепиться в системе и обеспечить защиту других вредоносов от обнаружения средствами защиты. Буткиты бывают двух видов и действуют по-разному:
1. Написанные для устройств на базе BIOS (legasy):
- внедрение в MBR (master boot record);
- внедрение в VBR (volume boot record) — загрузочный сектор логического диска;
- внедрение в IPL (initial program loader).
Популярные семейства ВПО: Gapz, Satana, Pitou.
2. Написанные для устройств на прошивку UEFI:
- внедрение в Bootmgr;
- внедрение в SPI-flash;
- внедрение в EFI-партицию.
Популярные семейства ВПО: LoJax, FinSpy, Trickboo.
Классическая цепочка заражения буткитом выглядит следующим образом:
- компрометированная загрузка ОС;
- инфицирование ядра (руткит);
- запуск бэкдора в режиме пользователя;
- контроль над ОС.
В основном буткиты устанавливаются в систему с помощью вызовов CreateFileA->WriteFile, SCSI-команд и функции DeviceIoControl. Защитники могут отслеживать эти команды и успешно детектировать попытки записи. Есть и другой способ внедрения, который часто применяется в таргетированных атаках, — прямая запись в SPI-чип. Отмечу, что для противодействия этой технике потребуется песочница с определенной конфигурацией, поскольку в виртуальной среде этого чипа может не быть (либо он может быть другим).
DOS-песочницы
Песочнице (в частности, технологии поведенческого анализа) нужно время, чтобы обнаружить вредоносную активность, — в среднем две минуты. А для обработки большого потока событий требуются серьезные вычислительные мощности, которых не всегда хватает. Соответственно, возможен сценарий атаки, в котором злоумышленник просто заваливает почту и песочница захлебывается. Или же атакующий может отправить всего один вредоносный образец, который будет совершать огромное количество бесполезных действий, вызовет большой расход ресурсов и т. д. Примеры реализации:
- беспорядочное создание файлов в системе;
- форк-бомба;
- виртуализирующие протекторы, которые не только затрудняют анализ, но и раздувают поток событий.
Отмечу, что атаковать можно не только поведенческий, но и статический компонент песочницы. Например, создать документ с вложенной и сложной структурой, которую система будет долго разбирать. Либо использовать сложное арифметическое вычисление, которое будет долго считаться в виртуальной среде (перемножение квадратных матриц 1000 x 1000, подсчет определителя и др.).
К счастью, песочницы не существуют в вакууме, а всегда работают в связке с другими ИБ-решениями. Чтобы выстроить эффективную защиту, нужно грамотно использовать весь комплекс СЗИ. Таким образом вы нивелируете недостатки отдельных продуктов.
Подробнее о технологиях защиты и техниках обхода песочниц — в докладе Алексея Колесникова на PHDays Fest 2!