概要
Webアプリケーション脆弱診断の対象としてWebRTCな案件が何度かあったので、**「セキュリティ診断」**という観点でWebRTCを見てみる。
WebRTC
まずは、WebRTCの概要をまとめてみた
- まずはHTMLとJavaScriptをダウンロード
- STUNサーバにアクセスして、グローバルIPアドレスを教えてもらう
(「確認くん」みたいなもの) - SDP/ICEを作成して、シグナリングサーバ(http/WebSocket/etc)を経由して、他のクライアントと交換
- 映像/音声/データの交換(P2P)
- Webブラウザ間が直接接続(P2P)して、映像/音声/データ交換
- TURNサーバを経由して、疑似的なP2P通信で、映像/音声/データ交換
SDP/ICE ⇒ グローバルIPアドレスとか、対応している映像フォーマットとかをまとめた情報
SDP/ICE
- SDP(Session Description Protocol) : メディアフォーマットとか、グローバルIPアドレスとか、通信帯域とか
- ICE(Interactive Connectivity Establishment) : 自分と相手のWebブラウザ間での通信経路の情報。ICE Candidate とかWebブラウザ間で共有する必要がある
WebRTCと脆弱性診断の観点
以下かな...
- 暗号化
- WebRTCを構成するサーバー群ネッワークに対してのPF脆弱性診断
- (WebRTCに付随する)Webアプリケーション脆弱性診断
- WebRTC のセッションハイジャック
- WebRTCとXSS
WebRTCと暗号化
ほぼ必須。というか、確実に必須。
https(HTTP over SSL)とかwss(WebSocket over SSL)やSRTP(Secure RTP)またはDTLS-SRTPなど、SSL/TLSというか、暗号化は必須。
暗号化されていないと、WebSocketの通信ができないとか、カメラにアクセスできないとか、本番運用上はいろいろと不都合があるので、SSL/TLSは必須。
必須というか、SSL/TLS化していないと、そもそも(本番運用として)まともに動作しないと思う。
マルチメディアを用いないWebRTCとか面白くないと思うし...
必須なので、診断という観点では省略でもいいでしょう。
WebRTCを構成するサーバー群ネッワークに対しての脆弱性診断
私の職場では、サーバ/ネットワークなどの領域の脆弱性診断を**「プラットフォーム脆弱性診断」**と呼んでいるので、その領域の脆弱性診断も必要だろう
ということで、以下が対象のうち自前で構築したサーバが診断対象になるだろう
- Webサーバ
- STUNサーバ ← Googleが用意しているので、通常はそれをそのまま使うので、対象外になる場合が多いと思う
- シグナリングサーバ
- TURNサーバ ← 負荷分散などの観点から出来合いのサービスを活用すると場面が多いので、これも診断の対象外になる場面が多いと思う
さらに対象システム専用に以下を用意していれば、それらも対象だろう
- Firewall
- DNS
- メールサーバ
- etc
(WebRTCに付随する)Webアプリケーション
だれでも使えるWebRTCというわけにもいかないので、ユーザ登録や認証/認可などのセッション管理など、WebRTCに付随するWebアプリケーションがあるはずで、それらについてのWebアプリケーション脆弱性診断は必要だろう。
WebRTC のセッションハイジャック
知らない人とWebRTCしたいわけじゃないので、ある程度のグループ化(ルームとかいう概念)が必要でしょう。
そうなると、(認証済/匿名にて)他人の部屋に勝手に入室できたりするのはマズいわけで、、、その辺り。
ただ、このような機能はシステム全体の肝となるような機能なので、実装漏れは考えにくい。
(よほどおかしな個別実装をしていない限り、、、)
通信を見て「セッション管理できているね。おしまい」になる可能性は高いと思う。
これは、WebアプリケーションのHTTPセッションがどのようにシグナリングサーバやTURNサーバへ引き継がれるのかを観察すればいいでしょう。
WebRTC のセッションハイジャック(シグナリングサーバ)
こちらは、WebSocket/HTTP/ServerSentEvent/Commet...などHTTP近辺の通信になると思うので、通常のWebアプリケーション脆弱性診断のテクニックでなんとかなると思う。
WebRTC のセッションハイジャック(TURN)
こちらは、RSTPとかになると思うので、通常のWebアプリケーション脆弱性診断のテクニックでは困難だろう。
どうすればいいんだろう。
コメント/Twitterなどで教えてほしいところ。
WebRTCとXSS
P2Pで交換するのは、映像/音声だけではなく、データ(テキスト)も可能
それをinnerHTMLを使って画面出力しようとするとXSSになるかもしれませんよ。という単純な話。
WebRTCのデータチャネルではXSSしないので、テキストを受信したら、innerHTMLに埋め込むように無理やり改造してみた。
104: document.getElementById('history').value = 'other> ' + msg + '\n' + document.getElementById('history').value;
105: document.getElementById('his').innerHTML = 'other ' + msg + '\n';
106: };
105行目に、事前に作った空のPタグ(hisというId)にinnerHTMLで表示しようとしている。
結果はこんな感じ。
まぁ、innerHTML使っているんだから、当然といえば当然だよね...
参考URL
- WebRTCセキュリティレポート
- WebRTC入門2016
- WebRTCのデータチャネル
- 【初心者向け】STUN/TURNサーバをざっくり解説してみた
- WebRTC で利用されいる TURN プロトコルの解説
- WebRTCでビデオチャットアプリを作ってみた!
- WebRTC - Wikipedia
- WebRTCの基本とP2P通信が成立するまでを学ぶ
- 【Web RTC】Skyway APIを使ってビデオチャット・多人数配信アプリを簡単につくる
- 【入門】WebRTCとは?一般的な仕組み・サーバー構成を解説(シグナリング/TURN/SFU)
余談
こちらは、P2PのWebRTC(SDP/ICE交換などでも)なので、WebブラウザのIPアドレスが(VPN経由でも)Webサーバや他のWebブラウザに漏れるよ。
という利用者側のセキュリティの話
修正履歴
- 2021/08/23 初版
- 2021/08/23 「RSTP」→「SRTP」に修正、「DTLS-SRTP」を追記
その他
上記以外の観点があるのであれば、コメント欄などでリンクしてくれれば、読者はより良いコンテンツへ誘導できると思う。