10月21日の夜、楽天市場でお気に入りを開いたらメンテナンス画面が出た。
気分を変えてニコニコ動画を開くと、こっちもメンテ中。
通販と動画が同じ夜にそろって止まったら、まず自分のスマホを疑わない? 再起動ボタンに指が伸びて回線の速度まで測り出す。最後は個人情報が抜かれたんじゃないかと背中が冷えていく。
カートに商品を入れたままだった人ほど、カード情報まで心配したはずだ。
犯人は手元のスマホにいなかった。サーバーの奥で働くPHPという部品に、同じ日に2件の大穴が見つかっていた。
同じ夜にメンテが並んだ理由
PHPの開発チームは21日、ログインもなしに外からサーバーで勝手にプログラムを動かせる穴を2件塞いだ。修正版は現役の4つの系統すべてにまとめて出ている。
名前は物騒でも、作業の現場はサーバー室にある。
同じ夜から国内のサービスが次々とメンテに入った。対象になったのは楽天市場の一部ページ、楽天モバイルの Rakuten Link 内にあるAI機能、ニコニコ動画とpixiv、ネットショップ作成のBASE、横浜DeNAベイスターズの公式サイトだ。
通販と動画と野球が同じ夜に寝込むって、どんな偶然だよ。
偶然の正体は共通の部品にある。PHPはページを開くたびにサーバーで画面を組み立てる実行環境で、ログインや検索の処理も裏で回している。どのサービスも同じ職人を雇っていたわけだ。
職人に穴が開いたら、雇い主は全員で交換作業をするしかない。
しかも交換して終わりにならない。新しい部品で決済やログインや画像の処理がおかしくなっていないか、全部試し直す時間が要る。メンテ画面は運営が確認の時間を作るために出した札だと思う。
設定をちょっといじって逃げる手も封じられている。開発チームは設定変更を完全な対策と認めず、修正版への更新だけを完全な対策と書いた。運営のエンジニアにとっては逃げ道ゼロの通告になる。
じゃあ利用者がアプリを更新すれば直る?
直らない。君のスマホでアプリを何回更新しても、楽天やニコニコのサーバーの部品は1ミリも替わらないからだ。
楽天はレジを開けたままだった
楽天市場が止めたのはトップページやお気に入りなど一部のページだった。22日の午後には買い物自体は通常通りできると整理されている。
入口にメンテの札をかけて、レジは開けたまま営業していたことになる。
この切り分けには素直に惚れる。全部止めて安全を優先するのは簡単だけど、深夜でも買い物したい客を丸ごと追い返す羽目になる。影響する機能だけを選んで閉める判断に、手間をかけた設計が見える。
メルカリは予防のために臨時メンテを行うかもしれないと事前に告知していた。同じ部品を使っていても、止めるかどうかも止める範囲も運営ごとに違う。
そしてメンテ画面と情報漏えいはまったく別の話になる。
メンテの告知に書かれているのは火消しの途中経過で、被害の報告とは中身が違う。画面の文字だけで漏えい確定まで飛ぶのは、さすがに先走りすぎる。
毎月サービスに払う会費のうち、広告に化ける分には今でも腹が立つ。でも深夜に部品を替えて火を消す分なら、僕は喜んで払う。今回のメンテで利用者が追加で払う金はゼロで、端末の初期化に休日を費やす方がよほど高くつく。
確認先は公式のお知らせだけ
重大な穴なら、全部のパスワードを変えるべきじゃない?
サーバーの穴は運営が部品交換で塞ぐもので、君がパスワードを替えても1ミリも塞がらない。不正アクセスや漏えいを公表したサービスが出たら、僕はその時点でそのサービスのパスワードだけ替える。
メンテ画面を見た夜に僕が開くのは各サービスのお知らせページだけ。確かめるのは、止まっている機能がログイン・検索・購入・出品のどれなのか、再開予定の時刻、不正アクセスや情報漏えいの告知が出ていないかの3つだ。
止まった機能さえわかれば、楽天の件みたいに買い物は普通に続けられたりする。
運営側の宿題はもう一つ残っている。PHPの8.2系は今回の修正版で穴が塞がったものの、12月31日で公式サポートが終わる予定になっている。年明けからは8.2系に公式の修正が届かなくなる。
8.2系で動くサービスの運営は年内に次の世代への引っ越しを抱えたままだろう。
あの夜のメンテ画面はサーバーの奥で運営が火を消していた途中経過だった。スマホは無実なので、初期化も買い替えも要らない。今日の作業はお知らせを開いて止まった機能と再開時刻を確かめるだけで済む。




