Исследователи из компания АРМО Несколько дней назад они сделали публикацию, в которой они выразил обеспокоенность в растущей тенденции в развитии вредоносного ПО: способность создавать полнофункциональные руткиты, которые обходят традиционные методы обнаружения.
Исследователи отмечают в своей публикации, что центральным моментом этой стратегии является использование io_uring — асинхронного интерфейса ввода-вывода ядра Linux, который позволяет выполнять распространенные операции, такие как чтение и запись файлов или установление сетевых подключений, не прибегая к системным вызовам, которые обычно отслеживаются средствами безопасности.
Два года назад наша команда в ARMO исследовала, как обойти и манипулировать инструментами мониторинга на основе eBPF. Среди наиболее интересных методов, которые мы исследовали, были манипуляция картой eBPF и атаки TOC-TOU.
Это расследование привело нас к интересной записи в блоге от 6 июня 2022 года. В своем блоге Дэниел Тейшейра, старший оператор Red Team, продемонстрировал, как io_uring может обойти мониторинг системных вызовов в системах Linux. Этот метод показался нам очень интересным, но он не был полностью изучен, поэтому мы внимательно следили за его развитием.
Что такое io_uring и почему он представляет собой смену парадигмы?
Представлено в Linux 5.1, io_uring Это API, разработанный для асинхронных операций ввода-вывода. высокая производительность. Его работа Он основан на двух общих кольцевых буферах. между пространством пользователя и пространством ядра. Такая структура позволяет приложениям отправлять несколько запросов ввода-вывода, которые обрабатываются без блокировки вызывающего потока, что устраняет необходимость в нескольких системных вызовах.
В отличие от традиционных API ввода-вывода в стиле UNIX, где каждая операция (чтение, запись, подключение и т. д.) требует явного системного вызова, io_uring предлагает более эффективный и гибкий интерфейс. Среди его преимуществ – снижение накладных расходов. избегая постоянного копирования данных между ядром и пользовательским пространством.
Однако эта же эффективность теперь рассматривается как слабость. С точки зрения безопасности многие инструменты, предназначенные для обнаружения вредоносного поведения, полагаются исключительно на отслеживание системных вызовов. Если руткит действует без их использования, эти инструменты становятся слепыми.
Лечение: скрытый руткит
Чтобы продемонстрировать эту технику, ARMO разработала функциональный прототип под названием Curing, руткит, который работает исключительно через io_uring. Его цель: получать инструкции от удаленного сервера и выполнять такие операции, как передача или изменение системных файлов. В ходе демонстрации Curing удалось извлечь файл /etc/shadow через TCP-соединение на порту 8888, при этом его активность не была обнаружена инструментами Falco или Tetragon.
Оба решения потерпели неудачу, поскольку не рассматривалось использование io_uring как канал связи. То же самое относится и к большинству коммерческих инструментов обнаружения и реагирования на инциденты в средах Linux, которые в качестве основного средства мониторинга полагаются на перехват системных вызовов.
Что можно сделать?
Столкнувшись с этой угрозой, Исследователи рекомендуют использовать более глубокие механизмы мониторинга, например KRSI (Kernel Runtime Security Instrumentation). Представленный начиная с ядра 5.7, KRSI позволяет программам BPF (eBPF) подключаться напрямую к хукам LSM (модуль безопасности Linux), обеспечивая видимость даже в тех случаях, когда операции не генерируют системные вызовы.
С помощью этой техники Можно отслеживать доступ к файлам, сетевые подключения. и даже выполнение процессов, запущенных через io_uring. Интеграция KRSI в решения по обеспечению безопасности позволит обеспечить более надежный мониторинг, адаптированный к современным методам уклонения от контроля.
И это Это не первый случай, когда io_uring вызывает проблемы., так как в последние годы оказался в центре нескольких критических уязвимостей. Из-за этих проблем безопасности, Google решил отключить его по умолчанию в таких средах, как ChromeOS, Android и их собственные серверные инфраструктуры. В связи с этим, начиная с ядра Linux 6.6, был введен новый параметр sysctl под названием io_uring_disabled, который позволяет администраторам полностью отключить io_uring без необходимости перекомпиляции ядра.
Наконец, если вы хотите узнать об этом больше, вы можете ознакомиться с подробностями в по следующей ссылке.