
CVE-2026-41940 (cPanel & WHM 認証バイパス) 向け高忠実度スキャナ
CVE-2026-41940 として追跡されている cPanel/WHM 認証バイパス用の高精度スキャナです。公開されている概念実証や検出にありがちな偽陰性を発生させず、またアカウントロックアウトや root IP 許可リスト機構(ナイーブなスキャンを妨害する)を引き起こさずに脆弱なホストを識別します。
このツールには、cpdavd(ポート 2079 平文/2080 TLS)上の同一系統の CalDAV パストラバーサルバグ(CVE-2026-29205)に対する、オプトインの独立したエクスプロイトチェーンもバンドルされています。このバグにより、リモートの攻撃者は小さな SMTP 駆動のセットアップ手順が成功した後、root として任意のファイルを読み取ることができます。cPanel 11.134.0.26 では、基礎となる RAII のライフタイムバグが修正され、読み取りは非特権のアカウント所有者として実行されます。トラバーサル自体は依然として cpdavd に到達しますが、そのアカウントが既に読み取れるものを超えてエスカレーションすることはできません。CalDAV チェーンは --exploit で有効になり、実際のメールを送信し、確認されたターゲットからファイルを読み取るためデフォルトではオフになっています。エクスプロイトモード(アクティブ)のセクションを参照してください。
CVE-2026-41940 に対する公開検出のほとんどには 3 つの問題があります。このスキャナはそれぞれに対処します。
この検出手法に関するブログ記事はこちらで読めます: https://slcyber.io/research-center/high-fidelity-check-for-the-cpanel-authentication-bypass-cve-2026-41940/
cPanel の vhost ごとの Apache 設定は、リクエストの Host ヘッダに関係なく、/___proxy_subdomain_whm を 127.0.0.1:2086 に、/___proxy_subdomain_cpanel を 127.0.0.1:2080 に転送する ProxyPass をインストールします。RewriteCond は管理サブドメインをプロキシパスにマッピングするリライトのみを制約します。ProxyPass 自体は無条件です。cPanel 管理下の Apache によって提供される任意の vhost でこれらのパスにアクセスすると、管理ポートと同じ脆弱なバックエンドに到達します。
ポート 2082/2083/2086/2087 のみをプローブするスキャナは、これらのポートがファイアウォールで保護されている場合、バグが 443 経由で完全に到達可能であるにもかかわらず、ホストを脆弱ではないと報告します。このスキャナは、デフォルトで 2087、2083、および 443 の 2 つのプロキシパスをプローブします。
cPanel には cphulkd(少数のパスワード試行失敗後にアカウントをロックアウト)と authorized_whm_root_ips(root ログインを設定された送信元アドレスリストに制限)が付属しています。バイパスを悪用して root のセッションを注入しようとするスキャナは次のようになります:
このスキャナは、ランダムに生成されたユーザー名でセッションペイロードに expired=1 を注入することで、WHM 側でこれらの問題を回避します。セッションの注入は、結果の cpsessXXXX URL にアクセスし、レスポンスボディ内の msg_code:[expired_session] を照合することで確認されます。これは注入が成功した場合にのみ存在します。実際のアカウントは対象とならないため、実際のアカウントがロックアウトされることはなく、root ログインは試行されないため root 許可リストは無関係です。
cPanel デーモン(cpaneld、ポート 2083 および /___proxy_subdomain_cpanel パス)では、指定されたユーザー名がディスク上の既存の cPanel アカウントに対応している必要があります(-f /var/cpanel/users/$user)。root はシステムユーザーであり cPanel ユーザーではないため、このチェックを満たすことは決してありません。root のみを試す検出では、この面で偽陰性が発生します。このスキャナは、cPanel 面では一般的な cPanel ユーザー名の設定可能なワードリストを使用し、WHM 面ではそのような制限がないためランダムユーザー名のパスにフォールバックします。
ターゲットごとに、スキャナは面ごとに次の手順を実行します。
GET /login を発行し、Set-Cookie ヘッダーから whostmgrsession(WHM)または cpsession(cPanel)を読み取ります。Cookie にはカンマ区切りのセッション名コンポーネントが含まれています。<user>:\xff\nexpired=1 である Authorization: Basic ヘッダーを使用して GET / を発行します。末尾の \nexpired=1 がセッション注入ペイロードです。ステップ 1 のセッション Cookie は変更せずに再送信されます。Location ヘッダーを読み取り、cpsessXXXX トークンを抽出します。GET /<cpsessXXXX>/ を発行し、ボディ内で msg_code:[expired_session] を探します。これが存在すれば、セッション注入が成功し、ホストが脆弱であることが証明されます。WHM(ポート 2087 および 443 の /___proxy_subdomain_whm パス)では、ユーザー名はランダムな u の後に 10 文字の 16 進文字が続きます。cPanel(ポート 2083 および 443 の /___proxy_subdomain_cpanel パス)では、スキャナはユーザー名ワードリストを走査し、最初に一致したところで停止します。
デフォルトでは、スキャナは 2087、2083、443 の順にプローブし、いずれかの面が脆弱性を確認した時点で停止します。
--exploit)CVE-2026-29205 — cPanel/WHM WP2 セキュリティアップデート、2026 年 5 月 13 日。cPanel 11.134.0.26 で修正。この勧告は、このエクスプロイトチェーンが悪用するのと同じ
cpdavd特権降格の後退を追跡しています。
バグとエクスプロイトチェーンの完全な解説: https://slcyber.io/research-center/new-age-of-collisions-reading-arbitrary-files-pre-auth-as-root-in-cpanel-cve-2026-29205
cpdavd はポート 2079(平文 HTTP)および 2080(TLS)で、CalDAV/CardDAV リソースを提供する際に構築する <principal>/<collection>/... パスを信頼します。パスコンポーネントに .. セグメントをエンコードし、ディスク上の名前もトラバーサルをエンコードする maildir フォルダ(x-attachment-1-y)を指すリクエストを作成することで、cpdavd はディスク上の任意のファイルを root として、所有権やパーミッションに関係なく読み取るように強制できます。これには /etc/shadow、/etc/passwd、およびユーザーごとのメールスプールが含まれます。
読み取りの前にアカウント所有者に特権を降格するはずだった多層防御は静かに失敗しました。Cpanel::AccessIds::ReducedPrivileges オブジェクトが void コンテキストで構築されたため、そのデストラクタは読み取りが実行される前に root 権限を復元しました。cPanel 11.134.0.26 では、オブジェクトを my $privs レキシカル変数にバインドすることで、-f / stat / open / read チェーンを通じて生存させます。修正されたホストでは、読み取りは root ではなく非特権のアカウント所有者として実行されます。
読み取りが機能するには、脆弱なフォルダがディスク上に存在している必要があります。cPanel は、受信者 <user>+x-attachment-1-y@<domain> に初めてメールが届いたときに、.x-attachment-1-y という名前のフォルダを自動的に作成します。したがって、チェーンは次のようになります。
info、admin、webmaster などの一般的なメールボックスプレフィックスの小さなワードリスト)を導出します。<prefix>+x-attachment-1-y@<domain> を送信します。受け入れられた RCPT TO 応答が追跡されます。cpdavd のポート 2080(TLS)および 2079(平文)に対して、/calendar/ と /addressbook/ の両方のコレクションプレフィックスでパストラバーサル GET を送信します。成功するとファイルのバイトが返されます。検出結果には、使用されたメール、コレクション、バイト数、および最初の 200 バイトのプレビューが記録されます。
このチェックは --exploit が渡されない限り無効です。有効にすると、フォルダ作成ステップをスキップできないため、動作するアウトバウンド SMTP リレーが必要です(下記の設定ファイルを参照)。
このエクスプロイトは、cPanel の メールアカウント 機能で設定された実際の仮想メールアカウントに対してのみ機能します。キャッチオールアドレスは機能しません。キャッチオールは Exim の system_aliases ルーターを経由し、dovecot_virtual_delivery トランスポートに到達しないため、.x-attachment-1-y/ フォルダを生成する lda_mailbox_autocreate パスをトリガーしません。
ターゲット上の有効な仮想メールを既に知っている場合は、--email を使用して渡します。
python scanner.py --config scanner.ini --email [email protected] target.com
--email は証明書の SAN 列挙とプレフィックスワードリストを完全にスキップし、指定したアドレスに正確に 1 通のメッセージを送信します。既知の複数のアカウントを対象とするために繰り返すことができます。ターゲット型パスはスプレー型パスよりもはるかに信頼性が高いです。
--email がない場合、スキャナはホストの TLS 証明書から抽出されたドメインごとに約 15 の一般的なプレフィックス(info、admin、webmaster など)をスプレーすることにフォールバックします。200 の cpdavd 露出ホストのサンプルに対する Assetnote の測定では、スプレーのヒット率は約 10% でした。スプレーモードのクリーンな結果は、ホストが修正されているという弱い証拠に過ぎず、実際のアカウントに対して --email を再実行することが確認する唯一の信頼できる方法です。
エクスプロイトモードは --config 経由で INI ファイルを読み取ります。
python scanner.py --config scanner.ini --exploit example.com
scanner.ini.example を scanner.ini にコピーし、SMTP 認証情報を入力し、必要に応じて CalDAV のデフォルトを調整します。scanner.ini は .gitignore に含まれているため、入力済みのコピーはローカルに残ります。SMTP パスワードは SCANNER_SMTP_PASSWORD 環境変数でも指定でき、ファイル内の password フィールドが空の場合にのみ優先されます。
pip install -r requirements.txt
Python 3.8 以降が必要です。
単一ターゲット:
python scanner.py example.com
位置引数による複数ターゲット:
python scanner.py host-a.example.com host-b.example.com:2083
ターゲットのファイル(1 行に 1 つ)。# で始まる行は無視されます:
python scanner.py -f targets.txt
標準入力からの読み取り:
cat targets.txt | python scanner.py
ターゲットはホスト名または host:port のいずれかです。ポートが指定された場合、スキャナはそのポートのみをプローブします。それ以外の場合は 2087、2083、443 をプローブします。