到目前为止,还不错
2003年8月
(距离《反垃圾邮件计划》已经过去大约一年了。到目前为止,过滤器仍然占上风。本文分析了垃圾邮件发送者为绕过过滤器所尝试的各种伎俩,并提出了一些对未来的建议。)
贝叶斯过滤器如今已经足够普及,我们开始看到专门针对它设计的垃圾邮件。到目前为止,这些小伎俩并没有奏效。我的过滤率仍然超过99.7%,而布莱恩·伯顿(Brian Burton)借助多词贝叶斯过滤器 SpamProbe 报告的过滤率甚至惊人地达到了99.9%。
这样的过滤率能维持吗?垃圾邮件发送者正在如何攻击贝叶斯过滤器?我们是否能让过滤器更严密?
更多“好”词元
绕过贝叶斯过滤器只有两种方法:要么增加更多的“好”词元(good tokens),要么减少“坏”词元(bad tokens)。垃圾邮件发送者正在积极尝试这两种方式。
他们尝试通过插入随机的词典词,或附加一大段中性的文本(通常摘自书籍或通讯社文章)来添加好词元。但这两种伎俩效果都不佳。
随机选择的词(正如你所预料的)在垃圾邮件和正常邮件中出现的可能性差不多。垃圾邮件的词汇量比正常邮件略窄,因此添加随机词可能带来一点微小优势,但从统计上看大多无关紧要。
大多数随机词在垃圾邮件和非垃圾邮件中都未曾出现过,因此它们的垃圾概率是中性的。(我仍然将未见过的词的默认概率设为0.4。)你可以通过设置出现次数阈值来对抗这些噪音,正如《反垃圾邮件计划》中推荐的那样。我至今仍使用3次作为阈值。
附加书籍或文章片段似乎也没好多少,至少在我见过的案例中如此。附加的文本看上去不像垃圾邮件,但也不像我平常收到的正常邮件,因此在统计上往往没什么效果。
许多垃圾邮件发送者现在在“发件人”一栏中使用随机生成的名字,但这反而让过滤更容易:我确实收到很多陌生人的邮件,但到目前为止,没有人叫 Krystal 或 Louella。我认为大多数用户联系人名字的分布都集中在一个小而一致的子集内。随机挑选名字反而会产生垃圾概率很高的词元。
更少的“坏”词元
另一种欺骗贝叶斯过滤器的方法是减少坏词元。一般有两种策略:试图隐藏坏词元,或重写邮件以使用更少“垃圾”的语言。
到目前为止,试图隐藏坏词元完全失败。我见过的所有伎俩都让垃圾邮件更容易被抓住,而不是更难。这些手法包括拼写错误(如 V1agra)、在单词间插入空格或 HTML(如 S E X)、将垃圾邮件做成图片而非文本,甚至发送一个生成垃圾内容的 Javascript 程序。
拼写错误的垃圾概率反而更高。在我的过滤器中,“Viagra”的垃圾概率是0.9848,而“V1agra”的垃圾概率是0.9998。[1] 要让这种伎俩奏效,必须保证你几乎每个拼写错误都是首创。成功概率极低,一旦失败,你只是帮过滤器学会了所有新拼写。
打断单词的效果相同。让分词器忽略这种伎俩其实很容易,但即使不处理也无妨。正常邮件中不会出现被拆开的词,所以它们很快会得到很高的垃圾概率。在我的过滤器里,单独的字母“S”出现在主题行中的垃圾概率高达0.9427。
把垃圾邮件做成图片也不行,因为显示图片需要特定的 HTML 标签,而这些标签的垃圾概率都极高,尤其是 URL。如果使用域名,而该域名之前出现在垃圾邮件中,那就完了;如果改用 IP 地址,那更糟糕。没有什么词元比 URL 中的数字垃圾概率更高。
将垃圾内容隐藏在 Javascript 程序中也同样失败。因为在正常邮件中,Javascript 比 img 标签还罕见,所以其中的词元垃圾概率极高。
重写
用更不“垃圾”的语言重写邮件是唯一可能成功的策略。但这需要大量工作,对某些垃圾邮件而言甚至是不可能的。比如,如何在不使用“refinance”(再融资,垃圾概率0.9612)、“lenders”(贷款方,垃圾概率0.9862)、“mortgage”(抵押贷款,垃圾概率0.9995)等词的情况下重写一封房贷类垃圾邮件?并且记住,不管你使用什么委婉语,它们都必须不同于之前所有房贷垃圾邮件中用过的。此时对垃圾邮件发送者而言,转行去做点正经生意可能工作量还更小。
这是一个重要的考量。如果绕过贝叶斯过滤器的唯一方式是更巧妙地撰写垃圾邮件,那么我们就把“聪明”的负担从少数编写垃圾邮件软件的相对聪明的人,转移到了大量撰写垃圾邮件正文的愚笨之人身上。这样一来,发垃圾邮件就变难了。
垃圾邮件的基础设施是由聪明人搭建的,正如乔恩·普雷德(Jon Praed)所说的,“误入歧途的黑客”。但垃圾邮件正文是由单个垃圾邮件发送者写的。垃圾邮件软件最多只能帮他们插入随机词,或拆分、拼写错误单词,但它没法重写成更自然的语言。要做到这一点需要人工智能。
当垃圾邮件发送者尝试重写消息时,他们大概率会选择用更中性的词组替换掉“垃圾词元”。但多词过滤器也会学习并捕捉到这些短语。布莱恩·伯顿的 SpamProbe 和比尔·耶拉祖尼斯(Bill Yerazunis)的 CRM114 已经在处理多词模式了。当有垃圾邮件绕过我的过滤器时,我会转发给他们,而他们总是能抓住。
更重要的是,如果垃圾邮件必须被改写得更中性,那它的效果就会差得多。那些会上当的人本来就比较迟钝,需要大量大写字母和感叹号才能被“敲醒”。或许你不告诉他们“必须立刻行动!(ACT NOW!)”,他们根本不会动。于是,迫使垃圾邮件写得更“温和”,或许就足以让大多数垃圾邮件发送者破产。明年我们就会看到结果。
未来
这场战斗才刚刚开始。专门用来欺骗贝叶斯过滤器的垃圾邮件,我也只是最近两个月才开始看到。但随着 AOL 发布贝叶斯过滤器,我们将会看到更多。
战斗会如何发展?
正如我在《反垃圾邮件计划》中所说,我认为关键可能归结为“链接”。网络才是垃圾邮件的根源,而不是电子邮件。几乎所有垃圾邮件都包含某种联系方式,而这几乎总是一个链接。[2] 这是过滤器作者应当关注的部分,因为它是垃圾邮件最难改变的部分。
在《更好的贝叶斯过滤》中提到,可以通过标记词元的上下文来让过滤更精确。例如,主题行里的“FREE”垃圾概率高达0.9999,而正文里的“FREE”只有0.7567。到目前为止,我只标记了它们出现在哪个头部字段。这个思路可以扩展到链接,从中榨取更多信息。像“here”、“remove”或“img”这些词,如果出现在链接里,其垃圾概率会比其他情况下更高。(在字体标签等 HTML 中也同样适用。)
随着过滤器的发展,垃圾邮件正在变小。许多邮件的有效载荷现在只剩下一个带图片的链接:
<a href="http://sea2ws.com/gp/default.asp?id=011">
<img src="http://pharmhere1.com/pics/gp1.jpg"></a>
但就算如此少的 HTML,仍足够识别为垃圾邮件。换句话说,你可以通过形式识别出这种垃圾邮件。
如果这些垃圾邮件中除了链接和图片标签之外还有其他内容,通常只是“干扰物”——用来欺骗过滤器的随机文本。到目前为止,这类干扰无效,但我们不能假设它会一直无效。确实有方法生成更合适的文本,以抵消链接和图片的垃圾权重。
未来,过滤器可能需要识别并忽略这种干扰。例如,如果一封邮件中既有垃圾概率极高的词元,又有垃圾概率极低的词元,你就需要考虑这些垃圾词是否集中出现,或者仅基于 HTML 部分重新打分。
另一种排除干扰的方法是检查文本是否语法合理。你甚至不必真的解析它。至少对于英文而言,我可以想出几种方法来快速生成一个统计估算。
最难抓住的垃圾邮件,是我所谓的“未来垃圾邮件”——一些简短的纯文本加一个 URL:
Hey there. Check out the following:
http://www.blackboxhosting.com/foo
我现在经常能看到这种垃圾邮件。我仍然能抓住其中绝大多数——光是邮件头就足以识别大部分当前的垃圾邮件——但那0.3%漏网的,大多是“未来垃圾邮件”。
在“未来垃圾邮件”里,推销内容被推后了一步。不再像传统垃圾邮件那样直接写在邮件中,而是藏在点击之后的网页里。
这种趋势令人鼓舞,因为它意味着过滤器正在取胜。垃圾邮件正在字面意义上“后退”。(这不仅仅是象征性的胜利,每多一步流程,响应率就会降低。)
既然垃圾内容藏在网页里,为什么过滤器不去查看网页内容呢?过滤算法几乎可以原封不动地应用到网页上。death2spam 的理查德·乔西(Richard Jowsey)已经在边界案例里开始尝试这样做,并报告效果不错。
一种更廉价的替代方案是建立一个“垃圾邮件宣传站点”协作列表。过滤器无需检查网页内容,而是查询服务器(或 P2P 网络),看其他用户是否最近举报过该域名的垃圾邮件。如果是,就可以把它当作垃圾概率极高的词元。(这种协作列表在其他场景下也会有用。)
这个思路可以推广到所有高垃圾概率词元,而不仅仅是域名。这会提高所有人的过滤率,尤其是刚安装的新过滤器用户,他们现在几乎不需要训练。
为了充分利用这种信息,我们理想情况下应尽可能延迟过滤。也就是说,在用户收取邮件时再过滤,而不是在服务器接收时过滤。因为当你检查邮件时,任何进入收件箱的垃圾邮件大概率已经被成千上万的人见过了。
各个击破 有人认为垃圾邮件发送者最终一定能找到绕过过滤器的方法,因此更好的解决方案是通过立法,把发送垃圾邮件定为联邦犯罪。我个人也很希望看到这样的法律,前提是写得合理。而且有趣的是,我认为过滤器将推动这件事发生。因为有一类垃圾邮件发送者,即便他们知道方法,也根本无法逃避过滤器。清除掉这些人,会让我们更容易集中力量对付剩下的。
目前要通过有效的反垃圾邮件法律很难,因为垃圾邮件发送者是一个连续谱:一端是所谓“许可式邮件营销者”(permission-based email marketers),比如 Virtumundo,他们向从隐私政策不端正的网站购买来的地址群发邮件;另一端是底层掠食者(bottom-feeders),比如艾伦·拉尔斯基(Alan Ralsky),他们从网页、聊天室和新闻组里收集地址来群发。[3]
光谱中相对“正规”的公司会游说国会留下漏洞,从而让底层掠食者也能钻空子。例如,国会似乎在考虑允许群发邮件,只要其中包含一个可用的退订链接。[4] 尽管大多数专家都建议不要点击这些退订链接,因为这只会告诉更不择手段的垃圾邮件发送者,你的地址是“活的”。国会又怎么能指望收件人分辨出哪些退订链接能减少垃圾邮件,哪些会增加呢?
过滤器将在此帮助解决问题,因为它们会首先淘汰“准合法”的垃圾邮件公司。这些公司无法采取严重的欺骗措施(比如伪造邮件头),却还能维持“数千万收件人都是订阅者,真的想收到他们的宝贵优惠”这种虚构。[5]
因此,“准合法”垃圾邮件极易过滤。我很难想象有哪怕一个实现得再糟糕的贝叶斯过滤器抓不住这些。我不记得有哪一封这样的垃圾邮件能漏过我的过滤器。
随着垃圾邮件数量的增加推动过滤器的广泛使用,能看到这些“准合法”垃圾邮件的人数将逐渐趋近于零。而相关公司也会随之消亡。
诚然,这意味着“错误的一半”垃圾邮件发送者会先被淘汰。但消灭这些“准合法”垃圾邮件发送者,最终也会伤及底层掠食者。
如果“准合法”垃圾邮件公司消失,留下一条清晰的界限——从 L.L.Bean 到艾伦·拉尔斯基——那么通过能够区分二者的法律就会更容易。每个人都会更清楚地知道哪里是市场营销,哪里是犯罪,不再有游说者来模糊界限。
给你的门上加把锁可能不能阻止所有人闯入,但它能让你轻松分辨谁是你邀请的客人,谁是破门而入的小偷。
注释
[1] 对大多数人来说,这种差异不会这么明显,但我的邮件中有很大一部分是关于垃圾邮件的,因此经常包含“Viagra”这个词。
[2] 大约95%发给我的垃圾邮件都包含 URL。剩下的平均分为三类:419骗局、多层次传销(MLM)、以及非 ASCII(主要是俄语)垃圾邮件。这些邮件大多希望你直接通过邮件回复,都很容易被过滤器抓住。有没有人想写个 ELIZA 来跟这些人聊天?
[3] 这两种情况真的差别很大吗?
[4] “退订”当然是误称。你根本没订阅过他们的邮件列表。他们只是买了你的地址。但不管好坏,从垃圾邮件列表中移除自己的地址,已经被习惯性称为退订。
[5] 我确实收到过一封推广 Omaha Steaks 的垃圾邮件,主题行写的是: 12_F.R.E.E._Hamburgers & Half_Price_Steaks 这已经触及了“合理否认”的极限。你不得不怀疑,他们在一边声称收件人是自愿的,一边却采取如此明显的手段来欺骗过滤器。下一步是什么?来自 0ma_ha 5teakz 的邮件?
英文版:paulgraham.com/sofar.html|中文版:HiJiangChuan.com/paulgraham/000-01-So-Far-So-Good
更新记录: 2025-08-25 HiJiangChuan 初稿翻译,术语待验证;