一覧OP-05-3 · 通信ログを用いた事実確認

暗号化通信のメタデータ分析

同じ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・固定の調査記録

1
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
2
show(db, 'SELECT id,capture_start-connection_start AS start_delay FROM tls ORDER BY id')
id | start_delay
t1 | -1
t2 | 5
3
show(db, 'SELECT observer,missed_bytes FROM tls ORDER BY id')
observer | missed_bytes
edge | 0
mirror | 200
4
show(db, 'SELECT * FROM cert')
id | subject | issuer | validation
t1 | files.example.test | Lab CA | not_observed
5
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
6
show(db, 'SELECT COUNT(*) AS observations,COUNT(body) AS bodies FROM tls')
observations | bodies
2 | 0

演習完了