Da Twitter die Zwei-Faktor-Authentifizierung für Textnachrichten deaktiviert , dachte ich, dass es Spaß machen würde, tiefer in die Funktionsweise von SMS-Betrug einzutauchen und wie sich App-Entwickler davor schützen können.
Es ist eine faszinierende Geschichte über perverse Anreize, kurzsichtige Regulierung und technischen Einfallsreichtum.
Lasst uns eintauchen! 👇
Lassen Sie uns zunächst die jüngste Ankündigung von Twitter zusammenfassen:
Im Klartext bedeutet dies einfach, dass nur Nutzer der kostenpflichtigen Version von Twitter beim Login einen Code an ihr Telefon gesendet bekommen.
Der Schlüssel zum Verständnis von SMS-Betrug liegt darin, zu verstehen, dass es sich bei einigen Nummern um Premium- Nummern handelt. Wenn Sie diese Nummer anrufen oder eine SMS an sie senden möchten, kostet Sie das etwas Geld – normalerweise mehrere zehn Cent – und der Inhaber der Nummer erhält einen Teil dieser zehn Cent für sich.
Besitzer dieser Telefonnummern bieten in der Regel legitime Dienste an, deren Bereitstellung Geld kostet und die ihren Nutzern einen Mehrwert bieten, wie etwa Tele-Voting, Dating und technischen Support.
Diese Zahlen können jedoch leicht ausgenutzt werden, um Gewinn zu erzielen 🤑
Ein schlechter Schauspieler, nennen wir ihn Bob , ergattert mehrere Premium-Telefonnummern[1]. Bob könnte ein Hacker oder ein kaputter Mobilfunknetzbetreiber sein.
Bob findet einen Webdienst, der Textnachrichten an seine Premium-Telefonnummern sendet. Bei diesen Nachrichten kann es sich um Zwei-Faktor-Authentifizierungscodes, Einmalpasswörter oder jede andere Textnachricht handeln, die im Rahmen des Dienstes an den Benutzer gesendet wird (z. B. sendet partiful.com Ereigniserinnerungen per SMS).
Bob findet einen Weg, den Dienst dazu zu bringen, Tausende von SMS an seine Premium-Telefonnummern zu senden. Das könnte sehr einfach sein. Der Front-End-Dienst lässt sich möglicherweise leicht manipulieren und die Backend-Endpunkte sind möglicherweise ungeschützt und können leicht zurückentwickelt werden.
Schlimmer noch: Viele Dienste nutzen einen standardisierten Endpunkt für den SMS-Versand. Dies macht es für Bob wesentlich einfacher, Websites zu finden, die angegriffen werden können. Wenn der Dienst beispielsweise einen Drittanbieter zur Authentifizierung von Benutzern und zum Versenden von 2FA- oder OTP-Codes wie Auth0 nutzt, ist der Endpunkt für den SMS-Versand größtenteils bekannt: Bob muss lediglich einen Weg finden, die Auth0s zu ermitteln ID für einen Webdienst (ziemlich einfach, da das Frontend des Webdiensts eine Anfrage mit dieser ID stellt), und dann können sie alle Websites angreifen, die diesen Drittanbieterdienst nutzen.
Schließlich lässt Bob den Dienst Tausende von SMS an seine Premium-Telefonnummern senden. Der Webdienst verliert 💵💵💵 und Bob profitiert.
Es gibt kein Allheilmittel, um SMS-Betrug zu verhindern. Aber hier sind ein paar Ideen, die funktionieren könnten:
Wenn Sie einen Drittanbieterdienst zur Authentifizierung von Benutzern verwenden, z. B. Auth0, können Sie den Endpunkt verschleiern, der zum Senden von SMS verwendet wird. Dadurch wird ein Angriff zwar nicht vollständig verhindert, es wird jedoch deutlich schwieriger, festzustellen, ob ein Angriff möglich ist.
Ähnlich wie ein Fahrraddieb die am einfachsten zu stehlenden Fahrräder ins Visier nimmt, würde ein guter Hacker auf Webdienste ausweichen, die leichter zu hacken sind. Meiner Vermutung nach würde dieser Ansatz für die Longtail -Apps gut genug funktionieren.
Blockieren Sie alle Anfragen von IPs, die von Cloud-Anbietern oder betrügerischen ISPs stammen oder auf andere Weise fragwürdig sind. Dies sollte relativ einfach zu implementieren sein – es gibt viele Dienste, mit denen Sie die Qualität einer IP-Adresse bewerten können – und wäre wahrscheinlich sehr effektiv.
Fügen Sie dem Endpunkt, der SMS sendet, eine IP-basierte Ratenbegrenzung hinzu, um Bobs Angriff zu blockieren. Bei korrekter Einrichtung hat dies keine Auswirkungen auf legitime Benutzer. Dies funktioniert jedoch nur gegen einen einfachen Angriff. Wenn Bob seinen Angriff so gestalten würde, dass er Anfragen von verschiedenen IP-Adressen sendet – ein verteilter Angriff –, würde dies nicht funktionieren.
Senden Sie eine SMS nur wenige Male an eine bestimmte Telefonnummer, bevor Sie diese Telefonnummer für eine Bedenkzeit sperren. Wir könnten dies am Front-End tun, aber wenn Bob entschlossen ist, könnte er stattdessen den Backend-Endpunkt herausfinden, den er angreifen soll. Das Blockieren der Telefonnummer im Backend ist schwieriger: Es erfordert die Aufzeichnung der Telefonnummern und ihrer letzten Anmeldeversuche[2].
Zwingen Sie den Benutzer, ein CAPTCHA zu lösen, bevor Sie ihm eine SMS senden. Während dieser Ansatz beim Blockieren von Angreifern gut funktioniert – das Lösen des CAPTCHAs ist in großem Umfang schwierig und teuer – beeinträchtigt er jedoch die Erfahrung des Benutzers mit dem Dienst.
Identifizieren und blockieren Sie Premium -Telefonnummern mit libphonenumber . Obwohl dies vielversprechend erscheint, weiß ich nicht, wie zuverlässig die Daten sind und wie effektiv dieser Ansatz ist.
Senden Sie Textnachrichten nur an kostenpflichtige Konten. Dies ist der Ansatz, den Twitter gewählt hat. Es ist keine schlechte Option, aber wie Sie der obigen Liste entnehmen können, gibt es viele andere Ansätze, die Sie verfolgen können.
Blockieren Sie Mobilfunknetzbetreiber mit einer hohen Anzahl betrügerischer Nutzer. Dies würde eindeutig schlechte Netzwerkbetreiber blockieren, würde aber nicht gut funktionieren, wenn das Netzwerk viele legitime Benutzer hat.
Verwenden Sie stattdessen WhatsApp, um Nachrichten zu senden. WhatsApp ist im Gegensatz zu SMS kostenlos, aber nicht alle Benutzer auf der ganzen Welt nutzen WhatsApp[3].
Eine gute Lösung wäre es, genügend der oben genannten Ansätze zu nutzen und nach Zeitaufwand und Effektivität zu priorisieren, bis die Angreifer sich einfacheren Zielen zuwenden.
Ich habe einige persönliche Erfahrungen mit der Umsetzung der oben genannten Maßnahmen und kann ein oder zwei Geschichten darüber erzählen, wie mein Team mit den Folgen umgegangen ist. Aber das ist eine Geschichte für ein anderes Mal… 👨💻
Das bringt mich zu meinem letzten Punkt:
Meiner Meinung nach hat Twilio – eine dominierende SMS-API – eine große Chance, SMS-Betrugsschutz als (kostenloses? 🙏) Add-on zu seinen Standard-APIs anzubieten.
Da Twilio über Daten zu betrügerischen Telefonnummern und Mobilfunkanbietern in allen seinen Konten verfügt, ist Twilio in der einzigartigen Position, fehlerhafte Nummern und Mobilfunkanbieter schnell zu blockieren – bevor sie für mehrere Webdienste zu einem großen Problem werden.
Twilio kann mithilfe von Silent Network Auth – einem Authentifizierungsmechanismus der nächsten Generation – sogar ungültige Telefonnummern direkt erkennen, und es scheint, dass dieses Dienstprogramm von allen Benutzern gemeinsam genutzt werden sollte.
Ich würde gerne weitere Gedanken, Ideen und Ansätze hören, die die Leute verwendet haben – teilen Sie sie bitte mit, indem Sie unten einen Kommentar schreiben, dann können wir alle lernen.
Das war’s fürs Erste – schützen Sie diese Endpunkte und wünschen Ihnen eine tolle Woche!
Es gibt eine ausgezeichnete Diskussion auf HackerNews.
[1] Beachten Sie, dass diese Premium-Telefonnummern nicht einmal funktionieren müssen: Sie müssen nicht mit einer funktionierenden und bei einem Telefon registrierten SIM-Karte verbunden sein. Solange sie weitergeleitet werden können, können sie bei diesem Angriff verwendet werden.
[2] Ich bin gespannt, ob es eine gute Datenstruktur und einen guten Algorithmus gibt, um dies effizient und maßstabsgetreu zu gestalten. Bitte teilen Sie es mit, wenn Sie eines kennen!
[3] Dank geht an @csharpminor auf HN für ihren Vorschlag .
Ich bin Apu , CTO von koodos und Ingenieur.
Dieser Beitrag erschien ursprünglich auf meinem persönlichen Blog – abonnieren Sie ihn für mehr Likes!