暗号化通信のメタデータ分析
同じTLS接続を二つの観測点から見た資料を使い、取得開始時刻、欠落バイト、SNI、証明書の補足情報を比較します。観測できた値と、追加資料が必要な内容を具体的に整理します。
説明
TLSを復号しない観測点では、接続先やタイミングなどを調べられても、アプリケーション本文を読めるとは限りません。ClientHelloより後から取得した記録では、開始時のメタデータ自体が欠けることもあります。
同じTLS接続を二つの観測点から見た資料を使い、取得開始時刻、欠落バイト、SNI、証明書の補足情報を比較します。観測できた値と、追加資料が必要な内容を具体的に整理します。
1観測点ごとの記録を読む
bodyは取得したアプリ本文です。NULLを空の本文と読み替えないようにします。
from oplab import *
db=connect(5)
show(db, 'SELECT観測点ごとの記録を読む * FROM tls ORDER BY id')どちらにも本文はありません。t2にはSNIもなく、欠落バイトが記録されています。
2途中からの取得を探す
取得開始が接続開始より後かを計算します。
show(db, 'SELECT途中からの取得を探す id,capture_start-connection_start AS start_delay FROM tls ORDER BY id')t2は5秒遅れて取得しています。SNIがない理由を直ちにSNI未送信と決めず、観測開始時点を確認します。
3欠落量を比較する
missed_bytesは観測処理が把握した欠落量です。0でも、別区間や別経路に観測漏れがない保証にはなりません。
show(db, 'SELECT欠落量を比較する observer,missed_bytes FROM tls ORDER BY id')mirrorは200バイトの欠落があります。欠落がある資料のデータ量を、接続全体の完全な転送量として扱うことはできません。
4別途得た証明書情報を見る
TLS 1.3の証明書メッセージは暗号化されます。このcert表は端末側から補足取得した情報です。
show(db, 'SELECT別途得た証明書情報を見る * FROM cert')名前と発行者は確認できますが、端末の検証結果は未取得です。証明書名の一致だけでサーバーが安全だとは判断しません。
5名前の対応を確認する
観測点のSNIと端末側資料のsubjectを並べます。subjectはこの試料で抽出した名前です。
show(db, 'SELECT名前の対応を確認する t.id,t.sni,c.subject,c.validation FROM tls t LEFT JOIN cert c USING(id) ORDER BY t.id')t1では名前が対応します。SNIは要求された名前であり、本文の意味や利用者の意図の証拠ではありません。
6本文を持つ記録の有無を調べる
本文の取得状況を数値で確認します。
show(db, 'SELECT本文を持つ記録の有無を調べる COUNT(*) AS observations,COUNT(body) AS bodies FROM tls')2観測とも本文は未取得です。確認できる接続情報を報告し、送信内容の調査には端末やアプリ側の記録を求めます。
まとめ
2観測とも本文は未取得です。確認できる接続情報を報告し、送信内容の調査には端末やアプリ側の記録を求めます。
表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite・固定の調査記録
from oplab import *
db=connect(5)
show(db, 'SELECT * FROM tls ORDER BY id')id | observer | sni | version | body | missed_bytes | capture_start | connection_start t1 | edge | files.example.test | TLS1.3 | NULL | 0 | 9 | 10 t2 | mirror | NULL | TLS1.3 | NULL | 200 | 15 | 10
show(db, 'SELECT id,capture_start-connection_start AS start_delay FROM tls ORDER BY id')id | start_delay t1 | -1 t2 | 5
show(db, 'SELECT observer,missed_bytes FROM tls ORDER BY id')observer | missed_bytes edge | 0 mirror | 200
show(db, 'SELECT * FROM cert')id | subject | issuer | validation t1 | files.example.test | Lab CA | not_observed
show(db, 'SELECT t.id,t.sni,c.subject,c.validation FROM tls t LEFT JOIN cert c USING(id) ORDER BY t.id')id | sni | subject | validation t1 | files.example.test | files.example.test | not_observed t2 | NULL | NULL | NULL
show(db, 'SELECT COUNT(*) AS observations,COUNT(body) AS bodies FROM tls')observations | bodies 2 | 0
演習完了