文責 mala
経緯:
- Meety退会しようと思ったがアカウントがなかったので、退会するためにアカウントを作ることにした。
免責:
- 気になった範囲ですぐに見つかったもののうち、悪用可能なものを記載しています。
- 好ましくないが仕様だろうというものは書いていません。
- 他の脆弱性が無いことを保証するものではないです。
これはsecret gistです 11/24 時点で未修正の脆弱性情報が含まれています。修正されたらpublicに変更する予定です。
- 近しい人向けの注意喚起と、開発元への報告を兼ねて書いています。
- 悪用を教唆したり、悪用しそうな人に情報を共有することは避けてください。
- 自分の所有していないアカウントの情報を書き換えると法に触れるので、そのような行為は絶対にやめてください。
11/25 Publicにしました
- 以下 1-4 については修正されていることを簡単ですが確認しています。他の脆弱性が無いことを保証するものではありません。
- ログインするとユーザーを識別するために mm_s という名前のcookieに保存される。
- このcookieにはsecure属性が使われていないため、 http://meety.net に接続するとネットワーク上に平文で認証cookieが流れる。
- この認証cookieを使って、ユーザー情報の取得や変更などが可能であることを確認した。
- 信用できないWiFiを利用した場合などに、meetyに登録している情報や、meety上でのやり取りの履歴がネットワーク上の中間者から窃取可能になる
- メールアドレスや、非公開に設定しているプロフィール情報が漏洩するおそれがある。
修正方法
- cookieにsecure属性をつける
ユーザー側での自衛方法
- Meetyを利用しない、または、信用できないネットワークでMeetyを利用しない。
- 公開されると差し障りがある情報をMeetyに登録しない。
修正状況
- 11/25 セッション情報は mm_s2 というsecure属性付きのcookieにJWTで保存されるようになった。
- 前日まで有効だった mm_s ではログインが維持されていないことを確認。
- ユーザーAでログインし、ポートフォリオを保存する際のリクエストをブラウザの開発者ツールを使ってcopy as curlなどでコピーする。
- ユーザーBの認証cookieに差し替えて上記のリクエストを実行すると成功する。(応答はユーザーBのプロフィールが返る)
- リクエスト本文を書き換えて、ポートフォリオのリンク先を変更してリクエストを送ると、ユーザーAのプロフィールが書き換わる。
- ユーザーBの認証cookieによって、ユーザーAのプロフィール情報が変更可能になっている。
APIのURL
ポートフォリオの場合は、以下のようなJSONで保存が行われている。
'{"user_portfolios":[{"id":36728,"created_at":"2022-11-24T00:18:55+09:00","updated_at":"2022-11-24T00:18:55+09:00","deletedAt":null,"user_id":35782,"portfolio_type":1,"value":"https://example.com/"}],
他のユーザーの user_id や、portfolios のidは、公開されているカジュアル面談のページから確認することが出来る。そのため、meety上に公開されているユーザーのポートフォリオのリンク先や、職歴を任意の内容に書き換えることが出来る。
修正方法
- リクエスト中の user_id を用いず、変更対象のレコードは常に認証cookieから取得したuser_idを用いる
備考
- 他にもuser_id をリクエストとして受け付けるapiがあり、同様の問題があると考えられます。
- これは他人のレコードの上書きが可能な脆弱性です。
- 内容を維持したまま非公開設定を公開に変更したりといったことは、自分の確認している範囲では出来ませんでした。(漏えいは起きず、情報の改ざんが出来る)
ユーザー側での自衛方法
- Meetyを利用しない
- カジュアル面談ページなど公開コンテンツがある場合は、改ざんされる可能性があるため、非公開にする。
- 人の恨みを買わない
修正状況
- 11/25 他人のuser_id を指定して保存を試みると500エラーが返るようになった。
via https://twitter.com/Hamachiya2/status/1595703931942096897
- URLにjavascript schemeを登録可能。上記1,2報告時点で自分も把握していたが、試していた範囲だと普通にクリックだとJavaScript実行されなかった。
- ホイールクリックや修飾キー付きでのクリックでJavaScriptが実行されたのでユーザーの習慣次第では被害が発生しそうだなと考えて追加で報告
以下の内容で 11/25 11:16に送った
追加の脆弱性の報告をさせてください
- SNS・WEBサイトでURLにhttp/https以外の任意のURL Schemeを登録可能
- javascript:alert(document.domain) といったURLを入れると、javascript schemeのURLがプロフィール表示でリンクされている
- 通常のクリックだと動作しなかったが、修飾キー付きでのクリック、ホイール付きマウスでのミドルクリックなどで動作するようです。
- 動作した際に、alert(document.domain) で meety.net が表示されるため、meety.net 上での権限でJavaScriptが実行されていることが分かる
- 入力できる長さについては確認していないですが、location.hash をevalするようなコードにしておけば長文の任意のscriptも実行可能であると考えられます
javascript:alert(document.domain) を設定してあるプレビューURLです。 ... snip ...
影響は、特定のユーザー操作が必要だが、非公開の情報の読み取りや、データの改ざんが可能です。 操作無しで不特定多数のユーザーが影響を受けるものではありません。
修正状況
- 11/25 表示の際にhttp/httpsで始まらないURLは非表示となっている。httpで始まらないURLはクライアント側バリデーションで登録出来ないようになっていた。(API直接であれば登録可能)
11/26 16:07 に以下の内容を追加で報告した。
/papi/notification_settings の権限確認不備
異なるユーザーの通知設定が変更可能になっています。 認証cookieと異なる user_id を指定した場合には invalid id のエラーが出て変更に失敗するが、 id, user_id セットで他のユーザーの有効な値を入れると他人の通知設定を変更することが可能となっていることを確認しました。
他のユーザーの user_id は公開されているカジュアル面談ページから取得可能であり、 notification_settings の id は連番で推測が可能であるため、他人のnotification_settingsの変更が可能です。 (user_id と近い数値の範囲で id を総当りで試行すれば、少ない試行回数で成功する)
影響は
- 通知メールアドレスを変更できる
- Slackのwebhook URLを変更できる
ため、本来と異なる宛先にメッセージ通知が届くことになります。 こちらも個人情報の漏えいや、届出電気通信事業者としての通信の秘密の漏えいに繋がりうる脆弱性と考えられます。 面談機能やメッセージ機能については確認していないため、通知本文の内容については把握していません。
報告に至る経緯
- 11/24 に最初に報告した時点では、ログイン用のメールアドレスの変更時にはuser_id指定がなく、書き換えが出来ない認識であった。
- 通知用メールアドレスの設定についてはログイン用メールアドレスと内部的にはレコードが独立しているようで、こちらについては、11/24時点では他人のレコードが書き換えできるかどうかは確認していなかった。
- 11/26 Meetyのメッセージ機能に関する言及をTwitterで見かける
- 電気通信事業者の届出出してるのか気になって調べる → 出しているのを確認
- メールや通知の宛先変更できたら問題になるだろうなと気になって user_id を差し替えたリクエストを送ってみる
- エラーメッセージが先日対応済みのものと異なっていたため(invalid paramではなくinvalid idになっていた)、request bodyにuser_idを含む全般の処理の前段で対応していないのでは無いかと疑念を抱く
- idもセットで指定すると書き換えに成功した
- idが連番で推定可能であるので、これも脆弱性ということで報告
修正状況
- 11/26 17:26に一次返信があり、19時ごろには修正されているのを確認した。11/27に対応完了の返信。
- 2022-11-23 22:50 Meetyに登録する、直後、認証cookieにsecure属性が付いていないのを見つける
- 一通り調べて終わろうかと思ったところで、ポートフォリオ保存時のリクエストにuser_idが含まれているのを発見する。
- 流石に成功しないだろうと思って適当な知ってる人のuser_idで試そうかと思ったが、嫌な予感がしたので手抜きしないでアカウントをもう一つ作ることにする。
- 2022-11-24 00:14 Meetyにもう一個アカウントを登録する
- 2022-11-24 00:20 他人の情報を書き換えが出来ることを確認する
- 2022-11-24 01:36 Meety CEOのTwitterにDMで連絡
- 2022-11-24 01:39 Meetyの問い合わせフォームに連絡、自動返信を受信。
- 2022-11-24 16:38 Meety CTOのにFacebook Messangerで連絡
- 2022-11-24 20:06 問い合わせフォームへの連絡に対して、確認中という主旨の手動返信が来る
- 2022-11-25 10時頃 報告した問題について修正されているのを確認(正確な修正時刻は把握してません)
- 2022-11-25 19:04 修正対応を行った旨の返信が来る
- 2022-11-26 16:07 修正不備を見つけたので追加で報告
- 2022-11-27 09:52 追加の報告に対して対応完了の返信が来る
@okash1n thx, updated