LinkPro Linux Rootkit
Um comprometimento recente de um ambiente da Amazon Web Services (AWS) revelou um rootkit GNU/Linux até então não documentado, rastreado como LinkPro. Esse backdoor é notável pelo uso duplo de módulos eBPF: um configurado para ocultar artefatos e outro que atua como um gatilho furtivo — uma "batida" que ativa a funcionalidade de comando remoto somente após a detecção de um pacote TCP especialmente criado. A cadeia de ataque e os mecanismos do rootkit ilustram um operador sofisticado que combina abuso de contêiner, ocultação em nível de kernel e ativação flexível de rede para frustrar a detecção e a correlação forense.
Índice
Vetor de infecção e implantação inicial
A intrusão começou com a exploração de uma instância exposta do Jenkins, vulnerável à CVE‑2024‑23897 (CVSS 9.8). A partir dessa base, os invasores implantaram uma imagem maliciosa do Docker (kvlnt/vv, já removida do Docker Hub) em vários clusters do Kubernetes. A imagem usava uma base Kali Linux e continha uma pequena pasta de aplicativo destinada a estabelecer persistência, acesso remoto e um download backdoor em etapas.
Por dentro da imagem maliciosa do Docker
A pasta do aplicativo da imagem continha três arquivos principais com funções distintas:
start.sh — um script de shell que inicia um serviço SSH e executa os outros dois componentes.
link — um programa de código aberto (vnt) compilado/empacotado para atuar como um cliente VPN/proxy, conectando-se a vnt.wherewego[.]top:29872. Isso permite que o invasor alcance o host comprometido de qualquer lugar e se direcione para outros alvos por meio dele.
app — um downloader baseado em Rust (chamado de vGet) que busca uma carga útil vShell criptografada de um bucket S3 e, em seguida, estabelece um link WebSocket para seu servidor de comando e controle (C2) em 56.155.98[.]37.
Cargas adicionais entregues aos nós do Kubernetes
Além da imagem maliciosa, os operadores também instalaram dois outros componentes nos nós: um dropper que instala outro backdoor vShell e o LinkPro, um rootkit escrito em Golang. O LinkPro foi projetado para ser executado em um de dois modos — passivo (reverso) ou ativo (encaminhamento) — dependendo de sua configuração. No modo passivo, ele aguarda a ativação de um pacote de rede especial; no modo ativo, ele inicia o contato com o próprio C2. O modo encaminhamento suporta cinco protocolos de transporte (HTTP, WebSocket, UDP, TCP, DNS), enquanto o modo reverso limita as comunicações ao HTTP.
Como o LinkPro persiste
O comportamento geral de execução e persistência do malware segue uma sequência clara:
- Instale o módulo Hide eBPF. Este módulo inclui os programas Tracepoint e Kretprobe eBPF usados para ocultar os processos e a atividade de rede do LinkPro.
- Se a instalação do módulo Hide eBPF falhar — ou se ele tiver sido desabilitado — instale uma biblioteca compartilhada em /etc/libld.so e adicione esse caminho a /etc/ld.so.preload como um mecanismo de ocultação de fallback.
- Para operação reversa (passiva), instale o módulo Knock eBPF. O Knock contém um programa XDP e um programa TC, de modo que o canal C2 só se torna ativo após receber um "pacote mágico" específico.
- Estabeleça persistência criando um serviço systemd.
- Executar comandos recebidos do C2.
- No desligamento ou quando sinalizado (SIGHUP, SIGINT, SIGTERM), desinstale os módulos eBPF e remova/restaure a modificação de pré-carregamento /etc/libld.so para que o sistema retorne ao seu estado anterior.
O Pacote Mágico e o Mecanismo de Ativação de Knock
A ativação passiva do LinkPro depende de um pacote TCP preciso: qualquer pacote TCP cujo tamanho de janela seja igual a 54321 é tratado como o "pacote mágico". Quando o Knock detecta esse pacote, ele armazena o IP de origem e o marca com uma expiração de uma hora. Os pacotes TCP subsequentes dessa origem são monitorados e, quando apropriado, o Knock reescreve os cabeçalhos para que o tráfego da operadora seja redirecionado para a porta de escuta do LinkPro (2333). Os pacotes de saída são ajustados para apresentar a porta original de volta à rede (porta de origem reescrita para 2233). A intenção é simples, mas eficaz: permitir que o invasor acesse o LinkPro por qualquer porta permitida pelo firewall front-end, dificultando a correlação dos logs externos do firewall com a atividade interna da rede do host.
Como o LinkPro se esconde
O LinkPro usa uma estratégia de ocultação de dois níveis:
Ocultação de kernel/eBPF : O módulo Ocultar eBPF instala programas Tracepoint e Kretprobe que interceptam chamadas de sistema, como getdents (para ocultar arquivos/diretórios) e sys_bpf (para ocultar seus próprios programas BPF). Essa abordagem requer um kernel construído com CONFIG_BPF_KPROBE_OVERRIDE habilitado.
Fallback LD_PRELOAD no espaço do usuário : Se a funcionalidade do kernel não estiver presente, o LinkPro grava uma biblioteca compartilhada (libld.so) e coloca seu caminho em /etc/ld.so.preload. Como /etc/ld.so.preload faz com que a biblioteca especificada seja carregada em todos os processos vinculados dinamicamente (aqueles que usam /lib/ld-linux.so e glibc), o libld.so implantado conecta funções libc antecipadamente (antes do próprio comportamento da glibc) e altera os retornos das chamadas libc para ocultar artefatos que, de outra forma, exporiam sua presença.
Recursos e conjunto de comandos do rootkit
O LinkPro suporta ações remotas interativas e automatizadas. Seus recursos implementados incluem:
- Iniciando um pseudoterminal /bin/bash e executando sessões de shell interativas.
- Executando comandos de shell arbitrários.
- Enumerar arquivos e diretórios e executar operações de arquivo.
- Baixando e gravando arquivos no disco.
- Estabelecendo um túnel proxy SOCKS5 para pivotamento e proxy de subsistência.
Suporte ao protocolo de rede e comportamento C2
No modo ativo (encaminhamento), o LinkPro é flexível: pode se comunicar usando transportes HTTP, WebSocket, UDP, TCP ou DNS. No modo passivo (reverso), sua comunicação é restrita a HTTP, mas se beneficia da furtividade, pois só escuta depois que o pacote mágico Knock abre uma janela de comando temporária de uma hora.
Comportamento de limpeza e desinstalação
Se o processo receber sinais de encerramento, o LinkPro visa remover rastros: ele desinstala os módulos eBPF instalados e exclui ou restaura o /etc/libld, reagrupando-o ao seu estado anterior para que o sistema pareça inalterado. Essa rotina de limpeza deliberada indica um operador preocupado com a evasão e com a minimização de rastros forenses a longo prazo.
Contexto Operacional e Atribuição
A campanha utilizou um exploit Jenkins de alta gravidade, imagens de contêiner maliciosas, diversas variantes de backdoor e furtividade em nível de kernel — uma combinação que aponta para um operador motivado e capaz. Nenhuma atribuição definitiva foi tornada pública; no entanto, o conjunto de ferramentas e o aparente uso do comprometimento para proxy e acesso remoto persistente sugerem fortemente atividades com motivação financeira (pivot, proxy para intrusões adicionais ou revenda de acesso).
Dependência do kernel e comportamento de fallback
Como o LinkPro depende dos recursos de substituição do BPF kprobe para sua interceptação furtiva do kernel, ele só aplica a técnica de ocultação em nível de kernel quando o kernel do host expõe CONFIG_BPF_KPROBE_OVERRIDE. Quando esse recurso do kernel está ausente, o LinkPro recorre deliberadamente ao método de biblioteca compartilhada LD_PRELOAD para se ocultar no espaço do usuário, garantindo a ocultação em uma ampla gama de ambientes.
Nota de Encerramento
O LinkPro demonstra como intrusões modernas podem combinar comprometimento de contêineres, carregadores em estágios, instrumentação de kernel (eBPF) e truques de rede inteligentes (ativação de pacotes mágicos e reescrita de portas) para manter a discrição e a flexibilidade. A detecção e a correção exigem uma inspeção cuidadosa em busca de programas eBPF não autorizados, entradas inesperadas em /etc/ld.so.preload, serviços systemd incomuns e conexões de rede com a infraestrutura indicada (os indicadores forenses incluem o IP 56.155.98[.]37, as portas 29872, 2333, 2233 e o nome da imagem Docker removida kvlnt/vv).