2要素認証(2FA)のSMS送信は、Webサービスのセキュリティ強化策として広く使われています。ログイン時にスマホへ届く6桁の数字コードを入力させることで、IDとパスワードだけより安全な認証を実現する仕組みです。しかし最近、SMS型2要素認証が突破される事例が急増しています。本記事では、SMS-OTP(ワンタイムパスワード)が突破される代表的な手口と、それを防ぐためにサービス提供者側が見直すべき3つの観点を解説します。
SMS-OTPはなぜ突破されるのか
SMS型2要素認証はその利便性ゆえに広く普及しましたが、複数の攻撃手口が知られています。代表的なものを整理します。
- SIMスワップ攻撃: 攻撃者が通信キャリアに被害者になりすまし、SIMの再発行を申請。被害者の電話番号を自分のSIMに移管し、SMSを受信する
- リアルタイムフィッシング: 偽サイトでID・パスワードを入力させ、攻撃者が同時に本物サイトでログイン。被害者宛てのSMS-OTPも偽サイトで入力させる中間者攻撃
- マルウェアによる盗聴: スマホに侵入したマルウェアがSMS受信を傍受、自動で攻撃者に転送
- スミッシング誘導: 「セキュリティのためコードを送ります」と偽SMSで誘導し、本物のコードを口頭で聞き出す
これらの手口に共通するのは「SMSさえ受信できれば突破できる」という前提を逆用していること。サービス提供者側は、SMSの送信方法・有効期限・頻度などの設計次第で攻撃を難しくできます。
観点① コード(OTP)の寿命を短くする
SMS-OTPの有効期限は、サービスにより5分〜30分とバラつきがあります。攻撃を難しくする最も簡単な改善は有効期限の短縮です。
- 推奨設定: 1〜3分以内、最長でも5分
- 理由: フィッシングサイト経由でコードを聞き出した攻撃者が本物サイトで使うまでに時間がかかるため、有効期限が短いほど成功率が下がる
- UX配慮: ユーザーがコードを入力するのに2分あれば通常は十分。「再送ボタン」を画面に大きく配置すれば短い有効期限でもストレスは少ない
15分以上の長い有効期限は、リアルタイムフィッシング攻撃に対する防御を実質的に無効化します。SMSサービスの送信制限と相談しつつ、できる限り短くしましょう。
観点② コードの桁数を最低6桁、可能なら8桁に
SMS-OTPの桁数は4桁・6桁・8桁が一般的です。桁数による総当たり攻撃への耐性は大きく変わります。
- 4桁: 1万通り。試行制限がないと数秒で総当たり可能。今すぐ廃止すべき
- 6桁: 100万通り。試行3回までなら現実的に総当たり困難
- 8桁: 1億通り。高セキュリティ要件のサービス(金融・医療)向け
これに加えて「試行回数制限」と「失敗時のロック」を必ず実装してください。3〜5回連続失敗で一定時間ロック、IPアドレスごとのレート制限も組み合わせます。これがないと、桁数を増やしても突破のリスクが残ります。
観点③ 送信頻度と「同一番号への連続送信」を制御する
第3の観点は、認証コード送信そのものの「送信制限」です。攻撃者が悪用するのは、サービスのSMS送信機能を踏み台にする「OTPボム」と呼ばれる攻撃です。被害者の電話番号宛てに大量のOTPを送信させ、SMS爆撃で迷惑をかけたり、本物のOTPを埋もれさせて見落とさせたりします。
具体的な制御策:
- 1分あたりの送信回数制限: 同一番号宛ては1分に1回まで
- 1時間あたりの送信回数制限: 同一番号宛ては1時間に最大5回
- 同一IPからの送信制限: 1IPから1分間に同一番号宛て送信できる回数を3回以下に制限
- 異常検知: 短時間に複数番号宛て送信する大量送信パターンを検知してアラート
SMS配信ベンダーがこれらの制御APIを提供しているかは、サービス選定時の重要なチェックポイントです。安価なベンダーには制御機能が欠けていることがあり、開発で独自実装するコストを考えると割高になります。
「SMS本文」も認証強化に使える
OTP送信のSMS本文も工夫の余地があります。フィッシング被害を抑える文面のコツを紹介します。
- 具体的なサービス名と用途を明示: 「○○のログイン認証コードです」と書く。ユーザーが「これは何のコードか」を判別できるようにする
- 「他人に教えないでください」の警告文を入れる: 「コードを尋ねる電話・メール・チャットは詐欺です」と明記。社会工学的攻撃を防ぐ
- 有効期限を本文に書く: 「○分以内に入力してください」
本文例:
【○○○○】ログイン認証コードは 123456 です(3分以内に入力)。 このコードを尋ねる電話・メール・チャットは詐欺です。絶対に教えないでください。
SMS-OTP以外の選択肢も組み合わせる
SMSによる認証はリスクがある一方、ユーザー全員に手間なく届く利便性も無視できません。最近の流れは「SMS-OTPを主としつつ、より強い認証方式を選択肢として提供する」という構成です。
- 認証アプリ(TOTP): Google Authenticator など。SMS不要、SIMスワップ無効
- パスキー(FIDO2): フィッシング耐性が極めて高い、生体認証連動
- セキュリティキー(物理デバイス): 金融・企業の高セキュリティ要件向け
ユーザー層に応じて「SMS / アプリ / パスキー」を選べる設計が理想です。一般ユーザーはSMS、セキュリティ意識の高いユーザーはパスキー、というふうに自己選択で使い分けられる仕組みです。
まとめ: 「SMS-OTPは安全」の前提を疑う設計を
SMS-OTPは依然として有効な2要素認証の選択肢ですが、設計次第で安全性が大きく変わります。本記事で挙げた「コード寿命の短縮」「桁数の確保」「送信頻度の制御」の3観点は、すぐに見直せる項目ばかりです。
SMS配信を導入している事業者様は、自社サービスのOTP設定を一度点検してみてください。攻撃者は最も弱いリンクを狙ってきます。SMS-OTPがその弱いリンクにならないよう、設計と運用のアップデートを継続することが重要です。