Erfahrungen beim Hacken einer Dating-App – und der falsche Umgang mit Sicherheitsforschern
(alexschapiro.com)- Bei der Dating-App Cerca führte die Kombination aus telefonnummernbasiertem Login und einer offengelegten API zu einem gefährlichen Zustand: Der OTP-Antwort war der Authentifizierungscode beigefügt, was bis zum Abruf personenbezogener Daten führen konnte
- Unter
api.cercadating.comwurden mit angehängtem App-Versions-Header die Endpunkte über openapi.json unter/docssichtbar; einige Requests konnten sogar Business-Logik wie das erzwungene Matchen manipulieren user/{user_id}lieferte allein mit einer gültigen Benutzer-ID PII wie Name, Standort, Geburtsdatum, Hochschule, Telefonnummer, E-Mail und Profilstatus zurück, was in Kombination mit der OTP-Schwachstelle zur Kontoübernahme führen konnte- Nach dem Kontozugriff waren für Nutzer mit eingereichten Dokumenten sogar Pass- oder Ausweisdaten, Selfie-URLs und private Nachrichten zugänglich; ein Verifikationsskript fand 6.117 Nutzer, 207 Nutzer mit hinterlegten Ausweisdaten und 19 als Yale-Studierende markierte Nutzer
- Die Schwachstelle wurde Cerca am 23. Februar 2025 gemeldet und am 24. Februar auch telefonisch besprochen, doch bis zur Veröffentlichung am 21. April gab es keine weiteren Antworten und keine Benachrichtigung der Nutzer; nur der Patch-Status wurde unabhängig verifiziert
Abgebrochene Reaktion nach der Meldung
- Die Dating-App Cerca hatte eine Sicherheitslücke in einer Dating-App, durch die private Nachrichten, Passdaten, sexuelle Präferenzen und weitere personenbezogene Daten offengelegt werden konnten
- Nach Entdeckung der Schwachstelle wurde das Cerca-Team am 23. Februar 2025 per E-Mail informiert; in einem Videogespräch am nächsten Tag wurden Schwachstelle, Gegenmaßnahmen und weitere Schritte besprochen
- Das Cerca-Team erkannte die Schwere des Problems an, bedankte sich für die verantwortungsvolle Offenlegung und versprach, die Schwachstelle zu beheben und betroffene Nutzer zu benachrichtigen
- Danach wurde am 5. März und 13. März um Updates zum Fix und zum Benachrichtigungsplan für Nutzer gebeten, doch bis zur Veröffentlichung am 21. April 2025 erfolgte keine Antwort
- Vor der Veröffentlichung wurde unabhängig bestätigt, dass die Schwachstelle gepatcht worden war; darauf basierte die Veröffentlichung
Kontozugriff begann beim OTP-Login
- Die App nutzte ausschließlich einen OTP-basierten Login, bei dem ein Code an die Telefonnummer gesendet wird
- Um die Netzwerkanfragen zu prüfen, wurden auf der iPhone-App mit Charles Proxy die App-Requests abgefangen
- In der Antwort, die das OTP auslöste, war das Einmalpasswort direkt enthalten
- In dieser Struktur war der Zugriff auf das betreffende Konto möglich, wenn nur die Telefonnummer des Nutzers bekannt war
- Weil dafür ein separater Weg nötig war, an Telefonnummern von Kontoinhabern zu gelangen, wurde anschließend die API auf Endpunkte untersucht
Endpunkte wurden durch die OpenAPI-Dokumentation sichtbar
- Für
api.cercadating.comwurden mit einem Directory Fuzzer Pfade enumeriert - Ohne appbezogene Header war kein Teil der Website erreichbar
- Als mit Gobuster Requests mit diesem Header gesendet wurden, wurde der Endpunkt
/docsgefunden, deropenapi.jsonbereitstellte - Mit der Match-and-Replace-Funktion von Burp Suite wurde eingestellt, den App-Versions-Header und das aus Charles Proxy extrahierte Bearer-Token immer anzuhängen
- Einige ungeschützte Endpunkte beeinflussten die Business-Logik; so waren sogar Requests möglich, die zwei Personen zwangsweise matchten
Offenlegung von Nutzerprofilen und personenbezogenen Daten
- Der Endpunkt
user/{user_id}gab bei einer gültigen Benutzer-ID verschiedenste personenbezogene Daten zurück - Die Antwort enthielt unter anderem folgende Informationen
- Name, Geschlecht, bevorzugtes Geschlecht, Stadt, Breitengrad und Längengrad
- Hochschul-E-Mail und Verifizierungsstatus, Branche, Beruf, Geburtsdatum, Körpergröße
- Hochschul-ID und Hochschulname, Status der Profilvervollständigung
- Status der National-ID-Verifizierung sowie Mobil- und E-Mail-Verifizierung
- Premium-Status, Kontoaktivität, Sperr- und Onboarding-Status
- Telefonnummer, E-Mail, Benutzer-ID, verbleibende Anzahl von Suchen
- Profilbilder, Match-Präferenzen, Nutzer-Prompts, gegenseitige Kontaktdaten, Erstellungs- und Änderungszeitpunkt, Alter usw.
- Mit einem Python-Skript konnten gültige Benutzer-IDs gefunden und Nutzerdaten in großem Umfang enumeriert werden
- Die zurückgegebenen Telefonnummern konnten zusammen mit der OTP-Schwachstelle für den vollständigen Kontozugriff genutzt werden
- Personenbezogene Daten der Nutzer waren also selbst ohne OTP-Login offengelegt
Zugriff bis hin zu Ausweisdokumenten und privaten Nachrichten
- Das Feld
national_id_verifiedzeigte, dass Pass- oder Ausweisdaten im System gespeichert wurden - Antworten im Zusammenhang mit Ausweisdokumenten enthielten folgende Informationen
verification_type:PASSPORTdocument_numberfront_side_urlback_side_urlselfie_url- Status, ID, Benutzer-ID
- Diese Informationen wurden nur eingeloggten Nutzern bereitgestellt, doch wegen der OTP-Schwachstelle war ein Login als beliebiger Nutzer möglich
- Für Nutzer mit eingereichten Dokumenten war die Struktur so, dass die ID-Daten jeder beliebigen Person eingesehen werden konnten; nach eigenen Angaben wurde das jedoch nicht tatsächlich getan
- Auch private Nachrichten mit potenziellen Dating-Partnern konnten eingesehen werden, und bei eingereichten Dokumenten sogar Passinformationen
Bestätigtes Ausmaß der Offenlegung
- Mit einem schnellen Skript wurde gezählt, wie viele Nutzer Informationen abrufbar hatten, wie viele als Yale-Studierende registriert waren und wie viele Ausweisdaten eingegeben hatten
- Das Skript stoppte, wenn es beim Durchzählen gültiger Benutzer-IDs 1.000 Mal in Folge keine gültige ID fand
- Diese Methode schließt nicht aus, dass es noch mehr Nutzer gab
- Cerca hatte angegeben, in der ersten Woche 10.000 Nutzer erreicht zu haben
- Bestätigt wurden folgende Zahlen
- 6.117 Nutzer
- 207 Nutzer mit hinterlegten Ausweisdaten
- 19 Nutzer, die als Yale-Studierende markiert waren
Datenschutzversprechen und tatsächliches Risiko
- In der Datenschutzerklärung von Cerca heißt es, Daten würden „durch Verschlüsselung und andere branchenübliche Maßnahmen geschützt“
- Verglichen mit dem tatsächlichen Zustand der Schwachstelle ist diese Aussage irreführend
- Betroffen sein konnten sexuelle Präferenzen, private Nachrichten und verschiedenste personenbezogene Daten
- Wenn böswillige Akteure Zugriff auf diese Informationen erhalten, kann das zu Identitätsdiebstahl, Stalking oder Erpressung führen
- Dating-Apps verarbeiten sensible Daten; deshalb sollte die Sicherheit der Nutzerdaten Vorrang vor der Geschwindigkeit beim App-Launch haben
1 Kommentare
Hacker-News-Kommentare
Diese App wirkt wie ein ziemlich frühes Projekt von Studierenden. Natürlich sollten sie ihr Bestes tun, um Sicherheits- und Kommunikationspraktiken ordentlich einzuhalten, aber wenn man bedenkt, dass auch „erwachsene Unternehmen“ mit großen VC-Investments bei ähnlichen Problemen miserabel reagieren, möchte ich nicht zu hart mit ihnen ins Gericht gehen.
https://georgetownvoice.com/2025/04/06/georgetown-students-c...
Das ist ähnlich wie bei einem Fahrer, der bei einem Unfall jemanden tötet, und dann stellt sich heraus, dass er nicht einmal einen Führerschein hatte.
Im Originalbeitrag steht, dass man das Cerca-Team im Februar kontaktiert habe; entweder war es also ein Fehler, der am Launch-Tag gefunden wurde, oder die zeitliche Abfolge ist irgendwie seltsam. So oder so handelt es sich um eine „zwei Monate alte Schwachstelle“ und eine „zwei Monate alte von Studierenden gebaute App/einen zwei Monate alten Dienst“.
Außerdem ist das kein Spaßprojekt, sondern ein kommerzielles Produkt. In-App-Käufe sind gelistet als Cerca App $9.99, Cerca App 3 month $9.99, 10 Swipes $2.99, 3 Swipes $0.99, 5 swipes $1.99, 3 Searches $1.99, 10 Searches $3.99, 5 Searches $2.99.
Als Ingenieur in einem kleinen Unternehmen mache ich mir manchmal Sorgen um meine persönliche Haftung. Es gibt so viele Unternehmen in nicht regulierten Branchen, in denen PCI oder HIPAA nicht greifen, und in kleinen Organisationen wird Sicherheit nicht als organisatorische Pflicht behandelt, sondern einfach als Engineering-Anliegen abgeschoben.
Das Produktteam konzentriert sich auf Features, PMs auf Zeitpläne, QA darauf, Bugs zu finden, und kaum jemand erhebt vernünftig die Stimme zum Thema Sicherheit. Von Ingenieuren wird nicht erwartet, viel mehr zu tun, als die Aufgaben im Board abzuarbeiten. Wenn man etwas ohne Auswirkungen auf den Zeitplan sicher machen kann, ist das gut; wenn nicht, bekommt man Druck von PMs und anderen.
Dann hört man Dinge wie: „Wie lange dauert das denn?“, „Wie hoch ist wirklich das Risiko, dass so etwas passiert?“, „Kümmern wir uns später um die Sicherheit und bringen erst mal das MVP zu den Kunden.“ Als Angestellter tue ich, was mein Arbeitgeber mir aufträgt; wenn das Unternehmen wegen eines Hacks oder Datenlecks verklagt wird, frage ich mich, ob ich persönlich haftbar gemacht werde, nur weil ich die einzige Person bin, die „es hätte wissen müssen“.
Allerdings ist der Mangel an Sicherheitsstandards in Organisationen jeder Größe erbärmlich. Neue Features auszuliefern scheint immer Vorrang davor zu haben, gute Security Practices sicherzustellen.
Ich verstehe aber, dass selbst das in einem Startup mit nur ein oder zwei Entwicklern schwierig ist. Wenn ich den Eindruck hätte, dass dort keine legalen Ziele verfolgt werden, würde ich wohl gehen.
Das ist nicht einfach, aber es ist wichtig und kann das gesamte Geschäft versenken, wenn man es nicht ernst nimmt.
Man braucht E-Mail-Aufzeichnungen, in denen man Bedenken wegen mangelnder Sicherheit vorgebracht hat, und Antworten der Vorgesetzten, in denen steht, man solle sich nicht darum kümmern. Ich weiß nicht, um welche Gerichtsbarkeit es geht, aber mir ist kein Fall bekannt, in dem ein gewöhnlicher Angestellter persönlich rechtlich für ein Datenleck haftbar gemacht wurde. Meist hat bei Datenlecks niemand echte Konsequenzen zu tragen, und das Unternehmen zahlt nur eine symbolische Strafe und macht weiter.
Um als Forscher die rechtliche Angriffsfläche zu verringern, hätte es wohl gereicht, ein zweites Konto anzulegen oder einen Freund ein Profil erstellen zu lassen und sich dessen Zustimmung zum Zugriff zu holen.
Um eine Enumeration-Schwachstelle nachzuweisen, muss man nicht tatsächlich Daten scrapen. Wenn meine ID 12345 ist und ein Freund sich anmeldet und 12357 erhält, reicht das als Beleg dafür, dass man die ID eines beliebigen Nutzers finden und auf dessen Profil zugreifen kann.
Wie andere gesagt haben: Um eine Schwachstelle zu verifizieren und offenzulegen, muss man nicht in diesem Umfang auf personenbezogene Daten anderer Nutzer zugreifen.
Zu wollen, dass personenbezogene Daten geschützt werden, sie aber gleichzeitig zu scrapen, um den Punkt zu beweisen, ist unnötig und heuchlerisch.
Der Text ist ziemlich verwirrend. Die Stelle, dass bei einem OTP-basierten Login in der Antwort auf die Anfrage nach dem Einmalpasswort das OTP direkt enthalten ist, ist unzureichend erklärt, aber vermutlich bedeutet es, dass es eine API wie api.cercadating.com/otp/ gibt und man durch Erraten einer Telefonnummer den OTP-Code erhalten kann, ohne diese Nummer zu besitzen.
Außerdem schreibt der Autor, er habe mit einem Skript, das stoppt, wenn es bei 1.000 aufeinanderfolgenden IDs keine gültigen Nutzer findet, 6.117 Personen gefunden, 207 Personen, die Ausweisdaten hinterlegt hatten, und 19 Personen, die angaben, Yale-Studierende zu sein. Ich bin mir nicht sicher, ob ihm klar ist, wie riskant das ist. Im Grunde ähnelt das der Methode, mit der weev AT&T kompromittiert hat, und er landete dafür im Gefängnis[0].
Das war zwar ein größeres Unternehmen und ein größerer Leak, aber ich würde nicht öffentlich damit prahlen, über eine Sicherheitslücke unbefugt auf Daten von Tausenden Menschen zugegriffen zu haben. Ich will hier keine Moralbewertung vornehmen, und ich finde, dass Sicherheitsforscher Spielraum zum Warnen haben sollten, aber das Gesetz ist Sicherheitsforschern gegenüber ziemlich ungnädig.
[0] https://en.wikipedia.org/wiki/Goatse_Security#AT&T/iPad_emai...
Den Angeklagten in diesem Fall wurde außerdem vorgeworfen, zugrunde liegende personenbezogene Daten veröffentlicht zu haben; hier sieht es nicht so aus, als wäre das passiert.
Ich habe bei einer anderen Dating-App etwas Ähnliches erlebt, und dort kam am Ende nie eine Antwort. Um die Aufmerksamkeit des Gründers zu bekommen, habe ich seinen Profiltext in „Bitte melde dich“ geändert, woraufhin er ein Backup wiederherstellte.
Ein paar Jahre später sah ich eine Instagram-Werbung und prüfte, ob das Problem noch bestand: Es war immer noch da. Wer nur die API-Endpunkte kannte, die sich leicht über App–Proxy–Server finden ließen, hatte vollständige Admin-Rechte und Zugriff auf alle Nachrichten, Matches usw.
Ich frage mich, ob ich noch einmal hingehen und es erneut versuchen sollte.
Bevor man sensible Informationen wie Reisepass- oder Adressdaten entgegennimmt, sollte man Menschen dazu zwingen, zweimal darüber nachzudenken. So etwas kann man nicht einfach als Kinder haben eine App gebaut abtun.
Bei einer Dating-Site würde es völlig reichen, wenn die API zum Ausweisstatus ein Boolean verified/not-verified oder einen Enum-Wert wie „not-verified“, „passport“ oder „drivers-license“ zurückgibt. Es gibt keinen echten Bedarf, Details im Client bzw. in der UI anzuzeigen.
Fälle wie Airline-Apps, bei denen man Reisedokumente für Einreise-/Ausreisezwecke auswählen muss, sind eine Ausnahme und können mehr Informationen anzeigen, aber wie in der United-App reicht es, nur die letzten paar Stellen der Passnummer zu zeigen. Ich würde hoffen, dass auch interne APIs nur so viel senden.
Oder notfalls könnten auch „staatsähnliche“ Akteure wie Apple oder Google das übernehmen.
https://en.wikipedia.org/wiki/General_Data_Protection_Regula...
Dass die API-Antwort auf die Anfrage das OTP zurückgibt, ergibt keinen Sinn. Warum sollte man das so machen?
Wenn man Sicherheit nicht bedenkt, ist das eine sehr plausible und offensichtliche Lösung. Dating-Apps gehören wegen der zwangsläufig vielen personenbezogenen Daten zu den riskantesten Arten von Apps, die man bauen kann; das hier ist furchtbar.
Bei schnellen Proofs of Concept oder MVPs verwendet man aus Zeitgründen oft direkt das Speichermodell als API-Antwort, daher kann so etwas leicht übersehen werden.
Als die neue Pinterest-API herauskam, verteilte sie an alle Apps mit OAuth-Integration sämtliche Nutzerdaten, sogar inklusive 2FA-Secret. Ich habe es gemeldet und eine Prämie bekommen, aber solche Dinge passieren selbst bei APIs großer Unternehmen, die es besser wissen müssten.
Es könnte am Framework liegen. Vermutlich wurde ein Objekt, das in die Datenbank geschrieben wird, direkt aus dem ORM oder einem anderen Speichersystem serialisiert und als HTTP-Antwort zurückgegeben.
https://yaledailynews.com/blog/2025/04/24/yale-student-expos...
Ein weiterer Artikel zu diesem Fall.
Ich wünschte, es gäbe Gesetze, die das Speichern personenbezogener Daten so gefährlich machen wie die Lagerung von Atommüll. Bei einem Leak sollte das Unternehmen mit ziemlicher Sicherheit bankrottgehen, und die Verantwortlichen sollten rechtlichen Risiken ausgesetzt sein.
Ich halte das für den besten Weg, die Anreize richtig zu setzen. Derzeit gibt es kaum Nachteile, möglichst viele Nutzerdaten zu speichern. Datenleck? Einen Entschuldigungs-Tweet posten und weitermachen.
Dann würde dieses Problem vielleicht die Aufmerksamkeit bekommen, die es verdient.
Wenn man „überhaupt keine Antwort erhalten hat“, ist es an der Zeit mitzuteilen, dass man die Schwachstelle nach 90 Tagen offenlegen wird, falls das Schweigen anhält