1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

セキュリティ診断とWebRTC

Last updated at Posted at 2021-08-23

概要

Webアプリケーション脆弱診断の対象としてWebRTCな案件が何度かあったので、**「セキュリティ診断」**という観点でWebRTCを見てみる。


WebRTC

まずは、WebRTCの概要をまとめてみた

webRTC0 (2).png

  1. まずはHTMLとJavaScriptをダウンロード
  2. STUNサーバにアクセスして、グローバルIPアドレスを教えてもらう
    (「確認くん」みたいなもの)
  3. SDP/ICEを作成して、シグナリングサーバ(http/WebSocket/etc)を経由して、他のクライアントと交換
  4. 映像/音声/データの交換(P2P)
    • Webブラウザ間が直接接続(P2P)して、映像/音声/データ交換
    • TURNサーバを経由して、疑似的なP2P通信で、映像/音声/データ交換

SDP/ICE ⇒ グローバルIPアドレスとか、対応している映像フォーマットとかをまとめた情報


SDP/ICE

  • SDP(Session Description Protocol) : メディアフォーマットとか、グローバルIPアドレスとか、通信帯域とか
  • ICE(Interactive Connectivity Establishment) : 自分と相手のWebブラウザ間での通信経路の情報。ICE Candidate とかWebブラウザ間で共有する必要がある

WebRTCと脆弱性診断の観点

以下かな...

webRTC1 (2).png

  • 暗号化
  • 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で表示しようとしている。

結果はこんな感じ。

WebRTC3.png

まぁ、innerHTML使っているんだから、当然といえば当然だよね...


参考URL


余談

WebRTCを無効にして情報のリークを防ぐ方法を徹底解説

こちらは、P2PのWebRTC(SDP/ICE交換などでも)なので、WebブラウザのIPアドレスが(VPN経由でも)Webサーバや他のWebブラウザに漏れるよ。
という利用者側のセキュリティの話


修正履歴

  • 2021/08/23 初版
  • 2021/08/23 「RSTP」→「SRTP」に修正、「DTLS-SRTP」を追記

その他

上記以外の観点があるのであれば、コメント欄などでリンクしてくれれば、読者はより良いコンテンツへ誘導できると思う。


以上

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?