パスワードが流出したと聞くと、たいていの人は一回きりの事故として想像する。あるサービスが運の悪い日にあたり、ニュースになり、パスワードを変えて、それで終わり。終わっていない。 流出した日は何かの終わりではない。そこから何年も動きつづける組み立てラインの初日であり、そのラインにあなたの名前が出てくることは一度もない。ほとんど誰も見ていない工程なので、最初から最後まで話す価値がある。
第一工程: 誰かがデータベースを持ち出す
最初の一歩に派手なところは何もない。誰かが SQL インジェクションを見つける。公開されたままのバックアップを見つける。初期パスワードのままの管理画面を見つける。そしてテーブルを一つ持っていく。
そのテーブルには、運が良ければあなたのメールアドレスとパスワードのハッシュが入っている。運が悪ければ、あなたのメールアドレスとパスワードが入っている。平文で。あなたが打ち込んだそのままの形で。
2009年 三千二百万件の平文パスワード
2009年12月、SNS 向けウィジェットを提供していた RockYou という会社が SQL インジェクションを受けた。持ち去られたのはおよそ 3,200万件のパスワード。破るべきハッシュは存在しなかった。平文で保存されていたからだ。
RockYou にとっては大惨事で、それ以外の全員にとっては贈り物だった。史上はじめて、実在するパスワードの巨大なコーパスが手に入った。誰かに読まれるとは思っていない人たちが書いた、生のパスワード。研究結果ではなく、現物そのものである。
このファイルは rockyou.txt となり、今でも攻撃を試すときの基準辞書でありつづけている。その価値は、あなたのパスワードが載っていることではない。人間がどうやってパスワードを書くかが載っていることだ。名前に西暦。単語に 123。末尾の !。RockYou が流出させたのは3,200万個の秘密ではない。パターンを流出させたのだ。そしてパターンに賞味期限はない。
第二工程: 破れるものを、まったく急がずに破る
ここで直感が外れる。誰かがサービスのログイン画面であなたのパスワードを当てようとすれば、サービスが止めにくる。3回で打ち止め、CAPTCHA、アカウントロック。サーバーを相手にした推測は遅いし、うるさい。
だが、すでに自分のディスクの中にあるハッシュのファイルが相手なら、サーバーは存在しない。「だめだ」と言う人が向こう側に誰もいない。 ローカルで、GPU を使って、試行回数の制限もなく、時間だけはいくらでもある状態で試される。もしそのサービスのハッシュ化がお粗末なら——速いアルゴリズム、ソルトなし——平文との差は利便性の差であって、安全性の差ではない。
しかも、でたらめに試すわけではない。まず rockyou.txt、次にそこから導いたルール。a を @ に置き換える。末尾に西暦を足す。あなたが我ながら気が利いていると思った小細工は、どれも10年以上前から設定ファイルに書かれている。
こうして、流出データの一部が読めるパスワードに変わる。残り——長いもの、ランダムなもの、どの辞書にも載っていないもの——は依然としてただのノイズだ。チェッカーが引いているのはその線である。説教はしない。あなたがどちら側に落ちるかを教えるだけだ。
第三工程: 突き合わせる。そこであなたに値段がつく
流出データが一つあるだけでは大した価値はない。価値があるのは集約だ。別々のサイトの流出を10個持ってきて、メールアドレスで突き合わせ、すでに平文になっている メールアドレス:パスワード の組だけを残す。その結果は combolist と呼ばれ、もはや誰かのデータベースではない。人間のリストだ。
2013年 在庫目録が表に出る
2013年12月、Troy Hunt が Have I Been Pwned を立ち上げた。流出に現れたメールアドレスの公開データベースで、誰でも自分が入っているかどうかを問い合わせられる。その根底にある考えは単純で、そして居心地が悪い。攻撃者がすでに在庫目録を持っているなら、被害者にだけそれを見せないでいても、誰も守られない。数年後には Pwned Passwords が加わった。同じことをパスワードでやるもので、パスワードを送らずに照会できる。ハッシュの断片を送ると、サーバーが候補をまとめて返す。どれがあなたのものかは知らないまま。
2017年 NIST が記号を求めるのをやめ、リストを求めはじめる
NIST が SP 800-63B を公開したとき、入力フォームまわりの正統派の作法をほぼ丸ごと投げ捨て、代わりに、ほとんど誰も予想していなかった要件を置いた。パスワードを設定する際、システムはそれを既知の漏洩値のリストと照合し、載っていれば拒否しなければならない。
これは細部の変更ではなく、理屈そのものの変更だ。問いはもう、あなたのパスワードが強そうに見えるかどうかではない。すでに公開されているかどうかだ。だからジェネレーターは、まっとうな道が一つしかない以上、それをやる。一度も存在したことのない場所からパスワードを取り出すのである。
2019年 すでに他の流出の焼き直しだった流出
2019年1月、Collection #1 の名で知られるようになったパッケージが出回った。Hunt がそれを分析し、中身を数えた。ユニークなメールアドレスがおよそ 7億7,300万件、平文のユニークなパスワードがおよそ 2,100万件。数千の出所から集約されたものだった。
重要だったのは規模ではない。どこから来たかだ。その大部分は過去の流出の焼き直しで、すでに解析済みで、使いやすい形に整えられていた——もっとも Hunt は、それまで把握していなかった素材も見つけている。商品は侵入ではなかった。在庫目録だった。そしてそんな在庫目録の使い道は一つしかない。
クレデンシャルスタッフィング: 誰もあなたを狙っていない
あなたを攻撃している人間は誰もいない。 ここが腹に落ちにくいところだ。
誰もあなたのアカウントについて考えたりしない。誰かが数億行のコンボリストを持ってきて、銀行やメールのログインフォームに片っ端から試すツールに流し込み、ロックが働かないよう試行を多数の IP アドレスに分散させ、そして待つ。圧倒的多数は失敗する。かまわない。ほとんどタダなのだから。
それが credential stuffing であり、推測ではない。照合だ。パスワードはすでに持っている。判明するのは、あなたが他のどこでそれを使ったか、それだけである。
あの掲示板のパスワードは重要ではなかった。掲示板も重要ではなかった。重要なのは、その同じ文字列があなたのメールを開け、そのメールが「パスワードをお忘れですか」経由で他のすべてを開けるということだ。原罪は弱かったことではない。同じだったことだ。 30文字のランダムで完璧なパスワードも、2か所で使い回した時点で、その2か所のうち悪いほうと同じ強さしかない。そして、悪いほうがどうハッシュ化しているかを、あなたは決められない。
ここから導かれること
- 使い回していたなら、流出したパスワードを変えるだけでは足りない。 急ぐべきはニュースに出たサイトではない。他のサイトのほうだ。
- サイトごとに1つ。そして忘れても平気なものを。 自分のパスワードを全部覚えていられるなら、数が少なすぎるか、質が悪すぎる。
- 二要素認証が連鎖を断ち切る。 credential stuffing が試すのは
メールアドレス:パスワードだ。それだけでは入れないなら、在庫目録の価値は消える。
流出したあなたのパスワードは、敵の手の中にあるわけではない。数億行の中の1行として、ファイルの中に並んでいる。誰かにとって、もう一つ別のサイトで試してみる価値が出てくるのを待ちながら。そして、それがうまくいくかどうかを決める唯一の要素は、何年も前にあなたが決めた。同じ言葉を2度目に書いたときに。
出典: RockYou の流出 (2009年12月) と、その後の攻撃辞書としての rockyou.txt の利用 · Troy Hunt による Have I Been Pwned と Pwned Passwords · 漏洩値のリストとのパスワード照合について、NIST SP 800-63B · Collection #1 についての Troy Hunt の分析 (2019年1月) と公表された数値 · credential stuffing の OWASP による定義。