
CVE-2026-109618 / CVE-2026-109619(PHPコアRCE)向けの非破壊スキャナー。crt.sh + subfinderによるサブドメイン偵察、堅牢なバナー取得、バージョンベースの検出。
CVE-2026-109618(OOM 破壊による RCE)および CVE-2026-109619(古いグローバル状態による RCE)向けの非破壊スキャナー(オプトインのプローブ付き)— 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 で修正された PHP コアのバグです。
✅ 公式 php-src アドバイザリ(2026-10-21、Critical)に対して検証済み。 以下の CVE ID と修正バージョンの表は上流と完全に一致しています。
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| ブランチ | 影響あり | 修正済み |
|---|---|---|
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.5 | < 8.5.12 | 8.5.12 |
| < 8.2 | EOL — 上流のパッチなし | ディストリビューション/OSV のバックポートを確認 |
| モード | 動作内容 |
|---|---|
LOCAL | php -r により正確なランタイムバージョン、SAPI、memory_limit、post_max_size を取得 |
REMOTE | X-Powered-By / Server ヘッダーおよび公開された phpinfo() によるバージョンフィンガープリント |
PRESENCE | バージョンなしでの PHP 検出(PHPSESSID、.php 参照、リダイレクト) |
BANNER | 堅牢な raw ソケットバナー取得 — HEAD/GET/OPTIONS + 不正プローブ、http/https、エラーページの情報漏洩 |
RECON | crt.sh(Certificate Transparency)によるサブドメイン列挙と subfinder のフォールバック/マージ、その後ホストを解決してファンアウトスキャン |
PROBE | (オプトイン) 大規模なマルチパートリクエストでワーカーの不安定性を観測 — DoS を引き起こす可能性あり |
git clone https://github.com/JoasASantos/php2shell-scanner.git
cd php2shell-scanner
# stdlib only — no pip deps.
# Optional recon fallback: ProjectDiscovery subfinder
# brew install subfinder (or: go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest)
# Local runtime check
python3 php2shell_scan.py --local
# Single remote target, look for exposed phpinfo()
python3 php2shell_scan.py https://example.com --phpinfo-paths
# Subdomain recon (crt.sh + subfinder) then scan, 10 threads, JSON out
python3 php2shell_scan.py example.com --recon --threads 10 -o out.json
# Recon only, no scanning
python3 php2shell_scan.py example.com --recon-only
# Target list + forced robust banner grab
python3 php2shell_scan.py -f targets.txt --banner
# OPT-IN load probe (authorized use only — DoS risk)
python3 php2shell_scan.py https://example.com --probe --probe-count 5
| フラグ | 意味 |
|---|---|
--local | php バイナリによるローカルスキャン |
--recon | 各ドメインをサブドメインに展開し(crt.sh + subfinder)、解決するホストをスキャン |
--recon-only | サブドメインの列挙のみ、スキャンなし |
--banner | すべてのターゲットで堅牢な raw-socket バナー取得を強制 |
--phpinfo-paths | 一般的に露出している phpinfo() パスをプローブ |
--deep-version | 追加のバージョン特定手法: PHP イースターエッグ + バージョン漏洩ファイル(composer.json、.env など) |
--origin-scan | Cloudflare/WAF の背後にある PHP オリジンに到達 — 実際の Host ヘッダーを用いた IP 直接リクエスト |
--shodan-key | オリジン情報収集用の Shodan API キー(または環境変数 SHODAN_API_KEY)。--origin-scan を暗黙的に有効化 |
--censys-id / --censys-secret | Censys API 認証情報(または環境変数 CENSYS_API_ID / CENSYS_API_SECRET)。--origin-scan を暗黙的に有効化 |
--probe | マルチパート負荷プローブ — DoS リスク、許可された対象のみ |
--probe-count N | プローブリクエスト数(デフォルト 5) |
--threads N / --timeout N | 並列度 / リクエストごとのタイムアウト |
--insecure | TLS を検証しない |
-o FILE / --csv FILE | JSON / CSV レポートを保存 |
バージョンチェックに加えて、各ターゲットは(通常のレスポンスから得られる)パッシブなシグナルでエンリッチされ、判定を精緻化し誤検知を削減します:
fpm、mod_php)はリクエスト状態を再利用する → CVE-2026-109619 に晒される; 素の cgi ははるかに少ない。ubuntu、+deb、.el8 など)— バックポートによりバージョンを上げずに修正されている可能性 → 信頼度を低下、「changelog を確認」の注記。post_max_size / max_input_vars(CVE-2026-109618 の OOM 攻撃面)、disable_functions。--deep-version)バナーバージョンがない場合: PHP イースターエッグ(?=PHPE9568F34-... → expose_php=On の場合に GIF/クレジット)とバージョン漏洩ファイル(composer.json、.env など; .env の PHP_VERSION は正確、"php": ">=8.2" のような制約はブランチを絞り込むのみ)。
--origin-scan)CDN はオリジンを隠すため、ヘッダーを読んでもエッジしか見えません。--origin-scan:
www、非プロキシのプレフィックス(origin.*、cpanel.*、mail.* など)および recon サブドメインを解決;Host + SNI でリクエストし、Server / X-Powered-By / エラーページをオリジンから直接読み取る。すでに露出している IP への直接リクエスト。許可された対象のみ。
認証情報を用いた情報収集は、DNS が決して露出しない IP に加え、インデックスされたバナーからの PHP バージョンを追加します(情報収集フラグ付き — 古い可能性あり):
--shodan-key / 環境変数 SHODAN_API_KEY — hostname:<domain> によるホスト。--censys-id + --censys-secret / 環境変数 CENSYS_API_ID + CENSYS_API_SECRET — TLS 証明書 / DNS 名によるホスト。--origin-scan を自動的に有効化します。export SHODAN_API_KEY=xxx CENSYS_API_ID=xxx CENSYS_API_SECRET=xxx
python3 php2shell_scan.py hackersec.com --origin-scan
| 信頼度 | 意味 |
|---|---|
HIGH | 露出した phpinfo() または PHP エラーページから取得したバージョン |
MEDIUM | HTTP バナー(expose_php=On)から取得したバージョン |
LOW | 推測のみ、またはプロキシ経由、またはディストリビューションのバックポートが適用されている可能性 |
統合出力はターゲットを重大度別にグループ化し、VULNERABLE を信頼度順(HIGH が先頭)に並べ替え、LOW/MEDIUM の結果には報告前に再確認すべきフラグを付けます。
各ブランチのバージョンを FIXED テーブルと比較します:
< fixed → VULNERABLE>= fixed → PATCHED< 8.2(EOL)→ VULNERABLE_EOL(上流のパッチなし。ディストリビューション/OSV のバックポートを確認)所有している、またはテストを明示的に許可されている資産に対してのみ実行してください。
--probe モードは脆弱なワーカーを混乱させる可能性があります。使用に関する責任は利用者にあります。
MIT