public suffix list に含まれない TLD で DMARC の技術検証をしてはいけない
DMARC の RFC 7489 の 3.2 項に、受信メールの From アドレスから組織ドメインを抽出するアルゴリズムが書かれているが、TLD が public suffix list に含まれない場合には組織ドメインを決定できないことに気付いた。
public suffix list は Mozilla が中心となってコミュニティで管理されており、ICANN で管理されている TLD は全て含まれているので、上記のような問題は通常は起きない。
しかし、RFC 2606 で予約されている4つの TLD ".test", ".example", ".invalid", ".localhost" は public suffix list に含まれておらず、Bugzilla での議論 によるとこれらは追加しないものと過去に決定されたようである。
そのため、DMARC の技術検証をする際は、予約された TLD やオレオレ TLD ではなく、"example.com", "example.net", "example.org" といった例示用ドメインの DNS サーバを立てて行うのが良さそう。
OpenDMARC の実装の確認
ちなみに、OpenDMARC がどのような実装になっているか確認したところ、public suffix list に含まれないドメインの場合には動作が危ういように見えた。
/libopendmarc/opendmarc_tld.c#L234-L312 の opendmarc_get_tld
関数は、引数 domain
から組織ドメインを抽出し、結果を引数 tld
に格納して返すという動作をしている。
この関数を見ると、public suffix list に含まれない場合は L267-L272 の分岐に入って domain
がそのまま tld
に格納されて返るように見えるものの、L265 の for の繰り返し条件では L267 の条件が成立することはなく、引数 tld
に何も格納されないまま return 0;
で返ることになる。
この関数は /libopendmarc/opendmarc_policy.c
の中から呼び出されているが、関数の戻り値はチェックしているものの、抽出した組織ドメインが空かどうかはチェックしていないため、期待通りの動作にならないはずである。