デートアプリをハッキングした経験、そしてセキュリティ研究者への誤った対応
(alexschapiro.com)- Cerca Dating Appは電話番号ベースのログインと露出したAPIが重なり、OTPレスポンスに認証コードが含まれ、個人情報の照会にまでつながり得る危険な状態だった
api.cercadating.comはアプリバージョンのヘッダーを付けると、/docsの openapi.json からエンドポイントが露出し、一部のリクエストでは強制マッチングのようなビジネスロジックまで操作できたuser/{user_id}は有効なユーザーIDだけで、名前、位置、生年月日、学校、電話番号、メールアドレス、プロフィール状態などの PII を返し、OTP脆弱性と組み合わさるとアカウント乗っ取りにつながり得た- アカウントにアクセスした後は、提出済みのユーザーに限りパスポートまたは身分証明書情報、セルフィーURL、私的なメッセージにまでアクセス可能で、確認スクリプトによりユーザー6,117人、ID情報入力者207人、Yale学生と表示されたユーザー19人が見つかった
- 脆弱性は2025年2月23日にCercaへ報告され、2月24日には通話も行われたが、4月21日の公開時点まで追加の回答やユーザー通知はなく、パッチ適用の有無だけが独立に確認された
報告後に途絶えた対応
- Cerca Dating Appには、私的なメッセージ、パスポート情報、性的嗜好、その他の個人情報が露出し得るデートアプリのセキュリティ脆弱性があった
- 脆弱性を発見した後、2025年2月23日にCercaチームへメールで報告し、翌日のビデオ通話で脆弱性、緩和策、フォローアップ対応について議論した
- Cercaチームは問題の深刻さを認め、責任ある開示に感謝し、脆弱性の修正と影響を受けたユーザーへの通知を約束した
- その後、3月5日と3月13日に修正およびユーザー通知計画のアップデートを求めたが、2025年4月21日の公開時点まで返答はなかった
- 公開前に脆弱性がパッチ適用済みであることは独立に確認されており、それを踏まえて公開が行われた
OTPログインから始まったアカウントアクセス
- アプリは電話番号にコードを送るOTPベースのログインのみを使用していた
- ネットワークリクエストを確認するため、iPhoneアプリで Charles Proxy を使ってアプリのリクエストを傍受した
- OTPをトリガーするレスポンス内に、ワンタイムパスワードが直接含まれていた
- この構造では、ユーザーの電話番号さえ分かればそのアカウントにアクセスできた
- アカウント所有者の電話番号を見つける別経路が必要になり、APIエンドポイントの探索へつながった
OpenAPIドキュメントで露出したエンドポイント
api.cercadating.comに対してディレクトリファザーを使い、パスを列挙した- アプリ関連ヘッダーなしでは、サイトのどの部分にもアクセスできなかった
- Gobuster にそのヘッダーを付けてリクエストすると
/docsエンドポイントが見つかり、そこでopenapi.jsonが提供されていた - Burp Suiteのmatch-and-replace機能で、アプリバージョンヘッダーとCharles Proxyから抽出したbearer tokenを常に付与するよう設定した
- 一部の保護されていないエンドポイントはビジネスロジックに影響を与え、2人を強制的にマッチングさせるリクエストも可能だった
ユーザープロフィールと個人情報の露出
user/{user_id}エンドポイントは、有効なユーザーIDを受け取ると多様な個人情報を返した- レスポンスには次の情報が含まれていた
- 名前、性別、関心のある性別、都市、緯度・経度
- 学校メールアドレスと認証状態、業界、職業、生年月日、身長
- 学校IDと学校名、プロフィール完了の有無
- 国籍ID認証の有無、モバイル・メール認証の有無
- プレミアム状態、アカウントの有効・一時停止・オンボーディング状態
- 電話番号、メールアドレス、ユーザーID、検索残り回数
- プロフィール画像、マッチング希望条件、ユーザープロンプト、相互連絡先情報、作成・更新時刻、年齢など
- Pythonスクリプトで有効なユーザーIDを見つけ、ユーザーデータを大量に列挙できた
- 返された電話番号はOTP脆弱性と組み合わされ、アカウント全体へのアクセスに使われ得た
- OTPログインなしでもユーザーの個人情報が露出している状態だった
身分証と私的メッセージにまでつながったアクセス
national_id_verifiedフィールドは、パスポートまたは身分証明書情報がシステムに保存されていることを示している- 身分証関連のレスポンスには次の情報が含まれていた
verification_type:PASSPORTdocument_numberfront_side_urlback_side_urlselfie_url- 状態、ID、ユーザーID
- この情報はログイン済みユーザーにのみ提供されるが、OTP脆弱性により任意のユーザーとしてログインできる状態だった
- 提出済みのユーザーについては誰のID情報でも見られる構造だったが、実際にはそうしなかったと述べている
- 潜在的なデート相手との個人メッセージも見られ、提出済みの場合はパスポート情報にまでアクセス可能だった
確認された露出規模
- 簡単なスクリプトで、情報を取得できるユーザー数、Yaleの学生として登録されたユーザー数、ID情報を入力したユーザー数を集計した
- スクリプトは有効なユーザーIDを数え、1,000件連続で有効なIDが見つからなければ停止する方式だった
- この方式は、さらに多くのユーザーがいる可能性を排除するものではない
- Cercaは最初の週のユーザー数を1万人と発表していた
- 確認された数値は次の通り
- ユーザー 6,117人
- ID情報を入力したユーザー 207人
- Yaleの学生だと表示したユーザー 19人
個人情報保護の約束と実際のリスク
- Cercaのプライバシーポリシーは「暗号化およびその他の業界標準の措置でデータを保護する」と述べている
- 実際の脆弱性の状態と比較すると、この文言は誤解を招くおそれがある
- 露出対象には性的嗜好、私的なメッセージ、多様な個人情報が含まれ得た
- 悪意あるユーザーがその情報にアクセスすれば、なりすまし、ストーキング、脅迫といった結果につながり得る
- デートアプリは機微なデータを扱うため、アプリ公開のスピードよりもユーザーデータのセキュリティが優先されるべきだ
1件のコメント
Hacker Newsのコメント
このアプリは、大学生が作ったかなり初期段階のプロジェクトに見える。セキュリティとコミュニケーションの慣行をきちんと守るよう最善を尽くすべきなのは確かだが、似たような問題で大手VCから投資を受けた「大人の会社」でもひどい対応をすることを考えると、あまり厳しく責め立てたいとは思わない。
https://georgetownvoice.com/2025/04/06/georgetown-students-c...
運転手が事故で人を死なせたが、実は免許すら持っていなかった、というケースに似ている。
元記事では2月にCercaチームへ連絡したとあるので、リリース日に見つかった欠陥なのか、何かおかしな構造なのだろう。いずれにせよ「2か月前からある脆弱性」であり、「2か月前に学生が作ったアプリ/サービス」でもある。
しかも趣味で作ったものではなく商用製品だ。アプリ内購入として、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が掲載されている。
小さな会社のエンジニアとして、時々自分の個人責任が心配になる。PCIやHIPAAが適用されない非規制業種で運営されている会社は非常に多く、小さな組織ではセキュリティが組織レベルの責務ではなく、単なるエンジニアリング上の関心事に追いやられる。
プロダクトチームは機能、PMはスケジュール、QAはバグ発見に集中し、セキュリティについて合理的に声を上げる人はめったにいない。エンジニアには、ボードに上がった作業を終える以上のことは期待されない。スケジュールに影響を出さず安全に作れるならよいが、そうでなければPMなどから圧力を受ける。
「それはどれくらい時間がかかるのか」「実際にそんなことが起きるリスクはどれくらいあるのか」「セキュリティ対応は後でやって、まずはMVPを顧客に出そう」といったことを言われる。従業員としては雇用主に指示された仕事をしているのに、ハッキングやデータ漏えいで会社が訴えられたら、「知っているべきだった」唯一の人物だという理由で、自分が個人的に責任を負うことになるのだろうかと思ってしまう。
ただし、規模を問わず組織全体でセキュリティ基準が欠けているのは嘆かわしい。良いセキュリティ慣行を保証することより、新機能のリリースが常に優先されているように見える。
ただ、スタートアップで開発者が1人か2人しかいないなら、これすら難しいのは理解できる。合法的なことを追求していないと感じたら、自分なら去ると思う。
簡単ではないが、真剣に扱わなければ事業そのものを沈めかねない重要なことだ。
セキュリティ不足への懸念を提起したメールの記録と、上司が気にするなと返した記録が必要だ。どの地域かは分からないが、一般従業員個人がデータ漏えいについて法的責任を負った事例は知らない。通常、データ漏えいでは誰も実質的な結果を被らず、会社が形式的な罰金だけ払って済むことが多い。
研究者として法的リスクを減らすには、2つ目のアカウントを作るか、友人にプロフィールを作ってもらい、アクセスの同意を得る程度で十分だったはずだ。
列挙脆弱性を証明するために、実際にデータをスクレイピングする必要はない。自分のIDが12345で、友人が登録して12357を受け取ったなら、任意のユーザーIDを見つけてプロフィールにアクセスできるという証拠として十分だ。
他の人も言っているように、脆弱性を検証して公開するために、他のユーザーの個人識別情報へそこまで大量にアクセスする必要はない。
個人識別情報が保護されることを望みながら、それをスクレイピングして証明するのは不要で偽善的だ。
文章がかなり混乱している。OTPベースのログインで、ワンタイムパスワードのリクエスト応答にOTPがそのまま入っているという部分は説明不足だが、おそらく api.cercadating.com/otp/ のようなAPIで、電話番号を推測すれば、その番号を所有していなくてもOTPコードを受け取れるという意味に見える
また、連続する1,000個のIDに有効ユーザーがいなければ停止するスクリプトで6,117人、身分証情報を入れていた207人、Yale学生だと主張していた19人を見つけたと言っているが、これがどれほど危険なのか筆者が分かっているのか分からない。実質的には weev が AT&T に侵入した手口に似ていて、彼は刑務所に入った[0]
より大きな会社で、より大きな漏えいではあったが、セキュリティホールを利用して数千人のデータへ無断アクセスしたと公に自慢することはないと思う。道徳性を判断したいわけではなく、セキュリティ研究者には警告する余地があるべきだと思うが、法律はセキュリティ研究者にかなり不利だ
[0] https://en.wikipedia.org/wiki/Goatse_Security#AT&T/iPad_emai...
その事件の被告らは基礎となる個人識別情報を公開したことでも訴えられていたが、ここではそうしたことがあったようには見えない
別のデーティングアプリで似たようなことを経験したが、そちらは結局返答がなかった。創業者の注意を引こうとして、彼のプロフィール文を「連絡してほしい」という文言に変えたら、バックアップを復元していた
数年後、Instagram広告を見て問題がまだあるか確認してみたところ、まだ残っていた。アプリ-プロキシ-サーバーで簡単に見つけられるAPIエンドポイントさえ知っていれば、誰でも完全な管理者権限を持ち、すべてのメッセージやマッチングなどにアクセスできる構造だった
もう一度行って再挑戦すべきかと思っている
パスポートや住所のようなセンシティブな情報を受け取る前に、人々が二度考えるよう強制すべきだ。こういうことは単に子どもがアプリを作っただけとして片付けるわけにはいかない
デーティングサイトなら、APIは身分証の状態について verified/not-verified のブール値、あるいは「not-verified」「passport」「drivers-license」のような列挙値を返すだけで十分だ。クライアント/UIに詳細情報を表示する実際の必要はない
航空会社アプリのように、出入国目的の身分証明書を選ばなければならない場合は例外的により多くの情報を見せることもあり得るが、Unitedアプリのようにパスポート番号の末尾数桁だけを見せればよい。内部APIでもその程度だけを送ってほしい
あるいは Apple や Google のような「政府っぽい」存在が担ってもよい
https://en.wikipedia.org/wiki/General_Data_Protection_Regula...
リクエストAPIの応答でOTPを返すなんてあり得ない。なぜそんなことをしたのだろう?
セキュリティを考えなければ、非常にそれらしく明白な解決策ではある。デーティングアプリは必然的に個人識別情報が多く、作るには最も危険な種類のアプリの一つなのに、これはひどい
素早い概念実証やMVPでは、時間を節約するために保存モデルをそのままAPI応答として使うことが多いので、見落としやすい
Pinterestの新APIが出たとき、OAuth連携を使うすべてのアプリにユーザー情報を全部ばらまいていて、2要素認証のシークレットまで含まれていた。報告して報奨金をもらったが、こういうことはもっと分かっているべき大企業のAPIでも起きる
フレームワークのせいである可能性がある。おそらくデータベースに入れるオブジェクトをORMや別の保存システムからそのままシリアライズして、HTTP応答として返す構造だったのだと思う
https://yaledailynews.com/blog/2025/04/24/yale-student-expos...
この件についての別の記事だ
個人識別情報の保存を核廃棄物の保管と同じくらい危険なものにする法律があればいいと思う。漏えいしたら会社はほぼ確実に破産し、責任者は法的リスクにさらされるべきだ
インセンティブを正しくそろえる最善の方法はこれだと思う。今はユーザー情報を可能な限り多く保存することによるデメリットがほとんどない。データ漏えい?謝罪ツイートを1つ投稿して、そのまま続ければいい
そうすれば、この問題が受けるに値する注目を得られるようになるかもしれない
「まったく返答がない」のであれば、沈黙が続く場合は90日後に脆弱性を公開すると伝えるタイミングだ