メインコンテンツへスキップ

パスワードリカバリーの落とし穴 - アカウント復旧が攻撃経路になるとき

この記事は約 12 分で読めます

パスワードリカバリー (アカウント復旧) は、ユーザーがアカウントへのアクセスを取り戻すための仕組みですが、皮肉にも認証セキュリティにおける最も脆弱なリンクの 1 つとなっています。攻撃者はパスワードそのものではなく、アカウント復旧フローを標的にするケースが増えています。復旧メカニズムがアカウントを保護するセキュリティ対策そのものを迂回してしまうためです。復旧フローは「正規の利用者が認証情報を失った状態」を前提に設計されるため、通常のログインより弱い証拠 (登録済みのメールアドレス、電話番号、秘密の質問の答え) で本人性を認めざるを得ません。この逆転が攻撃者にとっての妙味です。パスワードや二要素認証を破る必要はなく、公開プロフィールや過去の漏洩に散らばった弱い証拠を集めれば足りるからです。フィッシングと復旧フローの悪用は競合するのではなく、互いを補強し合う関係にあります。SMS ベースの復旧は「電話番号を保持していること」を本人性の証明として扱うため、攻撃者が携帯キャリアを説得して番号を移し替えると、SIM スワップだけでリセット経路と二要素認証の受信先を同時に引き継げてしまいます。本記事では、パスワードリカバリーシステムの構造的な脆弱性を明らかにし、ユーザーとサービス設計者の双方に向けた具体的な防御策を提示します。

メールベースリセットの構造的問題

メールによるパスワードリセットは最も普及している復旧手段ですが、セキュリティの観点からは「パスワードの強度をメールアカウントの強度に依存させる」という根本的な問題を抱えています。どれほど強力なパスワードを設定しても、メールアカウントが侵害されればリセットリンク経由で即座にアカウントを乗っ取られます。

技術的な脆弱性がこの問題をさらに深刻にしています。多くのサービスがリセットトークンの生成に十分なランダム性を確保していなかったり、適切な有効期限を設定していなかったりします。OWASP の 2023 年分析では、調査対象の Web アプリケーションの 12% が予測可能なトークン生成パターンを使用しており、8% がリセットトークンを 24 時間以上有効なまま放置していました。さらに、暗号化されていないメールで送信されるリセットリンクは、公衆 Wi-Fi ネットワーク上の中間者攻撃で傍受される可能性があります。すべてのリセットの基盤となるメールアカウントの保護については、メールアカウント保護ガイドを参照してください。

SMS リセットと SIM スワップの脅威

SMS ベースのパスワードリセットは、メールよりも安全と考えられていた時期がありました。しかし、その前提は「電話番号は本人しか受け取れない」という思い込みに依存していました。電話番号は利用者が握る秘密ではなくキャリアが管理する契約情報であり、その到達先は利用者の手元ではなくキャリアの本人確認手続きの強度で決まります。SIM スワップとは、攻撃者が携帯キャリアのカスタマーサポートを騙して (あるいは内部協力者を利用して)、ターゲットの電話番号を攻撃者の SIM カードに移し替える手法です。

FBI IC3 の年次報告書 (Internet Crime Report) では、SIM スワップは 2022 年から独立した犯罪類型として集計されており、申告件数と被害額は 2022 年が 2,026 件・約 7,265 万ドル、2023 年が 1,075 件・約 4,880 万ドル、2024 年が 982 件・約 2,598 万ドルと推移しています (2021 年分は年次報告書ではなく、FBI の公告 I-020822-PSA が 1,611 件・調整後被害額 6,800 万ドル超と公表)。件数も総額も 2022 年以降は減少に転じていますが、1 件成立したときの構造は変わりません。攻撃者は電話番号を掌握した後、SMS で送信されるパスワードリセットコードや二要素認証コードをすべて受信できるようになります。つまり、SMS ベースの復旧手段は、攻撃者にとって「パスワードも二要素認証も同時に突破できる」一石二鳥の攻撃経路なのです。

秘密の質問が「秘密」でない理由

秘密の質問は、答えが「秘密」ではなく「その人に関する事実」であるため、推測ではなく調査で突破できてしまう最も脆弱な復旧メカニズムの 1 つです。Google の 2015 年の画期的な研究「Secrets, Lies, and Account Recovery」では、37% のユーザーがセキュリティを高めるために意図的に虚偽の回答を設定していましたが、その虚偽の回答を忘れてしまい復旧不能になるケースが多発していました。逆に、「母親の旧姓」や「生まれた都市」といった一般的な質問への正直な回答は、ソーシャルエンジニアリングや公的記録の検索で容易に発見できます。

SNS の普及がこの問題をさらに悪化させています。Facebook のプロフィールには出身地や出身校が記載され、Instagram には家族やペットの写真が投稿されています。「最初に飼ったペットの名前は?」「卒業した高校は?」といった質問の答えは、ターゲットの SNS を 5 分間閲覧するだけで判明することが珍しくありません。秘密の質問を設定せざるを得ない場合は、質問とは無関係なランダムな文字列を回答として設定し、パスワードマネージャーに保存するのが最善策です。

リカバリーコードの安全な保管方法

二要素認証を設定すると、多くのサービスがバックアップ用のリカバリーコード (通常 8〜10 個の一次使用コード) を発行します。このリカバリーコードは、認証デバイスを紛失した場合の最後の砦ですが、その保管方法を誤ると新たな攻撃経路を生み出してしまいます。

最も危険な保管方法は、リカバリーコードをメールの下書きやクラウドメモに保存することです。メールアカウントが侵害されれば、リカバリーコードも同時に漏洩します。スクリーンショットとして写真ライブラリに保存するのも、クラウド同期経由で漏洩するリスクがあります。

推奨される保管方法は以下の 3 つです。第一に、パスワードマネージャーの安全なメモ機能に保存する方法。第二に、紙に印刷して耐火金庫に保管する方法。第三に、暗号化された USB ドライブにオフラインで保存する方法です。いずれの場合も、リカバリーコードの保管場所を 1 箇所に限定せず、2 箇所以上に分散保管することで、1 箇所が失われても復旧可能な状態を維持してください。

サービス設計者が犯しがちな復旧フローの設計ミス

パスワードリカバリーの脆弱性は、ユーザー側の問題だけではありません。サービス提供者側の設計にも構造的な問題が存在します。

  • リセットトークンの有効期限が長すぎる: 24 時間以上有効なトークンは、攻撃者に十分な時間を与える。推奨は 15〜30 分
  • リセット後に既存セッションを無効化しない: パスワードをリセットしても攻撃者の既存セッションが生き残り、アクセスが継続される
  • リセット試行回数に制限がない: 攻撃者がリセットリンクを大量に要求し、トークンの推測やタイミング攻撃を試みることが可能
  • リセット成功時にアカウント所有者に通知しない: 正規ユーザーが不正なリセットに気づく機会を逃す
  • 復旧フローで二要素認証をバイパスできる: パスワードリセットが完了すると二要素認証の再設定なしにログインできてしまう設計

ユーザーが今すぐ実行すべき防御策

  1. メールアカウントを最優先で保護する。パスつく.com で 20 文字以上のランダムパスワードを生成し、FIDO2 キーまたは認証アプリで二要素認証を有効化する
  2. SMS ベースの復旧は可能な限り避ける。代わりに認証アプリまたは FIDO2 キーを使用する。SMS が唯一の選択肢の場合は、キャリアに連絡して SIM 移行 PIN を設定する。詳細は二要素認証ガイドを参照
  3. 秘密の質問にはランダムな文字列を設定し、パスワードマネージャーに保存する。正直な回答は絶対に設定しない
  4. リカバリーコードは暗号化されたパスワードマネージャーと紙の印刷物の 2 箇所に分散保管する
  5. パスキー対応サービスではパスキーを導入する。パスキーベースの認証はパスワードリカバリーの問題を根本的に解消する。復旧すべきパスワードが存在しないためである

よくある質問

パスワードリセットのメールが届いたのに自分でリクエストしていない場合、どうすべきですか?
リセットリンクをクリックせず、直ちにそのサービスに自分でログインしてパスワードを変更してください。誰かがあなたのアカウントへのアクセスを試みている可能性があります。二要素認証が未設定であれば即座に有効化し、ログイン履歴に不審なアクセスがないか確認してください。同じメールアドレスを使用している他のサービスのパスワードも念のため変更することを推奨します。
SIM スワップ攻撃から身を守るにはどうすればよいですか?
携帯キャリアに連絡して SIM 移行時の追加認証 (PIN コードや対面確認) を設定してください。SMS ベースの二要素認証を認証アプリまたは FIDO2 セキュリティキーに切り替えることが最も効果的です。また、電話番号をパスワードリカバリーの唯一の手段にしないよう、複数の復旧手段を設定しておくことが重要です。
秘密の質問を安全に設定する方法はありますか?
質問の内容とは無関係なランダムな文字列を回答として設定し、パスワードマネージャーに保存するのが最善です。「母親の旧姓」に対して "xK9#mP2vL" のようなランダム文字列を設定すれば、SNS からの推測は不可能になります。正直な回答は絶対に設定しないでください。SNS で公開している情報から容易に推測されます。

この記事は役に立ちましたか?

関連用語