セキュリティ診断とWebRTC

---
### 概要

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

---
### WebRTC

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

![webRTC0 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/62a7245b-c9ba-f687-9127-537b4352f58d.png)

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

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

---
### SDP/ICE

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

---
### WebRTCと脆弱性診断の観点

以下かな...

![webRTC1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/a64eea61-637b-0c22-4d04-92db4e715f40.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のデータチャネル](https://ja.tech.jar.jp/webrtc/datachannel.html)ではXSSしないので、テキストを受信したら、innerHTMLに埋め込むように無理やり改造してみた。

```javascript

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/e9ecf95c-8dd3-724c-9366-c311e25a79ea.png)

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

---
### 参考URL

- [WebRTCセキュリティレポート](http://webrtc-security.github.io/report_ja/)
- [WebRTC入門2016](https://html5experts.jp/series/webrtc2016/)
- [WebRTCのデータチャネル](https://ja.tech.jar.jp/webrtc/datachannel.html)
- [【初心者向け】STUN/TURNサーバをざっくり解説してみた](https://qiita.com/okyk/items/a405f827e23cb9ef3bde)
- [WebRTC で利用されいる TURN プロトコルの解説](https://gist.github.com/voluntas/a1d39c2b2a4392956ff69732dc493e39)
- [WebRTCでビデオチャットアプリを作ってみた！](https://qiita.com/lighthouse/items/34bb8ccb6149bbfae427)
- [WebRTC - Wikipedia](https://ja.wikipedia.org/wiki/WebRTC)
- [WebRTCの基本とP2P通信が成立するまでを学ぶ](https://qiita.com/daitasu/items/ae21b16361eb9f65ed43)
- [【Web RTC】Skyway APIを使ってビデオチャット・多人数配信アプリを簡単につくる](https://qiita.com/ynwa0826/items/a4fc294287d92248ffa9)
- [【入門】WebRTCとは？一般的な仕組み・サーバー構成を解説（シグナリング/TURN/SFU）](https://jp.vcube.com/sdk/blog/webrtc-general-server-configuration-signaling-turn-sfu.html)

---
### 余談

[WebRTCを無効にして情報のリークを防ぐ方法を徹底解説](https://nordvpn.com/ja/blog/what-is-webrtc/)

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

---
### 修正履歴

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

---
### その他

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

---
### 以上