Twitter がテキスト メッセージの 2 要素認証を無効にしているため、SMS 詐欺がどのように機能するのか、そしてアプリ開発者がそれをどのように防御できるのかを詳しく調べてみるのは面白いだろうと思いました。
これは、倒錯的なインセンティブ、近視眼的な規制、技術的な創意工夫に関する興味深い物語です。
掘り下げてみましょう! 👇
まず、Twitter の最近の発表を要約しましょう。
簡単に言うと、これは単に、有料版の Twitter のユーザーのみがログイン時に携帯電話にコードを送信されることを意味します。
SMS 詐欺を理解する鍵は、一部の番号がプレミアムであることを理解することです。この番号に電話をかけたり SMS を送信したりするには、通常は数十セントの費用がかかり、その番号の所有者はその数十セントの一部を自分用に受け取ります。
これらの電話番号の所有者は通常、電話投票、デート、技術サポートなど、ユーザーに価値を提供するのに費用がかかる正規のサービスを提供しています。
ただし、これらの数字は簡単に利益を得るために利用できる可能性があります 🤑
悪役 (彼をボブと呼びましょう) は、いくつかのプレミアム電話番号を入手します[1]。ボブはハッカーである可能性もあれば、経営破綻した携帯電話ネットワーク事業者である可能性もあります。
ボブは、自分のプレミアム電話番号にテキスト メッセージを送信する Web サービスを見つけました。これらのメッセージは、2 要素認証コード、ワンタイム パスワード、またはサービスの一部としてユーザーに送信されるその他のテキスト メッセージ (たとえば、partiful.com がSMS 経由でイベント リマインダーを送信する) である可能性があります。
ボブは、このサービスで自分の高級電話番号に何千もの SMS を送信する方法を見つけました。これはとても簡単かもしれません。フロントエンド サービスは操作が簡単ですが、バックエンド エンドポイントは保護されておらず、リバース エンジニアリングが簡単である可能性があります。
さらに悪いことに、多くのサービスは SMS の送信に標準化されたエンドポイントを使用しています。これにより、ボブが攻撃対象のサイトを見つけるのが非常に簡単になります。たとえば、サービスがユーザーの認証と 2FA または OTP コード (Auth0 など) の送信にサードパーティを使用する場合、SMS を送信するエンドポイントはほとんどわかっています。ボブが行う必要があるのは、Auth0 を検出する方法を見つけることだけです。 Web サービスの ID (Web サービスのフロントエンドがこの ID を含むリクエストを作成するため、かなり簡単です)、その後、そのサードパーティ サービスを使用するすべてのサイトを攻撃できます。
最後に、ボブはこのサービスで自分のプレミアム電話番号に数千の SMS を送信します。 Web サービスは 💵💵💵 を失い、Bob は利益を得ます。
SMS 詐欺を防ぐ特効薬はありません。ただし、有効なアイデアがいくつかあります。
Auth0 などのサードパーティ サービスを使用してユーザーを認証する場合は、SMS の送信に使用されるエンドポイントを難読化することができます。これによって攻撃を完全に防ぐことはできませんが、攻撃の可能性を発見するのがはるかに困難になります。
自転車泥棒が最も盗みやすい自転車を狙うのと同じように、優れたハッカーはハッキングが容易な Web サービスに移ります。私の予感としては、このアプローチはアプリのロングテールには十分に機能するだろうということです。
クラウド プロバイダー、詐欺的な ISP、またはその他の危険な IP からのリクエストをすべてブロックします。これは実装が非常に簡単で、IP アドレスの品質を評価できるサービスが多数存在しており、おそらく非常に効果的です。
SMS を送信するエンドポイントに IP ベースのレート制限を追加して、Bob の攻撃をブロックします。正しく設定されていれば、正規のユーザーには影響しません。ただし、これは単純な攻撃に対してのみ機能します。ボブがさまざまな IP アドレスからリクエストを送信する攻撃を設計した場合 (分散攻撃)、これは機能しません。
クールオフ期間中その電話番号をブロックする前に、特定の電話番号に SMS を少数回送信するだけにしてください。フロントエンドでこれを行うこともできますが、ボブが決意した場合は、代わりに攻撃するバックエンド エンドポイントを見つけ出すこともできます。バックエンドで電話番号をブロックするのはより困難です。電話番号とその最近のログイン試行の記録を保持する必要があります[2]。
SMS を送信する前に、ユーザーに CAPTCHA を解決するよう強制します。このアプローチは攻撃者をブロックするのには効果的ですが、CAPTCHA の解決は大規模に行うのが難しく、コストがかかりますが、サービスのユーザー エクスペリエンスは低下します。
libphonenumber を使用して、プレミアム料金の電話番号を識別してブロックします。これは有望に思えますが、データがどれほど信頼できるのか、このアプローチがどれほど効果的であるのかはわかりません。
テキスト メッセージは有料アカウントにのみ送信してください。これがTwitterが採用したアプローチです。それは悪い選択肢ではありませんが、上記のリストからわかるように、他にも多くのアプローチが可能です。
不正ユーザーが多い携帯電話ネットワーク事業者をブロックします。これは明らかに悪質なネットワーク オペレーターをブロックしますが、ネットワークに正規のユーザーが多数いる場合はうまく機能しません。
代わりに WhatsApp を使用してメッセージを送信してください。 WhatsApp は SMS とは異なり無料ですが、世界中のすべてのユーザーが WhatsApp を使用しているわけではありません[3]。
優れたソリューションでは、攻撃者がより簡単なターゲットに移動するまで、時間の投資と有効性を優先して上記のアプローチを十分に活用します。
私には上記の対策を実施した個人的な経験があり、チームが影響を及ぼした際にどのように対処したかについて 1 つまたは 2 つ共有したいことがあります。でも、それはまた別の機会に…👨💻
これが私の最後のポイントになります。
IMO の Twilio (有力な SMS API) には、標準 API への (無料? 🙏) アドオンとして SMS 詐欺防止機能を提供する大きなチャンスがあります。
Twilio はすべてのアカウントにわたって不正な電話番号と通信事業者に関するデータを保有しているため、複数の Web サービスで大きな問題になる前に、不正な電話番号と通信事業者を迅速にブロックできる独自の立場にあります。
Twilio は、次世代の認証メカニズムであるSilent Network Authを使用して無効な電話番号を完全に検出することもでき、このユーティリティはユーザー間で共有されるべきだと感じています。
他の人が使用した考え、アイデア、アプローチがあればぜひ聞きたいです。以下にコメントを書いて共有してください。そうすれば、私たち全員が学ぶことができます。
今のところはここまでです。エンドポイントを保護して、素晴らしい一週間をお過ごしください。
HackerNews に素晴らしいディスカッションがあります。
[1] これらのプレミアム電話番号は機能する必要さえないことに注意してください。機能していて電話に登録されている SIM カードに接続する必要はありません。ルーティングできる限り、この攻撃に使用できます。
[2] これを効率的かつ大規模に動作させるための優れたデータ構造とアルゴリズムがあるかどうかに興味があります。ご存知の方はぜひシェアしてください!
[3]提案に対する HN の @csharminor の功績です。