2K Followers
·
Follow

E2EE を開発していて思うこと

ここ数ヶ月は自社製品向けの End to End (Media) Encryption の設計と実装をしています。年内での提供を目標として開発を進めてい見ていますが、色々感じることがあったので雑に書いていこうと思います。

前提

  • 自分は暗号やセキュリティの専門家ではない
  • 自社製品向けの E2EE は Signal や Google Duo が利用している実績のある仕組みを採用している
  • E2EE や暗号の専門家を招聘し、相談しながら開発している

自分の E2EE に対する考え

悪意あるサービス管理者からユーザを守るために存在する機能と考えています。

Signal プロトコルはよく考えられすぎている

Signal が考えた Curve25519 (x25519/ed25519) を利用した X3DH / Double Ratchet の仕組みは安全すぎると感じるくらいです。

  • 相手からメッセージを受信するたび DH (Diffie–Hellman key exchange) に利用する公開鍵を変える
  • 参加と離脱で利用するマテリアル鍵を変える

実装して、テストを書いて感じるのが仕組みとしてよく考えられているということです。仕組み自体はよくできているのですが、いかんせん複雑というのは正直思いました。ただ Foward Security / Post-Compromise Security の両方を実現できているのは考えられているなと実感しています。

End to End Media Encryption はこれから

E2EE は今までメッセージがほとんどで、通話は 1 対 1 が前提でグループ通話は今までほとんど考えられていませんでした。

実際、ほとんどの E2EE サービスはグループ通話の E2EE には対応していません。対応が活発になったのは今年になってからです。

グループ通話での E2EE が難しいのは P2P が利用できないのが理由でしょう。ほぼすべての E2EE サービスの 1:1 の通話は WebRTC の P2P が利用されています。ただグループ通話となると P2P は厳しくなるため WebRTC SFU が必要になります。Zoom でも Media Router と呼ばれる WebRTC SFU と同じような仕組みを実現しています。

メッセージは参加者それぞれの鍵で暗号化してそれぞれに送信していたとしてもそんなに重いものではありませんでしたが、音声や映像のようなストリームは「常に送信し続ける」必要があり、それぞれに送信するわけにもいきません。

そこで出てきたのが Sender Keys と呼ばれる仕組みで、Signal プロトコル上でストリーム向けの鍵を事前に配布するというものです。

この仕組を利用した場合、誰かが参加した場合にはそれぞれが配られた鍵を更新する必要があります。また、誰かが離脱した場合には鍵を全員が配布し直す必要があり、新しい鍵を利用開始するまでのインターバルは限りなく小さくする必要があります。ちなみに Google Duo では 5 秒、Zoom では 15 秒以内と決められています。

グループ通話における E2EE はいろいろなサービスが試行錯誤している段階と言って間違いないでしょう。まずは Signal プロトコルをうまく利用して進んでいく事になりそうです。

WebRTC における E2EE

WebRTC (メディアチャネル) の P2P は E2EE といって問題ない仕組みを実現していますが、WebRTC SFU となると話は別です。

WebRTC (メデアチャネル) を WebRTC SFU でそのまま利用する場合は必ず、SFU 側で一度復号し、その後暗号化して送るという手順が必要になります。そのため WebRTC を利用してブラウザで E2EE を実現するのは今まで困難でした。

そこで出てきたのが Insertable Streams API です。これはブラウザ側でエンコード後またはデコード前のフレームに対して処理を挟み込める仕組みです。コレを利用することで独自の暗号化や復号ができるようになりました。

Google Duo のウェブ版もこの仕組を利用しています。おそらく Signal や Wire のデスクトップ版もこの機能を利用するでしょう。もちろん自社製品でもこの機能を利用しています。

ブラウザにおける E2EE

ブラウザで E2EE を実現する際に課題になるのが暗号関連です。Signal プロトコルで利用する Curve25519 が Web Crypto が非対応という問題です。これの問題を Google Duo では WebAssembly を利用して解決しており、Signal は Emscripten を利用して JS 化することで解決しているようです。自社製品では Go を利用した WebAssembly で解決することにしました。

また複雑な仕組みということもあり、JS で書くのはあまり現実的ではないようにも思います。

E2EE の情報は嘘が多い

「E2EE をよくわかっていない人」が書いている情報が多いです。そしてそれらを信じた「E2EE よくわかっていない人の記事を参考に書いたさらに E2EE をよくわかっていない人の記事」もあります。

また、よくわかっていない中で「E2EE 未対応を批判をしている」記事も多いです。

わかりにくい技術を利用している世界なのでどうしようもないのかもしれませんが、E2EE の記事は一次情報以外は参考にしないほうがいいです。サービスが出しているホワイトペーパーか、オープンソースの実装か、サービスの中の人が書いた記事あたりがおすすめです。

E2EE は安全すぎることが脅威とされている

どうやら E2EE は「安全すぎる」ということがいろいろな場面で脅威とされているようです。これは実際に実装していても「安全すぎる」と思います。

ちなみに FB メッセンジャーは Signal プロトコルを採用しています

自分はあくまでサービス側ではなく「サービスに利用するためのパーツ」を作っている側なので、なんとも言えませんが今後 E2EE は安全すぎるために解析できないと困る部分で脅威とされていくんだろうなとは思います。

どう転ぶかは今後も見守り続けたいと思います。

追記: 2020–10–12 12:00

E2EE を採用したメッセージングアプリに対して暗号技術の見直しを求めたとの記事がでました。

IT企業に対し、捜査機関がメッセージの内容を閲覧できるよう対策を取るべきだとした

E2EE は現時点でメッセージングの解読は難しいため、補完した復号済みのメッセージに対してのバックドアがほしいというのが本音ではないでしょうか。

もちろん EncroChat のように「すべてのメッセージを読めるサーバを設置したい」というのが本音だと思いますが。

何万人ものユーザーのメッセージが警察の監視にさらされてフィナーレを迎えた

日本も声明に参加しているという事から、今後どうなっていくのかわかりませんが、このあたりは積極的に追いかけて行こうと思います。

追記: 2020–10–12 15:00

(1)システム設計に公共の安全を取り入れることにより、企業が違法なコンテンツや活動に対し、安全性を損なうことなく効果的に行動できるようにしつつ、違法行為の捜査や訴追を円滑化し、脆弱な人々を保護することができるようにすること。

E2EE では両方は難しいので誰もが利用できる E2EE サービス自体を廃止しろと言う流れのような文章にも見えます。

(2)令状等が合法的に発行され、必要かつ衡平であり、厳格な手続と審査に服している場合に、法執行機関が読取可能かつ利用可能な形式のコンテンツにアクセスできるようにすること。

誰もが利用できる E2EE サービスにバックドアを用意しろという文章に見えます。E2EE はバックドアがある時点で E2EE ではなくなります。

(3)合法的なアクセスを促進するための政府や他の利害関係者との協議に、実質的かつ設計の決定に実際に影響を及ぼす形で取り組むこと。

E2EE においてバックドアをどう実現するかの設計に横槍を入れられるようにしたいという文章に見えます。

どうやら誰もが利用できる E2EE サービス自体を殺しにかかっているように見えます。まずは E2EE を実装している Signal / Wire / Telegram / WhatsApp / FB Messenger / LINE がどう出るかを見守りたいです。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Erlang/OTP / 時雨堂 / WebRTC / E2EE


2020 年 9 月版

WebRTC 関連でどんなことをやっているか、やっていこうかというのを書いていこうと思います。時雨堂が WebRTC で何をやろうとしているのかの可視化です。

毎月書いていこうと考えています。時雨堂の WebRTC 製品に興味がある方は読んでみていただけると嬉しいです。

今後 WebRTC SFU Sora は独立して書くことにしました。WebRTC SFU Sora については以下をご確認ください。

WebRTC Native Client Momo

詳細については OpenMomo プロジェクト をご確認下さい。

方針

WebRTC Native Client Momo はビルドの簡易化、libwebrtc への追従、単体で完結する事がメインです。

様々な OS やアーキテクチャーに対応しており、それらを簡易化し、誰もが簡単にビルドできるようにしています。また libwebrtc の最新バージョンに追従することで最新の技術を積極的に使えます。

ハードウェアエンコーダーへの対応も積極的にすすめています。現時点では Raspberry Pi と macOS 、Jetson Nano 、NVIDIA ビデオカードに搭載されているハードウェアエンコーダに対応しています。

H.265 対応

feature/h265 で対応済みです。

こちらはリリース予定は今の所ありませんので、試してみたい方は GitHub Actions が生成するバイナリか自前でビルドしてみてください。

libwebrtc M86 対応

対応済みです。

今後

Momo は一通り欲しい機能は実装した状態になったため、今後はメンテナンスフェーズとする予定です。libwebrtc のアップデートや AV1 などについては追従していきます。

WebRTC Signaling Server Ayame

詳細については OpenAyame プロジェクト をご確認下さい。

方針

WebRTC Signaling Server Ayame はベンダーロックフリーの WebRTC P2P サーバをオープンソースで公開するというのが目的です。ソースコードもそうですが、仕様自体もオープンに公開しています。

1対1 のやり取りとして絞り込むことでとてもシンプルな仕様を実現しています。

今後

Ayame (Go 実装) はメンテナンスモードで少しずつ改善をしていく予定です。Web SDK やサンプルにも手を入れてメンテナンスしていく予定です。

今後 P2P を利用した 1 対 1 での WebRTCは「無料で利用できる」が当たり前になっていくと考えています。そこに Ayame も食い込めればと考えています。

Erlang 版の提供を検討

現在 Ayame (Erlang/OTP 実装) の開発を進めています。これは Go 版と仕様自体は全く同じものですが、商用利用を意識した実装をしたものです。すでに Ayame Lite は Erlang/OTP 実装に置き換えてテストしてみています。

WebRTC React Native WebRTC Kit

サイマルキャストへの対応

libwebrtc のサイマルキャストの実装が落ち着いてきたこともあり、対応を進めています。2020 年内に公開予定です。

統計機能への対応

getStats への対応をしていく予定です。サイマルキャストの対応が終わったら対応予定です。

libwebrtc M86 へのアップデート

対応済みです。

React Native for macOS 対応

React Native for macOS 対応を進めています。現在試行錯誤中です。

React Native for Windows 対応

macOS 対応版が落ち着き次第、進めていく予定です。

Ayame lite

リニューアル

ずっとベータ版でやってきましたが、正式リリースに向けて準備中です。

  • サインアップなしで利用可能は継続
  • 無料で利用可能は継続
  • 商用利用は推奨しないが申請すれば利用可能
  • 動作保証などは一切ない

メンテナンスの通知などは今まで通り営業日、営業時間であれば Discord にて共有するが、それ以外の場合はサイレントで行うは継続します。

Sora Labo

サンプル周りを Sora デモベースにしたいと考えています。また E2EE は wasm 版に置き換える予定です。

また Momo を使って 4K@30fps や 1080p@60fps をを試してみたい方向けに帯域制限がないサーバを新規に立てるというのも考えています。

2020 年 8 月版は以下からどうぞ


8 期が終わり、9 期に入りました。時雨堂の方針を書き出していきます。

まとめ

今期は既存のお手伝い先以外からの仕事以外は受ける予定はないため、売上の殆どが自社製品からの売上になる予定です。

自社製品に徹底的に投資をしていきます。

自社製品 (クローズドソース) への投資

WebRTC SFU Sora

最優先は WebRTC SFU Sora への投資です。発行済みライセンスが 700 を超えて多くのお客様に使っていただいております。ただまだまだ改善できるところは多く、今期も前期に引き続き Sora への投資をしていきます。

  • サイマルキャスト正式版のリリース
  • サイマルキャストの設定カスタマイズ対応
  • サイマルキャスト録画への対応
  • サイマルキャスト転送への対応
  • スポットライト録画への対応
  • E2EE 対応
  • シグナリングの DataChannel 対応
  • QUIC / WebTransport 対応

ざっと適当に書き出しただけでもこれくらいあります。一つ一つの機能が重めなのが多いのですが、できるだけ早めに対応していければと考えています。

今後、サイマルキャストを正式版としてリリースしていき、基本的にはサイマルキャストありきで進めていこうと考えています。

その理由としては Chrome / Edge だけでなく Safari が 14 にてサイマルキャストに対応し、Firefox も 11 月リリースの 83 でほぼほぼ問題なく動作するところまで行くと見ているためです。

E2EE (wasm 版) もまずは実験的機能として追加していきます。E2EE は今後、選択できることが必須になっていくと思っています。

シグナリングに WebSocket を利用している場合、WebSocket が WebRTC より先に不安定になるという問題もありこれの抜本的解決を行いたいと考えており、最初だけ WebSocket を利用し、その後は DataChannel 経由でシグナリング通信を行いたいと考えています。

2021 年からは WebTransport に取り組んでいく予定です。まずは WebCodecs + WebTransport に対応した WebRTC SFU を提供できればと考えています。ただまだまだ仕様が確定しているわけではない世界ということもあり、様子を見つつ追従していきます。

WebRTC シグナリングサーバ Ayame (Erlang/OTP 版)

現在 WebRTC シグナリングサーバ Ayame は Go 実装をオープンソースとして公開しております。Ayame…


WebRTC SFU Sora 向けの WebRTC 負荷試験ツール Zakuro の 2020.1 をリリースしました。ソースコードを Apache License 2.0 として公開後、これが初めてのリリースになります。

WebRTC SFU Sora を徹底的に叩くツールとして今後も改善していく予定ですので、期待していてください。