2025/05/13 15:24 A Tale of a Trailing Dot (2022)

やあ、ロボ子。今日はDNSの話をするのじゃ。

DNSですか、博士。よろしくお願いします。

ホスト名の末尾にドットを付けても、DNS解決の結果は変わらないって知ってたか?

え、そうなんですか?初めて知りました。DNSプロトコル自体が末尾のドットを無視するんですね。

そうなんじゃ。でも、名前解決の時はちょっと違うぞ。ドットがある場合は、ドメイン名を追加せずに完全指定された名前として扱われるんじゃ。

なるほど。ドットがない場合は、ドメイン名が追加される可能性があるんですね。

HTTPの世界では、もっと面白いことが起こるんじゃ。HTTPクライアントはURLからホスト名を抽出して、IPアドレス解決と`Host:`ヘッダーに使うんじゃ。

`Host:`ヘッダーですか。そのヘッダーに末尾のドットが含まれるとどうなるんですか?

HTTPの仕様では、`Host:`ヘッダーのホスト名はURLから verbatim で使うべきで、末尾のドットも含まれるべき、とされているんじゃ。

へえ、面白いですね。サーバーは "example.com" と "example.com." で異なるコンテンツを提供できるんですね。

Cookieはどうなると思う?

Cookieですか。Cookie仕様では、ホスト名の末尾のドットは無視されるんでしたっけ?

その通り!ドットの有無にかかわらず、同じドメインとして扱われるんじゃ。

SNI (Server Name Indication)はどうですか?

SNIフィールドでは末尾のドットの有無を区別できないんじゃ。

curlの歴史も関係あるみたいですね。

そうなんじゃ。以前は末尾のドットを削除していたけど、`Host:`ヘッダーでドットが必要なサイトに対応するために、curl 7.82.0でドットを保持するように変更されたんじゃ。

その変更がセキュリティ脆弱性につながったんですね。

そうなんじゃ。Cookie処理とHSTSで問題が起きて、CVE-2022-27779とCVE-2022-30115という脆弱性が生まれたんじゃ。

curl 7.83.1でこれらの問題が修正されたんですね。安心しました。

Public Suffix List (PSL)も重要じゃ。サーバーが広すぎるドメインにCookieを設定しないように、クライアントはドメインをチェックする必要があるんじゃ。

PSLは、Cookieの設定が許可されていない既知のドメインのリストですね。

その通り!curlはlibpslをオプションで使用していて、libpslがない場合はバックアップ機能を使うんじゃ。

CVE-2022-27779は、libpslなしでビルドされたcurlで、末尾にドットが付いたTLDにCookieを設定できる脆弱性でしたね。

そして、CVE-2022-30115は、HSTSにおいて、末尾にドットがある場合とない場合で同じホスト名が異なるものとして扱われ、HSTSをバイパスできる脆弱性だったんじゃ。

DNSの末尾のドット一つで、こんなに色々なことが変わるんですね。奥が深いですね。

そうじゃろう?ところでロボ子、ドットが付いてるお菓子ってなーんだ?

えーと…水玉模様のクッキー、とかですか?

ブー!答えは、ホットドッグ!…って、ベタすぎたかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
