Pesquisadores da empresa ARMO demonstraram a capacidade de criar rootkits que não utilizam chamadas de sistema específicas para realizar operações comuns, como leitura/gravação de arquivos e recebimento de comandos de um servidor externo. Em vez de chamadas de sistema para realizar operações de rede e arquivos, foi proposto usar a interface de entrada/saída assíncrona io_uring, suportada desde o kernel Linux 5.1.
A essência do método é que, em vez de chamadas de sistema separadas para acessar arquivos e realizar operações de rede (read/write, recv/send/connect/bind/listen), podem ser utilizadas chamadas de sistema gerais io_uring (io_uring_enter, io_uring_setup, io_uring_register, etc.), que não são analisadas por ferramentas comuns para detectar atividades maliciosas. A interface io_uring suporta cerca de 60 operações diferentes. Existe um desenvolvimento em andamento de uma funcionalidade que permite iniciar novos processos através do io_uring.
Para demonstrar o funcionamento do método, foi preparado um protótipo de rootkit chamado Curing, que executa ações como receber comandos de um servidor externo servidor e transferir/modificar arquivos. Na demonstração, foi enviado um pedido para a porta TCP 8888 de um host externo e enviado o conteúdo do arquivo '/etc/shadow'. Presume-se que após a comprometida bem-sucedida do sistema e obtenção de privilégios root, o atacante instala o rootkit para consolidar sua presença no sistema invadido.
No experimento realizado, a atividade do rootkit Curing não foi percebida pelas ferramentas de monitoramento Falco e Tetragon, que são utilizadas para identificar anomalias de segurança em hosts e containers (a integração com a infraestrutura baseada em Kubernetes é suportada). As ferramentas mencionadas utilizam interceptação de chamadas de sistema para analisar eventos como inicialização de processos, atividade de rede e manipulação de arquivos, mas não consideram a possibilidade de uso do subsistema io_uring para tais operações. A maior parte dos sistemas comerciais de detecção e resposta a incidentes de segurança disponíveis para Linux também se baseia na interceptação de chamadas de sistema.
Para evitar a contorno das ferramentas de rastreamento de atividades de rede e de arquivos, é recomendável utilizar o mecanismo KRSI (Kernel Runtime Security Instrumentation), que surgiu no kernel do Linux 5.7 e permite anexar programas BPF a qualquer gancho LSM. Por exemplo, o KRSI a nível de ganchos LSM possibilita rastrear operações com arquivos, acesso à rede e execução de processos, independentemente de essas operações serem iniciadas através de chamadas de sistema específicas ou através do io_uring.
Anteriormente, o subsistema io_uring foi alvo de críticas devido a vulnerabilidades sérias que surgiam regularmente. Em resposta aos pedidos dos usuários que desejavam uma ferramenta simples para desativar o io_uring sem recompilar o kernel, foi adicionado ao kernel do Linux 6.6 o sysctl io_uring_disabled. A empresa Google, por padrão, desativou o io_uring no ChromeOS, Android e em seus servidores, explicando que a situação lamentável da segurança no io_uring supera as vantagens do uso do io_uring para aumento de desempenho.
Fonte: opennet.ru
