
cPanel/WHM の認証バイパス(CVE-2026-41940)を検出するスクリプトです。11.40 以降のすべての cPanel バージョンに影響します。
これは上流の cPanel 検出スクリプトを書き直したもので、誤検知の修正とログ相関の追加が行われています。
/var/cpanel/sessions/raw/ をスキャンして改行インジェクションの悪用の兆候を示すセッションファイルを検出し、疑わしい IP とセッショントークンを cPanel のアクセス/ログイン/エラーログと相互参照します。また、セッションファイルが期限切れまたは削除された履歴的な悪用についても access_log をスキャンします。
pass 正規表現を削除 — 本番環境のすべての認証済みセッションで誤検知が発生していました(この正規表現は pass= フィールドの後に別の行が続くものすべてに一致するため、すべてのセッションファイルが該当していました)。token_denied + cp_security_token の組み合わせを要求する代わりに、method=badpass origin + 任意の認証後属性 を検出します。token_denied を省略する PoC の亜種も捕捉できます。POST /login/?login_only=1 -> 401)と、同じ IP からのその後の成功した cpsess トークン使用を相関させて検出します。--extended モード — 追加のソースを対象に、より深いログスイープを実行します。# Bash — どこでも動作、依存関係なし
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — 大規模なセッションディレクトリで高速、--json 対応
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# 拡張スキャン(どちらのバリアントでも)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# 実行後の終了コードを確認($? = 0 クリーン、1 IOC 検出、2 環境エラー)
echo $?
curl フラグ:
-fHTTP エラー時に失敗(エラーページを bash にパイプしない)、-sサイレント(プログレスバーなし)、-S-sでもエラーを表示、-Lリダイレクトを追跡。
Python バリアントは --json をサポートしており、jq にパイプしたり、SIEM に送信したり、プログラムで処理したりできる構造化出力を生成します。
# 完全な JSON 出力
python3 ioc.py --json
# サマリーカウントのみ
python3 ioc.py --json | jq '.counts'
# すべての CRITICAL 検出結果を一覧表示
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# 一意の攻撃者 IP を抽出
python3 ioc.py --json | jq '.suspect_ips[]'
# ソース IP 付きの検出結果を表示(ファイアウォールブロックリスト用)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# トークン使用が成功したすべての IP を取得(即時ブロック用)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# 特定の IP の相互参照データを取得
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
JSON 構造の例:
{
"findings": [
{
"severity": "CRITICAL",
"file": "/var/cpanel/sessions/raw/:Q3f8Ag2epeBuTaIZ",
"verdict": "Injected token used successfully (2xx/3xx in access_log)",
"origin": "address=203.0.113.50,app=whostmgrd,method=badpass",
"source_ip": "203.0.113.50",
"user": "root",
"hasroot": "1",
"tfa_verified": "0",
"cp_security_token": "/cpsess04396539398",
"token_denied": "1",
"successful_internal_auth_with_timestamp": "9999999999",
"token_hits": [
"203.0.113.50 - root [04/30/2026:12:12:01 -0000] \"GET /cpsess04396539398/json-api/version HTTP/1.1\" 200 0 ..."
]
},
{
"severity": "MEDIUM",
"file": "/var/cpanel/sessions/raw/:2TDiaHwh_r8qOH5y",
"verdict": "Injection landed; token was tried but BLOCKED (all 4xx/5xx)",
"source_ip": "198.51.100.23",
"cp_security_token": "/cpsess5637704041",
"token_hits": [
"198.51.100.23 - root [04/30/2026:04:08:09 -0000] \"GET /cpsess5637704041/json-api/version HTTP/1.1\" 403 0 ..."
]
},
{
"severity": "CRITICAL",
"file": null,
"verdict": "Injected cpsess token used with 2xx/3xx after failed login; session expired or purged",
"source_ip": "203.0.113.99",
"cp_security_token": "/cpsess8705792557",
"token_hits": ["..."]
}
],
"counts": {"critical": 2, "high": 15, "medium": 71, "warning": 0},
"suspect_ips": ["203.0.113.50", "198.51.100.23", "203.0.113.99"],
"suspect_ips_omitted": 0,
"cross_ref": {
"203.0.113.50": {
"cpanel_access_log": ["...last 5 lines..."],
"cpanel_login_log": ["..."]
}
},
"advisory": "https://support.cpanel.net/hc/en-us/articles/40073787579671"
}
git clone https://github.com/AndreiG6/cpanel-cve-2026-41940-ioc.git
cd cpanel-cve-2026-41940-ioc
# Bash バリアント
bash ioc.sh # デフォルト(CRITICAL/HIGH 展開、MEDIUM/WARNING はカウントのみ)
bash ioc.sh -v # 詳細(すべての検出結果を展開)
bash ioc.sh --extended # 詳細 + より深いログ + 相互参照のすべての IP
# Python バリアント(同じ検出ロジック、高速、構造化出力)
python3 ioc.py # デフォルト(bash と同じ折りたたみ動作)
python3 ioc.py -v # 詳細
python3 ioc.py --extended # 詳細 + より深いログ
python3 ioc.py --json # 構造化 JSON(常にすべての検出結果を含む)
対象の cPanel サーバーで root として実行する必要があります。Python バリアントには Python 3.6+ が必要です(CentOS 7 / CloudLinux 7+ に同梱)。
| コード | 意味 |
|---|---|
| 0 | 指標が検出されませんでした |
| 1 | IOC が検出されました |
| 2 | 環境エラー(cPanel サーバーではない) |
MIT