Невидими руткитове: новото предизвикателство за инструментите за сигурност на Linux

io_uring се завръща, този път като руткит

Изследователи от на компанията АРМО Те направиха публикация преди няколко дни, в която имат изрази загриженост в нарастваща тенденция в еволюцията на зловредния софтуер: способността за създаване напълно функционални руткитове, които избягват традиционните методи за откриване.

В публикацията си изследователите споменават, че централният момент на тази стратегия е използването на io_uring, асинхронен входно/изходен интерфейс на ядрото на Linux, който позволява извършването на често срещани операции като четене и запис на файлове или установяване на мрежови връзки, без да се прибягва до системни повиквания, които обикновено се наблюдават от инструменти за сигурност.

Преди две години нашият екип в ARMO проучи как да се заобиколят и манипулират инструменти за мониторинг, базирани на eBPF. Някои от най-интересните техники, които изследвахме, бяха манипулирането на eBPF карти и TOC-TOU атаките.

Това разследване ни доведе до интересна публикация в блога от 6 юни 2022 г. В блога си Даниел Тейшейра, старши оператор на Red Team, демонстрира как io_uring може да заобиколи мониторинга на системните повиквания в Linux системи. Намерихме този метод за много интересен, но той не беше напълно проучен, затова следихме отблизо неговата еволюция.

Какво е io_uring и защо представлява промяна на парадигмата?

Въведен в Linux 5.1, io_uring Това е API, предназначен за асинхронни входно/изходни операции. висока производителност. Неговото действие Базира се на два споделени пръстенни буфера между потребителското пространство и пространството на ядрото. Тази структура позволява на приложенията да изпращат множество I/O заявки, които се обработват без блокиране на извикващата нишка, елиминирайки необходимостта от множество системни извиквания.

За разлика от традиционните UNIX-стил I/O API, където всяка операция (четене, запис, свързване и т.н.) изисква изрично системно извикване, io_uring предлага по-ефективен и гъвкав интерфейс. Сред предимствата му е намаляването на режийните разходи като се избягва постоянното копиране на данни между ядрото и потребителското пространство.

Но същата тази ефективност сега се разглежда като слабост. От гледна точка на сигурността, много инструменти, предназначени за откриване на злонамерено поведение, разчитат изключително на проследяване на системни повиквания. Ако руткит действа без да ги използва, тези инструменти стават слепи.

Лечение: Скрит руткит

За да демонстрира тази техника, ARMO разработи функционален прототип, наречен Curing, руткит, който работи изключително чрез io_uring. Целта му: да получава инструкции от отдалечен сървър и да извършва операции като прехвърляне или промяна на системни файлове. В демонстрацията, Къринг успя да извлече файла /etc/shadow през TCP връзка на порт 8888, без активността му да бъде открита от инструментите Falco или Tetragon.

И двете решения се провалиха, тъй като не взеха предвид използването на io_uring като комуникационен канал. Същото важи и за повечето инструменти за откриване и реагиране на търговски инциденти в Linux среди, които разчитат на прихващане на системни повиквания като основно средство за наблюдение.

Какво може да се направи?

Изправени пред тази заплаха, Изследователите препоръчват приемането на по-задълбочени механизми за мониторинг, като например KRSI (Kernel Runtime Security Instrumentation). Въведен, започвайки с ядрото 5.7, KRSI позволява BPF (eBPF) програми да бъдат свързани директно към LSM (Linux Security Module) hooks, осигурявайки видимост дори когато операциите не генерират системни повиквания.

С тази техника, Възможно е да се проследява достъпът до файлове, мрежови връзки и дори изпълнението на процеси, стартирани чрез io_uring. Интегрирането на KRSI в решенията за сигурност би позволило по-надежден мониторинг, адаптиран към съвременните техники за избягване на риска.

И Това не е първият път, когато io_uring причинява проблеми., тъй като през последните години е бил в центъра на няколко критични уязвимости. Поради тези проблеми със сигурността, Google реши да го деактивира по подразбиране в среди като ChromeOS, Android и техните собствени сървърни инфраструктури. В този смисъл, от ядрото на Linux 6.6 насам е въведен нов sysctl параметър, наречен io_uring_disabled, който позволява на администраторите напълно да деактивират io_uring, без да е необходимо да прекомпилират ядрото.

И накрая, ако се интересувате да научите повече за него, можете да се консултирате с подробностите в следваща връзка.