-- Views
October 22, 26
スライド概要
2026年10月21日、PHPの任意コード実行の脆弱性 php2shell(CVE-2026-109618 / 109619)の夜。修正版が出ない PHP 7.4 の本番サイトを、止めずに WAF と php.ini の 1 行で守り、その直後に実際の攻撃を Block するまでを 15 枚にまとめました。
▼扱う論点
- 影響をバージョン・成立条件・外から届くかの 3 軸で見る
- multipart を止める前に、何が壊れるかをコードとログで調べる
- Host 偽装ですり抜けられない除外条件と、ALB ごとの Web ACL
- php-fpm の reload で 502 を出さない、1 台ずつの反映
- 最初の攻撃を止めたのは ALB の 301 だった話
- Block にしたら何も止まらなくなった、二重 base64 の罠
- Remi に 7.4.33-31 が出ていた件
▼記事の全文(コマンド・WAF ルールの JSON・侵害確認の手順)
https://qiita.com/kenimo49/items/30f290bf0f4fff021fb3
▼更新前にできる暫定対策 7 つ
https://kenimoto.dev/ja/blog/php2shell-mitigation-before-update/
▼最後に宣伝させてください(php2shell とは別テーマの本です)
『MCP実践セキュリティ』(インプレス)― AI エージェント / MCP を本番に入れるときのセキュリティ
https://kenimoto.dev/ja/books/mcp-security-practice
著者: ken imoto / kenimoto.dev
PHPセキュリティ / 2026-10-21 の夜 php2shellの夜、 PHP 7.4の本番を 止めずに守った 修正版が出ない版で、WAFとini 1行。 そして実際に来た攻撃 ken imoto エンジニア php2shellの夜 / PHP 7.4を止めずに守る 1 / 15 kenimoto.dev
何が起きたか PHPの任意コード実行、 7.4には修正版が来ない CVE-2026-109618 / 109619 (CVSS v4.0 9.2)。php.net の告知で修正版が出たのは 8.2~8.5 だけでした。 9.2 CVSS v4.0。 ログイン不要で届く 8.2~8.5 修正版が出た系列 (8.5.12 / 8.4.27 / 8.3.36 / 8.2.35) 7.4 7.4 / 8.0 / 8.1 は ソースへのパッチのみ php2shellの夜 / PHP 7.4を止めずに守る 2 / 15 kenimoto.dev
放っておくと何が起きるのか 1本のPOSTで、ここまで開く 直接取られるのは コード実行 と メモリの中身。その先は一般に起きることです。 データの持ち出し DBの接続情報を読まれ、利用者の情報をまとめて抜かれる 居座り Webシェルやcronは、PHPを更新しても抜けない クラウドへの横展開 EC2のメタデータからロールの認証情報を取られる メモリの漏えい Heartbleedのように、他人のセッションやパスワードが漏れうる php2shellの夜 / PHP 7.4を止めずに守る 3 / 15 kenimoto.dev
その夜、止まったサービス(報道ベース) 業種を問わず、大手が止めた 止めるのは正しい判断の1つ。ただ、売上と利用者の信頼が削られます。私たちは止めずに守る道を選びました。 BASE メロンブックス ニコニコ バンダイチャンネル pixiv BOOK☆WALKER ウマ娘 グランブルーファンタジー Shadowverse: WB Pokémon Sleep ヘブンバーンズレッド makeshop / カラーミー 出典: GIGAZINE / ファミ通 / Yahoo!ニュース (10/21~22 報道時点) php2shellの夜 / PHP 7.4を止めずに守る 4 / 15 kenimoto.dev
告知を待つ間 バージョンだけで判定しない SSM Run Command で 読み取り専用のコマンドだけを、サーバー名で外さず全台に流しました。 1 影響するバージョン か 全台 7.4。該当 2 成立する条件がある か upload_progressが既定の On 3 インターネットから 届くか Webは届く / 社内用は 127.0.0.1 のみ php2shellの夜 / PHP 7.4を止めずに守る 5 / 15 kenimoto.dev
WAFを設計する 止める前に、何が壊れるかを調べる 攻撃は multipart/form-data。入口で止めると、正規のアップロードも止まります。 ソースコード 送る側 (FormData) と 受ける側 ($_FILES) を 洗う × アクセスログ POSTの送り先を ホストごとに集計して 照合 → 結論 multipartは管理画面だけ。 それ以外で止めても 利用者に影響なし php2shellの夜 / PHP 7.4を止めずに守る 6 / 15 kenimoto.dev
除外条件の作り方 除外は、すり抜けられる前提で作る 「Hostが管理画面なら除外」は、Hostヘッダーの偽装で通られます。 1つのACLで全サイト サイトAのALBに Host: admin.site-b を付けて送る →除外が成立しPHPに届く ACLをALBごとに分ける 他サイトのHostは一致しない → 403 管理画面のAPIはnginxのIP制限の内側 php2shellの夜 / PHP 7.4を止めずに守る 7 / 15 kenimoto.dev
23:00 公式告知 WAFはCountで入れ、iniに1行足す 告知の言葉は「完全な暫定策はなく、更新が唯一の安全な選択」。7.4は暫定策を積むしかありません。 WAFの段取り 全ルールをCount (記録のみ) で入れ る →誤検知がないのを見てBlockへ ; /etc/php.d/99-php2shell-mitigation.ini session.upload_progress.enabled = 0 ; 切り戻しはファイルを消して reload php2shellの夜 / PHP 7.4を止めずに守る 8 / 15 kenimoto.dev
無停止で反映する reloadで502を出さない process_control_timeout が既定の0だと、reloadの瞬間に処理中のリクエストが502になります。 1 ALBから1台外す 2 iniを置いてreload 3 値とworkerを確認 4 ALBに戻す 1秒おきの確認リクエストは すべて200。十数台を約10分。 php2shellの夜 / PHP 7.4を止めずに守る 9 / 15 kenimoto.dev
23:37 最初の攻撃 止めたのは WAFではなかった WAFはまだCount中。攻撃ツールはapexドメインにmultipartを送り、ALBの301を追うときにPOSTをGETに変えていました。 攻撃データはPHPに届かず。 運が良かっただけなので、すぐBlockへ。 php2shellの夜 / PHP 7.4を止めずに守る 10 / 15 kenimoto.dev
Blockに切り替えたら エラーなしで、何も止まらなくなった AWS WAFの更新は、設定を丸ごと取り出し、直して、丸ごと戻すのが定番です。 取り出す get-web-acl → CountをBlockに ここだけ書き換え → 戻す update-web-acl 取り出した値はbase64になっていて、戻すときにもう一度base64されていました。 探すつもりだった文字列 multipart 実際に探していた文字列 bXVsdGlwYXJ0 切り替えたらデコード結果とcurlの403の両方で確かめる。 php2shellの夜 / PHP 7.4を止めずに守る 11 / 15 kenimoto.dev
23:51~ 5つのIPから同じ攻撃、すべてBlock 仏・米・独・ポーランドのVPSから、8,828 B と 25,212 B のmultipart POST。User-AgentはPython aiohttp。 攻撃の形 同じツール・同じサイズが、複数の国から順に届く 送信元の1つは、数時間前にGET / を1件だけ送っていた(下見) 入られていないか workerの異常終了・子プロセス・変更ファイル・cron・外向き通信を確認 痕跡なし php2shellの夜 / PHP 7.4を止めずに守る 12 / 15 kenimoto.dev
日付が変わるころ Remiに7.4の更新が出ていた php.net は「今日は更新が出ない」と書いていましたが、7.4.33-31 が 10/21 付けで上がっていました。 # RPM の変更履歴 (rpm -q --changelog で見える) 2026-10-21 Remi Collet - 7.4.33-31 - Mitigation fix Avoid state corruption via bailout CVE-2026-109618, CVE-2026-109619 ブログの告知より、リポジトリと変更履歴を直接見るほうが早い。 php2shellの夜 / PHP 7.4を止めずに守る 13 / 15 kenimoto.dev
続きは記事で コマンドと設定は、記事に全部書きました 記事の全文 qiita.com/kenimo49/items/30f290bf0f4fff021fb3 WAFルールのJSON、reload手順、侵害確認のコマンド 更新前の対策7つ kenimoto.dev/ja/blog/php2shell-mitigation-before-update php.net 公式の暫定対策と、それぞれが防げない範囲 php2shellの夜 / PHP 7.4を止めずに守る 14 / 15 kenimoto.dev
最後に宣伝させてください 『MCP実践セキュリティ』 (インプレス) AIエージェントを本番に入れるときの、MCPサーバーの認証設計と、OWASP MCP Top 10を踏まえた攻撃と対策をまとめた本です。 php2shellとは別のテーマです。 Kindle / 紙 amazon.co.jp/dp/B0HM85RXKL 詳細 kenimoto.dev/ja/books/mcp-security-practice MCP 実践 セキュリティ AIエージェント時代の Model Context Protocol 安全運用ガイド 井本 賢 MCPのアーキテクチャや通信仕様を解説し、 OWASP MCP Top 10を踏まえたセキュリティリスクと 対策を整理 インプレス php2shellの夜 / PHP 7.4を止めずに守る 15 / 15 kenimoto.dev