适用于 CyberPanel 2.4.4 之前版本的 CVE-2026-41473 Nuclei 检测模板。
CyberPanel 的 AI Scanner 功能暴露了两个无需认证即可访问的 API 端点:
| Endpoint | Method | Impact |
|---|---|---|
/api/ai-scanner/list-api-keys | GET | 泄露管理员用户名、API 密钥前缀、托管的域名和扫描 ID |
/api/ai-scanner/callback | POST | 无需认证即可向扫描历史写入任意数据 |
两个端点均位于 /api/* URL 前缀之下,CyberPanel 的 secMiddleware 无条件地将该前缀排除在会话认证检查之外。访问任一端点均无需任何令牌、会话 Cookie 或任何形式的凭据。
读取端点可被用于目标枚举。写入端点可被用于破坏扫描历史;当与 AI Scanner 仪表板中的存储型 XSS(CVE-2026-41472)结合利用时,可通过操纵 cron 任务实现未认证的远程代码执行。
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H —— 9.8 严重(Critical)
CWE: CWE-306(关键功能缺少认证)
修复版本: CyberPanel 2.4.4(提交 8eb29181cb137baa4adb4bba5dce60f601d55a5f)
该模板发送两个请求:
请求 1 —— GET /api/ai-scanner/list-api-keys
确认目标是一个启用了 AI Scanner 功能且读取端点未受保护的 CyberPanel 实例。以 HTTP 200 匹配 JSON 结构(api_keys、recent_scans、is_payment_configured)。将管理员用户名、API 密钥前缀、域名和扫描 ID 提取为命名输出。
请求 2 —— 使用空请求体 {} 的 POST /api/ai-scanner/callback
在不执行任何实际写入的情况下探测写入端点。空请求体意味着不存在 scan_id,因此服务器无法匹配或修改任何现有的 ScanHistory 记录。在存在漏洞的服务器(< 2.4.4)上,认证检查被跳过,Django 返回包含 scan_id 的 HTTP 400 错误响应体——服务器在从未强制执行认证的情况下就进入了输入验证阶段。在已修复的服务器(≥ 2.4.4)上,X-API-Key 头检查首先触发,在读取 scan_id 之前即返回 HTTP 401。
匹配要求满足以下所有条件:
scan_id + application/json 内容类型这一组合可确认两个请求都到达了 CyberPanel AI Scanner 的逻辑且未强制执行认证,同时排除了 WAF 拦截、反向代理错误以及无关的 400 响应。
nuclei -t cyberpanel-aisscanner-unauth-rw-cve-2026-41473.yaml -u https://target:8090
# 针对目标列表
nuclei -t cyberpanel-aisscanner-unauth-rw-cve-2026-41473.yaml -l targets.txt
| Version | Status |
|---|---|
| CyberPanel < 2.4.4 with AI Scanner | 存在漏洞 |
| CyberPanel ≥ 2.4.4 | 已修复 |
| CyberPanel without AI Scanner module | 不受影响 |
未启用 AI Scanner 功能的 CyberPanel 实例(通常是 2.3 之前的版本)将不会匹配——list-api-keys 端点会返回 404,模板不会触发。