Clubhouseを支えている技術とアーキテクチャ、セキュリティについて
TL;DR
Clubhouseは極めてシンプルなアーキテクチャ
音声データはAgoraを、リアルタイム性の高い情報の扱い(ルームの中など)はPubNubを利用
音声データが暗号化されていないなどセキュリティ面での課題も多い
Clubhouseは招待制の音声配信SNSで、2020年Aplha Exploration社が開発したこのサービスは、つながりがある人同士でラジオ放送のように自由に会話を楽しんだり、興味ある人はその会話を傍聴、さらには会話に飛び入り参加もできる特徴がある。2021年に入り世代・国籍・性別を問わず爆発的人気となっており、日本では2021年1月からスタートアップ界隈を中心に一気に話題が広がっている。また、テスラの創業者や有名人・著名人などが利用しはじめたことで大きな注目を浴びた。今回はClubhouseはどのようなアーキテクチャになっていて、またどのような技術が使われているかについて解説をした後に、どのようなセキュリティ課題があるかについて述べる。 構成要素
Clubhouseは大きく4つのコンポーネントで構成されている。
1. Clubhouse App
2. Clubhouse API Server
3. Argora RTC Server
4. PubNub Server
https://gyazo.com/c6537d00dbc677ea1b7cf0e009b44d1c
上の図はClubhouseのアーキテクチャを表す図であり、シンプルなアーキテクチャになっている。ClientアプリはAPI Serverから情報を取得し、それを元にAgoraやPubNubのチャネルにジョインしてデータのやりとりを行う。リアルタイム性の高いデータ制御などの複雑な機能を自前で実装するというより他のプラットフォームを効果的に活用する戦略のように見える。音声の部分はAgora.ioを、リアルタイムのメッセージングサービス(Pub/Sub)はPubNubというサービスを利用している(もちろん利用者認証やクラブ管理は自前で管理している)。
1. Clubhouse App
Clubhouseアプリの部分。現在iOSのみアプリが提供されており、Android版は開発を行なっている。このアプリはClientとして動作し、利用者にSNS機能のUI/UXを提供する。基本的には登録とログイン、利用者/クラブ検索、友達招待、チャネルリスト表示、スケジュール管理、フォロー/フォロワー管理、ルーム生成、Notificationなどの機能を提供しており、ルームの中で発言したい時は手をあげるなどのユニークな機能も提供している。アプリはHTTP Requestを用いてClubhouse API Serverと通信を行う。上記で挙げた機能のほとんどはサーバと通信してstateをupdateする役割を持つ。
2. Clubhouse API Server
Clubhouseにおけるユーザ認証やルーム、ユーザ情報など様々な情報を扱う。上記で説明したがClubhouseアプリはHTTP Request経由でClubhouse API Serverと通信を行う。API Serverを含むClubhouseのほぼ全てのEndpointはCloudflareインフラの後ろに位置している。なのでClubhouse APIのURLであるwww.clubhouseapi.comへのRequestには__cfduidというCookieが存在する。また、API Serverに送信されるReqeustには言語、利用者UUID、アプリバージョンや機器固有の値のようなClubhouse独自のHTTP Headerがある。User-Agentも同じくアプリのビルド番号を含めカスタムUAとセットされ、送信される。各Endpointはwww.clubhouseapi.com/apiをベースにし、Endpointは100以上ある。詳しくはこちらを参照 3. Agora
Agora.ioはリアルタイムでビデオおよび音声でコミュニケーションが可能なサービスを提供するプラットフォームである。Agoraは中国とUSのカリフォルニアをベースとする企業で、2020年6月にNasdaqに上場し、Clubhouseの登場とともに注目を浴びるようになった。特に、SD-RTN™ (Software Defined Real-time Network) という独自のネットワークインフラで全世界的に低遅延なリアルタイムビデオ/音声が可能な技術をサービスとして提供している。 Agoraの重要機能
RTC Token Generation
Dynamic Key
利用者がチャネルにジョインする際、認証に必要なToken
RTM(Real-time Messaging) TokenとRTC(Real-time Communicatiom) Tokenで構成
https://gyazo.com/7e3dd0cf08fd08f532880e035bcd79a9
当該チャネルでどのような権限を持つかを明示するroleと有効期間を指定してRTC Tokenを生成
Role-based Privilege Separation
Publisher(ClubhouseではSpeakerに該当)
Subscriber(ClubhouseではAudienceに該当)
Publisherは音声データの送受信が、Subscriberは音声データの受信のみ可能。SubscriberからPublisherに昇格された場合、一時的に音声が切れるような現象が起こるが、それは既存セッションは終了し、新しい権限が追加されたTokenで再接続されると思われる。つまり、Publisher roleのみ音声データの送信が可能なため、Subscriberとして参加し、任意の音声データを送信するなど荒らし行為ができない。
Separate Audio Stream
Audio Media Stream(いわゆる音声データ)はチャネルにジョインして送信する利用者ごと分けて送信するため、格Trackを録音してmixingすることが可能。Audioに対するcodecはモードによってILBC, SILK, NOVA, HVXC, ACCなどをサポートする。
Encryption
大きく2つのデータ暗号化方法がある。
https://gyazo.com/1040db6faba0a92d25ee0334338c869d
Built-in暗号化
E2E暗号化をサポート(AES-128-XTS, AES-128-ECB, AES-256-XTS, SM4-128-ECB)をしており、鍵生成と保存、伝達、検証はSDK使用者(つまりClubhouse)が直接制御が可能。例えばClubhouse APIサーバがClientにRTC Tokenを生成して送信するように各チャネルに対する暗号化鍵を生成して伝達する方式によってAgoraサーバではデータ内容を見ることができない。
Custom暗号化
SDKを利用する場合、任意の暗号化関数を実装して使用することが可能。当該関数はSDK使用者のみ制御できるため、Agora側ではどのような暗号化を行なったかはわからない。
cipepser.icon アプリにSDKを指定するsettingsがある感じです?
jkcomment.icon ドキュメントによるとSDKの中で指定できるっぽいです
cipepser.icon なるほど...結局SDKを触れるのはclubhouse開発者だけなのではというお気持ち...
4. PubNub
PubNubはリアルタイムなメッセージングやMQTTなどの裏側の仕組みを肩代わりしてくれるBaaSサービスである。リアルタイムチャットなどでWebsocketやSocket.ioのサーバーを自前で用意しなくても、デバイスとのやりとりでMQTTブローカーを自前で用意しなくて済むなどの特徴を持つ。ClubhouseではRTCトークンと同様にクラブハウスAPIサーバーから接続する方法についてPubNubトークンを渡し受けPublishとSubscribeをして、データ交換を行う。特定の部屋に参加したり、誰かをスピーカーまたはモデレーターに昇格させたり、手を上げたりする行為をすることについてリアルタイムに更新するために使用されているという。 join_channel
leave_channel
add_speaker
remove_speaker
end_channel
make_channel_public
make_channel_social
reject_welcome_channel
make_moderator
change_handraise_settings
raise_hands
unraise_hands
invite_to_new_channel
accept_new_channel_invite
reject_new_channel_invite
cancel_new_channel_invite
invite_speaker
uninvite_speaker
reject_speaker_invite
accept_speaker_invite
remove_from_channel
mute_speaker
Security
Clubhouseは基本的には全てのHTTP通信をTLS上で行うためAPIサーバとの通信は暗号化された状態で安全に行われる。また、Certificate Pinning(クライアントで許容するTLS証明書を予め規定しておく)を適用して任意のRoot Certificateを登録する単純なMan-in-the-Middle(MITM)攻撃による通信盗聴などを防止している。しかし、Fridaをベースとしたobjectionツールを使うことで簡単にCertificate Pinningを無力化し、通信内容を確認するが可能になってしまう(例: こちら)。Agoraはデータ暗号化をサポートしているが、現在Clubhouseでは送受信する音声データとコントロールデータは暗号化されていない。 https://gyazo.com/156b3592c420b1bbcc3961da81c931a9
Channel ID、ユーザID、RTC Token、内部IPなどがパケットに入っており、RTCメッセージもそのままUDPパケットで見られる
https://gyazo.com/13ae1d22a2bb86466aca4a8d584c4090
ステルス盗聴 + 荒らし行為
パケットに入っている情報だけで当該のRTC Channelに接続し、音声データが収集可能
スピーカー権限を持っている場合、任意の音声データを流すなどの荒らし行為の危険性が発生しうる
データ改ざん
UDPパケットが暗号化されていないため、ARP spoofingなどの攻撃でパケットの内容を改竄し、異なる音声データの流すことが可能
cipepser.icon ARPはL2-L3の話なので、UDPパケットを暗号化しても防げなそう
cipepser.icon あーいや。パケットをスティールできてしまうこと自体が攻撃に寄与する感じかな
Multiple login sessions
二重ログインが可能なため、もし悪意を持つ者から対象アカウントにログインされても誰が自分のアカウントにログインしているかわからない。また、他のデバイスにログインされたことがわかったとしてもそれをログアウトさせる方法がない
Chinese Servers
Clubhouse上の会話データが中国政府に流れている可能性があるという報告がある。問題を発見したスタンフォード大学の研究者によると、Alpha Explorationはサービス提供のために上海を拠点とするソフトウェア企業Agoraのサーバーをバックエンドとして利用しており、さらにユーザーごとにユニークなClubhouse IDとチャットルームIDが平文でやりとりされることから、Agoraが生の音声データにアクセス、保管できる可能性が高いことがわかったという。会話のメタデータがすべて中国に流れてから中継されていることで、中国当局がこれを国家安全保障上の脅威だと見なせば、中国の法により音声データを含むすべてを複製し政府に提供させることができてしまう。Agora側はこの報告を否定し、データを保存することもなければ、音声データそのものが米国内にあれば中国政府がそれを入手することもできないと反論し、Alpha Explorationもサービスを開始の際「プライバシーの取り扱いに関する事情を考慮し、中国ではサービス提供をしないことを決めた」と述べている。 潜在的なアカウント奪取
etc
今回の記事にはあげていないが、他にもいろんな技術が使われている
AWS(S3 for storing your profile image)
参考
Certificate Pinning: クライアントで許容するTLS証明書を予め規定しておく。Certificate Pinningを行うことで「たとえ有効な証明書であっても見知らぬ証明書の通信は受け入れない」ようにすることが可能