今日更新できない場合
暫定対策
アップデートを展開するまでの間、特定の既知の攻撃経路へのリスクを下げる対策です。どれも完全ではなく、相応の代償を伴うものもあります。適用前にテストしてください。
最終確認 2026-10-22
設定だけで完全に防ぐ方法はありません
PHP の両アドバイザリがはっきりそう述べています。数週間ではなく、数時間から数日を稼ぐために使ってください。修正ガイド →
各対策の効果
| 対策 | 効果 | CVE | 代償・副作用 |
|---|---|---|---|
主要 | アドバイザリが挙げる主要な設定上の対策。多くの攻撃経路が依存する PHP 自身の OOM 中断をなくします。 | 両方 | 代わりに OS が暴走したワーカーを終了させるため、リクエストが中断されます。cgroup の上限がないと、1 つのリクエストでホスト全体のメモリを使い切る恐れがあります。 |
部分的 | 確認済みのセッション経路を防ぎますが、「他の亜種は防げません」(php.net)。php.ini、FPM プール、サーバー設定で指定する必要があり、.user.ini や ini_set() では効きません。 | …619 | これに依存したアップロード進捗バーが動かなくなります(まれ)。使っていなければ、パッチ適用後も無効のままにしておく価値があります。 |
部分的 | 確認済みの致命的エラーのバックトレース経路のみを防ぎます。CVE-2026-109619 で最も確実に実証された経路です。 | …619 | 致命的エラーにバックトレースが含まれなくなります。 |
部分的 | アプリが動く前の multipart 解析で、攻撃者が生み出せるメモリ負荷を減らします。php.net の推奨はファイルアップロードなしなら 8M、ありなら 32M。 | …618 | アップロードも制限されます——正規のアップロード処理をテストしてください。 |
入力を制限: 部分的 | パーサーによるその他のメモリ増加を抑えます。 | …618 | 大きなフォームや深くネストしたフォームが失敗することがあります。 |
攻撃者が引き起こせる致命的エラーと、リクエスト単位で適用される無効・非推奨の設定を取り除く 部分的 | CVE-2026-109619 の残留状態の発生源を取り除きます:初期化前に出力される診断メッセージ、コールバック・アップロード・インポート・後片付け処理での致命的エラーやタイムアウト。 | …619 | コードと設定の見直しが必要です。 |
部分的 | ワーカーを頻繁に入れ替え、破損した状態が生き残るリクエスト数を減らします。アドバイザリが挙げる極端な値は 1 です。 | …619 | CPU とレイテンシに実際のコストがかかります。1 リクエストで完結する攻撃には効果がありません。 |
被害を抑える | エラー出力から詳細が閲覧者に漏れるのを防ぎます。注意:診断を隠しても CVE-2026-109619 の引き金は止まりません。 | 被害 | 本番環境では副作用なし。 |
SELinux / AppArmor で PHP ワーカーを制限 被害を抑える | 注入されたコードが実行・読み取りできる範囲を限定します。 | 被害 | ポリシー作成の手間がかかります。メモリ漏えいは防げません。 |
WAF/CDN のマネージドルール 部分的 | 既知のペイロードをエッジでブロックします。Cloudflare は Free プランも対象です。 | 両方 | 攻撃者はすでにペイロードを変形させています。対応範囲は事業者によって異なります。 |
やってはいけないこと
memory_limit の代わりに RLIMIT_AS / RLIMIT_DATA を使わない
つまり ulimit -v / ulimit -d、systemd の LimitAS= / LimitDATA=、rlimit_* を使う方法です。これらは PHP 内部の mmap() を失敗させ、同じ脆弱な OOM 経路を引き起こします。代わりに cgroup の制限(MemoryMax=、コンテナの --memory)を使ってください。
コピーして使える設定
; /etc/php/8.3/fpm/conf.d/99-php2shell.ini (path varies)
; TEMPORARY PHP2Shell mitigations — revisit after upgrading.
; Tune every number to what your application really needs.
session.upload_progress.enabled = 0
fatal_error_backtraces = 0 ; PHP 8.5 only, ignored elsewhere
display_errors = 0
post_max_size = 8M ; php.net: 8M without uploads, 32M with
upload_max_filesize = 6M ; keep below post_max_size
max_input_nesting_level = 32 ; default 64
max_input_vars = 1000
max_file_uploads = 5 ; default 20
max_multipart_body_parts = 200; /etc/php/8.3/fpm/pool.d/www.conf (one block per pool)
; php_admin_* cannot be overridden by ini_set() in application code.
; WordPress and others call ini_set('memory_limit', ...) — a plain
; php.ini value would be silently replaced with a finite limit again.
php_admin_value[memory_limit] = -1
php_admin_flag[session.upload_progress.enabled] = off
; Recycle workers more often (performance cost — measure it)
pm.max_requests = 50# Apache + mod_php (VirtualHost or global config)
php_admin_value memory_limit -1
php_admin_flag session.upload_progress.enabled off
# 32 MiB request body cap (match post_max_size)
LimitRequestBody 33554432
# nginx in front of PHP-FPM
client_max_body_size 32m;# Cap total PHP-FPM memory with cgroup v2 (systemd's MemoryMax = memory.max)
sudo systemctl edit php8.3-fpm
# [Service]
# MemoryHigh=3G
# MemoryMax=4G
sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryMax
# Containers: set a memory limit on the container instead
docker run --memory=4g ...変更のたびに PHP-FPM/Apache を再起動してください。実際に有効な値は php-fpm8.3 -i | grep -E 'memory_limit|upload_progress' で確認できます——ただし -i は php.ini を読むだけでプール単位の上書きは反映されないため、サイト上で phpinfo() も確認してください。
更新後
memory_limitをアプリに合った有限の値に戻してください。修正版の PHP はその上にハードリミットを追加します。post_max_sizeはメモリ予算より十分低く、max_input_nesting_levelは実際に必要な値にしておきましょう。- 使っていなければ
session.upload_progress.enabled = 0のままにしておきましょう。攻撃対象が減り、代償もありません。 pm.max_requestsを通常の値に戻してください。- 任意:
expose_php = 0でスキャナーからバージョンを隠せます。衛生管理であって、修正ではありません。