はじめに

こんにちは、 yosida95 こと技術開発部技術局の吉田昂平です。 20歳になって初めての Gehirn News のポストです。 先日 NHK Eテレで放映された「ニッポンのジレンマ」という番組に出演しました

さて、現在 Public Preview で提供している Gehirn Infrastructure Services に、メールをシンプルな API で送受信可能な Gehirn MTA というサービスがあります。 ご存知でしょうか。

Gehirn Infrastructure Services で提供しているすべてのサービスは、私ひとりで API とバックエンドを実装しており、 Gehirn MTA も例にもれず私が Go 言語を用いてひとりで MTA (smtpd) を実装したサービスです。

経緯

ゲヒルン社内では脆弱性情報のアナウンスなど、職員全員で購読したいメーリングリストを Gehirn MTA で受信し、 Gehirn EDJ を経由して Slack に投稿するという使い方をしています。

Gehirn MTA - Gehirn EDJ Slack 連携

この運用の中で、 Debian Security Announcements に投稿されたメールのうち、特定の送信者が投稿したメールを正常に受信できていない事に気づきました。

DKIM 署名

受信に失敗する理由を検証するために Gehirn MTA のログを調査した所、メールに施された DKIM 署名の検証に失敗したため、正常な動作としてメールの受信を拒否していたことが分かりました。 Gehirn MTA の DKIM 署名検証にバグがある可能性も考慮し、他社メールサービスで受信した同一のメールを手に入れ検証したところ、そちらの実装でも検証に失敗していることが分かりました。

DKIM とは RFC6376 で定義されている、メールが手元に届くまでの間に改ざんされていない事を検証するための仕組みです。 メール送信者はメール本文のハッシュ値と秘密鍵で署名したメールヘッダー群を DKIM-Signature ヘッダーに含め、受信者は署名に使われた秘密鍵に対応する公開鍵を用いて DKIM-Signature ヘッダーを検証することで、メールが途中経路で改ざんされていない事を確かめます。

今回検証に失敗していたのは、メールヘッダー群の署名の方でした。

原因の究明

不正な DKIM 署名を施している投稿者に個別に連絡をとり、この事実をメールでお伝えしました。 すぐに返信をいただき、「 SMTP のプロフェッショナルでは無いがこの問題の原因究明のための設定変更を行うので変化があったら教えて欲しい」とのことでした。

しかし、この返信に施されている DKIM 署名は正常に検証できることに気づきました。

そこで、 DKIM 署名の検証に成功する私宛の返信と、検証に失敗する Debian Security Announcements に投稿されたメールとで Received ヘッダーを比較してみました。 Received ヘッダーとは問題検証のためのヘッダーで、 RFC5321 でメール配送に加担したすべての MTA が自分の情報をメールに追記することになっています。

比較の結果、 lists.debian.org を経由したかどうかの違いしかみられませんでした。 ここから、この lists.debian.org がメールヘッダーを改変していることが推測できました。

過去に Debian Security Announcements に投稿されたメールの一覧を眺めた所、メールの件名に規則性があることに気づきました。 おそらく自動生成されているのだろうと推測し、件名に必ず付いている “[Security] ” という接頭辞に当たりをつけてこれを除いてみた所、見事に検証に成功しました。

問題の修正

ここまでの経緯を Debian Security Announcements の投稿者に連絡した所、 lists.debian.org の postmaster と協力してこの検証が正しいことを確認していただけました。

その上で、 Debian Security Announcements の投稿者に適用されるメールの配送経路のポリシーを更新することで、この接頭辞が付けられる前の DKIM 署名を防ぎ、この問題を修正したとの報告を受けました。

おわりに

この記事では、 Debian Security Announcements に投稿されたメールに施された DKIM 署名が不正であることに気づき、投稿者とやりとりをする中で原因を突き止め、問題が修正されるまでの流れを書いてみました。 なお、この件の Gehirn News での公開可否を尋ねた所、とても快く公開の許可をいただけました。

このようにして日々開発が続いている Gehirn MTA を始めとする Gehirn Infrastructure Services のサービスは現在、 Public Preview として無料でご提供するかわりにご要望や不具合のご報告をいただくことで正式リリースに向けてより品質を高めております。 この機会に是非、ご利用ください。

また、ゲヒルンでは私の同僚となる バックエンドエンジニア (Gehirn Web Services) を始め、あらゆる職種で職員を募集しています。 詳細は採用情報よりご確認ください。

ありがとうございました。