
Python用エクスプロイト CVE-2026-41940 — cPanel/WHM cpsrvdにおける重大なCRLFインジェクション。認証と2FAをバイパスし、4ステップのHTTP攻撃チェーンを介してルートレベルのアクセスを許可します。
脆弱性: cpsrvd の HTTP Basic 認証ハンドラにおける CRLF インジェクションを 利用したセッションファイルの操作 CVE: CVE-2026-41940 CVSS: 9.8(緊急) CWE: CWE-93(CRLF インジェクション)/ CWE-306(認証の欠如) 影響を受けるバージョン: cPanel & WHM の以下のバージョンより前: 11.110.0.97, 11.118.0.63, 11.126.0.54, 11.132.0.29, 11.134.0.20, 11.136.0.5 ポート: 2082/2083(cPanel)、2086/2087(WHM)、2095/2096(Webmail)
技術的根本原因: cpsrvd の HTTP Basic 認証ハンドラは、指定されたパスワードをそのまま Cpanel::Session::saveSession() 経由で認証前セッションファイルに保存します。これは、サニタイズ用の Cpanel::Session::create() / Cpanel::Session::Modify::save() ラッパー(filter_sessiondata() を呼び出して CR/LF を除去する)を迂回します。saveSession() 自体は filter_sessiondata() を呼び出さないため、パスワード内の CR/LF はリテラルな改行として生のセッションファイルに書き込まれます。
リクエストが URL に紐付くセキュリティトークンチェックの失敗で拒否されると、cpsrvd の do_token_denied() ハンドラが Cpanel::Session::Modify::new($session, nocache => 1) を呼び出します。nocache => 1 フラグは、JSON キャッシュを読み込む代わりに生のセッションファイルの再パース(key=value の行単位)を強制します。攻撃者が制御する pass フィールドが CRLF で分割された行は、個別の key=value レコードとして扱われます。その後、Modify::save() は、パースされたすべてのキー(攻撃者が注入したキーを含む)をトップレベルのセッションエントリとして昇格させて、JSON キャッシュを書き換えます。
再生成後、セッションには user=root、hasroot=1、tfa_verified=1、攻撃者が選択した cp_security_token、および新しい successful_internal_auth_with_timestamp が含まれます。cpsrvd はこのセッションを完全に認証済みとして扱います。
攻撃チェーン(4 回の HTTP リクエスト):
注記: Perl のハッシュ反復順序がランダム化されているため、レースコンディションが発生します。元の(未設定の)cp_security_token が、注入されたものを上書きする可能性があります。複数回のリトライにより、この攻撃チェーンは信頼性が高まります。
免責事項: このツールは、許可されたセキュリティテストおよび研究目的でのみ提供されます。所有していない、または明示的なテスト許可を得ていないシステムに対する不正使用は違法です。