0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP2Shell対応後も php -v が8.5.4のまま? Ubuntu 26.04の修正版とFPM再起動を確認する

0
Posted at

PHP2Shell対応後のUbuntu 26.04で、PHPが修正版になったか確かめるなら、まずパッケージの完全な番号を見ます。

dpkg-query -W php8.5-fpm

Ubuntu公式パッケージのPHP 8.5-FPMでは、8.5.4-0ubuntu1.5が今回の修正版です。 26.04の公式パッケージなら、この番号以上かを確認します。php -vに出る「8.5.4」だけでは判定できません。

PHP2Shellは、CVE-2026-109618とCVE-2026-109619の通称です。Ubuntuの公式解説のIntroductionとImpact of php2shellでは、認証なしのリモートコード実行につながり得ると説明されています。版の確認と、更新したPHPを実際の処理へ反映する確認を、一続きで進めましょう。

以下の例は、Ubuntu 26.04 LTS・Ubuntu公式パッケージのPHP 8.5-FPM・Nginxの構成です。コマンドは対象サーバーのBashで実行します。

なぜ、更新しても「8.5.4」のままなのか

Ubuntuでは、ソフトウェア全体を新しいバージョンへ入れ替える代わりに、必要なセキュリティ修正を既存のバージョンへ取り込むことがあります。これがバックポートです。

新機能までまとめて取り込むことによる動作の変化を抑え、既存環境との互換性を保つための方法です。Ubuntuのセキュリティ更新方針にも、この仕組みが説明されています。

そのため、上流のPHP本体では別の修正版番号が案内されていても、Ubuntu側では「8.5.4」に修正が入ります。見る場所は、後ろの-0ubuntu1.5まで含めたパッケージ番号です。

今回、私の環境で更新前後を確認した値は次のとおりでした。

パッケージ 更新前 更新後
php8.5-fpm 8.5.4-0ubuntu1.4 8.5.4-0ubuntu1.5
php8.5-cli 8.5.4-0ubuntu1.4 8.5.4-0ubuntu1.5

これは私の環境の記録です。一方、修正済みかを判断する基準は、UbuntuのUSN-8948-1にある、Ubuntu 26.04向けの一覧です。そこでもFPM・CLIの修正版は8.5.4-0ubuntu1.5になっています。

同じ更新ではphp8.5-commonも.5へ更新しました。ただし、commonはこのUSNの修正版一覧には載っていません。公式のパッケージ情報ではamd64・arm64向けの.5の配布を確認できますが、commonだけを見てFPMも対処済みと判断しないようにします。

自分の環境で、版と配布元を確かめる

まず、Ubuntuのリリースと、導入済みパッケージの状態を確認します。

cat /etc/os-release

dpkg-query -W -f='${binary:Package}\t${db:Status-Status}\t${Version}\n' \
  php8.5-fpm php8.5-cli php8.5-common

dpkg-queryの表示形式を指定し、パッケージ名、状態、完全な版番号の順に表示しています。対象がinstalledになっていることと、FPMの版番号を確認してください。CLIはコマンドラインで動くPHP、FPMはWebからの要求を処理するPHPなので、片方の確認だけで済ませないようにします。

次にパッケージ一覧を更新し、導入済みの版・更新候補・配布元を見ます。

sudo apt update
apt-cache policy php8.5-fpm php8.5-cli php8.5-common

apt-cacheのマニュアルにあるpolicyで、次を確認します。修正版の番号は、26.04向けUSNと照合します。

  • Installedは導入済みの版。
  • Candidateは、現在の配布元設定で導入候補になる版。
  • 版ごとの取得元は、どの配布元のパッケージかを示す。

InstalledとCandidateが同じでも、対象の脆弱性に対応した版とは限りません。USNの対象リリースと版番号まで照合します。

PPAなどの追加配布元や、独自ビルドのPHPには、この判定基準をそのまま当てはめられません。その配布元の修正情報で確認してください。

版の比較をコマンドに任せるなら

Ubuntu 26.04の公式パッケージだと確認できたら、版比較を自動化したい場合は、次の補足を使えます。取得失敗や未導入を、修正済みと誤判定しない形にしています。

補足:導入状態も確認する版比較スクリプト
if state=$(dpkg-query -W -f='${db:Status-Status}' php8.5-fpm) \
  && [ "$state" = installed ] \
  && version=$(dpkg-query -W -f='${Version}' php8.5-fpm); then
  if dpkg --compare-versions "$version" ge '8.5.4-0ubuntu1.5'; then
    printf '%s\n' 'FPMパッケージは今回の修正版の条件を満たしています'
  else
    printf '%s\n' 'FPMパッケージの更新が必要です'
  fi
else
  printf '%s\n' 'php8.5-fpmの導入状態を確認してください' >&2
fi

dpkg --compare-versionsは、Debian系のパッケージ番号の規則で比較します。geは「以上」です。文字列を単純に大小比較するより、番号の読み違いを避けられます。dpkgのマニュアルを参照してください。

この判定で分かるのは、今回のFPMパッケージの版が条件を満たすかどうかです。

再起動や画面の確認は、このあとに続きます。

PHP更新確認フロー.png

図:パッケージの条件を満たしたあとも、起動先・再起動時刻・アプリの動作を確認する。

未更新なら、変更予定を読んでから更新する

以下は、FPM・CLIと共通パッケージを更新する例です。インストール済みのPHP拡張などにも更新があれば、それらを含めて対象を確認してください。

更新や再起動で利用中の処理に影響することがあるため、普段の保守時間と復旧手順を確保して進めます。

sudo apt install --only-upgrade php8.5-fpm php8.5-cli php8.5-common

表示される変更予定に、想定していない削除や変更がないかを読んでから確定します。更新候補が出ない場合は、apt updateのエラーや配布元を確認し、別リリース向けのパッケージを直接入れて合わせようとしないでください。

更新後は、先ほどのdpkg-queryで状態と版をもう一度確認します。Ubuntuの公式解説にも、パッケージの更新方法が案内されています。

FPMが、更新後に起動し直したことを確認する

PHP-FPM(ピーエイチピー・エフピーエム)は、Webサーバーから渡されたPHPの処理を担う常駐プロセスです。パッケージを入れ替えたあとも、稼働中のプロセスへの反映が必要です。

まず、サービスの起動先と現在の状態・時刻を控えます。

systemctl show php8.5-fpm \
  -p ExecStart -p MainPID \
  -p ExecMainStartTimestamp -p ActiveEnterTimestamp

ExecStartの実行ファイルが、今回更新したphp8.5-fpmのものかを確認します。標準の配置では/usr/sbin/php-fpm8.5です。別の場所から起動している場合は、パッケージの更新と、そのサービスが使うPHPの更新を同一視できません。

続けて設定構文を検査します。

sudo php-fpm8.5 -t

エラーがあれば、この段階で解消します。-tは設定を検査して終了するオプションです。Ubuntu 26.04・PHP 8.5-FPMのマニュアルで確認できます。

構文確認が通ったら、現在の日時を表示して控え、FPMを再起動します。あとで、FPMがその日時以降に起動したことを確認します。

date --iso-8601=seconds
sudo systemctl restart php8.5-fpm

再起動が成功したことを確認してから、FPMが稼働していることと、起動した日時が今回の再起動後になっていることを確認します。

systemctl is-active php8.5-fpm
systemctl show php8.5-fpm \
  -p MainPID -p ExecMainStartTimestamp -p ActiveEnterTimestamp
systemctl is-active nginx

FPMとNginxがactiveであることに加えて、次を見ます。

  • MainPID:現在のFPMの主プロセスID。0ではないこと。
  • ExecMainStartTimestamp:主プロセスが作成された時刻。今回の再起動時刻になっていること。
  • ActiveEnterTimestamp:サービスがactive状態へ入った時刻。今回の再起動後の時刻になっていること。

それぞれの意味はsystemdの公式資料に記載されています。

activeだけなら、前から動き続けているプロセスでも同じ表示になります。時刻を加えると、更新後に起動し直したかを確認できます。ただし、時刻自体はバイナリの版を示しません。導入済みの版、サービスの起動先、更新後の再起動を組み合わせて確認します。別サービスや個別に起動したFPM、cronなどから動くCLI版PHPは、このサービスの確認には含まれません。

再起動に失敗した場合や、時刻が更新されていない場合は、先へ進まず状態を調べます。

sudo systemctl status php8.5-fpm --no-pager

最後は、いつもの画面からPHPを使う操作を確かめる

FPMが動いていても、アプリが普段どおり使えるかは画面から確かめます。静的なページの表示だけで終わらせず、ログインなど、PHPを通る代表的な操作を選んでください。

業務データを変更する確認には、普段の検証用アカウントや手順を使います。

今回の更新では、FPMの構文確認と再起動、FPM・Nginxの稼働、画面表示とログインまで確認しました。

更新後は、参照したUSN、更新前後の版、FPMの再起動結果と時刻、確認した画面操作を残しておきます。後から見直すときも、どの修正を入れ、どこまで確かめたかを追えます。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?