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-L312opendmarc_get_tld 関数は、引数 domain から組織ドメインを抽出し、結果を引数 tld に格納して返すという動作をしている。

この関数を見ると、public suffix list に含まれない場合は L267-L272 の分岐に入って domain がそのまま tld に格納されて返るように見えるものの、L265 の for の繰り返し条件では L267 の条件が成立することはなく、引数 tld に何も格納されないまま return 0; で返ることになる。

この関数は /libopendmarc/opendmarc_policy.c の中から呼び出されているが、関数の戻り値はチェックしているものの、抽出した組織ドメインが空かどうかはチェックしていないため、期待通りの動作にならないはずである。