見出し画像

TWPCAP:TLS 1.3を検知しない問題で悩む

今朝は久しぶりに猫が4時に起こしに来てくれました。「昨日作ったTLSのレポートにはまだ問題あるよ」とのことです。
早く起こしてもらったので、まじめにTLSの検知機能をテストしてみました。
TLS 1.3の通信を発生させるには、opensslのコマンドで、

# openssl s_client -connect  www.google.com:443 -tls1_3

を実行すればよいです。テストの結果、どうもTLS 1.2までしか検知していないようです。
さらにまじめにTLS 1.3について調べました。

の記事をみてRFC8446に

A TLS 1.3 client who wishes to negotiate with servers that do not support TLS 1.3 will send a normal TLS 1.3 ClientHello containing 0x0303 (TLS 1.2) in ClientHello.legacy_version but with the correct version(s) in the "supported_versions" extension. If the server does not support TLS 1.3, it will respond with a ServerHello containing an older version number. If the client agrees to use this version, the negotiation will proceed as appropriate for the negotiated protocol.

ということが書いてあることを知りました。実際のパケットでも、

画像1

のようになっていました。私が検知に使っているバージョンの値はTLS 1.2にしかならないということのようです。これではTLS 1.3を検知しないのは当然です。ServerHello の Supported_versionを取得する必要がありますが、使っているgopacketのデコード機能では取得できません。それどころか、TLS 1.3のServerHelloはデコードエラーになっています。
そのうちgopacketが進化してTLS 1.3をデコードできるようになることを祈って終わりにしようかと思いましたが、悔しいので力技でTLS 1.3の検知を組み込みました。

if err != nil {
	if bytes.Contains(packet.ApplicationLayer().LayerContents(), []byte{0x00, 0x2b, 0x00, 0x02, 0x03, 0x04}) {
		setTLSv1_3(src, dst, int(tcp.SrcPort))
	}
	return
}
​

パケットの中にServerHello の Supported_versionがTLS 1.3を示すバイトパターンがあればTLS 1.3をTLSレポートのでデータのセットするという処理にしました。
gopacketがTLS 1.3に対応した場合は別の場所で検知するコードも組み込んでおきました。
いちおう検知できるようになりましたが、今朝は時間切れです。詳しいテストは明日にします。
猫が早く起こしてくれたおかげで何とか解決できました。
ありがとう猫。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。