第二章 神秘的500k(接上)
正常情况下,Windows系统中执行打开文件、读取文件或保存文件等一般任务的代码,都保存在系统的.DLL(动态链接库)文件中。当系统或其他应用程序要执行这些任务时,就会调用相关的.DLL文件,就像一名读者在图书馆中查询一本书那样。然后,被调用的.DLL文件就会进入内存并运行。黑客们也会试图将用于恶意活动的代码储存在Windows动态链接库文件中,但反病毒引擎会扫描整个“图书馆”,发现本不属于那里的“那本书”。所以,震网的设计者并没有这样做,而是让恶意代码直接被调入内存,这样反病毒引擎就更难探测到它了。单单这一点也没什么大不了,因为很多厉害的黑客也会这么干。震网真正惊人之处在于,它独辟蹊径的代码调用方式。
通常,内存中的恶意代码在运行时,还需要向系统申请加载硬盘上其他文件中的额外代码,这种行为是可以被反病毒引擎发现的。震网用了一个更好的思路。震网把运行所需的所有代码都整合在一起,存放在多个有着奇怪名字的虚拟文件中。一般来说,这样做是行不通的。因为当震网调用代码时,操作系统根本无法认出这些文件名,或者根本无法在硬盘上找到这些奇怪的文件。但是,震网重写了Windows系统的部分API(应用程序编程接口,通过它可以调用系统的内部函数),建立了这些奇怪文件和震网代码之间的“挂钩”关系。这样一来,每当系统访问这些奇怪文件时,就会自动将震网的全部代码调入内存。如果反病毒引擎怀疑内存中的这些奇怪文件有问题、并对其进行检测时,震网也提前想好了应对之策。因为它还重写了API中关于显示文件属性的代码,反病毒引擎只会“看到”:“这些文件是空的。这里什么都没有,去别的地方找吧。”
这还没完。一般的病毒执行代码的方式是比较直接的:调用代码并运行。但震网不是这样。它被设计成一台“鲁宾•哥德堡机器”(一种被设计得过度复杂的机械组合,以迂回曲折的方法去完成一些本来非常简单的工作)来更好的隐蔽自己——把自己的代码植入某个正在运行的进程A的代码块中,然后把进程A的代码拿出来放到另一个正在运行的进程B的代码块中。
莫楚惊叹于病毒设计者为此次攻击所投入的巨大工作量。近年来他所见过的最复杂病毒也没有这么大的体量。而一般的病毒设计者只会尽可能少费劲,只要能让病毒运行起来、逃过检测就行了。如果仅仅是为了盗抢一些密码或者拿到一点数据,根本没必要在代码研究方面费这么大周章。即便是貌似来自中国的高级间谍工具都没有像震网这样在手段上花这么大精力。莫楚仅仅认真检测了这个1M大文件中的前5k,就发现代码中到处都是陷阱。
很明显,这不是一次标准的黑客攻击,需要加以更细致的研究。但代码的规模和复杂度意味着,靠莫楚单打独斗显然不行,得成立一个团队才能对其进行全面的逆向工程和解构。所以莫楚自问:我们应不应该费劲去折腾这件事呢?如果赛门铁克到此为止,转向其他业务,没人会说什么。毕竟,反病毒公司的职责是:在病毒肆虐前阻止其传播、在病毒发作后清除染毒系统中的病毒。搞清楚病毒感染后究竟做了什么,其实还在其次。
虽然如此,虽然赛门铁克已经检测出、杀掉病毒,但是被震网感染的客户们仍然超级想知道,震网到底对自己的计算机做了什么。它是否把密码或重要文件偷走了?它是否修改或删除了重要数据?莫楚感到,他们有责任追查到底。
当然,这并非莫楚继续研究的唯一原因。别忘了莫楚是谁,他可是从小拆汽车长大的!一看到震网中蕴藏的谜题,他的小宇宙就按捺不住要爆发了。莫楚心想,震网这么复杂,绝不只是一个间谍工具;震网这么精致,绝不只是一般黑客的作品。我一定要把它拆个底朝天。
莫楚邂逅震网的第一天就要过去了。他把一天的发现记录下来,把它发给了东京某团队的同事,抱歉说自己没有更多时间来分析这个病毒了。
东京团队周末加班绘制了震网的结构框图,对代码进行了总体分析,以便使每个人都能对震网有个大致了解。
而莫楚呢?此时,他和英国籍女友正在加州玛丽安德尔湾附近海滩的家中休息,但头脑中始终萦绕着震网的代码,挥之不去。有关它入侵系统复杂手段的记忆在他脑中不断回放。莫楚开始怀疑,我是不是有些地方搞错了?为了平复疑惑,他又回到办公室把代码又看了一遍,确认没搞错才满意离开。
7月19日周一早上,莫楚当年仰视的那个反病毒团队老大、如今是赛门铁克应急响应团队负责人钱哥已经从都柏林飞到了卡尔弗城。钱哥决定他们应该再找一个人,远在巴黎公司、擅长解构疑难代码的年轻人——高级软件工程师兼系统分析师尼古拉斯•法里耶(Nicolas Falliere)。“钱莫法反毒天团”就此成立。很快,他们琢磨出一个解决方案。
尼古拉斯•法里耶
震网如此巨大,有如此多的部分,难以快速理出头绪。而指挥控制服务器是一个容易下手的点。所以,当法里耶忙着看代码、争取尽快“进入情况”时,莫楚和钱哥把矛头对准了服务器。
每当震网感染一台计算机,它都会“打电话回家”,目标是互联网上以足球球迷网站为域名的两个网址mypremierfutbol.com和/或todaysfutbol.com。域名显然是用假名和假信用卡注册的,显示服务器地址分别在丹麦和马来西亚。每当震网感染一台计算机,它都会与服务器联系,将感染成功的信息和本次感染的详情传输过去。通信是加密的、防止他人随意读取,但攻击者使用的加密算法出人意料的简单、很容易破解。钱哥和莫楚一下就破掉了加密,然后看到了震网向服务器传输的内容:计算机名、所在域名、内网IP、Windows版本号以及是否安装了西门子特定软件。
每条数据都有助于攻击者判断震网是否正在接近目标。考虑到服务器无法看到攻击过程,因此这些数据非常重要。一旦具有自我复制和传播能力的病毒释放出去,攻击者就没办法控制它的行为了。这些返回服务器的数据,只能帮助攻击者在一定程度上了解病毒在寻找目标过程中的传播轨迹。
在这些数据中,有关西门子软件的数据是真正关键的。因为,研究者很快会发现,当震网发现计算机上没有安装西门子公司的特定软件,就什么也不做。它仅仅寻找机会继续感染其他计算机,但不会在未安装西门子特定软件的计算机上释放载荷。没装这些软件的计算机只不过是用来找到最终目标的渠道。
莫楚联系了与这两个服务器域名相应的域名解析(DNS)服务提供者,要求他们停止切断导向攻击者的数据流,并把它引向一个“槽洞”(sinkhole)——一台由赛门铁克控制的、专门用于接收恶意流量的计算机。DNS服务商是因特网上管理数据流的“交通警察”,负责将电子邮件和浏览导向正确的地址,也就是说任何人任何时候在浏览器中输入“nytimes.com”(纽约时报网站)或点击网站上的某个链接,都能跳转至它应当对应的IP地址。通过将流量导引至“槽洞”的行为,研究者可以实时收集震网这名士兵向上级——攻击监控者报告的战场态势。7月20日周二早上,一大波数据流向槽洞袭来。
莫楚和钱哥用世界地图作为背景图层,每收到一条感染成功的记录,就把这台计算机的域名和所在国家标注在地图上,并对这些数据的特征进行统计和分析——包括装有西门子特定软件的遭感染计算机数量。截至当周周末,统计显示:共有来自数十个国家的38000多台计算机与“槽洞”进行了联系,大约每天新增遭感染计算机9000台,并且这个数字在缓慢增加。据推测,病毒最终将感染分布在100个国家的10万台以上计算机。虽然反病毒公司已经发布了震网的特征码和专杀工具,但它仍在快速传播,这表明还有大量用户并未升级最新的杀毒包。在“槽洞”收到的被感染计算机中,偶尔会出现其他安全公司的身影,看来,有其他安全公司也在对震网进行研究和测试。
当他俩将遭感染计算机的地理位置标注在地图上之后,发现了一个异于常理的分布模式。在这38000台计算机中,有22000台在伊朗。印尼远远的排在第二,有6700台,印度第三,3700台。美国只有不到400台遭感染计算机,其他国家遭感染数量也特别少。另外,在所有遭感染计算机中,只有很小一部分安装了西门子公司的特定软件,其中大部分——217台在伊朗,相比之下美国只有16台。
与之前全球病毒大规模爆发时常见的地区分布模式相比,上述统计数字显示的结果截然不同。之前,伊朗的排名从来没有靠前过,即使病毒肇始于中东和中亚地区,伊朗也从来不是重灾区。看起来,这是一次针对伊朗伊斯兰共和国某一特定目标的黑客攻击。但是,如果说攻击者最感兴趣的是伊朗境内装有西门子公司特定软件的计算机,震网传播的范围又不仅于此。还有,为什么它在印度和印尼感染的计算机数量远远超过欧美呢?伊朗、印度、印尼三者之间有何共同之处,才使得病毒在此聚集?考虑到制作这些代码所耗费的时间和金钱,莫楚和钱哥断定,攻击者根本不是为了偷什么设计图纸或什么产品情报。弗兰克的推测是错的!攻击者一定是为了偷取具有地缘政治和战略价值的、关键系统中的情报。震网要找的西门子公司软件,不仅大型工厂在用,很多关键基础设施也在用。钱哥搜索了一下伊朗和印度有什么合作项目后发现,近几年,双方正在共同建造一条连接两国的天然气管道。这条名叫“和平管道”的天然气管道长达1700英里,从伊朗南部的南帕尔斯油气田开始,通过巴基斯坦,一直延伸到印度。而美国对建造这条管道的态度是:强烈反对。所以,这个项目因为地缘政治形势变化和资金短缺等原因经历了N多波折。在2009年,印度迫于美国的巨大压力选择了退出。但在2010年5月,在震网被发现的两个月之前,印度又宣布重启该项目。同时,伊朗决定开始设计建造项目境内部分的最后一段管道。
除此之外,还有一个跟伊朗有关的重大事件——快速扩张的核项目。伊朗正在准备在南部的布什尔地区开设一个核反应堆,而这件事让伊朗和以色列及西方世界之间的关系持续多年紧张。比布什尔争议更大的,是给布什尔反应堆提供核燃料的纳坦兹铀浓缩工厂。因为这个工厂,联合国已投票通过对伊朗实施制裁的决议,甚至有人讨论“对纳坦兹实施空袭”。
这是一幅令人不安的地缘政治图景。恶意代码的复杂程度、偷来的数字签名、伊朗身处遭感染的漩涡中心……这似乎暗示,震网可能肩负着一项机密的政府间谍任务。考虑到目标是伊朗境内某处,那么可能的攻击方并不多。最有可能的是以色列、俄罗斯、中国和美国。
钱哥开始对这些问题展开思考。如果震网真的是某国政府的间谍战武器,比方说是美国的,那么,之前设置“槽洞”的做法是不是太鲁莽了?钱莫法团队拦截了攻击者意图从伊朗遭感染机器传回的数据,那么,这是否意味着自己可能已卷入到一场国际安全事件当中?这是否意味着自己已经对某项机密行动造成了破坏?这会产生怎样的潜在影响呢?想到这些,钱哥倒吸了一口凉气。
但钱哥现在顾不上考虑那么多。况且,保护某国政府的机密行动不是赛门铁克公司的使命,不论是哪个国家。公司的使命是保护客户的计算机。不管是谁制作了这个病毒,也不管它的目标到底是什么,只要它对赛门铁克公司的客户造成了影响,公司就有责任把它清除。
虽然赛门铁克在震网的主战场伊朗没有客户,但震网同时感染了其他国家的计算机,而且这种感染还在延续。而且,研究人员至今也还没有弄清楚,震网的恶意载荷是用来做什么的,也不知道它是否包含能显著影响非目标计算机的错误。
研究人员同样无法确定的是,伊朗到底是病毒攻击的目标还是发源地?震网有没有可能是伊朗人制作出来、用于攻击美国目标、却不慎从实验环境中泄露出来的?这样也说得通啊。那么,如果病毒现在感染了美国的关键基础设施,如某个发电厂、某个水坝或铁路的控制系统,那么接下来会发生什么事?
钱哥和莫楚决定,不能就此罢手,必须继续侦查。
不论这个决定可能蕴含怎样的政治含义,都只能留待水落石出之后再讨论了。(待续)
悬疑:为什么攻击者选择用一般的打包工具UPX,而没用更专业的定制版打包工具?(答案在第四章“解构震网”中)
译者:李云凡