O Ecossistema: NemoClaw, OpenClaw e Ollama
Para compreender a gravidade do CVE-2026-65105, é preciso perceber como as peças encaixam. O NVIDIA NemoClaw é uma plataforma que corre agentes OpenClaw em sandboxes OpenShell, utilizando inferência local através do Ollama — um servidor de modelos de linguagem que expõe uma API REST na porta 11434.
Para que o contentor do NemoClaw conseguisse comunicar com o modelo no anfitrião, o wrapper de arranque fazia bind do Ollama a 0.0.0.0:11434 em vez de 127.0.0.1:11434. Na prática, isto significava que qualquer dispositivo na rede local — e, como veremos, qualquer site no browser — podia falar com a API do Ollama sem qualquer autenticação.
A escolha de 0.0.0.0 não era acidental: resolvia o problema imediato de routing entre contentor e anfitrião. Mas criava uma superfície de ataque que, combinada com a ausência de validação do cabeçalho Host e a falta de autenticação na API do Ollama, transformou um atalho de conveniência numa falha de segurança com consequências persistentes.
A Cadeia de Ataque: Do Browser ao Modelo Envenenado
A descoberta é da equipa da Oasis Security em colaboração com a Cyera, com coordenação do NVIDIA PSIRT (Product Security Incident Response Team). O CVE atribuído é o CVE-2026-65105. A cadeia de ataque desenrola-se em cinco passos sequenciais:
Passo 1: Bind Inseguro — 0.0.0.0 em Vez de 127.0.0.1
O wrapper do NemoClaw arranca o Ollama com bind em 0.0.0.0:11434, expondo a API REST a todas as interfaces de rede. Qualquer processo ou dispositivo que consiga alcançar essa porta pode enviar pedidos à API sem restrições. A intenção era permitir comunicação contentor-anfitrião; o resultado foi a exposição completa do serviço.
Passo 2: DNS Rebinding — O Browser Torna-se Proxy
O atacante controla um domínio cujo DNS resolve inicialmente para o IP do servidor malicioso (para servir o JavaScript) e depois altera o registo A para 127.0.0.1. O browser da vítima, ao fazer o segundo pedido, acredita que continua a falar com o mesmo domínio — mas na realidade está a enviar pedidos directamente para localhost:11434, a API do Ollama. A validação enfraquecida do cabeçalho Host no Ollama permite que o pedido passe.
Passo 3: API Sem Autenticação — Acesso Total
A API REST do Ollama não exige qualquer token, chave ou credencial. Uma vez que o pedido chega à porta 11434, é processado como legítimo. O atacante tem acesso total a todos os endpoints: /api/show para ler a configuração do modelo, /api/create para modificar modelos, /api/generate para executar inferências e /api/pull para descarregar modelos.
Passo 4: Template Poisoning — Reescrita do System Prompt
O passo crítico. Usando o endpoint /api/create, o atacante modifica o chat template do modelo, injectando instruções maliciosas que passam a integrar o system prompt de todas as sessões futuras. O Modelfile permite redefinir completamente o bloco SYSTEM e o template de conversação. As instruções envenenadas ficam gravadas no próprio modelo em disco.
Passo 5: Consequências — Agente Comprometido em Silêncio
O agente NemoClaw que consome o modelo envenenado passa a operar segundo as instruções do atacante: pode gerar código com backdoors, desactivar salvaguardas de segurança, exfiltrar dados sensíveis para endpoints externos ou alterar o comportamento de forma subtil e difícil de detectar. Tudo sem qualquer indicação visível para o utilizador.
Prompt Injection vs. Template Poisoning: A Diferença Fundamental
A maioria dos ataques de prompt injection conhecidos são efémeros: o atacante manipula o contexto de uma sessão específica, mas o efeito desaparece quando a sessão termina. O modelo subjacente permanece intacto.
O template poisoning explorado pelo CVE-2026-65105 é fundamentalmente diferente. As instruções maliciosas não vivem na memória de uma sessão — são gravadas no ficheiro do modelo em disco, no chat template que define como cada conversação é iniciada. Isto tem três implicações directas:
- Sobrevive a reinícios: Reiniciar o Ollama, o NemoClaw ou a máquina não remove o envenenamento. O template modificado é carregado novamente a partir do disco.
- Afecta todas as sessões futuras: Cada nova conversação com o modelo envenenado herda as instruções maliciosas, independentemente do utilizador ou do contexto.
- Invisível para quem consome a API: O agente que faz pedidos ao Ollama recebe respostas normais na aparência, mas condicionadas pelas instruções escondidas no template. Sem inspecção directa do Modelfile com
/api/show, não há como detectar o compromisso.
Estado do Patch por Sistema Operativo
A resposta da NVIDIA foi coordenada com o PSIRT e resultou em correcções parciais, cujo alcance varia conforme o sistema operativo:
macOS e Linux: Correcção no NemoClaw v0.0.35
A partir da versão v0.0.35, o NemoClaw em macOS e Linux deixou de forçar o bind do Ollama em 0.0.0.0. O wrapper respeita agora a configuração do utilizador e, por defeito, o Ollama liga-se a 127.0.0.1:11434, eliminando o vector de ataque via rede.
Windows e WSL: Sem Correcção Equivalente
À data de publicação deste artigo, não existe uma correcção equivalente para o caminho Windows e WSL. A arquitectura de rede do WSL apresenta desafios distintos para o routing entre contentor e anfitrião, o que torna a mitigação automática mais complexa. Utilizadores de Windows devem aplicar as mitigações manuais descritas abaixo.
Variável NEMOCLAW_OLLAMA_PROXY_SKIP_BIND_PROBE
No commit v0.0.106, foi introduzida a variável de ambiente NEMOCLAW_OLLAMA_PROXY_SKIP_BIND_PROBE=1, que instrui o wrapper a saltar a verificação e alteração automática do bind do Ollama. Isto permite que utilizadores avançados controlem manualmente a configuração de rede sem que o NemoClaw interfira.
Guia Prático de Mitigação Imediata
Independentemente do sistema operativo e da versão do NemoClaw, estas são as acções recomendadas para eliminar ou reduzir significativamente o risco:
1. Definir OLLAMA_HOST=127.0.0.1:11434
A mitigação mais importante. Define a variável de ambiente OLLAMA_HOST=127.0.0.1:11434 antes de arrancar o Ollama. Isto garante que a API aceita apenas conexões locais, eliminando o vector de DNS rebinding via rede.
export OLLAMA_HOST=127.0.0.1:11434
2. Bloquear Tráfego Inbound na Porta 11434
Como camada de defesa adicional, bloqueia qualquer tráfego de entrada na porta 11434 via firewall do sistema operativo. Mesmo que o Ollama seja inadvertidamente reiniciado com o bind errado, o firewall impede conexões externas.
# Linux (ufw)
sudo ufw deny in 11434
# macOS (pf) — adicionar a /etc/pf.conf
block in proto tcp from any to any port 11434
3. Evitar Navegação Não Confiável com o Agente Activo
Enquanto o Ollama estiver a correr, evita navegar em sites não confiáveis no mesmo computador. O ataque de DNS rebinding explora o browser como proxy — sem browser a executar JavaScript malicioso, o vector não existe. Considera usar um perfil de browser separado ou uma máquina virtual dedicada para navegação geral.
4. Rever Templates e Re-puxar Modelos Suspeitos
Se suspeitas que o modelo possa ter sido comprometido, inspeciona o template actual com o endpoint /api/show e compara-o com o original. Em caso de discrepância, apaga o modelo local e volta a puxá-lo do repositório para garantir que o template é limpo.
# Verificar o template actual
curl http://localhost:11434/api/show -d '{"name":"llama3.1"}'
# Re-puxar o modelo limpo
ollama rm llama3.1
ollama pull llama3.1
5. Actualizar o NemoClaw
Em macOS e Linux, actualiza para a versão v0.0.35 ou superior do NemoClaw. Em Windows/WSL, aplica as mitigações manuais acima e monitoriza o repositório para a correcção dedicada. Utilizadores avançados podem também definir NEMOCLAW_OLLAMA_PROXY_SKIP_BIND_PROBE=1 para controlo total sobre o bind.
A Lição de Fundo: Segurança de Rede, Não de Modelo
O CVE-2026-65105 é, na sua essência, uma falha clássica de exposição de serviços locais. Não há aqui nenhuma técnica exótica de adversarial machine learning, nenhum ataque ao modelo em si. Os ingredientes são antigos e bem conhecidos: um bind em 0.0.0.0 por conveniência, uma API sem autenticação, uma validação de cabeçalho Host insuficiente, e a técnica de DNS rebinding documentada desde 2006.
O que amplifica a gravidade é o contexto: o serviço exposto não é um servidor web convencional ou uma base de dados — é o motor de inferência que alimenta um agente autónomo. A capacidade de reescrever persistentemente o comportamento do modelo transforma uma falha de rede numa falha de confiança em toda a cadeia de decisão do agente. Cada output gerado, cada linha de código sugerida, cada acção executada pelo agente passa a estar condicionada pelas instruções do atacante.
Para quem opera inferência local — seja com Ollama, llama.cpp ou outros runtimes — a mensagem é clara: os fundamentos de segurança de rede aplicam-se com a mesma urgência que aplicariam a qualquer outro serviço. Bind, autenticação, validação de origem e segmentação de rede não são preocupações opcionais só porque o serviço é "local".
🔒 Verifica a Tua Configuração Agora
Confirma que o OLLAMA_HOST está em 127.0.0.1, actualiza o NemoClaw, e inspecciona os templates dos teus modelos com /api/show. Se encontrares algo anómalo, apaga e volta a puxar o modelo.