メール検証の名のもとに行われるスパム送信

メールアドレス検証という建前で、実質的なスパムメールを大量送信するサービスの実装が報告されました。セキュリティエンジニアの milek7 氏が、複数のサービスに共通する問題的なパターンを指摘しています。(出典)

具体的には、Pangram という企業のサインアップフォームでメールアドレスを入力すると、検証という名目で以下のような API リクエストが実行されます。

curl --request POST --data '{"email": "example@example.com"}' 
https://www.pangram.com/api/validate-email

その直後、ユーザーのメールボックスに身に覚えのないメールが届きます。差出人は「Winwin Insights」という企画から、磁気ドメインに関する情報メールという体裁で送信されているのです。

このメールは一見すると「事実の共有」という名目ですが、実態はスパム配信の仕組みに組み込まれています。

なぜこのような実装が問題なのか

メールアドレスの有効性確認は、ウェブアプリケーション開発の常識的なタスクです。一般的なベストプラクティスは「検証リンクを送信して、ユーザーがクリックするまで待つ」というシンプルな方法です。事前に複雑な検証を行うことは、多くの開発者によって非推奨とされています。

しかし、この企業(およびおそらく複数の類似サービス)は異なるアプローチを選択しました。メールアドレスの有効性を確認する名目で、実質的には第三者のドメインからユーザーにメールを送信し、そのメールが到達したかどうかで検証を完了するという仕組みです。

この手法の問題点は以下の通りです:

  • 迷惑メール送信となっている:ユーザーの同意なく他社のドメインからメールが大量に送信される
  • スプーフィング的な性質がある:複数のドメインを使い分けることで追跡を難しくしている
  • ユーザーへの通知がない:なぜこのメールが来たのかを説明していない
  • メール認証への負荷:スパムフィルタリングやメール配信インフラへの負荷が増加する

milek7 氏が確認した限りでは、この企業は 20 以上のドメインを使い分けて送信しています。

使用されているドメイン例(一部)
sifgoldenshine.com sipandsweater.com
lanternlyric.com thruwaymotors.com
hydroponicseeders.com strategycrit.com
fragmentjoystick.com pyxisvoyager.com

メール検証の「正しい」やり方

セキュリティのベストプラクティスは「複雑な事前検証はしない」です。RFC に準拠した基本的な構文チェック(@記号の存在、ドメイン名の形式)程度に留め、実際の検証はユーザー自身のアクション(確認メールのクリック)に委ねるべきです。

以下が推奨される流れです:

  1. クライアント側で基本的な正規表現チェック
  2. サーバー側で再度、最小限の形式チェック
  3. ユーザーに確認メールを送信(自社ドメインから、ユーザーが同意した形式で)
  4. ユーザーがメール内のリンクをクリックしたら確認完了

この方法なら、ユーザーは明示的に「メールを受け取ることに同意した」ことになり、法的にも倫理的にもクリアです。

セキュリティ業界の潮流として、特に Five Eyes(オーストラリア・カナダ・ニュージーランド・米国・英国の情報機関)が共同で発表した警告では、組織は「サイバーセキュリティの基本を徹底すること」を求めています。(出典)メール検証という基本的なプロセスを誤った実装で進めることは、まさにこの警告に抵触する行為と言えます。

ユーザーの信頼を失わないためにも、検証プロセスは透明で予測可能である必要があります。

開発者が今すぐできる確認と対策

もし自分たちのサービスでメール検証を実装しているなら、以下の点をチェックしてください:

  • ユーザーの同意なく第三者ドメインからメールを送信していないか
  • 複数のドメインを用いてスパム判定を回避しようとしていないか
  • メール送信時に「なぜこのメールが来たのか」をユーザーに明確に説明しているか
  • メール送信が DKIM・SPF・DMARC などの認証レコードに準拠しているか

参考になるのが OpenAI の最近の取り組みです。OpenAI は脆弱性検出用の AI モデル「GPT-5.5-Cyber」を強化し、セキュリティ関連のベストプラクティスを支援する方向に舵を切っています。(出典)このように業界全体でセキュリティ意識が高まっている中、不適切な実装は早期に改善すべきです。

開発チーム内で「なぜこの実装を選んだのか」を問い直し、RFC に準拠した標準的な手法への移行を検討することをお勧めします。