PHPに穴が見つかった夜、なぜサイトは一斉に止まるのか

PHPに穴が見つかった夜、なぜサイトは一斉に止まるのか

読了目安:約6分
文字サイズ

ひとつのプログラムに穴が見つかっただけで、なぜ何百、何千というサイトが同じ夜に店を閉めるのでしょうか。答えは、PHPが多くのサイトで「お店の奥のレジ」のように共有されていて、その穴が外から店の中身まで届いてしまう種類のものだったからです。さらに、直し方が配られる前に穴の存在が外へ漏れていました。やられる前に閉める。その判断が一斉に下された、というのがこの話の骨格です。

ここで扱うのは、そうした一夜を描いた物語形式の解説をもとにした仕組みの整理です。日付や出来事をそのままニュースとして受け取るのではなく、自分のサイトや仕事に置き換えて読むと使い道があります。

PHPは「お店の奥」で動いている

まず誤解しやすい点から。PHPはスマートフォンの中に入っているわけではありません。動いているのはサイトを配信している側、つまりサーバーです。私たちがスマホで見ているのは、出来上がった画面と、入力した内容を送る窓口だけです。

たとえばコンビニのレジを思い浮かべてください。バーコードを読み、値段を出し、在庫を減らし、売上を記録する。この一連の処理をサイトの奥で担当しているのがPHPです。利用者は財布を持って店に来ているお客さんで、レジそのものには触れていません。だから「自分のスマホの調子が悪いのかも」と再起動を繰り返しても、止まっている理由は見えてきません。

止めたのは「やられたから」ではない

サイトが止まる場面を聞くと、攻撃を受けて壊れたのだと思いがちです。しかし今回の停止は、被害が出る前に自分たちの判断でシャッターを下ろす行為でした。情報が漏れてから閉めても、抜けていったカード番号は戻ってきません。だから先に閉める。泥棒が来る前に店を閉めておく、という順番です。

この違いは、再開の見通しにも影響します。壊されたのなら復旧には時間が読めませんが、自分で閉めたのなら、直し方を当てて確かめてから開けられます。止まっているあいだも、中の状態は保たれている可能性があります。

一斉に止まる三つの理由

広さ――同じレジを使う店が多い

調べたサイトのおよそ7割がPHPで動いている、という数字がよく挙げられます。10軒の店のうち7軒が同じ型のレジを使っているようなものです。そのレジに穴がひとつあれば、7軒が同じ穴を抱えることになります。個々のサイトが弱いというより、土台が共通しているために影響が横に広がります。

深さ――レジの先にあるものまで届く

穴の性質も厄介でした。条件が揃うと、外部からレジを言いなりにできる種類のものだったと説明されています。値段を書き換える程度では済みません。レジは店の奥のコンピュータにつながっていて、顧客名簿や注文記録、サイトの看板まで書き換えられうる。偽の支払い画面に案内することもできてしまいます。しかも会員カードも暗証番号も要らず、店に来なくても遠くから操作できる。

ただし、一回の試行で必ず成功するわけではありません。条件が揃わなければうまくいかない。だから攻撃側は何度も何度も試します。成功率の低さは安全の保証にはならず、回数を重ねられると突破される、という前提で考える必要があります。

順番――直し方より先に、穴の場所が漏れた

本来の手順は、直し方を配ってから穴があったと発表する順番です。泥棒に知られる前に、みんなで直すためです。ところが公開前に対象の番号が外部に漏れてしまい、予定を前倒しして夜のうちに直し方を出すことになった、という経緯が描かれます。

ここが今回の急所でした。攻撃側が先に知り、守る側はこれから配る。その空白の時間を埋める手段が、一時停止だったわけです。

「深刻度の点数」だけを見ると判断を誤る

危険度は点数で示されることが多く、高いほど危ないという印象を持ちます。しかし点数がすべてではありません。2024年にも9.8という高い点数のPHPの脆弱性がありましたが、それはWindows上で古い動かし方をしている場合に限られ、影響が及ぶのは日本語や中国語の設定のサーバーが中心でした。

今回は、長く使われてきた世代のPHPにはほぼ全部あてはまる種類だったとされます。点数がやや低くても、範囲が広く、しかも攻撃側が先に知っていた。点数よりも広さと順番を見るべきだ、というのがこの事例の教訓です。長いあいだ大きな穴だと気づかれなかった、という点も添えられています。

穴そのものより、不安の広がり方が速い

見落とせないのは、情報の伝わり方です。「日本のネットは全部ハッキングされた」という投稿が拡散し、多くの反応が集まる場面があります。広がったのは、投稿した人を詳しい人だと信じたからではなく、ただ怖かったからでした。恐怖は、確認より先に人を動かします。

実際に問い合わせが来ます。「私のカードは大丈夫ですか」と。ここで使えるのが、「確認できた範囲では、不正アクセスは見つかっておりません。引き続き調べております」という伝え方です。断定せず、しかし放置もしない。分かっていないことを分かっていないと書くほうが、不安を長引かせません。

自分が発信する側になったときも同じです。分かったことと推測を分けて書く。これは文章の作法であると同時に、誰かを不要に怖がらせないための実務的な備えになります。

自分のサイトで確かめられること

まず、使っているPHPのバージョンを確認します。公式のサポートが終了したバージョンには修正プログラムが提供されません。その場合はパッチを当てるのではなく、新しいバージョンへ移行する必要があります。管理画面のボタンひとつで切り替えられると案内されていても、古いバージョンから移ると表示が崩れたり、プログラムが動かなくなったりすることがあります。事前のバックアップと、できればテスト用の環境での確認を挟んでください。

レンタルサーバーやネットショップのモールを使っている場合、サーバー側の対応は事業者が行います。自分でできることは限られるので、公式の告知を確認するのが先です。自分でサーバーを動かしていないなら、噂を見て手元のパスワードを一斉に変える必要はありません。変更すべきは、同じパスワードを使い回している場合など、穴とは別の理由があるときです。

修正を当てたあとは、実際に買い物ができるかのテスト注文と、止まっているあいだに届いた問い合わせへの返信が残ります。地味な作業ですが、店を開けたのにレジが動かない、という状態を避けるにはここまでが一組です。

閉めるという判断について

なぜ店を止めるのか。それは、すべてを理解してから動くのを待っていたら間に合わないからです。何が危ないのかを完全に知る前に、被害を出さない側へ倒しておく。閉めるのは、分からないことへの敗北ではなく、選べる打ち手のひとつです。

同時に、閉じたままでは売上も生まれません。どこまで分かれば開けてよいのかを決めておくことが、閉じる判断と同じくらい大切になります。確認できた範囲を言葉にして、確かめて、開ける。その順番を日頃から決めておけば、次に同じ夜が来ても、慌てずにシャッターを上げられます。

シェアする

気になる記事から、別の視点も見つけてみませんか。

気になるテーマを、次も。

フォローしたテーマの新着記事をホームに表示します。登録は不要です。