モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

フォームメールの脆弱性を使ったspam

みっともないので書かないでおこうかと思ったんですが、まあ誰かの役に立つこともあるかと思ってあえて恥をさらして書いてみます。


年末にハウジングしてる先からメールがあって、自分が管理してるサーバからspamが出てる、とSpamCopから連絡があったので、調べて対応してね、とのこと。
で、添付されてあったスパムメール見ると、確かにうちのサーバから出てて、古いフォームメールのcgi(Matt's Script Archive: FormMail)から出ているようでした。

このフォームメールのcgiは古くからあり、だいぶ昔に自分でパッチ書いて日本語化したものなんだけど、とてもメジャーなんだけど穴があるため、よくスパマーに狙われて使われるらしい。
SpamCop.net - SpamCop FAQ: Formmail

よく知られた穴としては、メールの送付先をパラメータ渡しできるようになっているため、送信先をスパムの送付先に指定してメールを送らせる、というもの。
cgiはreferrerでチェックが掛けられているのだけど、referrerはクライアント側から送られてくる情報だから、当然偽装して抜けてこれる。

実はこれを使って、これまただいぶ前にスパム送信に使われてしまったことがあって、この時は送信先のアドレスをチェックして、こちら側で許可したドメインにしかメールを送れないように修正して対処しました。
つまり、自分ところのユーザしか使わないはずだから、基本自分ところのドメインにしか送れないように修正したわけです。


その修正が施されていたため、なんで送られているんだろう?と不思議でした。
httpdのログを見ても解らなかったため、cgiにログを吐くように修正し、相手が再度スパムを送るのに使うのを観察してみました。

すると、メールの送付先には、うちのドメインなんだけど適当なメールアドレスを書いておいて、subject用に渡されてくるパラメータ中に「%0a」で改行して勝手に他のヘッダを付ける、というやり方だとわかりました。
つまり「subject=spam_subject%0abcc:target_address1@example.com,target_address2@example.net」とかになってるわけ。

さっそく、subjectやその他のheaderに埋め込まれるパラメータに対して「%0a」を削除する修正(tr/\x0D\x0A//d Perlメモより)を加えました。



ふと気になって、国内で使われてる他のフォームメールのcgiを眺めてみると、結構この手のチェックされずに、subjectだとかfromだとかにパラメータが埋められてるようで、同じ手でspamの送信に使われてしまう、ということが解りました。

ついでに一つ思いついたんですが、fromってカンマ区切りでたくさんメールアドレス書けましたっけ?それが出来ると、故意にエラーメールにさせて、fromにスパムメールの送り先を書いといて、エラーメールの内容がスパムになってる、とか出来るなあ、と。


(関連)

ここに、FormMail-1.9に修正の加えられたバージョンのリンクがあります。
SpamCop.net - SpamCop FAQ: Formmail