送信元メールアドレス偽装が可能となる、メールクライアント側の脆弱性を突いた攻撃のことで、2017年12月7日にWebで公開されました。プロトコルを使って行います。送信元メールアドレスは基本的に返信したいときに使われる情報ですので、SMTPプロトコル自体では受信時に『送信元メールアドレスが偽装されているかどうか』は気にしません。送信元メールアドレスを記述する場所が2か所あります。FROM"コマンドで通知するメールアドレスで、『エンベロープFROM』とも呼ばれます。行で通知するメールアドレスで、『ヘッダFROM』とも呼ばれます。『ヘッダFROM』はメールクライアントから見たときに<差出人>として表示される情報です。通信においては使われません。それゆえ簡単に偽装ができます。通信の送信元として取り扱われます。宛先メールアドレスが存在しなかった場合などでエラーメールが返ってくる場合は、『エンベロープFROM』宛になります。いった送信元ドメイン認証技術により使われる情報となりました。メールアドレスを騙って送信する例を示します。昔はメール送信時に送信元メールアドレスが正しいかどうかの認証は行っていませんでした。それゆえ、自分のメールアドレスを勝手に騙られるのはよくある話でした。AUTHという認証を行うことにより、送信元メールアドレスを使うのにも認証が必要となりました。昔は自分のドメイン外のメールアドレスを中継してしまう(いわゆるオープンリレー)設定をしてしまっているメールサーバも多々見られ、スパムメールの踏台になってしまうケースもありました。リレーするのが原則となっています。受信側で偽装メールアドレスを止める対策(2つの送信ドメイン認証技術)しかし送信側の対策もまだまだ完璧ではありません。以外を受け付けてしまうメールサーバは存在しますし、これからも意図してか意図せずか、作られ続けるでしょう。そこで受信側での対策も求められました。2つの送信元ドメイン認証技術があります。Mail)"が統合されて出来た規格です。メール送信する場合を考えます。サーバのTXTレコードに公開鍵を配置します。メールサーバへ送ります。公開鍵は例えば以下コマンドで確認できます。s1024._domainkey.yahoo.comなお、公開鍵・秘密鍵の仕組みについてはこちらを参照下さい。最大のメリットは、エンベロープFROMが正しいことを確認できる上に、ヘッダ内が改竄されていないことも確認できるため、エンベロープFROMとヘッダFROMが一致するかどうかを検証することで、両方の正当性を確認できることです。設定に手間がかかるのがデメリットです。氏により提唱されたメール認証技術です。統合されて出来た規格です。仕組みとしてはどちらも共通で、『SMTPのTCPコネクションの送信元IPアドレス』と『送信元メールアドレスのドメイン管理DNSサーバのTXTレコードに含まれるIPアドレス』が合致するかどうかを確認します。メール送信する場合を考えます。サーバのTXTレコードにSPF/SenderIDの設定をしておきます。DNSサーバのTXTレコードを取得してSMTP送信元IPと比較することで、送信元メールアドレスの正当性を確認できます。逆引きしたもの、もしくはyahoo.netを逆引きしたものであれば正しいと認証しろ。他のIPから来ることもあるから、その他のIPについては正しいとも不正とも判断するな。SPF情報は以下コマンドで確認できます。_spf.mail.yahoo.comSPF/SenderIDのメリットは、実装が簡単なところですが、デメリットとして、確認できるのはエンベロープFROMのみです。両方を実装するという選択肢メールはその性質から、なかなか思い切って切り捨てることが難しいです。認証されたならば確実に正しいと言えますが、認証できなかったものは全て不正かというとそうも言い切れません。両方実装し、正しいと確認できる機会を増やしていくことが大事なのかもしれません。それがやがて、全てを正しく認証できる時代へと繋がる気がします。よる『ヘッダFROM』の偽装メール防止技術をすり抜ける攻撃です。正しく実装していないことに起因していますが、すり抜けられ方は、メールクライアントによってまちまちです。RFC1342では、ASCII以外の文字コード(つまりマルチバイトコード)をエンコード/デコードする具体的な方法が決められています。正確に言うと、対象範囲をバイナリとして扱い、それをASCIIへエンコードし、本来ASCIIにしか対応していないSMTPでの送信を可能とする手法です。ASCII自体もバイナリとして捉えることでエンコード/デコード可能です。例が紹介されています。https://www.mailsploit.com/index送信メールサーバのエンコード送信側メールサーバでは、ヘッダFromを以下のように書きます。ポイントは『=?utf-8?Q?=00?=』の箇所で、これはNULLをエンコードしたものになります。=?utf-8?b?${base64_encode('potus@whitehouse.gov')}?==?utf-8?Q?=00?==?utf-8?b?${base64_encode('(potus@whitehouse.gov)')}?=@mailsploit.combase64_encode()関数を使ってエンコード後の文字列が入ると次のようになります。