第二章 神秘的500k

最后更新于:2022-04-01 21:16:52

6年来,里阿姆•奥•莫楚(Liam O’Murchu)一直以分析各种蠕虫和病毒为业,但从没有见过这样的代码。它运用的技术远远超越了他所见过的其他病毒。所以,当他坐在南加州办公室的计算机前,打开欧洲同事连夜发来的震网病毒时,压根没想到,居然会碰到这样一个“神兽”。 那是个周五,2010年7月16日,震网新闻在科技业界发布的第二天。当时莫楚像往常一样,正有一搭无一搭的浏览着病毒代码。这位33岁的爱尔兰人是赛门铁克公司卡尔弗城办公室应急响应团队的运营负责人,他的任务是检视[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。"),并决定是否有必要对它们进行更深入的研究。 公司在爱尔兰都柏林的同事已经在前一天下午拿到了病毒文件,几小时后,文件就送到了早上刚刚起床的莫楚这里。赛门铁克公司的[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")分析团队遍布各个大洲,这样不管什么时候,只要有重要事件发生,都会有人处于值班状态、迅速跟踪事态发展。一个分部下班的同时,就有另一个分部上班,前一个分部的员工把工作文档交给后一个分部的员工,就像传递接力棒一样。 当然,并非所有病毒都有这种“追着日出跑”的待遇。每个月赛门铁克及其他安全公司都会发现大约100万种恶意文件,绝大多数都是技术模仿者利用已知工具改写、希望通过改变特征指纹的方式骗过反病毒扫描引擎。对于这些“标准化”病毒,可以通过导入特定算法对其代码进行分析,寻找与已知病毒相匹配的特征和行为方式。只有当算法搞不定的时候,才会把代码导出到研究人员这里,进行人工分析。如果一个恶意程序利用或可能利用了“零日漏洞”进行攻击,肯定是由人而非算法来进行检测的。这也是震网的文件会到莫楚手上的原因。 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b15e9a569.jpg)](http://www.aqniu.com/wp-content/uploads/2015/09/640.webp-61.jpg) 里阿姆•奥•莫楚Liam O’Murchu 莫楚是个充满激情的滑板青年,说话富有感染力,留一头棕色短发,前额上还做了一个醒目的“直立烫”造型。他2004年起在赛门铁克公司上班,不过从都柏林来到美国时间不长,至今才在赛门铁克加州公司工作两年。他领导着一个技术出众的[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")分析和逆向工程团队,连年征战在处理数字威胁事件一线,每个人都身经百战。但任何人都没有预料到,莫楚会从震网当中“挖出核弹”。 震网的主文件大得不可思议——500k字节,而常见恶意代码文件大小仅为10k到15k之间。即便是臭名昭著的Conficker,这个两年前(2008年)感染了600万台计算机的“怪物级”病毒,其大小也不过35k。大于这个量级的恶意文件,通常会包含一块非代码区域,一般是用图片文件填充来使其占用更大空间。但震网中并没有图片文件,也没有无关填充物。而且,当莫楚开始将文件一步步打开时,他意识到,震网的代码比他和其他人所见过的任何恶意代码都要复杂。 莫楚与恶意代码的第一次亲密接触是在1996年,那时他在都柏林大学学习计算机科学专业,然后有个奇葩同学自己制作了一款病毒,把学校机房里所有的计算机都感染了。在3月15日,病毒获得了所有终端的控制权,大家都没法上机了。用户必须先答对屏幕上出现的10道问题,才能登录。大多数同学都被搞烦了,但莫楚一心想着能得到一份病毒文件的拷贝,然后把它拆开来看看。他的个性是“见啥拆啥”。莫楚从小在吉尔戴尔郡阿赛镇外的乡村长大,跟别家孩子喜欢玩汽车不同的是,他最喜欢把汽车拆成零件,看它是怎么工作的。 年轻时,莫楚并没有打算成为一个专门摆弄病毒的。他一开始上大学的时候为拿到一个自然科学的学位,勤勤恳恳的苦学各种物理和化学课程,后来才转向计算机科学课程并为之着迷。他快速抛弃了化学实验室,开始沉浸在计算机房里。在大学中,黑客攻击逐渐成为众人关注的话题,但莫楚从未想过信息安全会成为一种职业发展的可能路径,直到有一天,攻击者黑掉了机房的服务器,然后一大帮同学来帮忙打补丁、清除病毒修复机器。莫楚被这场“猫鼠大战”深深吸引着,他目睹了入侵者一次又一次地使用计谋,把防守一方戏弄到团团转。 这种翻越数字障碍的本事,在莫楚和朋友们大学毕业到美国后派上了用场。他们得到一份为一家圣迭戈创业公司测试付费阅读网站(kiosk)的工作。他们的任务是看能不能绕过网站的“付费门槛”,越权打开本应花钱才能浏览的网页。这公司没有找普通的计算机用户来测试,而是故意找了他们这么一个黑客团队。包括6个付费阅读点的系统搭建完毕后,莫楚团队的工作开始了。公司打算给他们两个星期的测试时间,然后就把系统上线。但莫楚和他的朋友们一直能找到绕开“付费门槛”的新办法。2个月过去,他们还在不断发现新的破解方法,这家公司实在受不了了,终止了测试,让系统就这样上线了。 接下来的几年里,莫楚带着他心爱的滑板,满世界旅行,心中对进入信息安全行业怀着一种模糊的情愫,却又没有明确的计划。2002年,他加入了都柏林的一家名为“光明邮件”的反垃圾邮件公司。他当时想法很简单,挣点钱,供养自己游玩的开销。而当2004年赛门铁克公司收购光明邮件时,莫楚看到了进入信息安全行业的真正机会。在作为被收购公司雇员参观赛门铁克都柏林公司办公室的过程中,他耐着性子跟人们一个部门一个部门地转悠,实际上他只想去看那令他心驰神往的病毒研究团队。但是,当见到了研究团队老大美国人埃里克•钱(Eric Chien,下称“钱哥”)的时候,他的梦碎了一地。莫楚原以为公司在世界各地会有几百个病毒分析师的岗位,所以进来会比较容易。但钱哥告诉莫楚,他的团队只有五、六个人,每个人都已经干了很多年,而且“没人想离开,他们都很热爱这份工作。” [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b15eaa027.jpg)](http://www.aqniu.com/wp-content/uploads/2015/09/640.webp-71.jpg) 埃里克•钱(钱哥) 莫楚并未被吓住。他开始自学分析师们用来破译病毒、提取特征码的工具。几个月后,出现了间谍软件和广告软件大爆发的情况,公司研究团队需要增加人手,而这时的莫楚已经做好准备了。接下来的几年里,莫楚仍然在有着赛门铁克最大研究团队的都柏林公司工作,直到2008年搬到美国卡尔弗城。 多年来,莫楚和他在赛门铁克公司的同事们处理了多起令人瞩目的、复杂的安全威胁事件。但没有任何一次比得上震网这么刺激、这么具有挑战性。 当莫楚检测震网主文件时,他很快发现,文件采取了多层加密机制来保护其核心和多个组件。很幸运,第一层是容易破解的“打包”(packer)。 打包,是一种压缩和分割代码的软件工具,目的是增加反病毒引擎识别代码特征的难度,防止病毒检测者迅速搞清楚代码的功能。恶意代码每次打包时,都会在外表上出现细微的变形,所以将同样的代码打包一千次,就会得到一千个不同的版本,而其内部的代码是不变的。反病毒引擎能认出使用已知打包工具的恶意文件,将其解包,并识别出内部代码的特征。为规避这种查杀,高明的攻击者会定制出更不易识别和去除的打包工具。但震网的制作者并没有这样做。他们只是用了一种名为UPX——全称“可执行文件终极打包器”的现成打包工具,所以很容易识别并破解。考虑到它其他部分的高级特征——零日漏洞利用程序、盗取数字签名——他们选择用UPX而不是更专业的定制版打包工具,让人觉得有点奇怪。因此,莫楚断定,打包的主要目的很明确,就是压缩文件、减小体积。解包解压完成后,主模块的体积增大至1.18M。 解包之后,莫楚可以清楚的看到弗兰克之前提到的有关西门子公司软件的线索。更重要的是,他还发现了一个经过加密的代码块,它就是震网病毒的主干。这个代码块是一个包含30多个DLL(动态链接库)文件和其他组件的巨大DLL文件,像俄罗斯套娃一样一层一层加密、嵌套在一起。他还发现了一个功能强大的配置文件,攻击者可以对其中400多项内容进行设置,从与震网保持通信的指挥控制服务器的网址(URL),到每次通过U盘上的漏洞利用程序感染计算机的数量。莫楚还幸运地发现,病毒为自己的感染设定了终止日期:2012年6月24日。每当震网病毒进入一台新的计算机,都会检查计算机上的日期,如果晚于这个日期,病毒就会停下来,放弃感染。已经被感染机器上的恶意程序载荷仍然会继续运作,但震网病毒将不再感染新的计算机。推算下来,这个终止日期比震网首批感染伊朗计算机要晚3年。看来,攻击者觉得,3年的时间足够他们完成预定任务了。 震网最令莫楚感到牛逼之处,是他在目标计算机上隐匿文件的复杂方法,和调用一个貌似普通的函数完成超级任务的精巧招数。莫楚花了一天时间来搞清楚这些细节。当他完成的时候,被惊呆了。(待续) 正常情况下,Windows系统中执行打开文件、读取文件或保存文件等一般任务的代码,都保存在系统的.DLL(动态链接库)文件中。当系统或其他应用程序要执行这些任务时,就会调用相关的.DLL文件,就像一名读者在图书馆中查询一本书那样。然后,被调用的.DLL文件就会进入内存并运行。黑客们也会试图将用于恶意活动的代码储存在Windows动态链接库文件中,但反病毒引擎会扫描整个“图书馆”,发现本不属于那里的“那本书”。所以,震网的设计者并没有这样做,而是让[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")直接被调入内存,这样反病毒引擎就更难探测到它了。单单这一点也没什么大不了,因为很多厉害的黑客也会这么干。震网真正惊人之处在于,它独辟蹊径的代码调用方式。 通常,内存中的[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")在运行时,还需要向系统申请加载硬盘上其他文件中的额外代码,这种行为是可以被反病毒引擎发现的。震网用了一个更好的思路。震网把运行所需的所有代码都整合在一起,存放在多个有着奇怪名字的虚拟文件中。一般来说,这样做是行不通的。因为当震网调用代码时,操作系统根本无法认出这些文件名,或者根本无法在硬盘上找到这些奇怪的文件。但是,震网重写了Windows系统的部分API(应用程序编程接口,通过它可以调用系统的内部函数),建立了这些奇怪文件和震网代码之间的“挂钩”关系。这样一来,每当系统访问这些奇怪文件时,就会自动将震网的全部代码调入内存。如果反病毒引擎怀疑内存中的这些奇怪文件有问题、并对其进行检测时,震网也提前想好了应对之策。因为它还重写了API中关于显示文件属性的代码,反病毒引擎只会“看到”:“这些文件是空的。这里什么都没有,去别的地方找吧。” 这还没完。一般的病毒执行代码的方式是比较直接的:调用代码并运行。但震网不是这样。它被设计成一台“鲁宾•哥德堡机器”(一种被设计得过度复杂的机械组合,以迂回曲折的方法去完成一些本来非常简单的工作)来更好的隐蔽自己——把自己的代码植入某个正在运行的进程A的代码块中,然后把进程A的代码拿出来放到另一个正在运行的进程B的代码块中。 莫楚惊叹于病毒设计者为此次攻击所投入的巨大工作量。近年来他所见过的最复杂病毒也没有这么大的体量。而一般的病毒设计者只会尽可能少费劲,只要能让病毒运行起来、逃过检测就行了。如果仅仅是为了盗抢一些密码或者拿到一点数据,根本没必要在代码研究方面费这么大周章。即便是貌似来自中国的高级间谍工具都没有像震网这样在手段上花这么大精力。莫楚仅仅认真检测了这个1M大文件中的前5k,就发现代码中到处都是陷阱。 很明显,这不是一次标准的黑客攻击,需要加以更细致的研究。但代码的规模和复杂度意味着,靠莫楚单打独斗显然不行,得成立一个团队才能对其进行全面的逆向工程和解构。所以莫楚自问:我们应不应该费劲去折腾这件事呢?如果赛门铁克到此为止,转向其他业务,没人会说什么。毕竟,反病毒公司的职责是:在病毒肆虐前阻止其传播、在病毒发作后清除染毒系统中的病毒。搞清楚病毒感染后究竟做了什么,其实还在其次。 虽然如此,虽然赛门铁克已经检测出、杀掉病毒,但是被震网感染的客户们仍然超级想知道,震网到底对自己的计算机做了什么。它是否把密码或重要文件偷走了?它是否修改或删除了重要数据?莫楚感到,他们有责任追查到底。 当然,这并非莫楚继续研究的唯一原因。别忘了莫楚是谁,他可是从小拆汽车长大的!一看到震网中蕴藏的谜题,他的小宇宙就按捺不住要爆发了。莫楚心想,震网这么复杂,绝不只是一个间谍工具;震网这么精致,绝不只是一般黑客的作品。我一定要把它拆个底朝天。 莫楚邂逅震网的第一天就要过去了。他把一天的发现记录下来,把它发给了东京某团队的同事,抱歉说自己没有更多时间来分析这个病毒了。 东京团队周末加班绘制了震网的结构框图,对代码进行了总体分析,以便使每个人都能对震网有个大致了解。 而莫楚呢?此时,他和英国籍女友正在加州玛丽安德尔湾附近海滩的家中休息,但头脑中始终萦绕着震网的代码,挥之不去。有关它入侵系统复杂手段的记忆在他脑中不断回放。莫楚开始怀疑,我是不是有些地方搞错了?为了平复疑惑,他又回到办公室把代码又看了一遍,确认没搞错才满意离开。 7月19日周一早上,莫楚当年仰视的那个反病毒团队老大、如今是赛门铁克应急响应团队负责人钱哥已经从都柏林飞到了卡尔弗城。钱哥决定他们应该再找一个人,远在巴黎公司、擅长解构疑难代码的年轻人——高级软件工程师兼系统分析师尼古拉斯•法里耶(Nicolas Falliere)。“钱莫法反毒天团”就此成立。很快,他们琢磨出一个解决方案。 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b15f274c1.jpg)](http://www.aqniu.com/wp-content/uploads/2015/09/640.webp_34.jpg) 尼古拉斯•法里耶 震网如此巨大,有如此多的部分,难以快速理出头绪。而指挥控制服务器是一个容易下手的点。所以,当法里耶忙着看代码、争取尽快“进入情况”时,莫楚和钱哥把矛头对准了服务器。 每当震网感染一台计算机,它都会“打电话回家”,目标是互联网上以足球球迷网站为域名的两个网址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月,在震网被发现的两个月之前,印度又宣布重启该项目。同时,伊朗决定开始设计建造项目境内部分的最后一段管道。 除此之外,还有一个跟伊朗有关的重大事件——快速扩张的核项目。伊朗正在准备在南部的布什尔地区开设一个核反应堆,而这件事让伊朗和以色列及西方世界之间的关系持续多年紧张。比布什尔争议更大的,是给布什尔反应堆提供核燃料的纳坦兹铀浓缩工厂。因为这个工厂,联合国已投票通过对伊朗实施制裁的决议,甚至有人讨论“对纳坦兹实施空袭”。 这是一幅令人不安的地缘政治图景。恶意代码的复杂程度、偷来的数字签名、伊朗身处遭感染的漩涡中心……这似乎暗示,震网可能肩负着一项机密的政府间谍任务。考虑到目标是伊朗境内某处,那么可能的攻击方并不多。最有可能的是以色列、俄罗斯、中国和美国。 钱哥开始对这些问题展开思考。如果震网真的是某国政府的间谍战武器,比方说是美国的,那么,之前设置“槽洞”的做法是不是太鲁莽了?钱莫法团队拦截了攻击者意图从伊朗遭感染机器传回的数据,那么,这是否意味着自己可能已卷入到一场国际安全事件当中?这是否意味着自己已经对某项机密行动造成了破坏?这会产生怎样的潜在影响呢?想到这些,钱哥倒吸了一口凉气。 但钱哥现在顾不上考虑那么多。况且,保护某国政府的机密行动不是赛门铁克公司的使命,不论是哪个国家。公司的使命是保护客户的计算机。不管是谁制作了这个病毒,也不管它的目标到底是什么,只要它对赛门铁克公司的客户造成了影响,公司就有责任把它清除。 虽然赛门铁克在震网的主战场伊朗没有客户,但震网同时感染了其他国家的计算机,而且这种感染还在延续。而且,研究人员至今也还没有弄清楚,震网的恶意载荷是用来做什么的,也不知道它是否包含能显著影响非目标计算机的错误。 研究人员同样无法确定的是,伊朗到底是病毒攻击的目标还是发源地?震网有没有可能是伊朗人制作出来、用于攻击美国目标、却不慎从实验环境中泄露出来的?这样也说得通啊。那么,如果病毒现在感染了美国的关键基础设施,如某个发电厂、某个水坝或铁路的控制系统,那么接下来会发生什么事? 钱哥和莫楚决定,不能就此罢手,必须继续侦查。 不论这个决定可能蕴含怎样的政治含义,都只能留待水落石出之后再讨论了。(待续)
';