動画配信の DRM(Webvine)について調べてみた
はじめに
HLS を暗号化で配布する場合、.m3u8 ファイルの EXT-X-KEY に共通鍵の URL を記載することでクライアントサイドで復号することができる。 URL アクセスを cookie や JWT の認証にすることで、会員のみのアクセスといったことを実現できる。 もしくは、.m3u8 ファイルへのアクセスを cookie や JWT 認証にするならば、共通鍵の URL を署名付き URL することで、アクセス時間の問題短いキー共有を実現できる。
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key"
しかし、復号と再生はユーザランドで行われるため、ブラウザに限らず .m3u8 と共通鍵を取得さえできれば、動画をローカルに保存し、再配布(不正コピー)できてしまう。DRM はより安全に実現できる仕組みである。
以下、Webvine + android、すなわち L1 を説明する。全体的に複雑であるため、間違っている箇所があるかもしれない。
DRM の全体像
ハードウェアの仕組みを使用して、復号キーへのアクセスや、復号した動画へのアクセスを特定のハードウェアに制限し、例え OS でも動画へのアクセスができないようにすることで実現する。
Android の例
[Browser / App]
└─ CDM(Normal World)
↓(License Request)
DRM Server
↓(License Response)
└─ CDM
↓(Secure IPC)
TEE / TA(Secure World)
├─ Content Key 復号・保持
├─ 再生可否判断
└─ Secure HW レジスタ設定
↓
Memory Controller / Decoder / GPU / Display
(Secure モード化)
[CDN]
↓ (encrypted media)
[Browser / App]
↓
[OS / Kernel / Driver]
↓
[Secure Video Decoder]
↓
[Secure Video Buffer]
↓
[GPU / Display]
復号までの流れ
0. .m3u8 ファイルにアクセス
- EXT-X-KEY において METHOD=SAMPLE-AES が指定されており、鍵を直接取得する形式ではないため、DRM フロー(CDM とライセンスサーバーの通信)が必要であると判断される。
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="https://license-proxy.example.com"
- ブラウザが GraphicBuffer/MediaCodec 等で dmabuf/ION 等の 共有 DMA バッファを確保し、暗号化されたデータを保持する
- バッファに対する handle が返される
- 後続の Secure Video Decoder は、この handle を用いて DMA 経由で暗号化されたデータへアクセスする。
1. CDM とライセンスサーバーの通信
- CDM(Content Decryption Module)というユーザランドのモジュールが、ライセンスサーバーと通信を行う。
- CDM は、公開鍵を含む証明書チェーンをライセンスサーバーに送信する。
- あわせて、Cookie や JWT 認証などのアプリケーションレベルの認証も行われる。
- ライセンスサーバーは以下を実行する。
- セッションキーを作成する。
- 動画を暗号化するためのコンテンツ暗号化キー(コンテンツキー)を返却する。
- ライセンス要求では、エフェメラルな鍵共有(ECDH)を用いて共有秘密が生成され、KDF によりセッションキーが導出される。
- ライセンス要求に含まれる ECDH 公開鍵などのパラメータは、TEE 内の長期秘密鍵で署名され、その正当性が保証される。
- コンテンツキーは、このセッションキーで暗号化されて返却される。
- ライセンス要求では、エフェメラルな鍵共有(ECDH)を用いて共有秘密が生成され、KDF によりセッションキーが導出される。
- 公開鍵に対応する秘密鍵は、TEE(Trusted Execution Environment)の Secure World 内で管理されており、Trusted App(TA)のみがアクセス可能である。
- 例:
- Widevine においては、Widevine Trusted App が Secure World 側に存在する。
- Widevine CDM はユーザーランド側の実装である。
- 例:
- CDM は、受け取ったライセンスレスポンスを TEE の Trusted App に渡すことで、この後の復号および再生処理が可能となる。
2. TEE 内での鍵復号処理
- TA は Secure World 内で、TEE が管理する秘密鍵を用いてセッションキーを復号する。
- 復号したセッションキーを使用して、コンテンツキーを復号する。
- 復号されたコンテンツキーは Secure World 内で保持され、Normal World からは参照できない。
3. Secure 再生経路の確立(ハードウェア設定)
- TA は Video Decoder のハードウェアレジスタを設定し、Secure mode(Secure Video Decoder)を有効化する。
- あわせて、GPU や Display Controller に対しても Secure mode に関する制約を設定する。
- TA は復号後のデータを保持するための Secure Video Buffer を確保する。
- メモリは通常の DRAM 上に確保されるが、Secure 属性が付与される。
- Secure Video Decoder、GPU、Display Controller など、保護されたハードウェア経路のみがアクセス可能となるようセキュリティポリシーが設定される。
- TA はコンテンツキーに対するアクセスポリシーを設定し、Secure Video Decoder がキーを参照して復号処理を行うことを許可する。
4. メディアデータの復号およびデコード
- Secure Video Decoder は、暗号化されたメディアデータを復号しながら、対応するコーデックのデコード処理を行う。
- デコードされた映像フレームは Secure Video Buffer に格納される。
- 復号後の平文フレームが通常のメモリや CPU から参照可能な領域に出ることはない。
5. 表示とキャプチャ制限
- Secure Video Buffer に格納されたデータは、TA によって設定された制約のもとで GPU や Display Controller に渡される。
- Secure mode では、GPU や Display Controller のキャプチャ機能がハードウェア的に制限または無効化される。
- その結果、画面キャプチャや画面録画を行っても、キャプチャアプリケーションは制限されたデータにアクセスできない。
- キャプチャ結果として取得される映像は黒い画面、または無効なフレームとなる。
Windows + Chrome はどうなるか
Windows には当然 Webvine の TA は TEE に存在しないので L3 となる。 一方で、Windows において Secure Boot HVCI、ドライバー署名強制が有効な環境では、ユーザーが任意に改変した GPU ドライバーやカーネルドライバーを導入することは困難であり、OS や GPU ドライバーは DRM の脅威モデルにおいて「完全に信頼できないが、容易には破れない実行環境」として扱われる。復号したフレーム等は、GPU や Display Controller の機能を使い、API 経由でのキャプチャを不可能とすることで、L1 に比べると弱いものの比較的安全に DRM を実現できる。