如何拒绝base64编码的垃圾邮件?


11

我刚收到几封邮件,它们的内容相似,都是用base64编码的。现在,我想使用正文检查来拒绝或丢弃此类电子邮件。

在我进入body_之前,请检查以下内容:

/Quanzhoucooway/ DISCARD

但是由于消息已编码,因此不会检测到该关键字。

这是base64编码的消息:

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

那么,阻止此类电子邮件的最佳实践是什么?


3
正确的垃圾邮件过滤会影响邮件的实际解码内容吗?
ceejayoz

您能否更具体一点,应使用哪种机制?我已经在使用spamassassin,在打击垃圾邮件方面做得很好。
user134969

我会MTA拒绝它们,并显示一条错误消息“不要使用base64编码消息正文”。
joshudson

Answers:


19

不要使用Postfix来执行此操作,body_check而是为其编写一个Spamassassin规则。Spamassain在应用其规则之前会对消息正文进行解码。就像是:

body     LOCAL_QUANZHOUCOOWAY  /Quanzhoucooway/
score    LOCAL_QUANZHOUCOOWAY  7.0
describe LOCAL_QUANZHOUCOOWAY  Block word Quanzhoucooway

这些规则属于/etc/mail/spamassassin/local.cf(或~/.spamassassin/user_prefs)。


1
即使该关键字是使用base64编码的,例如上面的内容,该方法也可以使用吗?
user134969

2
是。有人已经编辑了我的答案以澄清此问题。感谢那个匿名的人!:)
Esa Jokinen

9

从技术上讲,您可以直接为关键字过滤base64编码的数据。考虑到存在更好和更简单的替代方案(例如,如上述Esa的回答中所述),我并不是说这是实际或合理的事情,但它可能的。

诀窍是要认识到base64编码是将3字节原始未编码数据块确定性地映射为base64字符的4个字符块的确定性映射。因此,每当在未编码数据中出现某个3字节块序列时,相同的4个字符块序列将出现在编码版本中。

例如,如果您输入的字符串Quanzhoucooway的base64编码器,你会得到输出UXVhbnpob3Vjb293YXk=。由于输入的长度不是3个字节的倍数,因此输出在末尾包含一些填充,但是如果我们删除最后的=符号和最后一个实际的base64字符k(因为它也编码了一些填充位),我们将得到字符串UXVhbnpob3Vjb293YX这是保证出现在base64编码数据每当字节三胞胎Quanzhoucoow和部分三重态ay出现在以该顺序输入。

但是,当然,字符串Quanzhoucooway可能不会完全在三重音边界开始。例如,如果我们对字符串进行编码XQuanzhoucooway,则得到的输出WFF1YW56aG91Y29vd2F5看起来完全不同。这次,输入长度可被三倍整除,因此最后没有填充字符要丢弃,但是我们确实需要丢弃前两个字符(WF),每个字符都编码前置X字节中的某些位,从而使我们F1YW56aG91Y29vd2F5

最后,base64编码XXQuanzhoucooway提供了output WFhRdWFuemhvdWNvb3dheQ==,在两端都有填充。除去前三个字符WFh(对XX前缀进行编码)和后三个字符Q==(对末尾的零填充进行编码),剩下的就是字符串RdWFuemhvdWNvb3dhe。因此,我们获得以下三个base64编码的字符串:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

其中(至少)一个必须以base64编码形式出现在任何包含单词的输入字符串中Quanzhoucooway

当然,如果您不走运,base64编码器可能会在其中途在任何两个编码的三元组之间插入换行符。(例如,您的示例消息在F1YW56和之间有一个aG91Y29vd2F5。)因此,为了可靠地将这些字符串与正则表达式匹配,您需要类似以下内容(使用PCRE语法):

/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD

手工生成这些模式有点乏味,但是至少只要提供了base64编码器,编写一个简单的脚本即可用您喜欢的编程语言来完成它就不会困难。

如果确实需要,甚至可以通过base64对关键字的小写和大写版本进行编码,然后将它们组合成与它们的任意组合匹配的regexp,从而实现不区分大小写的匹配。例如,的base64编码quanzhoucoowaycXVhbnpob3Vjb293YXk=同时的那QUANZHOUCOOWAYUVVBTlpIT1VDT09XQVk=,所以规则:

/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD

只要它以三元组边界开头,它将与base64编码的单词“ Quanzhoucooway”匹配。剩下的工作是为转换后的版本生成其他两个相应的正则表达式。;)

las,像这样简单地进行比简单子字符串匹配更复杂的事情变得不切实际。但这至少是一个巧妙的把戏。原则上,如果您出于某种原因不能使用SpamAssassin或任何其他可以在过滤之前对base64编码进行解码的过滤器,它甚至可能会很有用。但是,如果您能够做到这一点,那么您一定应该这样做,而不是像这样使用hacks。


1
是的,有可能;不太实用,也不想为每个字再做一次。+1来解释:虽然这可能不是很有用,但它肯定是有教育意义的!
Esa Jokinen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.