概述
电子邮件是最常用的网络应用之一,已经成为网络交流沟通的重要途径。但是,垃圾邮件(spam)烦恼着大多数人,近来的调查显示,93%的被调查者都对他们接收到的大量垃圾邮件非常不满。一些简单的垃圾邮件事件也造成了很有影响的安全问题。日益增加的垃圾邮件现在会造成1年94亿美元的损失(来自chinabyte上一则新闻的数据),在一些文章表明,垃圾邮件可能会花费一个公司内每个用户600到1000美元。
垃圾邮件随着互联网的不断发展而大量增长,不再像以前一样,只是小小的一个骚扰,现在的垃圾邮件可以说是铺天盖地了。最初,垃圾邮件主要是一些不请自来的商业宣传电子邮件,而现在更多的有关色情、政治的垃圾邮件不断增加,甚至达到了总垃圾邮件量的40%左右,并且仍然有持续增长的趋势。另一方面,垃圾邮件成了计算机病毒新的、快速的传播途径。
而且目前世界上50%的邮件都是垃圾邮件,只有少数组织承担责任。很多反垃圾邮件的措施都被提出出来,但是只有非常少的被实施了。不幸的是,这些解决办法也都还不能完全阻止垃圾邮件,而且还对正常的邮件来往产生影响。
什么是垃圾邮件?
某种程度上,对垃圾邮件的定义可以是:那些人们没有意愿去接收到的电子邮件都是垃圾邮件。比如:
*商业广告。很多公司为了宣传新的产品、新的活动等通过电子邮件的方式进行宣传。
*政治言论。目前会收到不少来自其他国家或者反动组织发送的这类电子邮件,这就跟垃圾的商业广告一样,销售和贩卖他们的所谓言论。
*蠕虫病毒邮件。越来越多的病毒通过电子邮件来迅速传播,这也的确是一条迅速而且有效的传播途径。
*恶意邮件。恐吓、欺骗性邮件。比如phishing,这是一种假冒网页的电子邮件,完全是一种诡计,来蒙骗用户的个人信息、账号甚至信用卡。
普通个人的电子邮箱怎么成为了垃圾邮件的目标呢,造成这样的结果有很多原因,比如在网站、论坛等地方注册了邮件地址,病毒等在朋友的邮箱中找到了你的电子邮箱,对邮件提供商进行的用户枚举,等等。通常情况下,越少暴露电子邮件地址越少接收到垃圾邮件,使用时间越短越少接收到垃圾邮件。一些无奈的用户就选择了放弃自己的邮箱而更换新的电子邮箱。
安全问题
圾邮件给互联网以及广大的使用者带来了很大的影响,这种影响不仅仅是人们需要花费时间来处理垃圾邮件、占用系统资源等,同时也带来了候运的东西,那么“特洛伊木马”将会被作为与“马奇诺防线”同样性质的著名无效战略而被列入史册,而且后世可能再也不会采用这种攻击手段。
但是希腊人的木马计成功了,正如现在数以千计的现代网络木马计成功了一样。现代的希腊人――入侵者积极使用各种手段让现代的特洛伊人――受害者把那只木马程序高高兴兴的领回家去。
早期的防病毒思想并不盛行,那时候的网民也比较单纯,使用网络防火墙的人也只有少数,所以那时候的入侵者可以算是幸福的,他们只需要一点简单的社会工程学手段就能把木马程序传输给对方执行,这一时期的木马种植手段(如今的普遍称谓为“下马”)基本上不需要牵涉到技术,也许唯一需要的技术就是如何配置和使用一个木马,因为那时候木马也还是个新产物而已。那时候的网民,只能依靠自己的判断和技术,才能免受或摆脱木马之害。因此,当木马技术刚在国内开始的时候,任意一个IP段都有可能存在超过40%的受害计算机开放着大门等待入侵者进攻,可以毫不夸张的说,那时候是木马的第一黄金时期,唯一美中不足的制约条件就是当时的网络速度普遍太慢了。
随着时间的流逝,木马技术发展日益成熟,但网民的安全意识也普遍提高,更出现了初期的病毒防火墙概念,这个时期的入侵者必须掌握更高级的社会工程学手段和初期的入侵技术才能让对方受害了,这时期的木马虽然隐蔽性有了相对提高,但仍然是基于客户端寻找连接服务器端的模式。由于出现了病毒防火墙,网民判断和查杀木马的效率大大提高,而且大部分人也知道“人心不古”了,不再轻易接收陌生人给的程序,使得木马不再像上时期那样肆无忌弹的横行,但是因为病毒防火墙是个新兴产物,仍然有相对多的人没有安装使用,以至于许多老旧的木马依然可以横行无忌。
再后来,随着网络防火墙技术诞生和病毒防火墙技术的成熟,木马作者被迫紧跟着防病毒厂商的脚步更新他们的作品以避免马儿过早“殉职”,同时由于网络防火墙技术的出现,让计算机与网络之间不再直接,尤其是网络防火墙实现的“拦截外部数据连接请求”与“审核内部程序访问网络请求”的策略,导致大部分木马纷纷失效,这时期的木马逐渐分裂成两个派别:一种依然采用客户端连接服务器端的方式,只是改为了其他传输途径,如E-MAIL、FTP等,或者在内部除掉网络防火墙,以便自己畅通无阻;另一种则改变了入侵的思维,把“客户端连接服务器端”变为“服务器端连接客户端”,再加上一点社会工程学技术,从而突破了网络防火墙的限制,也因此诞生了一种新的木马技术――“反弹型”木马。这一时期里,入侵者与受害者之间的战争终于提升到技术级别,若想保护自己,除了安装网络防火墙和病毒防火墙,以及接触网络攻防技术以外别无他法,这个“基础互动”一直保持到今天的XP时代。
到了XP时代,网络速度有了质的飞跃,黑客攻防战更是越来越多的浮上水面,因为系统变了,一个专门为网络应用而诞生的操作系统,必定会存在与网络有关的缺陷。没错,WinXP相对于Win9x的弱点就是它的网络漏洞太多了,无论是利用MIME漏洞传播的信件木马,还是通过LSASS溢出而放下的木马,都能在XP系统上分到一块肉。你也许会说,Win9x同样有许多漏洞,但是为什么它没有XP的烦恼?这是因为Win9x的网络功能太弱了,几乎没有什么系统组件需要依靠网络运行!所以现在的用户,除了使用网络防火墙和病毒防火墙把自己包裹得严严实实以外,还要三天两头去微软的系统更新站点安装各种漏洞修复程序……
越来越具有欺骗性的病毒邮件,让很多企业深受其害,即便采取了很好的网络保护策略,依然很难避免,越来越多的安全事件都是因为邮件产生的,可能是病毒、木马或者其他恶意程序。Phishing的假冒诡计对于普通使用者来说,的确很难作出正确的判断,但是造成的损失却是很直接的。
反垃圾邮件技术
已经存在的和在被提及的反垃圾邮件方法试图来减少垃圾邮件问题和处理安全需求。通过正确的识别垃圾邮件,邮件病毒或者邮件攻击程序等都会减少。这些解决方法采取多种安全途径来努力阻止垃圾邮件。
Neal Krawetz在Anti-Spam Solutions and Security[ref 1]文中将反垃圾邮件技术作了非常好的分类。当前的反垃圾邮件技术可以分为4大类:过滤器(Filter)、反向查询(Reverse lookup)、挑战(challenges)和密码术(cryptography),这些解决办法都可以减少垃圾邮件问题,但是都有它们的局限性。本文将在下面的内容讨论这些技术以及一些主要技术的实现。
滤
过滤(Filter)是一种相对来说最简单却很直接的处理垃圾邮件技术。这种技术主要用于接收系统(MUA,如OUTLOOK EXPRESS或者MTA,如sendmail)来辨别和处理垃圾邮件。从应用情况来看,这种技术也是使用最广泛的,比如很多邮件服务器上的反垃圾邮件插件、反垃圾邮件网关、客户端上的反垃圾邮件功能等,都是采用的过滤技术。
关键词过滤
关键词过滤技术通常创建一些简单或复杂的与垃圾邮件关联的单词表来识别和处理垃圾邮件。比如某些关键词大量出现在垃圾邮件中,如一些病毒的邮件标题,比如:test。这种方式比较类似反病毒软件利用的病毒特征一样。可以说这是一种简单的内容过滤方式来处理垃圾邮件,它的基础是必须创建一个庞大的过滤关键词列表。
这种技术缺陷很明显,过滤的能力同关键词有明显联系,关键词列表也会造成错报可能比较大,当然系统采用这种技术来处理邮件的时候消耗的系统资源会比较多。并且,一般躲避关键词的技术比如拆词,组词就很容易绕过过滤。
黑白名单
黑名单(Black List)和白名单(White List)。分别是已知的垃圾邮件发送者或可信任的发送者IP地址或者邮件地址。现在有很多组织都在做*bl(block list),将那些经常发送垃圾邮件的IP地址(甚至IP地址范围)收集在一起,做成block list,比如spamhaus的SBL(Spamhaus Block List),一个BL,可以在很大范围内共享。许多ISP正在采用一些组织的BL来阻止接收垃圾邮件。白名单则与黑名单相反,对于那些信任的邮件地址或者IP就完全接受了。
目前很多邮件接收端都采用了黑白名单的方式来处理垃圾邮件,包括MUA和MTA,当然在MTA中使用得更广泛,这样可以有效地减少服务器的负担。
BL技术也有明显的缺陷,因为不能在block list中包含所有的(即便是大量)的IP地址,而且垃圾邮件发送者很容易通过不同的IP地址来制造垃圾。
HASH技术
HASH技术是邮件系统通过创建HASH来描述邮件内容,比如将邮件的内容、发件人等作为参数,最后计算得出这个邮件的HASH来描述这个邮件。如果HASH相同,那么说明邮件内容、发件人等相同。这在一些ISP上在采用,如果出现重复的HASH值,那么就可以怀疑是大批量发送邮件了。
字节码增强的有如下功能:当应用程序通过set方法修改某个字段1时,由于通过增强过程,在其内部插入了某些代码,JDO会获得数据状态变化的信息,从而在持久过程中,进行有选择性的处理。
按照JDO规范,增强后的类可以在不同的JDO实现上使用,而无需重新编译或增强。
并不是所有Book对象都是持久对象,只有当makePersistence后,该对象才是持久对象,并会通过JDO实现存储到数据库中。通过JDO的供应商扩展标记符(vendor-extension),可详细描述Book类的存储特性,如为该可持久类指定数据库表和对应字段。
持久对象查询
JDO查询主要有以下两种方式。
使用Extend查询
Extend可以查询指定类及子类的持久对象。
PersistenceManager
manager = persistenceManagerFactory.
getPersistenceManager();
manager.currentTransaction().begin();
Extend extend =
manager.getExtend(Book.class,true);
//true表明同时查询子类
Iterator it = extend.iterator();
while(it.hasNext())
{
Book book = (Book)it.next();
System.out.println(book.getISBN());
}
extend.closeAll();
manager.currentTransaction().commit();
Extend查询方法,提供了一种基于类的查询途径,它可以与下面的Query构成更为强大的查询。
使用Query查询
Query可以指定过滤条件,是一种常用的查询方式。
下例是查找条件为“书名以‘Java设计模式’开头且出版日期小于今天”的书籍。
String filter =
“((String)name).startsWith(\”Java设计模式\”)
&& publishDate < today”;
Query query =
pm.getQuery(Book.class,filter);
query.declareImports(“import java.util.Date”);
query.declareParameters(“Date today);
Date today = new Date();
results = (Collection)
query.execute(today);
//传入参数值today
if (results.isEmpty())
{
System.out.println(“No data!”);
}else{
Iterator it = results.iterator();
while(it.hasNext())
{
Book book = (Book)it.next();
System.out.println
(“Book Name:” + book.getName()
+ “, ISBN:” + book.getISBN());
}
}
注:该条件使用了一个变元‘today’,通过“declareParameters”来声明该变量,并在“execute”方法中传入该变量的实例。这种带参数的查询,很类似于我们以前采用JDBC的带?的查询方式。
其中startsWith(String s)是JDO提供的标准字符方法,类似的方法还有endsWith(String s)。
JDOQL:上述使用的就是一个JDOQL样例,JDOQL是JDO规范一个组成部分。使用JDOQL可以使用应用在不同的JDO实现上运行。为了解决JDOQL的某些不足,JDO规范提供了支持特定JDO供应商查询语句接口。
查询排序
下例是将查询结果按“出版日期降序、书名升序”进行排序。
Query query =
pm.newQuery(Book.class, filter);
String orderStr =
“publishDate decending, name ascending”;
query.setOrdering(orderStr);
results = query.execute(today);
贝叶斯算法的步骤为:
1. 收集大量的垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集。
2. 提取特征来源中的独立字符串,例如 AAA等作为TOKEN串并统计提取出的TOKEN串出现的次数即字频。按照上述的方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件。
3. 每一个邮件集对应一个哈希表,hashtable_good对应非垃圾邮件集而hashtable_bad对应垃圾邮件集。表中存储TOKEN串到字频的映射关系。
4. 计算每个哈希表中TOKEN串出现的概率P=(某TOKEN串的字频)/(对应哈希表的长度)
5. 综合考虑hashtable_good和hashtable_bad,推断出当新来的邮件中出现某个TOKEN串时,该新邮件为垃圾邮件的概率。数学表达式为:
A 事件 ---- 邮件为垃圾邮件;
t1,t2 …….tn 代表 TOKEN 串
则 P(A|ti)表示在邮件中出现 TOKEN 串 ti 时,该邮件为垃圾邮件的概率。设
P1(ti)=ti 在 hashtable_good 中的值
P2(ti)=ti 在 hashtable_ bad 中的值
则 P(A|ti)=P2(ti)/[(P1(ti)+P2(ti)] ;
6. 建立新的哈希表hashtable_probability存储TOKEN串ti到P(A|ti)的映射
7.根据建立的哈希表 hashtable_probability可以估计一封新到的邮件为垃圾邮件的可能性。
当新到一封邮件时,按照步骤2,生成TOKEN串。查询hashtable_probability得到该TOKEN 串的键值。假设由该邮件共得到N个TOKEN 串,t1,t2…….tn,hashtable_probability中对应的值为 P1 ,P2 ,……PN ,P(A|t1 ,t2, t3……tn) 表示在邮件中同时出现多个TOKEN串t1,t2……tn时,该邮件为垃圾邮件的概率。
由复合概率公式可得:
P(A|t1 ,t2, t3……tn)=(P1*P2*……PN)/[P1*P2*……PN+(1-P1)*(1-P2)*……(1-PN)]
当 P(A|t1 ,t2, t3……tn) 超过预定阈值时,就可以判断邮件为垃圾邮件。
当新邮件到达的时候,就通过贝叶斯过滤器分析,通过使用各个特征来计算邮件是spam的概率。通过不断的分析,过滤器也不断地获得自更新。比如,通过各种特征判断一个包含单词AAA的邮件是spam,那么单词AAA成为垃圾邮件特征的概率就增加了。
这样,贝叶斯过滤器就有了自适应能力,既能自动进行,也可以用户手工操作,也就更能适应单个用户的使用。而垃圾邮件发送者要获得这样的适应能力就很难了,因此,更难逃避过滤器的过滤,但他们当然还是能够将邮件伪装成很普遍的正常邮件的样子。除非垃圾邮件发送者能去对某个人的过滤器进行判断,比如,采用发送回执的办法来了解哪些邮件被用户打开了等,这样他们就可以适应过滤器了。
虽然贝叶斯过滤器还存在有评分过滤器的缺陷,但是它更优化了。实践也证明,贝叶斯过滤器在客户端和服务器中效果是非常明显的,优秀的贝叶斯过滤器能够识别超过99.9%的垃圾邮件。大多数目前应用的反垃圾邮件产品都采用了这样的技术。比如Foxmail中的贝叶斯过滤。
局限性和缺点
现行的很多采用过滤器技术的反垃圾邮件产品通常都采用了多种过滤器技术,以便使产品更为有效。过滤器通过他们的误报和漏报来分等级。漏报就是指垃圾邮件绕过了过滤器的过滤。而误报则是将正常的邮件判断为了垃圾邮件。完美的过滤器系统应该是不存在漏报和误报的,但是这是理想情况。
一些基于过滤器原理的反垃圾邮件系统通常有下面的三种局限性:
?可能被绕过。垃圾邮件发送者和他们用的发送工具也不是静态的,他们也会很快适应过滤器。比如,针对关键字列表,他们可以随机更改一些单词的拼写,比如("强悍", "弓虽悍", "强-悍").Hash-buster(在每个邮件中产生不同的HASH)就是来绕过hash过滤器的。当前普遍使用的贝叶斯过滤器可以通过插入随机单词或句子来绕过。多数过滤器都最多只能在少数几周才最有效,为了保持反垃圾邮件系统的实用性,过滤器规则就必须不断更新,比如每天或者每周更新。
?误报问题。最头痛的问题就是将正常邮件判断为垃圾邮件。比如,一封包含单词sample的正常邮件可能因此被判断为垃圾邮件。某些正常服务器不幸包含在不负责任的组织发布的block list对某个网段进行屏蔽中,而不是因为发送了垃圾邮件(xfocus的服务器就是这样的一个例子)。但是,如果要减少误报问题,就可能造成严重的漏报问题了。
?过滤器复查。由于误报问题的存在,通常被标记为垃圾邮件的消息一般不会被立刻删除,而是被放置到垃圾邮件箱里面,以便日后检查。不幸的是,这也意味着用户仍然必须花费时间去察看垃圾邮件,即便仅仅只针对邮件标题。
目前更严重的问题是,人们依然认为过滤器能有效阻止垃圾邮件。实际上,垃圾邮件过滤器并不能有效阻止垃圾邮件,在多数案例中,垃圾邮件依然存在,依然穿过了网络,并且依然被传播。除非用户不介意存在被误报的邮件,不介意依然会浏览垃圾邮件。过滤器可以帮助我们来组织并分隔邮件为垃圾邮件和正常邮件,但是过滤器技术并不能阻止垃圾邮件,实际上只是在"处理"垃圾邮件。
尽管过滤器技术存在局限,但是,这是目前最为广泛使用的反垃圾邮件技术。
验证查询
SMTP在设计的时候并没有考虑到安全问题。在1973年,计算机安全还没有什么意义,那个时候能够有一个可执行的邮件协议已经很了不起了。比如,RFC524描述将SMTP作为独立协议的一些情况:
"虽然人们可以或者可能可以,以本文档为基础设计软件,但请恰如其分地进行批注。请提出建议和问题。我坚信协议中依然存在问题,我希望读者能够阅读RFC的时候能够将它们都指出来。"
尽管SMTP的命令组已经发展了很长时间,但是人们还是以RFC524为基础来执行SMTP的,而且还都假定问题(比如安全问题)都会在以后被解决。因此直到2004年,源自RFC524中的错误还是依然存在,这个时候SMTP已经变得非常广泛而很难简单被代替。垃圾邮件就是一个滥用SMTP协议的例子,多数垃圾邮件工具都可以伪造邮件头,伪造发送者,或者隐藏源头。
垃圾邮件一般都是使用的伪造的发送者地址,极少数的垃圾邮件才会用真实地址。垃圾邮件发送者伪造邮件有下面的几个原因:
*因为是违法的。在多个国家内,发送垃圾邮件都是违法行为,通过伪造发送地址,发送者就可能避免被起诉。
*因为不受欢迎。垃圾邮件发送者都明白垃圾邮件是不受欢迎的。通过伪造发送者地址,就可能减少这种反应。
*受到ISP的限制。多数ISP都有防止垃圾邮件的服务条款,通过伪造发送者地址,他们可以减少被ISP禁止网络访问的可能性。
因此,如果我们能够采用类似黑白名单一样,能够更智能地识别哪些是伪造的邮件,哪些是合法的邮件,那么就能从很大程度上解决垃圾邮件问题,验证查询技术正是基于这样的出发点而产生的。以下还会解析一些主要的反垃圾邮件技术,比如Yahoo!、微软、IBM等所倡导和主持的反垃圾邮件技术,把它们划分在反向验证查询技术中并不是很恰当,但是,从某种角度来说,这些技术都是更复杂的验证查询。
反向查询技术
从垃圾邮件的伪造角度来说,能够解决邮件的伪造问题,就可以避免大量垃圾邮件的产生。为了限制伪造发送者地址,一些系统要求验证发送者邮件地址,这些系统包括:
反向邮件交换(RMX)<http://www.ietf.org/internet-drafts/draft-danisch-dns-rr-smtp-03.txt>
发送者许可(SPF)<http://spf.pobox.com/>
标明邮件协议(DMP)<http://www.pan-am.ca/dmp/>
这些技术都比较相近。DNS是全球互联网服务来处理IP地址和域名之间的转化。在1986年,DNS扩展,并有了邮件交换纪录(MX),当发送邮件的时候,邮件服务器通过查询MX纪录来对应接收者的域名。
类似于MX纪录,反向查询解决方案就是定义反向的MX纪录("RMX"--RMX,"SPF"--SPF,"DMP"--DMP),用来判断是否邮件的指定域名和IP地址是完全对应的。基本原因就是伪造邮件的地址是不会真实来自RMX地址,因此可以判断是否伪造。
DKIM技术
DKIM(DomainKeys Identified Mail)技术基于雅虎的DomainKeys验证技术和思科的Internet Identified Mail。
雅虎的DomainKeys利用公共密钥密码术验证电子邮件发件人。发送系统生成一个签名并把签名插入电子邮件标题,而接收系统利用DNS发布的一个公共密钥验证这个签名。 思科的验证技术也利用密码术,但它把签名和电子邮件消息本身关联。发送服务器为电子邮件消息签名并把签名和用于生成签名的公共密钥插入一个新标题。而接收系统验证这个用于为电子邮件消息签名的公共密钥是授权给这个发件地址使用的。
DKIM将把这两个验证系统整合起来。它将以和DomainKeys相同的方式用DNS发布的公共密钥验证签名,它也将利用思科的标题签名技术确保一致性。
DKIM给邮件提供一种机制来同时验证每个域邮件发送者和消息的完整性。一旦域能被验证,就用来同邮件中的发送者地址作比较检测伪造。如果是伪造,那么可能是spam或者是欺骗邮件,就可以被丢弃。如果不是伪造的,并且域是已知的,可为其建立起良好的声誉,并绑定到反垃圾邮件策略系统中,也可以在服务提供商之间共享,甚至直接提供给用户。
对于知名公司来说,通常需要发送各种业务邮件给客户、银行等,这样,邮件的确认就显得很重要。可以保护避免受到phishing攻击。
DomainKeys的实现过程
发送服务器经过两步:
1、建立。域所有者需要产生一对公/私钥用于标记所有发出的邮件(允许多对密钥),公钥在DNS中公开,私钥在使用DomainKey的邮件服务器上。
2、签名。当每个用户发送邮件的时候,邮件系统自动使用存储的私钥来产生签名。签名作为邮件头的一部分,然后邮件被传递到接收服务器上。
接收服务器通过三步来验证签名邮件:
1、准备。接收服务器从邮件头提取出签名和发送域(From:)然后从DNS获得相应的公钥。
2、验证。接收服务器用从DNS获得的公钥来验证用私钥产生的签名。这保证邮件真实发送并且没有被修改过。
3、传递。接收服务器使用本地策略来作出最后结果,如果域被验证了,而且其他的反垃圾邮件测试也没有决定,那么邮件就被传递到用户的收件箱中,否则,邮件可以被抛弃、隔离等。
SenderID技术
2004年,Gates曾信誓旦旦地预言微软能够在未来消灭垃圾邮件,他所期望的就是Sender ID技术,但是,最近他则收回了他的预言。这也就是标准之争,微软希望IETF能够采用Sender ID技术作为标准,并且得到了大量支持,比如Cisco, Comcast, IBM, Cisco,Port25,Sendmail,Symantec,VeriSign等,也包括后来又倒戈的AOL的支持,但是在开源社区,微软一直没有得到足够的支持,IETF最终否决了微软的提议。
SenderID技术主要包括两个方面:发送邮件方的支持和接收邮件方的支持。其中发送邮件方的支持主要有三个部分:发信人需要修改邮件服务器的DNS,增加特定的SPF记录以表明其发信身份,比如"v=spf1 ip4:192.0.2.0/24 -all",表示使用SPF1版本,对于192.0.2.0/24这个网段是有效的;在可选情况下,发信人的MTA支持在其外发邮件的发信通信协议中增加SUBMITTER等扩展,并在其邮件中增加Resent-Sender、Resent-From、Sender等信头。