session.upload_progress.enabled

session.upload_progress.enabled = 0 で PHP2Shell は防げるか

部分的にしか防げません。2 つの CVE のうち一方の、確認済みのセッション関連経路だけを防ぐもので、しかも正しい場所で設定して再起動した場合に限ります。暫定策であって、修正ではありません。

最終確認 2026-10-22

結論

php.net:「This blocks the confirmed session paths but not other variants.」(確認済みのセッション経路は防ぐが、他の亜種は防がない)。CVE-2026-109618 には効果がありません。この回避策はパッチ公開前に広く出回りましたが、正式リリースで不完全だったことが確認されました。PHP を更新してください。

この設定は何をするものか

アップロード進捗(デフォルトで有効)がオンだと、PHP は multipart アップロード内の特別なフォーム項目を監視し、まだリクエストを解析している段階でユーザーのセッションに進捗を書き込みます。PHP2Shell のセッション関連の use-after-free とメモリ漏えいは、まさにこの初期化前のセッション処理で起きます。ヒープメモリが PHPSESSID Cookie に漏れる問題も含まれ、これはアプリがセッションを一度も開始していなくても発生します。

防げるもの・防げないもの

攻撃経路防げる?
確認済みのセッションのアップロード進捗経路(CVE-2026-109619)防げる
致命的エラーのバックトレース経路(PHP 8.5)防げない——fatal_error_backtraces = 0 も設定
その他の残留状態の亜種(CVE-2026-109619)防げない
メモリ枯渇時の破損(CVE-2026-109618)防げない——memory_limit / post_max_size を参照

1. 現在の値を確認する

shell
# What php.ini says (CLI and FPM can differ — check both)
php -i | grep session.upload_progress.enabled
php-fpm8.3 -i | grep session.upload_progress.enabled    # adjust version

# Where the setting comes from
php --ini
grep -rn "upload_progress" /etc/php/ 2>/dev/null

# What the running site actually uses (FPM pool overrides are only visible here)
# <?php var_dump(ini_get('session.upload_progress.enabled'));

2. 確実に効く場所で設定する

設定場所有効?理由
php.ini / conf.d の追加設定有効リクエスト解析の前に適用されます。
FPM プールの php_admin_flag / php_admin_value有効プール単位で、アプリから上書きできません。
Apache の仮想ホスト/サーバー設定(php_admin_flag)有効mod_php 向け。
.user.ini無効php.net:頼らないこと——リクエスト解析の前に適用されない場合があります。
.htaccess の php_flag非推奨ディレクトリ単位で上書き可能。サーバー設定を使ってください。
コード内の ini_set()無効リクエストの解析が終わった後に実行されます。
config
; php.ini or conf.d drop-in, e.g. /etc/php/8.3/fpm/conf.d/99-php2shell.ini
session.upload_progress.enabled = 0

; or per FPM pool (/etc/php/8.3/fpm/pool.d/www.conf)
php_admin_flag[session.upload_progress.enabled] = off

; or Apache + mod_php (vhost or server config, not .htaccess)
php_admin_flag session.upload_progress.enabled off

3. すべてのワーカーを再起動する

実行中のワーカーは、再起動するまで古い設定を保持し続けます——すでに破損した状態を抱えている可能性もあります。

shell
sudo systemctl restart php8.3-fpm      # every FPM version and pool you run
sudo systemctl restart apache2         # mod_php
sudo /scripts/restartsrv_apache_php_fpm   # cPanel
sudo systemctl restart plesk-php83-fpm # Plesk, per handler

よくある質問

session.upload_progress.enabled = 0 で PHP2Shell を防げますか?+

部分的にだけです。php.net によれば「確認済みのセッション経路は防ぐが、他の亜種は防がない」とのこと。CVE-2026-109618 には効果がありません。PHP コア開発者の Gina Peter Banyard 氏:「the only mitigation is patching/upgrading PHP.」(唯一の対策は PHP へのパッチ適用・アップグレードだ)

.user.ini や ini_set() で session.upload_progress.enabled を設定できますか?+

できません。アップロード進捗の処理は、コードが動く前、PHP がリクエストを解析している段階で行われます。php.net は、リクエスト解析の前に適用される php.ini、FPM プール、サーバー設定を使うよう求めており、.user.ini や ini_set() には頼らないよう明記しています。

アップロード進捗を無効にするとサイトが壊れますか?+

まれです。影響するのは、PHP のセッションアップロード進捗機能で作られた進捗バーだけです。最近のアップロード UI の多くは、ブラウザ側で進捗を管理しています。

パッチ適用後は元に戻すべきですか?+

使っている場合だけです。php.net は、使っていないなら修正済みバージョンでも無効のままにすることを勧めています。

関連ページ