10月の後半に、PHP というプログラムの言語で重い脆弱性が見つかり、世界中のサイトが更新に追われた。PHP は古くから多くの Web サイトで使われているので、影響の範囲がとても広かった。私たちはまず、自分たちのサービスに PHP が使われていないことを確かめた。そのうえで、このサイトに外から入り込まれた跡や、何かが持ち出された跡がないかも見た。どちらも無かった。
その少しあとに、今度は Next.js という部品で、同じくらい重い脆弱性が報告された。こちらは他人事ではなかった。このサイトも、私たちのほかのアプリも、Next.js で作っている。報告されたのは、条件がそろうと外から命令を実行されてしまうものと、サーバーを止められてしまうものだった。
調べると、このサイトは問題が起きる機能のいくつかを使っていなかった。だから実際に被害が出る見込みは低い、とは言えた。それでも、見込みが低いことと、穴が開いていないことは違う。避ける方法も示されていなかったので、直った版へ上げることにした。
11月2日に、事務所で手元のすべてのプロジェクトを点検した。本番で動く部品の一覧を1つずつ照らし合わせて、古い版が残っているものを最新の版に上げた。このサイトは 16.3.8 という版だったので、直った 16.4.3 へ上げた。
上げるだけでは終わらない。版を上げると、それまで動いていたものが静かに壊れることがある。上げたあとは、型の検査、本番と同じ形での組み立て、全ページの点検を通してから公開した。公開したあとにも、本番で同じ点検をもう一度した。
このサイトには、公開のたびに、本番が本当に新しい版で動いているかを自動で確かめる仕組みがある。押したのに古い版のまま、という食い違いを放っておかないためのもので、今回もこれが新しい版への切り替わりを確かめた。
守りも足した。中身を細かく書くと攻める側の手引きになってしまうので、大まかにだけ書く。よそのサイトから送られてきた操作は前から入口で断っているが、それが全部の入口で効いているかを確かめ直した。
最近は、世界中でサイバー攻撃が増えている。目立つのは、正面から破るのではなく、みんなが使っている部品の中に悪いプログラムを紛れ込ませ、それを取り込んだパソコンやシステムに入り込むやり方だ。自分で書いたコードがどれだけ丁寧でも、取り込んだ部品が汚れていれば意味がない。
そのため、見張り方も強めた。使っている部品に脆弱性が見つかると知らせが届く仕組みは前から使っているが、知らせを待つだけにせず、手元ですべてのプロジェクトを点検する手順を決めた。部品の版を固定して、知らないうちに中身が入れ替わらないようにもした。
使う側の皆さんに、していただくことはない。更新はサーバーの側で済んでいる。パスワードを変えてほしい、という話でもない。もし私たちを名乗る連絡で、パスワードや支払いの情報を求めるものが届いたら、それは私たちではない。私たちがメールやチャットでパスワードを聞くことはない。
失敗を1つ書いておく。このサイトは、自分が何で作られているかを、ずっと外に向けて名乗っていた。作ったときの初期設定のままで、今回の点検まで気づかなかった。名乗っていても、すぐに破られるわけではない。けれども、どの部品のどの穴を試せばいいかを、相手に教えていることになる。今回、名乗らないように直した。初期設定のままのところも、守りの点検の中に数える。
守りに終わりはない。今回の作業も、次の脆弱性が見つかるまでの安心でしかない。だから、見つかったら放っておかない、上げたら確かめる、使わないものは置かない、の3つを続ける。自分で Web サイトを持っている方に1つだけお勧めするなら、サイトが何の部品で動いていて、その版がいくつなのかを、一度書き出してみてほしい。分からなければ、作った人に聞いてみること。