本文へスキップ
試したこと PHP Security Response

PHP の脆弱性 php2shell に、自分のサーバーで対応してみました

PHP セキュリティ
PHP の脆弱性 php2shell に、自分のサーバーで対応してみました

10 月 21 日、PHP の脆弱性「php2shell」に、このサイトのサーバーで対応しました。ニュースで知ってから修正版を入れるまでの 8 時間で、やったことと詰まったこと、次に変えたいことをまとめます。

10 月 21 日、PHP 本体の脆弱性「php2shell」に、このサイトのサーバーで対応しました。夕方のニュースで知ってから、修正版を入れてサイトを戻すまで、ちょうど 8 時間です。

どんな脆弱性なのかと上げる版の番号は、速報 と 続報 に書きました。この記事では、実際にやった順番と途中で詰まったこと、次に同じことが起きたら変えたいことを書いておこうと思います。

8 時間でやったこと

先に、流れを表にしておきます。時刻は日本時間です。

16:00ニュースで知る。サーバーの PHP の版と、同じ PHP で動いているサイトを洗い出す
16:12つなぎの設定を 2 つ入れる。データベースと設定ファイルのバックアップも取る
16:27使っていない試作のサイト 2 つを止めて、片付ける
16 時半すぎサーバー会社の緊急メンテナンスで、サーバーが 17 時すぎまで応答しなくなる
17:48速報の記事を公開する
22:36サイトを閉じる。自分の回線とサーバー自身からしか見えないようにする
23:00PHP の修正版が公開される
23:58Ubuntu の修正版のパッケージを入れる
23:59サイトを開けて、つなぎの設定を外す

最初の 30 分で、入口を減らした

最初に見たのは、サーバーの PHP の版です。このサイトのサーバーは Ubuntu の PHP を使っていて、修正が出る系列でした。あとは修正版を待って入れればいい、と分かって少し落ち着きました。

次に、同じ PHP で動いているサイトを数えました。ここで、試作のまま使っていなかったサイトが 2 つ、動いたままになっているのに気づいたんです。どちらももう使っていないので、ファイルとデータベースを退避してから、その場で消しました。

つなぎの設定は 2 つです。どちらも完全な対策ではないと分かっていたので、入口を少しでも狭める、くらいの気持ちで入れました。

  • PHP の Session Upload Progress を切る
  • ファイルを送る形の POST(multipart)を、PHP に届く前に Web サーバーで止める。自分の回線からは通す

このサイトには、訪問者がファイルを送るフォームがありません。なので、multipart の POST を止めても困る人はいないんです。夕方から夜までの間に、この遮断に引っかかったのは、セキュリティ会社のスキャナーから来た 1 件だけでした。

あとで出た公式の告知を読むと、この 2 つはどちらも実際の攻撃経路に関わる場所でした。Upload Progress は 2 件目の経路の 1 つで、multipart の読み取りは 1 件目の手口に挙がっています。

途中で、サーバーが応答しなくなった

詰まったのは、16 時半すぎです。使っていないサイトを片付けている最中に、サーバーがまったく応答しなくなりました。Web も SSH も、ping も返ってきません。

設定を触った直後だったので、自分で何か壊したのかと、かなり焦りました。原因は、サーバー会社の緊急メンテナンスです。21 日の 15 時から翌日の 18 時までに、ホストを順に再起動するという案内が、メールで届いていたんです。

17 時すぎに戻ったあと、サーバーの時計が 10 分近く遅れていました。仮想マシンが一時停止していた間、時計も止まっていたんだと思います。時刻合わせのサービスを再起動して直しました。ログの時刻がずれたままだと、あとで攻撃の跡を追うときに困るところでした。

サイトを閉じて、修正版を待った

23 時に修正版が出る前に、サイトを閉じることにしました。修正版が出ると、その差分から攻撃のしかたを割り出されます。セキュリティ会社の Sansec は、公開から 15 分以内に大規模な攻撃が始まると見ていました。

このサイトは、1 日止まっても困る人はいません。それなら、修正版を入れるまで閉じてしまうのがいちばん確実です。22 時 36 分から、自分の回線とサーバー自身以外には、503 を返すようにしました。

503 にしたのは、検索エンジンに「一時的に止めている」と伝えるためです。404 を返すと、ページが消えたと受け取られるおそれがあります。

閉じていた 1 時間 23 分の間に、外から来たアクセスは 360 件でした。どれも PHP に届く前に止まっています。閉じる前の時間も含めて、PHP のプロセスが異常終了した記録はありませんでした。

23 時に、PHP の公式が修正版を出しました。ただ、このサイトのサーバーに入るのは、Ubuntu が自分のパッケージに修正を取り込んでからです。その Ubuntu の修正版が届いたのは、公開からおよそ 1 時間後でした。

23 時 14 分の時点で、Ubuntu のセキュリティ情報には修正版の番号が出ていました。それでも、サーバーで apt を見ると、新しい版がなかなか出てきません。23 時 36 分にもまだ無く、23 時 57 分に確かめたときに届いていました。配信の一覧には 23 時 4 分の日付が付いていたので、使っている配信サーバーに届くまでに時間がかかったようです。

入れたのは 23 時 58 分です。PHP の 15 個のパッケージをまとめて更新して、PHP-FPM が再起動したのを確かめました。更新の履歴には、CVE-2026-109618 と CVE-2026-109619 の修正が載っています。

23 時 59 分にサイトを開けて、つなぎの設定も外しました。トップや記事、管理画面が普段どおり動くのも確かめています。

自動更新に任せていたら、どうなっていたか。Ubuntu の自動更新は 1 日 1 回で、このサーバーの次の出番は朝 6 時台でした。修正版が届いてから 7 時間近く、穴が開いたままだったことになります。

次に同じことが起きたら

今回やってみて、次からはこうしたい、と思ったことが 3 つあります。

  • 使っていないサイトは、早めに消す: 試作のサイトは、置いておくだけで入口になります。今回いちばん反省したところです
  • 閉じる手順は、昼のうちに作っておく: 閉じる設定と開ける手順を先に用意して試しておいたので、夜はそれを流すだけで済みました
  • 修正版は、自分で見に行く: 緊急の修正が予告されたら、公開の時刻に合わせて apt を確かめます。自動更新の出番を待たないほうが早いです

PHP で自分のサーバーを動かしている人は、使っていないサイトの片付けと、サイトを閉じる手順だけでも、先にやっておくと気持ちが楽だと思います。

share Xでシェア