created_at
updated_at
tags
toc

Passkey への道 #3: 手入力の限界

Intro

パスワードだけでの認証に限界が訪れ、TOTP を用いた 2FA が普及した。

しかし、これでもまだ、全くもって不完全であることが、フィッシング詐欺の増加によって証明された。

フィッシング詐欺

以下のような SMS を、多くの人が受け取ったことがあるだろう。

[XXXX 証券株式会社] 緊急連絡、重要なお知らせ。https://t.co/1X2Y3Z4

内容は様々だ。かつては雑な和訳で崩れた日本語も多かったが、最近は AI 生成の精巧な文面が送られてくる。「とにかくユーザを焦らせるような SMS とは?」という大喜利の回答が、定期的に送られてくるので楽しみにしている。

といっても、重要なのはリンクの方だ。クリックすれば、普段使っているのと全く同じ見た目の偽装サイトが開かれ、ログインを促される。うっかりログインすればパスワードが盗まれ、その後本物のサイトにリダイレクトされるため、攻撃されたことにすら気づかない場合も多い。

平成のころ、これはパスワードを盗む目的で行われていた。であれば、TOTP によって防がれたと思うかもしれない。

令和の今猛威を振るっているのは、TOTP も一緒に盗む方式だ。

転記型フィッシング詐欺

  1. 偽のログイン画面を開き、アカウント名とパスワードを入力させる
  2. 入力された内容を本家サイトに転記する
  3. 偽のログイン画面を遷移し、TOTP を入力させる
  4. 入力された TOTP も本家サイトに転記する
  5. 攻撃者は本家サイトにログインできた状態になる
  6. ユーザは本家サイトにリダイレクトしておけば、ログインに失敗したかのように勘違いする

TOTP は時間ベースであるため、乱数表のように、事前に盗んでおいて後で使うことはできない。であれば、両方ともユーザからもらい、その場ですぐ使えばよいのだ。サービスから見れば、正しいパスワードを知り、正しい TOTP を持っている、正規のユーザにしか見えない。

サイトは、本物をコピーして作っているため、見た目では判断できない。ユーザにとっての判断材料は URL しかない。

手の込んだサイトは、https://google.co.jp.net.attacker.example のように、それっぽく長いドメインにし、スマホの狭い画面だと後ろが切れて見分けがつかないなどの工夫をしていた。iPhone が URL 全体を表示せず、ドメインの右側(eTLD+1)だけを表示するようになったのは、こうした攻撃に気づけるようにする意図があったと言われている。

しかし、最近はかなり雑な URL のものも多い。フィッシングサイトは使い捨てでどんどん場所を変えていくため、雑な URL になるが、雑でも多くのユーザはそれとは気づかずに入力するため、こだわる必要もないのだろう。

そんな雑なものに引っかかるものかと思うかもしれないが、実際にはかなりの人が引っかかるという調査は、探せばいくらでも出てくる。昨今のサイバー犯罪の被害規模を見れば、笑って済ませる話でないことは火を見るより明らかだ。

今 Web の世界は、このシンプルな攻撃によって、ガタガタに崩されそうになっていると言える。

対策として、「SMS は信用するな」「ログインは必ずブックマークから」などと啓蒙されているが、それでは全く追いついていない。現にここ数年で何億もの被害を出しているサイバー犯罪被害は、フィッシング詐欺を起点にしたものが無視できないほどあるのだ。

人間が入力したら負け

フィッシング詐欺の対策は、結局「URL 確認の徹底」に尽きる。しかし、日々多くのサービスを使う中で、すべてのサイトの URL を目視で確認し続けるのは不可能だ。

本当の解決策は、「自分で入力しない」ことだ。

これが、パスワードマネージャをすべてのユーザが使うべき理由でもある。

パスワードマネージャといえば、前述したような「複雑で長いパスワードを生成する」「記憶できなくても大丈夫にする」「サイトごとに保存し使い回さないようにする」などの目的で使うと思っている人も多いだろう。平成の間は確かにそうだった。

しかし、今のフィッシング対策で最も有効なのは、パスワードマネージャが持つ Autofill 機能なのだ。パスワードマネージャに登録したパスワードは、その画面のドメインに紐づけて保存される。次にログイン画面を表示したら、パスワード欄に自動で入力する UI を表示するが、これは保存したパスワードとドメインが一致しているからだ。

つまり、「常に Autofill で入力する」を徹底していれば、フィッシング詐欺サイトを表示してしまったとしても、Autofill が出ないことでおかしいと気づくことができるのだ。サイトの真正性を機械的にチェックしている状態だ。

パスワードマネージャを使っていない人の中には、「自分は〜な方法で、複雑なパスワードを作り安全に管理できている」などと、独自の方式に自信を持っている人もいるだろう。もし、そのパスワードを手入力やコピペで入力し、TOTP も手で入れているのであれば、その方式は片手落ちで脆弱な平成の遺物だと言っていい。

パスワードマネージャを使っていても、保存するだけで Autofill していないなら、ブラウザ拡張など何らかの Autofill する方法を探して導入すべきだ。なければ、そのパスワードマネージャはやめて、別のものに乗り換えた方が良い。

TOTP もパスワードマネージャで行う

最近ではパスワードマネージャが TOTP も行うようになった。

「パスワード」も「TOTP」も、両方同じパスワードマネージャに入っていては、「一要素二段階」で認証の強度が上がっていないのではないかという、もっともらしい指摘もある。

しかし、実際のところ TOTP を別の Authenticator にして、それをフィッシングサイトに手入力してしまうくらいなら、両方パスワードマネージャに Autofill してもらうほうがよっぽど安全なのだ。

また、多要素認証の原則は、そもそもの「記憶に頼るパスワード」があまりにも脆弱なものであったため、それを補う上で「記憶」要素を追加しても有意な結果にならない、という側面がかなり強い。

しかし、パスワードマネージャを適切に使い、すべてのサイトで自動生成されたパスワードを登録し、使い回しがない状態を維持できていれば、その問題の半分は解決している。そのうえでさらに TOTP を登録できているなら、Autofill にさえ気をつければ「ソースが同じパスワードマネージャ」であること自体は、認証プロセスにおいて有意な問題ではなくなる。十分に堅牢なのだ。

むしろ、気をつけるべきは「パスワードマネージャ自体の死守」一箇所に絞られるため、複数のことに気を配らなくてはいけなかったユーザの負荷も下がる。

もしどうしても気になるのであれば、TOTP を Autofill できる Authenticator を別途用意すればいい。恐らく今だとパスワードマネージャを 2 つ使う結果になるだろう。

サービス側の Autofill サポート

ユーザが認証をパスワードマネージャの Autofill に委ねるためには、サービスは Autofill 可能な作りになっていなくてはならない。

例えば、<input type=password> などはそのままでも Autofill されるが、<input type=text name=otp> では、TOTP が適切に Autofill されない場合がある。「ここには TOTP を入力する」というセマンティクスがブラウザに伝わらないからだ。

正しくはこうだ。

<input type=text name=otp autocomplete=one-time-code>

そして、もっと問題なのは「アカウント登録」のドメインと「ログインのドメイン」が異なるサイトだ。

パスワードマネージャは、登録時のドメインに紐づけて保存するため、ログインのドメインが違えば Autofill されない。もともと別サービスだったものを、強引にアカウント統合したサービスによくある構成だ。

勘違いしてほしくないのは、これらは「ユーザが使いやすいように」などという利便性でやるべきと言っているのではない。

こうした Autofill が効かない不完全な認証画面があるたび、ユーザに「パスワードマネージャから値をコピーして手入力する必要が出る」ことだ。ユーザが「あーまたか」と日常的にコピペを行い、それに慣れてしまうと、いざという時フィッシング詐欺に気づくことができなくなってしまう。

直近でも、これが原因でフィッシング詐欺の被害にあった事例がある。

Troy Hunt は、セキュリティの専門家で、#1 で紹介した Have I Been Pwned の運営者その人だ。

普段からパスワード漏えいの実態そのものに取り組み、その日も政府関係者に対してフィッシング対策のミーティングを行ったばかりだったそうだ。このエントリには彼がなぜ引っかかったのかが、回顧録として細かく書かれているが、大きな要因の 1 つとして「また Autofill が効かないサイトがある」とコピペしてしまったことが挙げられている。

あらゆるユーザが、日常的に Autofill に頼り、コピペをする必要がない状態。それが作れて初めて、「Autofill されないということは攻撃サイトだ」という認知状態に持っていくことができるのだ。

Outro

令和の現状で言えば、「パスワードを Autofill せず手入力」しているようでは自衛になっていないし、「まともに Autofill できないサイト」を作っているようでは「対策している」とは言えないのだ。

しかし、それでもユーザがコピペしてしまうのは、完全には防げないだろう。であれば、そもそも文字列で入力せず、ドメインが違えば絶対に発動しない認証方式があれば良いはずだ。