本文从特定的角度来研究过滤软件。对于正确识别垃圾邮件和合法消息这方面,我想了解这些不同的方法做得如何。为了回答这个问题,我没有将注意力特别放在配置过滤器应用程序,使之能使用各种“邮件传送代理(MailTransfer Agents (MTA))”的细节上。在 MTA(譬如,Sendmail、QMail、Procmail、Fetchmail以及其它邮件程序)的最佳配置方面,确实存在着许多奥妙。而且,许多电子邮件客户机都有自己的过滤选项和插件API。幸运的是,我研究的大多数过滤器都带有相当出色的文档,里面讲述了如何配置它们以与各种 MTA 协同工作。
为了测试,我开发了两组消息集:垃圾邮件和合法邮件。实际上这是我从前几个月收到的邮件中抽取出的两组消息,但我又向其中添加了一个重要的消息子集,在这些消息中,有的来自几年前,这就扩大了测试范围。我不能确切地知道,在下个月的电子邮件中会包含什么,但过去的邮件已为以后的趋势提供了极好的线索。这听上去似乎很神秘,但我的意思是,我不希望把这些模式只限制于一些单词、短语和正则表达式等,这些也许能描述出最近电子邮件的特征,但却不能概括成这两种类型。
除了这两组电子邮件,我为那些工具开发了培训(training)消息集,以“了解”什么是垃圾邮件,什么不是垃圾邮件消息。这些培训消息集比较大,而且有一部分是与测试集不相交的。测试集中包含略少于2000 条的垃圾邮件消息,合法消息的数目与此大致相同。而培训集中的消息是它们的两倍。
关于测试,这里有必要强调一下一般性的注意事项。在垃圾邮件过滤器中的“误否认”(False negatives)仅意味着一些不需要的消息进入了邮箱。这不是一件好事,但其本身没有多可怕。“误承认”(False positive)是指合法消息被误判为垃圾邮件。这可能 非常糟糕,因为一些合法邮件实际上很重要,甚至非常紧急,有时尽管这些消息是一些聊天性质的邮件,但我们也不希望丢失它们。大多数过滤软件能让您将受拒的消息保存在临时文件夹中,等待您去查看— 但如果需要查看的文件夹中充斥着大量的垃圾邮件,那么这个软件的实用性会因此而削弱。
1. 基本的结构化文本过滤器我所使用的电子邮件客户机能够根据特定邮件头域、一般性邮件头和/或正文中的简单字符串来对到来的电子邮件进行排序。这个功能非常简单,甚至不包含正则表达式匹配。几乎所有的电子邮件客户机都有这样的过滤能力。
在过去几个月中,我开发了少量的文本过滤器。这些少量的简单过滤器能正确捕获我所收到垃圾邮件中的80%。遗憾的是,这些过滤器的“误承认”的发生率比较高 —以至于我不时地需要手工来检查垃圾邮件文件夹中的 某些邮件。(我将可能的垃圾邮件进行分类,放在几个不同的文件夹中,然后保存它们以形成消息语言资料库(corpora)。)虽然各个用户之间具体的细节会有所不同,但对大多数读者来讲,这个通用的模式是很有用的:
- 集合 1:一些人或邮件列表在他们的邮件头上做了一些有趣的手脚,使得它们与众不同。我捕获邮件头中的某些内容(通常是From:),并将其放在“白名单(whitelist)”中(“收件箱”或其它文件夹)。
- 集合 2:我执行以下垃圾邮件过滤器(没有按特定的顺序):
- 识别特定的恶意邮件发送者。
- 查找作为 From: 邮件头的“<>”。
- 查找邮件头中的“@<”(出于许多原因,许多垃圾邮件都有这个标记)。
- 查找“Content-Type: audio”。我不需要这个,只有 virii 病毒需要(具体情况因人而异)。
- 在邮件头中查找“euc-kr”和“ks_c_5601-1987”,我不懂这种语言,但出于某些原因,我收到了 大量韩国垃圾邮件(当然,对于真正的韩国读者,这条规则恐怕不太适合他)。
- 集合 3:存储那些已知是合法地址的消息。我有几条这样的规则,但它们都仅仅与文字To: 域相匹配。
- 集合 4:查找那些在邮件头中具有合法地址,但通过上一个To: 过滤器没有捕获到的消息。我发现,只要我的邮件地址出现在Bcc: 域,其中有一串按字母顺序排列的地址(譬如,mertz1@……、mertz37@……等)时,那这封邮件肯定是不请自来的邮件。
- 集合 5:到此,所剩下的可能就是垃圾邮件(它可能有伪造的邮件头以避免被识别出发送者的身份)。
2.“白名单”/验证过滤器对于垃圾邮件的过滤,有一种主动性相当强的技术,我想称之为“白名单加自动验证”方法。这里有几种工具可以实现带验证的“白名单”:TDMA是一个深受大家喜爱的多平台开放源码工具;ChoiceMail 是一个针对 Windows的商业性工具;其它大多数似乎都比较初级。(请参阅本文后面的 ,那里有一些链接。)
“白名单”过滤器连接到 MTA,只有当接收者显式地同意接收,才会将邮件传到收件箱。其它消息会产生一个特殊的质询(challenge)响应给发送者。“白名单”过滤器的响应包含某种唯一的可以识别原始消息的代码,譬如,一个散列或序列标识。这个质询消息包含让发送者答复的指示,以便将其加到“白名单”中(这个响应消息必须包含由“白名单”过滤器生成的代码)。几乎所有的垃圾邮件信息中的回复地址信息都是伪造的,所以这个质询通常没有人会收到;但即便那些垃圾邮件发送者提供了有用的回复地址,但他们往往不会响应这个质询。当合法的发送者答复了这个质询之后,会将她/他的地址添加到“白名单”中,以便将来来自同一地址的消息会自动地通过检查。
虽然我没有用过这些工具,而只是自己做了些实验,但我认为,“白名单”/验证过滤器几乎可以100% 地将垃圾邮件消息阻挡在外面。可以想象,垃圾邮件发送者会开始在他们的系统中加一个质询响应,但只要稍微使质询消息变得复杂些,就可以解决这个问题(例如,要求对代码做一点小小的人为改动)。而且,如果垃圾邮件发送者响应了质询,那么就会使那些寻求合法地抵御垃圾邮件的人们可以更容易地跟踪到他们。
“白名单”/验证过滤器这种做法给合法的发送者带来了额外的负担。由于有些通信者可能出于各种原因而无法响应质询,所以会带来“误承认”这种情况。在最好的情形下,合法发送者只需花费一点点精力即可。但在以下情况,发送者可能无法发送他们合法的消息:发送者具有不可靠的ISP,防火墙的要求过于严格,发送者具有多个电子邮件地址,不能够理解英语(或者质询所使用的语言),或者发送者只是忽略了质询以及不想被质询所干扰。而且,有时合法的“通信者”根本不是人,而是不能够响应质询的自动响应系统。“白名单”/验证过滤器可能需要额外花精力来处理邮件列表注册、在线购买、网站注册以及其它“自动通信”。
3. 分布式适应性黑名单垃圾邮件往往被定义为发送给大量接收方的邮件。实际上,几乎很少有垃圾邮件被定制为发送给个别接收方。然而,在缺少预先过滤的情况下,每个垃圾邮件的接收者必须按自己的“Delete”按钮来删除垃圾消息。分布式黑名单过滤器会让一个用户的“Delete”操作去警告其他许多用户,注意这个垃圾邮件消息。
象 Razor 和 Pyzor(请参阅 )这样的工具运行在服务器一端,服务器上存储了一些已知垃圾邮件的摘要。当 MTA 收到一条消息时,会调用分布式黑名单过滤器来确定这条消息是否是已知的垃圾邮件。这些工具运用一些智能化的统计技术来创建摘要,使得在垃圾邮件作了微小的变动或自动的变化(或仅仅是由于传输路由的变化而导致邮件头的更改)时,也不会防止识别消息的身份。此外,分布式黑名单服务器的维护者经常会专门创建一些“蜜罐”地址,以引诱垃圾邮件(但从不针对合法的通信)。在我的测试中,发现用Pyzor,从 没有出现“误承认”这类情况。我认为用其它类似的工具(如Razor)也不会出现这样的情况。
对此有些常识。即使那些有不良企图的发送者可以篡改合法消息,他们也不可能让 我的好消息样本向服务器报告— 通常只有垃圾邮件是广泛分发的。 可以想象,被大量发送但又是合法的消息(譬如,developerWorks时事通讯)可能会导致错误报告,但分布式黑名单服务器的维护者几乎肯定会检测到这一点,并快速地纠正这样的问题。
然而,正如由下面的 所显示,使用分布式黑名单时发生“误否认”的频率要比其它我所测试的技术多很多。Pyzor 的作者推荐将这个工具与其它技术相 结合使用,而不是作为单独的防线来抵御垃圾邮件。虽然,这似乎合乎情理,但对于识别邮件是否为垃圾邮件这一点,事实上还不清楚这样的组合过滤技术是否比单独使用那些技术要强。
此外,由于分布式黑名单需要与服务器进行对话以执行验证,所以,在对我的语言资料库做测试时,Pyzor的执行效率要比其它技术慢得多。对于测试小流量的消息,这不是大问题,但对于高容量的ISP,这可能是个问题。我还发现,每一千条查询中,总会出现几次网络超时,所以,我的结果有一些“错误”(error),而不是标出“spam”(垃圾邮件)或“good”(合法邮件)。 |