こんにちは!👋 OWASP Top 10 攻略シリーズ、今回は2017年の「Broken Authentication」からより包括的な名称に変更されたA07:2021-識別と認証の失敗(Identification and Authentication Failures)について見ていきましょう。
皆さんの家の玄関ドアが頑丈な鍵で閉まっていても、その鍵があまりにも一般的だったり(簡単なパスワード)、鍵束が誰にでも見られる状態だったらどうなるでしょうか?😱 このように「識別と認証の失敗」は、ユーザーが誰であるかを確認する過程(識別)と、その身元を検証する過程(認証)に欠陥があるために発生する脆弱性です。私たちのサービスの最初の関門であるログインシステムがどれほど堅牢か、今から一緒に確認してみましょう!🕵️♀️

🤔 識別と認証の失敗?それは何ですか?
「あなたが誰であるか、そしてあなたが本人であるかを確認する過程で問題が発生すること」 👥➡️❓
識別と認証の失敗は、アプリケーションがユーザーの身元(Identification)を適切に確認できないか、身元を検証するメカニズム(Authentication)が脆弱であるか、または誤って実装されているために発生するセキュリティ問題です。簡単に言えば、システムが「ログインしようとしている人が本当にその人なのか」確信できないすべての状況を含みます。
この脆弱性は、攻撃者が正規ユーザーのアカウント(ID、パスワード)を奪取したり、ログインプロセスを完全に迂回してシステムにアクセスすることを許可する可能性があるため、非常に致命的です。一度アカウントが奪取されると、攻撃者はそのユーザーの権限で全ての操作を実行できます。
🕵️♂️ よく見られる識別と認証の失敗事例
どのような場合に識別と認証が「失敗」したと言えるでしょうか?
1. 弱すぎる、または予測可能なパスワード 🔑
最も基本的で、最も一般的な問題です。
- 問題点: サービスがユーザーにpassword123、123456、qwertyなどの簡単すぎる、または一般的なパスワードを許可している場合です。攻撃者は辞書攻撃(Dictionary Attack)やブルートフォース攻撃(Brute-force Attack)を通じて、これらのパスワードを簡単に推測し、アカウントを奪取することができます。
- 事例: パスワードの最小長、大文字小文字、数字、特殊文字の組み合わせなどの複雑性ポリシーがないか、または弱すぎる場合。
2. 不適切なパスワードリセット/回復メカニズム 🔄
パスワードを忘れた際の利便性が、時には毒になります。
- 問題点: 「パスワードのヒント」の質問が簡単すぎる(例:「母親の旧姓は?」)ため、攻撃者がSNSなどの公開情報を通じて回答を推測し、アカウント奪取を試みることができます。または、パスワードリセットリンクが簡単に予測可能であったり、有効期限がない場合もあります。
- 事例: パスワードリセット時にユーザーIDだけでリセットメールを送信できるが、メールアドレスの確認なしに単に「成功」メッセージだけを表示する場合。(アカウントの存在を露呈)
3. セッション管理の脆弱性 👻
ログイン後も安全でなければなりません。
- 問題点: ログインに成功するとユーザーにセッショントークンが発行されますが、このトークンが短すぎたり予測可能であるため、攻撃者が奪取したり偽造したりできる場合です。または、ログアウト時にセッションが適切に無効化されず、攻撃者が奪取したセッションでログイン状態を維持し続けることができる場合もあります。
- 事例: セッションIDがURLに露出したり、HttpOnlyおよびSecure属性が設定されていないため、XSS攻撃などでセッションクッキーが奪取される場合。
4. 多要素認証(MFA)の欠如または脆弱性 📱
一つの鍵だけでは不十分です。
- 問題点: 重要なアカウントに多要素認証(Multi-Factor Authentication, MFA)が適用されていないか、適用されていてもMFAコードを無制限に試行できる場合です。
- 事例: SMSで2段階認証コードを送信する機能があるが、コードを複数回間違えても試行を続けられるため、ブルートフォース攻撃に脆弱な場合。
5. アカウントロックアウトおよびレート制限の欠如 🚫
無限の試行はいつか成功します。
- 問題点: ログイン試行失敗時にアカウントをロックしたり、特定の時間内にログイン試行回数を制限する機能(Rate Limiting)がない場合です。攻撃者はこれを利用して、無限にログイン情報を推測したり、存在するアカウントを特定したりすることができます。
- 事例: ログインページで特定のIDに対してパスワードを100万回試行してもアカウントがロックされたり、IPアドレスがブロックされたりしない場合。
🛡️ どうすれば防げるでしょうか?(防御方法)
識別と認証の失敗はサービスの最初の関門であるため、最も堅固に構築されるべきです。
- 強力なパスワードポリシーの強制 🔐:
- 最小長、大文字小文字、数字、特殊文字の組み合わせなど、複雑性要件を設定し、強制する必要があります。
- すでに流出したパスワードリスト(HaveIBeenPwned APIなど)と照合し、使用を禁止する必要があります。
- パスワードは必ずソルト(Salt)を使用した強力なハッシュアルゴリズム(Bcrypt、Argon2など)で保存する必要があります。
- 多要素認証(MFA)の導入 📱✔️: 可能な限り全ての重要アカウントに多要素認証を義務付けるか、強く推奨する必要があります。(例:OTP、SMS認証、生体認証)
- アカウントロックアウトおよびレート制限の適用 🚫⏰:
- 一定回数以上のログイン試行失敗時にアカウントをロックするか、一定時間そのIPアドレス/ユーザーからのログイン試行を制限する必要があります。
- ユーザーIDが存在しないなどの情報漏洩を避けるため、ログイン失敗時には常に一般的なエラーメッセージ(「IDまたはパスワードが正しくありません。」)を表示してください。
- 安全なセッション管理 🍪:
- セッションIDは予測不可能でランダム性の高い値を使用する必要があります。
- セッションクッキーにSecure、HttpOnlyフラグを設定し、XSSなどによる奪取を防ぎます。
- ログアウト時にセッションを即座に無効化し、セッションの有効期限を適切に設定する必要があります。
- パスワードリセット/回復メカニズムの強化 🔒➡️✉️:
- リセットリンクは使い捨てで、短い有効期限を持つ必要があります。
- ユーザーが簡単に推測できる「セキュリティ質問」は避けるべきです。
- メールまたはSMSによる認証時、無制限の試行を防ぐレート制限を適用する必要があります。
✨ 終わりに
識別と認証の失敗は、あらゆる攻撃の出発点となり得る非常に重要な脆弱性です。私たちのサービスがどれほど優れていても、最初の関門が甘ければ全てが無意味になります。開発の初期段階から強力な認証メカニズムを設計・実装し、継続的に点検・改善することが不可欠です。
私たちのサービスの玄関ドアを頑丈にし、鍵の管理を徹底してハッカーの侵入を防ぎましょう!🏡💪
タグ: OWASP, A07, Authentication Failures, 識別, 認証, パスワードセキュリティ, MFA, セッション管理, アカウント奪取
コメントを残す