Rootkits invisíveis: o novo desafio para ferramentas de segurança Linux

io_uring está de volta, desta vez como um rootkit

Pesquisadores de a empresa ARMO Eles fizeram uma publicação há alguns dias na qual eles têm expressou preocupação em uma tendência crescente na evolução do malware: a capacidade de criar rootkits totalmente funcionais que escapam dos métodos tradicionais de detecção.

Os pesquisadores mencionam em sua publicação que o ponto central dessa estratégia é o uso do io_uring, uma interface de entrada/saída assíncrona do kernel Linux que permite realizar operações comuns, como ler e escrever arquivos ou estabelecer conexões de rede, sem recorrer a chamadas de sistema que normalmente são monitoradas por ferramentas de segurança.

Dois anos atrás, nossa equipe na ARMO investigou como contornar e manipular ferramentas de monitoramento baseadas em eBPF. Algumas das técnicas mais interessantes que exploramos foram a manipulação de mapas eBPF e os ataques TOC-TOU.

Essa investigação nos levou a uma postagem de blog interessante de 6 de junho de 2022. Em seu blog, Daniel Teixeira, um operador sênior do Red Team, demonstrou como o io_uring pode ignorar o monitoramento de chamadas do sistema em sistemas Linux. Achamos esse método muito interessante, mas ele não havia sido totalmente explorado, então acompanhamos de perto sua evolução.

O que é io_uring e por que ele representa uma mudança de paradigma?

Introduzido no Linux 5.1, io_uring É uma API projetada para operações de E/S assíncronas alto desempenho. Seu funcionamento É baseado em dois buffers de anel compartilhados entre o espaço do usuário e o espaço do kernel. Essa estrutura permite que os aplicativos enviem várias solicitações de E/S que são processadas sem bloquear o thread de chamada, eliminando a necessidade de várias chamadas de sistema.

Ao contrário das APIs de E/S tradicionais do estilo UNIX, onde cada operação (leitura, gravação, conexão, etc.) requer uma chamada de sistema explícita, o io_uring oferece uma interface mais eficiente e flexível. Entre suas vantagens está a redução de custos indiretos evitando a cópia constante de dados entre o kernel e o espaço do usuário.

Mas essa mesma eficiência agora é vista como uma fraqueza. Do ponto de vista da segurança, muitas ferramentas projetadas para detectar comportamento malicioso dependem exclusivamente do rastreamento de chamadas do sistema. Se um rootkit agir sem utilizá-las, essas ferramentas ficarão cegas.

Cura: Um Rootkit Furtivo

Para demonstrar esta técnica, A ARMO desenvolveu um protótipo funcional chamado Curing, um rootkit que opera exclusivamente através da io_uring. Sua finalidade: receber instruções de um servidor remoto e realizar operações como transferir ou alterar arquivos do sistema. Na demonstração, o Curing conseguiu exfiltrar o arquivo /etc/shadow através de uma conexão TCP na porta 8888 sem que sua atividade fosse detectada pelas ferramentas Falco ou Tetragon.

Ambas as soluções falharam por não considerar o uso de io_uring como um canal de comunicação. O mesmo vale para a maioria das ferramentas comerciais de detecção e resposta a incidentes em ambientes Linux, que dependem da interceptação de chamadas do sistema como seu principal meio de monitoramento.

O que se pode fazer?

Perante esta ameaça, a Pesquisadores recomendam adoção de mecanismos de monitoramento mais profundos, como KRSI (Kernel Runtime Security Instrumentation). Introduzido a partir do kernel 5.7, o KRSI permite que programas BPF (eBPF) sejam conectados diretamente aos ganchos LSM (Linux Security Module), fornecendo visibilidade mesmo quando as operações não geram chamadas de sistema.

Com esta técnica, É possível rastrear o acesso a arquivos, conexões de rede e até mesmo a execução de processos iniciados através do io_uring. A integração do KRSI em soluções de segurança permitiria um monitoramento mais confiável, adaptado às técnicas modernas de evasão.

E é que Esta não é a primeira vez que o io_uring causa problemas., já que nos últimos anos está no centro de diversas vulnerabilidades críticas. Devido a esses problemas de segurança, O Google optou por desativá-lo por padrão em ambientes como ChromeOS, Android e suas próprias infraestruturas de servidor. Nessa linha, desde o kernel Linux 6.6, um novo parâmetro sysctl chamado io_uring_disabled foi introduzido, o que permite aos administradores desabilitar completamente o io_uring sem precisar recompilar o kernel.

Por fim, se tiver interesse em saber mais sobre o assunto, pode consultar os detalhes no link a seguir