PHP「php2shell」:更新までのつなぎ対策を正しく入れる(upload_progress だけでは足りない)
CVE-2026-109618/109619(通称 php2shell)の根本対策は PHP の更新だけ。すぐ上げられないなら、公式の緩和策を複数組み合わせ、INI は php_admin で管理側から強制し、multipart の遮断やリクエストサイズ制限を前段で足す。
何が起きているか
- 2026-10-21 22:40 頃(JST)に PHP のセキュリティリリースが出た。2 件とも CVSS v4.0 で 9.2、一般的な構成(mod_php/php-fpm、WordPress/Laravel/Symfony など)で任意コード実行に至る。
- CVE-2026-109618:OOM(メモリ不足)時の処理中断で、初期化途中のデータを後片付けが正しいものとして扱う。
- CVE-2026-109619:解放済みのリクエスト用の状態が残り、同じワーカーの次のリクエストが使ってしまう。
- 公表前から悪用の試行(Amazon のハニーポットで 10/17)があり、PoC も出回っている。国内サーバーへの攻撃も観測され、官公庁や企業がサイトを一時停止した。
- 10/23 には関連する新しい CVE-2026-115560(
session.serialize_handler+ini_set+upload progress の組み合わせ)も報告されている。暫定策は同じくsession.upload_progress.enabled=0。
まずやること:更新
| 系列 | 修正版 |
|---|---|
| 8.2.x | 8.2.35 |
| 8.3.x | 8.3.36 |
| 8.4.x | 8.4.27 |
| 8.5.x | 8.5.12 |
- 8.1 以前はサポート切れで安全と言えない。ディストリが独自に修正版を出している場合はそれを使い、なければ移行する。米 CISA は「更新できない環境はオフライン化」を求めている。
- 影響は 5.x〜8.x に広く及ぶ前提で考える(Flatt Security の見立て)。
更新までのつなぎ(全部入れても完全ではない)
公式の告知と GHSA の緩和策をまとめると次のとおり。
ini
session.upload_progress.enabled = 0 ; 109619 の確認済み session 経路だけ
memory_limit = -1 ; 109618 の主な設定緩和。cgroup/コンテナのメモリ制限とセットで
fatal_error_backtraces = 0 ; PHP 8.5 のみ
post_max_size = 8M ; アップロード無し。アップロード有りなら 32M
upload_max_filesize = (post_max_size より小さく)
max_input_nesting_level = (下げる)- php-fpm でパフォーマンス低下を許容できるなら
pm.max_requests = 1(ワーカー使い回しをやめる)。 - 攻撃者が到達できる fatal error・実行時間超過、拡張やサーバーの終了処理で出る警告を潰す。
- リクエストごとに適用される不正・非推奨の INI 設定を消す。
error_reporting・display_errors・@で隠しても意味がない。 memory_limit=-1だけ入れると上限が外れるので、必ずコンテナ/cgroup 側でメモリを絞る。RLIMIT_AS/RLIMIT_DATAは使わない。
session.upload_progress.enabled=0 だけでは足りない理由: 塞げるのは 109619 の upload progress 経路だけで、109618(multipart 解析などでの OOM)は防げない。現在出回っている ASLR 回避型の PoC には効くという検証報告もあるが、それ以外の経路は残る。
設定は php_admin_* で書く
php_admin_* でini_set() や .user.ini に頼るなと公式が言っている。nix 氏の検証では次の結果だった。
- php-fpm の
php_flag[...]/php_value[...]、Apache のphp_flagは、アプリ側の.user.ini/.htaccessで上書きされて元に戻る。 php_admin_flag/php_admin_valueなら上書きされない。post_max_sizeも同様。
ini
; php-fpm プール設定
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[post_max_size] = 8M入れたあとは全ワーカーを再起動し、ini_get() を返すページでリクエスト経由で有効値を確認する(CLI の php -i はプール設定を反映しないことがある)。nginx の fastcgi_param PHP_VALUE/PHP_ADMIN_VALUE や .htaccess で INI を流し込んでいる箇所も洗い出す。
前段で multipart とサイズを止める
- multipart(ファイルアップロード・フォーム送信)を使わないなら、WAF やリバースプロキシで
Content-Typeにmultipartを含むリクエストを遮断する。109618 の multipart 解析経路と 109619 の upload progress 経路の両方を、PHP に届く前に止められる。- AWS WAF なら
content-typeヘッダーにmultipartを含むByteMatchStatementを Block。最初は Count で誤遮断がないか見て、期限を決めて Block に切り替える。 - PHP 8.4 以降は
request_parse_body()で PUT でも multipart を解析できるので、メソッドで絞らない。 - アップロード機能がある Host/パスを例外にすると、そこは露出したまま残る。
- AWS WAF なら
- ボディサイズは nginx の
client_max_body_size、Apache のLimitRequestBodyで絞る。AWS WAF はボディの先頭しか見られない(ALB は 8KB)ため、サイズ制限には向かない。 - Cloudflare は無料プランを含め、マネージド WAF で既定の保護を入れたと案内している。ただし WAF は補助で、更新の代わりにはならない。
更新後・並行してやること
- 攻撃を受けていないかアクセスログを調べる。侵害されていたら、サーバー内データの持ち出し範囲と、サーバーが持つ権限(IAM ロール、サービスアカウント、DB 認証情報)を確認して横展開を疑う。
- ログが記録・保全されているか(改ざんされにくいか)を見直す。
- 外部に公開していない管理画面系の PHP も対象に含める。
追記(2026-10-30):機器の管理画面とカーネルも対象、ハンティングクエリーの扱い
- アプライアンスの管理画面も PHP2Shell の対象: Dream Research の分析(10/26)では、外部公開された大手ベンダー製ファイアウォールの管理画面で PHP2Shell によりコードを実行し、Linux カーネルの権限昇格 Fragnesia(CVE-2026-46300)で root を奪取。FOFA で見つけた約 1 万 9000 台から 240 台へ絞って攻撃し、24 台と内部のファイアウォール管理サーバー 1 台で root を確認。侵害した機器には再起動後も残るトンネルが置かれ、LDAP サービスアカウントのパスワード復号と AD の全ユーザー・グループ列挙まで進んでいた。
- ファイアウォールや NAS など「PHP で動く管理画面」を持つ機器も棚卸しし、管理画面をインターネットに出さない(接続元制限・VPN 経由)。ベンダーの修正版を確認する。
- PHP の修正だけでなく、カーネルの権限昇格(Fragnesia)の修正も当てる。Web 側で RCE を許すと、カーネルの穴で root まで一気に行かれる。
- 侵害が疑われる機器は、トンネル設定と LDAP などに使うサービスアカウントの認証情報を確認・交換する。
- Unit 42 の事例記述は撤回: 10/23 に追記された欧州政府機関の事例(AI エージェントによる侵入後活動)は撤回され、初期侵入が PHP2Shell によるものかは確認できないとされた。Cortex XDR 向けの検索クエリーは掲載継続。そのうち「PHP の Web サーバー・ワーカー配下のコマンド実行」を探すクエリーは PHP2Shell 固有ではなく正常な動作でも一致するため、ヒットしたらそのアプリの通常動作かを確認する。
- CISA は 10/26 に CVE-2026-109618・109619 を KEV へ追加(両 CVE の悪用の証拠に基づくもので、上記政府機関の侵入経路を示すものではない)。修正版は 8.5.12・8.4.27・8.3.36・8.2.35。
出典
- @flatt_security · 2026-10-21
- GMO Flatt Security「php2shell の概要と対応指針」: blog.flatt.tech
- @lmt_swallow · 2026-10-21
- @calloc134 · 2026-10-22
- @yousukezan · 2026-10-21 / @yousukezan · 2026-10-21 / @yousukezan · 2026-10-22 / @yousukezan · 2026-10-24
- nix「php2shell、upload_progress を切るだけでは足りなかった話」: zenn.dev
- @MalwareBibleJP · 2026-10-23
- @MalwareBibleJP · 2026-10-29
- @MalwareBibleJP · 2026-10-30