WiresharkでのQUICの復号(decrypt)

2019/5/17追記 QUICの暗号化について説明を書きました
asnokaze.hatenablog.com


WiresharkIETF版 QUICパケットのdecryptに対応しているので、やってみる。

Wiresharkの細かい対応状況については以下の通りです。
Tools · quicwg/base-drafts Wiki · GitHub

最新のソースコード内に書かれているTODOとしては、以下の通り。

 * to-do list:
 * DONE key update via KEY_PHASE bit (untested)
 * TODO 0-RTT decryption

https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-quic.c#L173

(なお今回はGoogle QUICについては言及しない)

準備

必要なもの

  • Wireshark (今回は3.0.0を使用)
  • パケットダンプ
  • 該当通信のKEYLOGファイル

QUICのパケットをdecryptするために、KEYLOGファイルが必要です。各実装によってQUIC通信時に使用したシークレットをファイルとして出力できるようになってるものがあります。

Cloudflareが実装してるQUICHEのサンプルクライアントでは、SSLKEYLOGFILE 環境変数に出力先を指定しておくと出力されます。
https://github.com/cloudflare/quiche

SSLKEYLOGFILE=./keylog target/debug/examples/http3-client https://localhost:4433/index.html --no-verify

(ChromeもすでにSSLKEYLOGFILE環境変数を設定すれば、下記のようなデータが出力されます)

KEYLOGファイルは以下のような中身をしています。

QUIC_CLIENT_HANDSHAKE_TRAFFIC_SECRET .....
QUIC_SERVER_HANDSHAKE_TRAFFIC_SECRET .....
QUIC_CLIENT_TRAFFIC_SECRET_0 .....
QUIC_SERVER_TRAFFIC_SECRET_0 .....
QUIC_EXPORTER_SECRET .....

このKEYLOGファイルをWiresharkに食わせてやれば、パケットが復号されます。

復号

Wiresharkの設定(Advanced)から、tls.keylog_fileを得られたKEYLOGファイルに設定します
f:id:ASnoKaze:20190321235440p:plain

Protected Payloadが復号されます。STREAMフレーム内の、HTTP/3のレスポンスデータが見えているところです。
f:id:ASnoKaze:20190321235642p:plain