Исследователи из компании ARMO продемонстрировали возможность создания руткитов, не использующих специфичные системные вызовы для выполнения типовых операций, таких как чтение/запись файлов и приём команд от внешнего сервера. Вместо системных вызовов для выполнения сетевых и файловых операций предложено использовать интерфейс асинхронного ввода/вывода io_uring, поддерживаемый начиная с ядра Linux 5.1.
Суть метода в том, что вместо отдельных системных вызовов для доступа к файлам и совершения сетевых операций (read/write, recv/send/connect/bind/listen) можно использовать общие системные вызовы io_uring (io_uring_enter, io_uring_setup, io_uring_register и т.п.), которые не анализируются типовыми инструментариями для выявления вредоносной активности. Интерфейс io_uring поддерживает около 60 различных операций. В разработке находится возможность, позволяющая запускать новые процессы через io_uring.
Для демонстрации работы метода подготовлен прототип руткита
Curing, выполняющий такие действия, как приём команд от внешнего сервера и передача/изменение файлов. В демонстрации использовалась отправка запроса на TCP-порт 8888 внешнего хоста и отправка содержимого файла "/etc/shadow". Подразумевается, что после успешной компрометации системы и получения прав root, атакующий устанавливает руткит для закрепления своего присутствия на взломанной системе.
В проведённом эксперименте активность руткита Curing оказалась не замечена инструментами мониторинга Falco и Tetragon, применяемыми для определение связанных с безопасностью аномалий на хостах и в контейнерах (поддерживается интеграция с инфраструктурой на базе Kubernetes). Указанные инструменты используют перехват системных вызовов для анализа таких событий, как запуск процессов, сетевая активность и работа с файлами, но не учитывают возможность использования подсистемы io_uring для подобных операций. Большая часть доступных для Linux коммерческих систем обнаружения и реагирования на инциденты с безопасностью также основывается на перехвате системных вызовов.
Для исключения обхода инструментов отслеживания сетевой и файловой активности, вместо перехвата системных вызовов рекомендовано использовать механизм KRSI (Kernel Runtime Security Instrumentation), появившийся в ядре Linux 5.7 и позволяющий прикреплять BPF-программы к любым LSM-хукам. Например, KRSI на уровне LSM-хуков даёт возможность отслеживать операции с файлами, сетевой доступ и запуск процессов, независимо от того, инициированы данные операции через специфичные системные вызовы или через io_uring.
Ранее подсистема io_uring была объектом критики из-за регулярно всплывающих серьёзных уязвимостей. В ответ на пожелания пользователей, желающих получить простой инструмент для отключения io_uring без пересборки ядра, в ядро Linux 6.6 был добавлен sysctl io_uring_disabled. Компания Google по умолчанию отключила io_uring в ChromeOS, Android и на своих серверах, пояснив, что плачевная ситуация с безопасностью в io_uring перевешивает достоинства применения io_uring для повышения производительности.
|