世界を動かす技術を、日本語で。

パスワードをより悪いものに置き換えました

概要

  • 6桁コード認証 を利用するサービスの増加
  • アカウントセキュリティ の重大な懸念
  • フィッシング被害 の現実例
  • パスワードマネージャー の無力化
  • Minecraftアカウント の被害事例

6桁コード認証方式の問題点

  • 多くのサービスで メールアドレスや電話番号入力後、6桁コード送信 方式を採用
  • 攻撃者が 正規サービスに他人のメールアドレスを入力 し、6桁コードを送信可能
  • ユーザーは どのサービスからのコードか判別困難
  • パスワードマネージャー によるフィッシング対策が機能しない現状
  • 攻撃者が 不正な画面でコード入力を促す 手口の横行

実際の被害事例:Minecraftアカウント

  • MicrosoftのMinecraftログイン でこの認証方式を採用
  • 攻撃者による 大量のアカウント盗難 の報告
  • フィッシングメールや偽サイト 経由で6桁コードを入力させる手法
  • 正規のコード入力欄と偽の入力欄 の区別が困難
  • 既存のセキュリティ対策 が無効化されるリスク

今後の認証方式への提言

  • 多要素認証パスワード+認証コード の併用推進
  • メールやSMSのみのワンタイムコード認証 の見直し
  • ユーザービリティとセキュリティ のバランス再考
  • パスワードマネージャーと連携可能な認証設計 の重要性
  • ユーザー教育 によるフィッシング耐性の強化

Hackerたちの意見

完全に同意するけど、The Changelog Podcastのおかげで考え方が変わったよ。要は、パスワードを保存したり管理したりする責任がないってことなんだよね。

支払い情報を入力するショップサイトがセキュリティを強化してるのはちょっと変だよね。例えば、IKEAがそうだね。

パスワードは絶対に保存しちゃダメだよ。ハッシュを保存するんだ。問題が見えないんだけど。もしハッシュを保持する自信がないなら、ユーザー情報を全く保存しない方がいいかもね。

これ、15年後に痛い目見る気がするけど、bcryptは本当に本当に間違えにくいよね。

じゃあ、彼らがパスワードを保管したくないっていうのは、安全に保つ責任を負いたくないからなんだよね?それなら、クレジットカードや他の個人情報を彼らに預けるのは信頼できるの?

だから?彼らが私のパスワードを保管したくないなら、代わりに私のアカウントのセキュリティを大幅に弱めるってこと?これはユーザーにとって良くないよ。

攻撃の流れはこんな感じだよ:1) ユーザーが悪いサイトに行ってサインアップする。2) 悪いサイトが「メールを送ったから、6桁のコードを入力してね!メールは良いサイトから来るよ、彼らがサインインパートナーだから。」って言う。3) 悪いサイトのボットがユーザーのメールを使って良いサイトで「メールのワンタイムコードでサインイン」フローを始める。4) 良いサイトがユーザーのメールアドレスにワンタイムログインコードのメールを送る。5) ユーザーはこのメールを信じやすい。だって良いサイトからだし、正しいログインじゃなかったら良いサイトが送るわけないじゃん。6) ユーザーが悪いサイトにコードを入力する。7) 悪いサイトがそのコードを使って良いサイトにユーザーとしてログインする。これで悪いサイトはユーザーの良いアカウントに完全にアクセスできる。だから「メールでワンタイムコードを送る」ってのはフィッシングにとって最悪の認証フローの一つなんだよね。ユーザーがこのミスをするのを止めるのが本当に難しい。「メールのリンクをクリックする」方が少しマシだけど、ユーザーを良いサイトに直接連れて行くし、そのリンクを悪いサイトに渡すのは面倒だから、より疑わしいよね。でも、もし人気のあるメールサービスが突然ログインメールやログインリンクをブロックし始めたら、多くのユーザーがログインできなくなる。パスキーが最適だと思う。パスキーに対するパスワードマネージャーのサポートもかなり良くなってきてるし、ユーザーが電話を失くしたときにパスキーが全部失われるのは、パスワードの問題よりずっとマシだよ。おばあちゃんが再度口座にアクセスするために銀行に行かなきゃならない方が、誰かにフィッシングされてお金を全部盗まれるよりはいいよね。

いい感じだけど、おばあちゃんが電話を失くした後に新しいパスワードを得るためにGoogleやMicrosoftに行かなきゃならないとしたら、どうするの?

ちょっと前に、これに似た「リンク/コードを送る」サインインアプローチを実装したんだけど、(多分)こんな風に悪用されないと思う - https://sriku.org/blog/2017/04/29/forget-password/ - その点についての意見があれば嬉しいな。ちなみに、これはパスキーが出る前の話で、今後はパスキーが主流になるかもね。

パスキーの問題は、デバイスを失ったときにアクセスを失うことだけじゃなくて、もっと複雑だよ(実際、設定によってはそうならないこともある)。一番の問題はアテステーションで、これがサービスに対して、自由度を高めるツールを使うユーザーをブロックさせるんだ。パスキー、あるいは一般的にチャレンジレスポンスプロトコルは、パスワードの素晴らしい代替品になり得たし、みんなにとってウィンウィンだったはずなのに。残念ながら、デザインの現実は、これが主にビッグテックの優位性をさらに強化し、ユーザーの自由を奪う方向に進んでいるってことだね。

パスキーは最良の選択だと思う。同期可能なパスキーとデバイスに縛られたパスキーの違いがもっとはっきりしてほしいな。セキュリティやユーザーフレンドリーさに関しては、今同じ言葉を使ってるのがすごく違うアプローチになってる気がする。そして、グランマに同期できないパスキーを渡すのは、本当に悪いアイデアだよ、理由はたくさんあるけどね。

パスキーは好きじゃないな。前はログインするのがこうだったんだよね:- ウェブサイトを開く - まだログインしてなかったら1Passwordにログイン - パスワードを自動入力 - TOTPを自動入力 でも今は:- ウェブサイトを開く - 1Passwordにログインしてたらパスキーを使うって表示される - もし表示されなかったら:- 1Passwordにログイン - パスキーを使うを選択 - ほとんど何も起きない - 「他の方法を使う」を選択 - 「パスワード」を選択 - 自動入力 - そしたら今度は2FAの方法を選ぶダイアログが出て、Authenticatorを選択 - 自動入力 パスキーが実際にコンピュータで何かを簡単にしてくれるなら最高なんだけど。スマホではうまくいくけど、そこにいる時間はあんまりないからね。

パスキーはこれからの流れだよ いや、少なくともそれだけじゃダメだよ。過ちを繰り返さないようにしよう。パスワードマネージャーが一番で、特別な例を除いては専用のMFAを使うべきだよ。例えば、メールアカウントや金融関連のものにはね。MFAは少なくとも3つの要素を設定させて、2つ以上を使うように求めるべきだよ。それに、印刷されたコードやOSに依存しない認証アプリ、YubiKeyみたいなハードウェアキーなど、ほとんどすべての要素をサポートしていないなら、使うべきじゃない。

おばあちゃんが銀行に行ってアカウントにアクセスする方がいい 銀行に行くのはいいけど、Gmailのパスワードを回復するためには誰に会いに行くの?

どんなウェブサイトがこれらの攻撃に脆弱なのかはよくわからないけど、二重認証があるウェブサイトはかなり安全だと思うよ。それに、パスワードを忘れたら、セキュアなリンク付きのメールが届くしね。このポイントは、ユーザーが注意を払っていないってことを意味してる。1) ユーザーが悪いウェブサイトに行ってサインアップする。ステップ2-7は1がなければ不可能だよ。

「メールのリンクをクリックする」ってのは、ユーザーを直接良いウェブサイトに連れて行くから、ちょっとだけマシだね。でも、そのリンクを悪いところに渡すのは面倒だから、より疑わしい。 "メールのリンクをクリックする"ってのは本当に悪いよ。メールとその中のリンクが正当かどうかを知るのがすごく難しいからね。メール内のリンクを信頼するのはフィッシング攻撃の扉を開くことになる。

おばあちゃんが銀行に行って再びアカウントにアクセスする方が、誰かにフィッシングされてお金を全部盗まれるよりはマシだよね。問題は、地元の銀行支店や職場のITヘルプデスクに物理的に行ってアカウントを取り戻すことはできるけど、GoogleplexやFacebook、Xitterの本社に行って同じことはできないってこと。デバイスに縛られたパスキーは、後者のシナリオでは非常にエラーが起こりやすいから、ユーザーはそのケースを考慮しないことが多いんだ。

すごく短くて、ひどく書かれた記事だね。フィッシングについても正しく説明できてないし…せめて脅威モデルを正しくラベル付けしてよ。前提は正しいけど、著者はより良いMFAの形について全く提案をしてない。

最初の要素はメールへのアクセスだよ。次の要素は…?

この記事はMFAについてじゃなくて、メールを単一要素として使うことについてだよ。

短い記事を読み間違えてるよ。最近流行ってる単一要素認証としてのメールについてなんだ。メールアドレスを入力するだけで、パスワードは不要、コードがメールで送られてくる。メールへのアクセスが唯一の認証なんだよ。

記事は複数要素認証についてじゃなくて、ワンタイムトークンを使ったシングルファクターのパスワードログインについてだよ。

このスレッドで見かけるこの認証方式に対する不満は2つあるね。1つ目は、フィッシングされやすいってこと。これは、ユーザーが手動で信頼できるUIにコードを入力する代わりに、Slackスタイルのマジックサインインリンクを使うことで大体解決できると思う。フィッシャーは、ユーザーにメールからURLをコピー&ペーストさせないといけないから、リンクをクリックしたりアドレスバーにペーストするのとは違って、かなり珍しい行動になる。だから、ほとんどのユーザーはそれを自然にやらないと思うよ(HTMLメールにURLを表示しないようにして、画像をクリックさせるようにすれば、さらに改善できるかもしれないけど、使い勝手の問題が出るかも)。完全にフィッシングされないわけじゃないけど、ユーザーから認証の秘密を完全に隠さずにできる限りの近道だと思う。パスキーやYubikeyみたいなのがあるけど、ほとんどのウェブサイトがそれに踏み切れないのは、エコシステムがまだ成熟してないからだと思う。2つ目は、真のマルチファクター認証じゃないってこと。攻撃者は1つのもの(メールボックス)を侵害するだけでアカウントを乗っ取れるからね。この主張には2つの反論がある。a. これはすでに、ほとんどの消費者向けウェブサイトがメールベースのパスワードリセットフローを持っている限り、当てはまる。リセットメールは、リクエストしてないユーザーが受け取ったら怪しむ可能性が高いから、フィッシングには少し強いけど、1つ目のポイントを見てね。b. 普通の消費者向けウェブサイトでの真のマルチファクター認証は、実際には機能してないし、特にパスワードマネージャーの時代では全く機能しない。パスワードマネージャーが存在する限り、ユーザーの電話やノートパソコンにログインしている人は、通常の所持ベースのセカンドファクターの前提条件を満たしているから、パスワードも取れる。ほとんどのウェブサイトは、ユーザーに知識ベースの認証を使わせるべきじゃない。なぜなら、秘密が本当にユーザーの記憶から来たのか、どこかに保存されていたのかが分からないから。後者のケースは実際にはもっと一般的で、前者の場合だけが本当に知識ベースなんだ。ウェブサイトは、デバイスだけを認証して、ユーザーを安全なマルチファクター方式で認証するタスクをデバイス自身の認証システム(物理的な所持やロックの秘密、バイオメトリクスを含む)に委ねるべきだと思う。

マジックリンクで遭遇した2つの問題がある。* 埋め込みブラウザでリンクを開くモバイルメールクライアント。これが混乱を招く人がいるんだ。彼らの視点からすると、ログインしっぱなしにはならないから、普通のブラウザを開くたびにセッションがない(埋め込みブラウザで作成されたから)から、再度ログインリンクをリクエストしないといけない。* ログインしたいデバイスにメールがない人もいる。コードを送ることでこの2つの問題は解決できるけど(でも、記事で述べられている問題が出てくるし、メール送信に関する問題も共通してる)。

これは、ユーザーが手動で信頼できるUIに入力するコードの代わりに、Slackスタイルのマジックサインインリンクを使うことで、ほとんど解決されていると思う。マジックリンクはコードよりも良いけど、デバイス間のサインインにはあまり向いてない。任天堂がやってることは素晴らしいよ:スイッチで何かを買うと、QRコードが表示されて、私はそれをスマホで撮影して購入を完了する。確かに「ほとんど解決されている」って言えるけど、これはユーザーがウェブサイトや会社にセキュリティを真剣に考えてほしいという「ベストプラクティス」からはまだ遠いね。 > a. これはすでに、メールベースのパスワードリセットフローがあれば当てはまるよ 私は全く同意しない:もし「こんにちは、あなたのパスワードをリセットしています。この手順に従って続けてください」っていうメールが来て、私がパスワードをリセットしようとしていなかったら、そのメールは無視するよ。数日ごとにメールからランダムな数字を入力しなきゃいけないなら、たぶん自動操縦でやっちゃうだろう。これらは同じことじゃない。 > ユーザーの電話やラップトップにログインしている誰でも(通常、所持ベースの2要素の前提条件)も、彼らのパスワードを取得できる。あなたが使っているデバイスがどんなものかは知らないけど、私の家のどのデバイスでもこれは真実じゃない。私のコンピュータやスマホで保存されたパスワードリストにアクセスするには、認証ステップが必要だよ。ログインしていてもね。メールやほかのほとんどのこと(銀行、Facebook、チャットなど)でも二段階認証が必要だから、友達に「私の電話を使ってSpotifyで何かを変えたり、地図で住所を調べたりしてもいいよ」って言うことはあまりない。 > ほとんどのウェブサイトは、ユーザーに対して知識ベースの認証を試みるべきじゃない。なぜなら、秘密が本当にユーザーの記憶から来たのか、どこかに保存されていたのかを知ることはできないから。彼らはそれを知ることはできないし、そう思わせるのは洗練された攻撃者(パスキーを回復できる)や、ウェブサイトの無能さ(チェックせずにリセットリンクを送る)に人々を危険にさらすことになる。 > ウェブサイトは代わりにデバイスだけを認証し、そのデバイスの認証システムに委任すべきだ 私は反対だ:ウェブサイトはデバイスを認証することはできないし、試みるのは愚かだよ。

TOTP MFA認証を提供するのは、パスワードとTOTPシードの間に最低限の境界を持っている人にとっては重要だよね。

ウェブサイトは、私がユーザーであってデバイスじゃないのに、デバイスだけを認証すべきだよ。>>私<<が認証されるべきであって、いつか切り替えるかもしれない特定のデバイスじゃない。

かなりイライラするのは、ほとんどの製品がこの方法を強制してくることだよね。普通のメール+パスワードやソーシャルログインを使わせてくれ!100文字のパスワードを使わせてよ!

そんなに長いパスワードってバカみたいだよね。結局、基盤となる暗号の鍵の長さで切り捨てられちゃうし。

あなたはターゲットオーディエンスじゃないし、特異な存在でもない。そろそろこれを受け入れて、「メインストリーム」とのインターフェースを持つための長期的な解決策を探す時期かもしれないね。

一日に4回、誰かが私のMicrosoftアカウントのパスワードリセットをリクエストしたっていうメール通知が来るんだ。それで、アカウントを回復するための6桁の番号が送られてくる。だから毎日、攻撃者はその番号を推測してアカウントを盗むチャンスが4回もあるんだ。彼らは何年もこれを続けてる。もし攻撃者が何千ものアカウントに対してこれをやってるなら、間違いなくアカウントをただ推測するだけで盗めるってことだよ。私はセキュリティレポートを書いて提出したけど、彼らはこれがセキュリティの脆弱性だと数学的に十分に示していないって言われた。だから、唯一の選択肢はスパムを受け取って、アカウントが盗まれないことを願うことだね。

自分のアカウントにログインエイリアスを追加したんだけど、これで通常のアカウントのユーザー名(つまり自分の公開メールアドレス)でのログインがブロックされて、エイリアス(公開されてないランダムな文字列)だけでログインできるようになった。エイリアスを有効にしてから、外国からのログイン試行は一度もないよ。設定は account.microsoft.com > アカウント情報 > サインインの設定 > メールを追加 > エイリアスを追加 でできて、エイリアスをプライマリにするのを忘れずに。その後、サインインの設定を変更して、エイリアスだけを有効にすればOK。

MFAを追加することで、これに対して保護されるんじゃないの?パスワードの上にTOTPがあれば、パスワードをリセットされても関係ないはずだよ。

それともMFAを有効にするって手もあるよね?

コードの長さは理想的には適応型で、こういうことが起きたら増えるべきだよね。

MFAでスクリプトの認証を5回実行してたんだけど、ある時、6回もMFAのプロンプトが出てきて、何の情報もなくて混乱した。5回目で「はい」をクリックしたのは攻撃だったのか、6回目が攻撃だったのか、それともただのシステムの「ひっかかり」だったのか?移行ジョブをキャンセルして最初からやり直すべきか、それとも賭けに出るべきか?文脈ゼロで「はい/いいえ」の質問をするのは本当に馬鹿げてるけど、これが数億のMicrosoft 365とAzureユーザーのデフォルトのMFA設定だったんだ。「このボタンを訓練されたオウムのように押して!やれ!これで第三者の監査によって『安全』だとされて、君の避けられないハッキングに対してはもう責任を負わないよ!」

私は(記事が明確にすべきだと思うけど)この記事が特にユーザーがボックスに入力しなきゃいけないコードの使用を批判していると思う。これは中間者攻撃を招くからね。この記事は、ユーザーがコードを入力せずにURLに従うメールベースのパスワードリセット/ログインを否定してるわけじゃない。6桁のコードは、悪意のあるウェブサイトやアプリが設置した偽のボックスに入力される可能性がある。これがユーザーと正当なサイトの間に挿入されているんだ。悪意のあるサイトは、ユーザーにコード付きのログインを促す偽のUIを表示する。裏では、悪意のあるサイトが正当なサイトに連絡して、コード付きのログインを引き起こす。ユーザーは受信トレイに行って、コードを悪意のあるサイトのUIにコピーする。そうすると、そのサイトはそれを使って正当なサイトとのセッションを取得し、ユーザーのアカウントを乗っ取る。SSLで保護されたURLはそんなに簡単に傍受されることはない。ユーザーがクリックすると、それは正当なサイトのドメインに飛ぶ。

この手のシステムに対する自分の主な不満は、セキュリティリスクを超えて、SpotifyみたいなシステムのひどいUXなんだ。ほとんどの人はログインしてそのままだけど、自分は頻繁にSpotifyアカウントを切り替えるから、ログインするのにパスワードを使ってる。パスワードか6桁のコードを選べる代わりに、アカウントを切り替えるたびに無駄に6桁のコードが生成されて、共有の受信箱に送られる。リソースとストレージの無駄遣いだし、このスレッドで指摘されてるようにセキュリティの懸念もある。

Spotifyは全体的にUXがひどいよね。曲名すらコピーできないし。マルチアカウントコンテナを試してみたら?ログアウトする必要もないし。(AndroidならIslandとか?)

これの一番悪いところは、ひどい習慣や期待をさらに強化してしまうことだよね。1passwordみたいな現代的なパスワードマネージャーを使う方が、バカなメールトークンの流れよりもずっと_簡単_、安全、速いんだ。最初は数台のデバイスで設定して、ちゃんと動くか確認するのに少し手間がかかるけど、家や車、職場の鍵を管理するのと同じくらいの労力だよ。新しい場所に引っ越したときにドアの鍵をコピーするなら、その鍵がちゃんと使えるかテストするよね。パスワードマネージャーも同じ。スマホにパスワードを保存して、別のデバイスでテストして、魔法の同期がちゃんと動くか確認する。それは鍵のコピーや、鍵屋が取り付ける新しいロックと同じだよ。人間はこれができるんだ。暗号や2FAを理解する必要はないけど、「新しいパスワードを作成」をクリックして、アプリに新しいサイトのために超安全なパスワードを保存させることができる。パスキーも同じで、内蔵デバイスストレージに保存しない限り、電話が壊れたときのバックアップ用のひどく隠れたユーザーインターフェースなんて気にしなくていいしね。皮肉なことに、古い流れの方がうまく機能するんだ!パスワードマネージャーに自動入力をさせれば、メールとパスワードの入力があれば1、2秒で済むし、パスキーはもっと速いかもしれない。

このタイプのログインでのもう一つのイライラポイントは、ユーザー名とパスワードの欄があると、Safariが自動で正しく入力してくれることなんだよね。でも、メールアドレスだけのサイトだと、自分で手動で入力しないといけない。ちなみに、俺はサイトごとに違うメールアドレスを使うことが多いから、これが面倒なんだよね。もし一つのメールしか使わない人なら、あんまり問題じゃないかも。