脆弱性が出たら、保守を頼んでいる会社にパッチを当ててもらう。皆さんの会社でも、段取りとしてはそうなっていると思います。
それで合っています。10月21日の夜、PHPに重大な脆弱性が2件出たときも、修正が届くバージョンで動いているサイトは、届いた修正を当てれば済みました。
ただ、古いバージョンで動いているサイトは、その段取りの途中で止まりました。保守先から「修正パッチの確認と適用をお願いします」と頼まれても、当てる修正が届かないんです。残った手は、サイトを止めるか、危ないまま動かすか。
パッチが当たるかどうかは、脆弱性が出たその夜ではなく、ずっと前に決まっています。決めているのは、サイトが動いているPHPのバージョンと、そのPHPを誰が配っているかです。
23時の公開に間に合うように、代表は出張先から戻りました
予告は前日に出ていました。10月20日、PHPの公式サイトに「重大なセキュリティリリースを出す」という告知が載りました。中身は伏せたまま、公開は日本時間の21日23時、という日時だけが先に出た形でした。
21日の夕方ごろから、保守先の問い合わせが入りはじめました。PHPの件は知っているか、うちのサイトで何かすることはあるか、という内容でした。その日だけで11社・16サイト分が届きました。夜には高市総理もXで対策を呼びかけ、あちこちのサービスが予防のために止まりました。
ID-TECHS代表の花弥は、23時に間に合うよう出張先から急いで戻りました。サーバーごとにPHPのバージョンと入れ方を確かめて、このサイトは対象か、修正はどこから届くか、届かないならどうするかを1社ずつ返していく。翌日も10社から問い合わせが続き、最終的に28サイト分になりました。作業は夜中の3時を過ぎても終わらず、22日の夜はさらに遅くまで続きました。
この夜のことは、Bloombergが10月30日に配信した日本向けニュースレター「Next Japan」で取り上げられました。国内のWebサービスがPHPの脆弱性への対応で1日止まったように見えた、という話の中で、サポートの切れたバージョンで動くお客さんのサイトを抱え、パソコンの前からほとんど離れられなかった大阪の制作会社として紹介されています。
Bloomberg「Japan’s Aging Software Leaves It Exposed to AI-Powered Cyberattacks」
「パッチを当ててください」の先は行き止まりでした
1社からは、公開の3時間前に「サイトを止めてほしい」と依頼がありました。その会社は、ほかのホームページもまとめて止めると決めていました。対象の2サイトが、2022年11月にサポートの終わったPHP 7.4で動いていたからです。
23時過ぎに公開された内容は、予想より厳しいものでした。PHPの公式が修正済みのバージョンを出したのは8.2以降だけ。8.1以前のバージョンには、PHPのプロジェクトからの更新は出ていません。7.4・8.0・8.1向けに用意されたのは、自分でソースから組み直す人のための最小限の差分です。
サーバー会社やOSの配布元が用意したPHPを使っているサイトでは、修正もその配布元から届きます。古いバージョンで動くサイトに修正が届くかどうかは、配布元がまだそのバージョンの面倒を見ているかどうかで決まるわけです。同じ7.4でも、OSによっては修正を出した配布元もありました。止めた2サイトには届きませんでした。
穴の場所が発表された日に、塞ぐための板が自分の家の分だけ配られない。古いバージョンで動くサイトは、そういう立場にいます。
保守を頼んでいるから大丈夫、と思っていた方ほど、ここで足が止まるはずです。保守の契約があっても、届かない修正は当てられません。 担当者にできるのは、届いた修正を当てることと、届かないと分かったときに、止めるのか、危ないまま動かすのかを一緒に決めることです。
「止める」も、ちゃんとした対策なんですよ。2サイトは、PHPを動かす仕組みだけを止めて、一時停止を表す「503」を返す形にしました。戻すときはコマンド1つです。サーバー会社が設定で手当てを入れる例もありましたが、PHPの公式は、そうした緩和策では安全にならず、完全な対策はバージョンを上げることだけだと書いています。
サイトがPHP 8.2以降で動いていて、更新をサーバー会社が配っているなら、今回の件であわてる必要はありません。届いた修正が当たっているかを、担当者に確かめれば足ります。
バージョンを上げる作業は一晩では終わりません
止めた2サイトは、バージョンを上げることで先方と決まりました。7.4から新しいバージョンへ移すと、古いPHPで通っていた書き方のいくつかが使えなくなります。消えた関数の書き換え、テンプレートやメール送信の部品の入れ替え。数えられるものは先に数えておけますが、新しいバージョンで増えた警告やエラーは、実際に動かして1つずつ潰すしかありません。
2サイトの間でも、道は分かれました。1つは同じサーバーに新しいバージョンがすでに入っていて、切り替えて確かめる作業で済む見込み。もう1つはサーバーのOSのサポートも切れていて、修正済みの新しいバージョンが配られない。新しいサーバーを用意して移すことになりました。同じ7.4なのに、作業の重さがまるで違います。
古いバージョンのサイトは、普段は何も起きません。毎月の保守費を払って、表示もいつもどおり。そのぶん、脆弱性が出た夜に、止めるかどうかの判断と、バージョンアップの作業と費用が、まとめてやって来ます。前もって少しずつ払っておけたはずのものを、いちばん慌ただしい夜に一度に払うことになるんです。
次に制作会社と話すときの質問
公表の日時を決めるのはPHPの開発側で、こちらでは選べません。ただ、その夜にパッチが当たるかどうかは、今のうちに確かめられます。制作会社や保守の担当者と次に話す機会があったら、聞くのはこの2つです。
- うちのサイトは、PHPのどのバージョンで動いていますか
- そのPHPの更新は、どこから届きますか
「サポート中のバージョンで、更新はサーバー会社が配っています」と返ってくれば、次の騒ぎの夜も段取りどおりに進みます。答えに詰まるなら、それがいま確かめておくべきことです。社内で「うちは保守を頼んでいるから大丈夫」という話が出たときも、この2つを聞き返せば、どこまで大丈夫なのかがはっきりします。
古いバージョンのまま動いているかどうか分からない、というところからでも相談を受けています。点検でどこを見ているかはセキュリティ点検で見ているところと、保守で直してきたことに書きました。
FAQよくある質問
- Q保守を頼んでいれば、PHPの脆弱性には必ず対応してもらえますか?
- A修正が届くバージョンなら、届いた修正を当ててもらえます。サポートの切れた古いバージョンで、配布元から修正が届かない場合は、当てる修正そのものがありません。そのときは、サイトを止めるか、バージョンを上げるかを担当者と相談して決めることになります。
- Q自分のサイトのPHPが古いかどうかは、どう確かめればいいですか?
- A制作会社や保守の担当者に、PHPのどのバージョンで動いているかと、更新がどこから届くかを聞いてみてください。サポート中のバージョンで、サーバー会社やOSの配布元が更新を配っているなら、修正が届く仕組みになっています。
- Q修正が届かないからといって、サイトを止めるのはやりすぎではありませんか?
- A危ないまま動かすしかない状態なら、止めるのもきちんとした対策の1つです。一時停止を表す503を返す形にしておけば、戻すときもすぐに戻せます。今回は先方の依頼を受けて、修正の公開の3時間前に2サイトを止めました。