退信攻击式垃圾邮件
刘五十三
退信攻击式垃圾邮件
最近遇到很多次一个地址,一天收几百封,甚至上千封退信式垃圾邮件的,看了几个邮件好像模式是这样的
1 发垃圾邮件的冒充你的地址发信出去,比如你的地址是 [email]001@abc.com[/email] ,设置from地址是[email]001@abc.com[/email]一次发出去几十万封垃圾邮件出去。
2 一部分收到这些垃圾邮件的服务器(比如发到[email]002@cde.com[/email])会先收下来,比如有的邮件服务器前面放个杀毒的,垃圾邮件过滤网关之类的,然后他们在内部处理的时候出现错误,比如 to地址不存在,然后这个cde.com的服务器就生成一封退信退还给发信人就是退信发给[email]001@abc.com[/email]
3 由于发送邮件服务器不是垃圾邮件发送人,ip地址基本上也是清白的,这时候[email]001@abc.com[/email]的服务器会收下这封退信到[email]001@abc.com[/email]去。
4 第2步的每台服务器基本上不会发很多退信,很多情况下就是一封退信,但是垃圾邮件发送人发出去的10万封垃圾邮件中,就算有百分之一是第2步这种情况的服务器,就有1000个退信从不同的邮件服务器发给[email]001@abc.com[/email],这些邮件基本上都不是黑名单都会被判断为ham,这样[email]001@abc.com[/email]的用户就收到1大堆的垃圾邮件。不过基本比较有规律,主题是 return mail之类,发信人是[email]MAILER-DAEMON@xxx.com[/email],实际上rcpt过程中的发信人from一般是空地址<>。
我尝试过通过主题关键字或发信人关键字过滤,但是有时候[email]001@abc.com[/email]发出的正常邮件也会出现退信,也可能是发到了对方服务器后出现问题在打回,和垃圾邮件发送人造成的退信无法区分。
abc.com 域名使用spf之类的认证效果也不明显,因为很多服务器不做spf认证的,不知道大家有没有遇到这样的问题,有什么好办法处理。
xmbbx
把这种邮件重定向到/dev/null,要如何实现,还尚无思路,要根据实际情况。
ardi
回复 #1 刘五十三 的帖子
你不是得罪了什么人了吧
gucuiwen
这种情况spf是最好的方案,但是目前很多网站的邮件域名还不支持spf,查询不到SPF记录,这就给假冒者可趁之机了,我的方案是先spf查询真实性,如果没有spf记录,就比对IP,如果IP和查询到的A记录明显不是一个网段的,就block掉。这种方法的误判率非常低,实际效果还是不错的。
什么叫明显不是一个网段的? 举例:
abc.com 查询到MX记录,再查询A记录,假设IP是202.90.28.12
如果实际来连接的IP是61.192.93.82 ,这两个IP一比对,非常明显,99.9%的可能性是伪造的。
如果查出来是202.90.27.36,我就认为他不是伪造的,因为有些大型邮件系统的收发邮件都是分布在不同网段的服务器上的,我的判断 原则是前两个数字必须相同,当然是在spf过滤没有记录下再做这一步,用python,perl等写脚本实现,有现成的模块可以用。
gucuiwen
当然,要避免,首先自己的邮件域名要支持SPF,让别人可以根据SPF记录来判定邮件的真假。否则自己的域名被别人冒用了,就难免经常收到这种退信攻击信。
abel
1. Reject Sender=<> , 這種情況會把外部所有的退信都給檔了, 但自己信從自己的 Server 退給自己的 User 時, IP 會有一定特徵
劉兄可參考如下 code
[code]
if ($ip !~ /$my_network/) {
if ($sender=~/<>/) {
return ('REJECT',"we did not accept the empty address <>") if ($ip !~ /210.17.57.|140.92|140.112/);
}
#..以上略, my_network 內容即如: qw(127.0.0.1|211.72.21[01]|61.220.48|203.73.24|210.17.9|140.[123][0-9]|192.83.166)
[/code]
另外,我把以前說的再 quote 一下
[quote]
一般來說業界目前的做法不過兩種, 但是非得把他講的玄的又玄
SPF 是個好方法, 但是實做的太少,我查過全台灣的域名,有 SPF 才不過 1%, 這 1% 並沒有什麼意義!
方法:
1. 在由你發出的信中,加入一個 Tag (Ex: X-Relay-Host: my_server) , 這個 Tag 可以是一個固定值,或是一個 singing
的方法當有退信發生時, MDA/Milter 檢查郵件內容是否含此 Tag , 無則 discard
PS: 退信發生怎判斷 ? Sender, Subject or Header
2. 在發出去時,在 SMTP negotiation 階段, 修改 Mail From 內容,例如原送件人是 abel 則改為 abel+bouncing ,退發生時
也必是 abel+bouncing , 如此則是標準的退信,如果退信發生時無 +bouncing, 那就是退信攻擊的情況
兩種方式無非是收下來檢查有無 Tag 再決定行為, 或是在 SMTP negotiation 直接退
[/quote]
scyzxp
[quote]原帖由 [i]abel[/i] 于 2008-6-19 11:56 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8619119&ptid=1163965][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
1. Reject Sender= , 這種情況會把外部所有的退信都給檔了, 但自己信從自己的 Server 退給自己的 User 時, IP 會有一定特徵
劉兄可參考如下 code
if ($ip !~ /$my_network/) {
if ($sender=~//) { ... [/quote]
其实我觉得第一种方法很好.在header加tag.
刘五十三
[quote]原帖由 [i]abel[/i] 于 2008-6-19 11:56 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8619119&ptid=1163965][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
1. Reject Sender= , 這種情況會把外部所有的退信都給檔了, 但自己信從自己的 Server 退給自己的 User 時, IP 會有一定特徵
劉兄可參考如下 code
[/quote]
自己的信发到对方的服务器在发信过程中被退可以分辨出来,但是如果自己的信发给对方,对方服务器收下了,然后在对方服务器
内部处理的时候出错,比如对方的连接internet的杀毒网关发到真正服务器的时候发现用户的邮箱满了,这时候对方的真实服务器会产生一封退信,这封退信是从对方的服务器ip发出的,和垃圾邮件产生的退信看不出区别来。实际上这样产生的退信和我的文章中第2步产生的退信没有区别。
我这边可以根据信头发信ip之类的方法区分出自己的服务器产生的退信,但是没用,正常用户发给那些地址事先不知道。碰上cde.com的服务器一定要自己先收下来,然后内部处理出错了发送退信给收件人的话,自己也不知道这封信被退了。
我猜想发送垃圾邮件的人会随便取一个实际存在的用户作为发件人,冒充一个不存在的域名会被很多服务器拒绝,自己申请域名还要花钱。现在这种情况好像影响还不大大家不是很重视,看来只有等到这样的问题多了,对spf之类的认证才会重视起来才能解决问题了。现有的情况下解决这问题我觉得很悲观。
刘五十三
刚回复又看到abel老兄下面还有具体方法
[quote]1. 在由你發出的信中,加入一個 Tag (Ex: X-Relay-Host: my_server) , 這個 Tag 可以是一個固定值,或是一個 singing
的方法當有退信發生時, MDA/Milter 檢查郵件內容是否含此 Tag , 無則 discard
PS: 退信發生怎判斷 ? Sender, Subject or Header
2. 在發出去時,在 SMTP negotiation 階段, 修改 Mail From 內容,例如原送件人是 abel 則改為 abel+bouncing ,退發生時
也必是 abel+bouncing , 如此則是標準的退信,如果退信發生時無 +bouncing, 那就是退信攻擊的情況
兩種方式無非是收下來檢查有無 Tag 再決定行為, 或是在 SMTP negotiation 直接退 [/quote]
这个办法看来不错,具体操作在退信中需要对方服务器发信的时候包含原信或原信的邮件头,我研究看看。
abel
我自己是用 $sender=~/<>/ 這種方式,理論上會有誤殺退信, 不過實際上我還未看過 (我巳經 run 四年這種方式了)
刘五十三
应该可以搞定了,我这边的邮件发出的内容里面都有
by cde.com (8.xx.x/8.xx.x) with ESMTP id xxxxxxxxxxxx
这样的行,我看了几个垃圾邮件退信和正常退信,退信里面都会包含原始邮件,或者至少包含原始邮件的邮件头,如果是正常退信,就有两行 by cde.com,实际上每一封通过我的服务器的邮件都有by cde.com的received行的,但是正常退信在引用原信的时候会有两行 by cde.com,垃圾邮件造成的退信只有一行 by cde.com 因为引用的原信没有通过cde.com服务器发出就没有by cde.com行。再加上一个判断发件人是MAILER-DAEMON两个条件都成立就可以了。设定条件后试试看是否能解决这个问题。感谢abel提供了思路。希望垃圾邮件发送人不会这么聪明的马上伪造received头了。
刘五十三
[quote]原帖由 [i]ardi[/i] 于 2008-6-18 17:15 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8615012&ptid=1163965][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
你不是得罪了什么人了吧 [/quote]
应该不是,还不至于到这地步,估计就是运气不好
刘五十三
[quote]原帖由 [i]gucuiwen[/i] 于 2008-6-19 10:55 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8618626&ptid=1163965][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
这种情况spf是最好的方案,但是目前很多网站的邮件域名还不支持spf,查询不到SPF记录,这就给假冒者可趁之机了,我的方案是先spf查询真实性,如果没有spf记录,就比对IP,如果IP和查询到的A记录明显不是一个网段的,就block掉。这种方法的误判率非常低,实际效果还是不错的。
什么叫明显不是一个网段的? 举例:
abc.com 查询到MX记录,再查询A记录,假设IP是202.90.28.12
如果实际来连接的IP是61.192.93.82 ,这两个IP一比对,非常明显,99.9%的可能性是伪造的。
如果查出来是202.90.27.36,我就认为他不是伪造的,因为有些大型邮件系统的收发邮件都是分布在不同网段的服务器上的,我的判断 原则是前两个数字必须相同,当然是在spf过滤没有记录下再做这一步,用python,perl等写脚本实现,有现成的模块可以用。[/quote]
这个好像不可行,发信的ip就是正规的邮件服务器,我检查了几个都是这样,并不是垃圾邮件的或冒充的ip.
xmbbx
一般退信时在邮件超过了一定大小就不会带原邮件了,比如我的设置是退信时原邮件超过50K就不带原邮件了。
刘五十三
[quote]原帖由 [i]xmbbx[/i] 于 2008-6-19 17:04 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8621881&ptid=1163965][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
一般退信时在邮件超过了一定大小就不会带原邮件了,比如我的设置是退信时原邮件超过50K就不带原邮件了。 [/quote]
不需要带原始邮件,有原始邮件的邮件头就可以,至少让别人可以根据原始邮件的msgid或队列号查询问题邮件走过的路径。