巴黎CBD拉德芳斯区。爱琴海大厦(Tour Egée)。在这座以外形奇酷著称的40层三角形建筑中,尼克•法里耶正弓着腰、伸着脖子,在公司位于第8层的办公室里紧张工作着。窗外,摩天大楼鳞次栉比,隐约可以看到缓步走向新凯旋门的暑休游客和地上的白鸽。法里尔却是“两耳不闻窗外事,一心只研震网码”,目标就是它那复杂的载荷。
[![](https://box.kancloud.cn/2015-12-08_5666b18733d06.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-30.jpg)
爱琴海大厦
那是2010年8月初,法里尔进入震网3人小组刚满两个星期,钱哥和莫楚还没发现震网中有那么多零日漏洞。在这两周中,法里尔一直在和莫楚分析导弹部分中那个巨大的.DLL文件,但他知道,核心的秘密藏在载荷部分中。
这一天,和朋友们吃过午饭后,他开始了载荷部分的分析。具体步骤是,先把其中每个文件分离出来,再想方设法理解它们的格式和功能。他注意到,有一个.DLL文件的名字似曾相识。于是,他来到了测试计算机上的西门子Step 7程序文件夹。很快,他找到了一个同名.DLL文件。“这可真有意思。”法里尔想。
他断定,一旦震网病毒发现计算机上装有Step 7或WinCC,就会将与目标软件相对应的同名.DLL文件从较大的.DLL中解包出来并解密。
法里尔使用藏在病毒代码中的密钥,解开了Step 7同名.DLL文件的密码,发现它具有与合法Step 7同名.DLL文件的全部功能。除此之外,它还有一些包括“读”“写”指令的可疑代码。法里尔毕竟“阅码无数”,很清楚这是什么意思。原来,震网中的这个假冒.DLL是一个后门,感染计算机后在系统中潜伏,等待“系统企图对目标PLC执行读/写操作”的时机,再实施进一步劫持(hook)。与震网病毒导弹部分中的后门类似,这个后门可以通过劫持读函数(hooking the reading function),把对攻击PLC的代码隐藏起来。据法里尔所知,这是“史上第一个”针对工业控制系统的而设计的后门。震网脖子上挂的“第一”奖牌又多了一块。
法里尔无法判断这个假冒.DLL劫持读函数,究竟是为了被动监视PLC并收集其运行信息,还是有什么更深的用意。但是,它劫持读函数的行为,似乎在暗示,它正企图停止PLC的正常运行或改变PLC的运行状态。他瞄了一眼时间,现在是美国加州时间早上5点,给钱哥打电话太早了点,还是接着干活吧。
几小时后,他终于找到了这一谜题的所有答案。结果正如他所料,震网病毒会把西门子软件发给PLC的指令拦截下来,换成自己的指令。虽然看不到震网注入PLC的代码,不能确定它到底让PLC做了什么,但他敢肯定,绝不会是什么好事。这时,已经到了加州时间早上9点,法里尔拿起电话,给钱哥打了过去。
一般情况下,法里尔和钱哥每周联系一次,通报一下法里尔这边的工作进展。通话过程会非常高效,内容直截了当,时间不超过一分钟。但这一次,法里尔详细汇报了这次发现的所有细节。钱哥专心听着这些惊人的内容。他们看到的攻击越来越复杂。简直可以说,震网的每一个角落中都藏着一个大大的惊奇。
钱哥同意,让法里尔一心一意把震网注入PLC的代码弄清楚。他们还决定,让法里尔在博客上发布一个关于发现PLC后门的简短声明。当然,细节将暂时保密,直到法里尔搞清楚震网到底对PLC做了什么为止。
那天晚上,在回家的地铁上,法里尔陷入了一种紧张不安的情绪中。4年来,他拆解过无数病毒,见过无数种恶意程序,已经很难再对这些东西感到激动。但这一次太不一样了。对PLC的攻击史无前例,而且,震网很可能会开创一个网络攻击的全新类型。
激动之余,他深知前路充满坎坷。假冒的西门子.DLL文件很大,也不清楚Step 7和受其控制PLC的结构。法里尔和钱哥对Step 7和PLC完全是门外汉,甚至不能确定问题是否存在可行解,继续破解载荷代码的任务面临着严峻挑战。他们唯一知道的,就是他们正走在一条望不到尽头的苦旅上。(待续)
[![](https://box.kancloud.cn/2015-12-08_5666b15f274c1.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-311.jpg)
尼古拉斯•法里尔
法里尔长着一头黑发和高卢人的面庞,看上去更像一个在巴黎某个夜店驻场的摇滚乐DJ,不像是每天坐地铁通勤去公司读代码的技术宅男。而在生活中,他害羞话又少,比起去夜店嗨个通宵,他还是更愿意坐在电脑前,一行行检视密密麻麻的程序代码。
法里尔是个熟练的逆向工程师,特别擅长对[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")做深度分析。逆向工程是一种常人难以企及的艺术,主要内容是,取出一段由0和1组成的二进制机器代码,并把它翻译成人类可以看懂的程序语言。这项工作需要高度集中的注意力和高超的编码技巧,对震网这么复杂的代码来说更是如此。但法里尔就好这口。代码越复杂,把它破掉的时候就越开心。
法里尔十几岁的时候,经常玩一个叫做crackme(破解我)的代码游戏,是程序员们为相互测试逆向工程水平而设计的。游戏规则是:程序员甲在一个小程序外面加了一层加密外壳,制成一个crackme文件,然后把它发到网上。程序员乙必须破掉加密和其他安全机制,挖出藏在里面的“小纸条”,再把这个“小纸条”作为成功破解的证据发给甲。法里尔逆向工程的技术底子正是在那时打下的。从某种意义上看,病毒和蠕虫不过是更加复杂、破解难度更高的crackme文件而已。对于法里尔来说,玩游戏和破解病毒之间的唯一区别就是,前者只是好玩,而后者能赚钱。
法里尔在法国南部的图卢兹出生、长大,那里是空客公司总部所在地,还有一家卫星技术研究中心。在这样一个工程师和航空文化占主导的地区,法里尔从小就对科技感兴趣丝毫不足为奇。不过,早期给他更多影响的,是机械技术。他父亲是一名拥有并运营自己车库的汽车机械师。法里尔上高中的时候,才开始接触计算机,为他打开了另一扇门。他考取了法国国家应用科学学院的计算机科学专业。2001年,他赶上了红色代码病毒大爆发,造成超过70万台计算机被感染。这让他对计算机安全产生了浓厚的兴趣。在本科阶段,他曾在法国的一份小型技术杂志上发表过多篇文章,还有一篇上了赛门铁克公司旗下的安全焦点网(Security Focus)。在2005年底、攻读计算机科学硕士学位时,他被告知,要有一份6个月的实习经历才能申请学位。这时,他与安全焦点网取得了联系,网站又把他介绍给钱哥。法里尔运气实在是太好了。这时,赛门铁克都柏林公司正在广发英雄帖,而钱哥最缺的就是有经验的逆向工程师。钱哥告诉法里尔,不需要什么6个月的实习了,我给你一份全职工作。“你打算给自己开价多少?”
“我不要钱,”法里尔说,“我只要实习。”
“小子,你疯了吧?”钱哥说,“我会给你发个offer邮件的,等着吧。”
几周后,法里尔去了都柏林。他很快适应了新的生活。但经过了和女友两年“打飞的”式的异地恋之后,他提出,想去巴黎的赛门铁克市场营销分部。结果,他到了巴黎之后,发现自己是那里唯一一个搞技术的。这让他时常感到格格不入,但同时也让他把更多的精力放在自己的工作上。
他和另外两名同事共用一间办公室。在他的办公桌上,有一台用于运行[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")的测试用台式机,旁边乱七八糟的放着一大堆技术论文和书籍,还有一台装有调试工具的笔记本,专门用于代码分析。桌上唯一一件个人物品是一个圆筒形的魔方,每当他遇到难题的时候,就把它拿起来玩两下。
[![](https://box.kancloud.cn/2015-12-08_5666b187db0a1.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-32.jpg)
虽然法里尔非常擅长逆向工程,但实际上在震网出现之前,他这身本事也没派上过多大用场。一直以来,他扮演的角色是赛门铁克的“工具大神”。他能制作各种程序和工具,让其他分析师能更高效的破解[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")。不知不觉中,他已经扮演这个角色很久了。一开始,他只是把自己看着不爽的、低效的恶意代码鉴定工具做一些调整,后来,他开始把这些工具分享给其他同事用,甚至根据他们的需求制作新的工具。最后,他用来制作各种工具的时间远远超过了破解代码的时间。所以,这次要不是出了震网的事,钱哥点名找高层要他,他估计还在闷头做工具呢。
法里尔分析震网载荷的工作,是从研究西门子Step 7软件开始的。震网瞄准的Step 7软件,是用来为西门子S7系列PLC编程的专用工具。它运行在Windows操作系统上,程序员可以在Step 7中为PLC编写、编译指令和代码。Step 7不能单独使用,必须和Simatic WinCC配合。WinCC是一种可视化工具,专门用于监视PLC及受其控制的进程。PLCs通过工厂生产网络与WinCC监控台相连接,始终处于与机器同步的工作状态,定时向监控台发送数据报告和更新,让操作员能看到受PLC控制的所有机器和设备的实时运行状态。西门子的.DLL文件对于Step 7和WinCC非常重要,扮演着向PLC传输指令和从PLC接收数据报告的中间人角色。震网假冒的,就是这个.DLL文件。他不仅能执行原版.DLL文件的任务,还会执行其他任务。
要弄清楚“幽灵.DLL文件”做了什么,法里尔必须首先理解Step 7以及合法.DLL文件的工作原理。他在网上到处请教专家,甚至想去趟西门子公司,但又不知道该找谁。这个.DLL文件不过是西门子用到的N个.DLL文件之一,要找到能真正帮上忙的那两三个程序员,花的时间估计跟自己在这“硬破”也差不多。而且,说到底,还是自己破更有成就感嘛。
为了还原原版和“幽灵”版.DLL文件,法里尔把它们放进了反汇编器——用于把二进制代码翻译成汇编语言代码的工具。他可以在代码中添加标记和注释、或者将各部分重新编排,来提高程序的可读性。他每次只截取一小段代码,然后按顺序将一段段代码排列好,并详细列出每段代码的功能。
研究者在分析复杂的恶意代码时,一般会综合运用静态分析和动态分析两种手段。静态分析,是指把代码放在反编译器或调试器中观察;动态分析,是指让代码在测试机上运行,使用调试器反复中断、恢复运行过程,以便将每部分代码的功能与该部分代码运行期间对测试器产生的影响进行匹配。法里尔也是这样做的。但这个过程,即便在最好的环境下,也会极其劳神而耗时,因为,研究者必须在两台机器之间跳来跳去。考虑到震网假冒.DLL文件的规模和复杂性,反汇编的难度就更大了。
法里尔用了两个星期来验证这个.DLL文件的每一个功能。最终,他确认了自己之前的怀疑,震网的确绑架了西门子这个核心.DLL文件,用假冒.DLL文件实现了劫持。它把原版.DLL文件的文件名从s7otbxdx.DLL改成了s7otbxsx.DLL,之后把假冒.DLL文件放了进去,成功实现了偷梁换柱。之后,当系统调用这个.DLL文件执行任务时,假冒.DLL文件中的内容就生效了。
替换成功后,假冒.DLL文件开始大显身手。(待续)
每当工程师要向PLC发送指令时,震网都会将自己的恶意指令和代码发送出去并执行。但是,它并未简单的将原始指令覆盖掉,而是增加了代码的长度,把自己的[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")放在的原始代码的前面。然后,为了确认被激活的是[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")而非原始代码,震网还在负责读取和执行指令的PLC上“嵌入”(hook)了一段核心代码。要将代码天衣无缝的注入到PLC中,同时又不会造成PLC失灵,需要非常丰富的知识和高超技巧。攻击者做的,实在太漂亮了。
攻击的第二部分更精彩。在震网的恶意指令运行之前,[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")会先耐心的在PLC上守候两周甚至更久的时间,专门做这件事——当控制器将运行数据发给监控台时,就把合法操作对应的正常值记录下来。之后,当震网的恶意指令开始执行时,程序就会把之前记录下来的正常值“重放”给操作人员,让他们无法知道机器中的任何差错。这简直跟好莱坞警匪片中,窃贼将循环播放的录像插入监控摄像头硬盘中一样。当震网侵入PLC时,它还通过修改PLC安全系统中一个名为OB35的代码段,废掉了PLC的自动数字警报系统,以防止安全系统发现设备面临危险时,停止受PLC控制的工作进程。这段代码的功能,是监控受PLC控制的涡轮的转速等关键操作数据。PLC每100毫秒就会生成这样一段代码,以便让安全系统能在涡轮失控或出现其它问题的第一时间发现并介入,从而让系统(自动)或操作人员及时关机、停车。震网一来,安全系统只能看到被震网修改过的正常数据,再也没机会发现危险情况并介入其中了。
攻击并未到此结束。如果程序员发现受PLC控制的涡轮或其他设备出了问题,要去看看PLC的指令中看有没有程序错误,震网就会对此进行干涉,并阻止其看到恶意代码。它是怎么做到的呢?原来,震网会拦截所有读取PLC代码段的请求,并向其提供减去恶意代码段的“清洁版”代码。如果某个试图解决问题的程序员要用新代码覆盖旧代码,震网同样会介入,并将恶意指令注入其中。就算有人把PLC程序更新100次,震网也会把新代码反复感染100次。
法里尔被攻击的复杂程度及其可怕的意图吓到了。真相已经水落石出,震网的目的并非像人们之前想的那样,是监听受PLC控制设备的运行数据。它将指令注入PLC并将其隐蔽起来,同时关闭报警系统,根本不是什么间谍行为,而是赤裸裸的破坏!
而且,这不是一个简单的“拒绝服务”类攻击。攻击者并不是要把PLC关闭,而是要在保留其正常功能的同时,从物理上破坏受PLC控制的工业进程和设备。这是法里尔第一次看到数字代码不是用来改写或盗取数据,而是从物理上破坏受程序控制的实体。
震网做的事情,简直就是好莱坞大片的套路。这个大片,请布鲁斯·威利斯当男猪脚再合适不过了。三年前,一部名叫《虎胆龙威4:虚拟危机》(Live Free or Die Hard)的电影中,曾上演过与之类似的桥段,其中带着些许好莱坞特有的傲娇和创造力。在这部电影中,由一个对政府不满的前官员带着一帮网络恐怖分子,精心策划并发动了一系列连环网络攻击:攻击证交所造成恐慌抛售、攻击交通信号造成交通混乱、攻击电网造成大范围停电……通过这些攻击分散当局的注意力,从而实现他们的真正目标——从政府金库中盗取大笔美元,并引发终极大爆炸。
[![](https://box.kancloud.cn/2015-12-08_5666b188098d8.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-331.jpg)
电影海报上的布鲁斯·威利斯
但是,这些电影情节甫一放映,就有计算机安全人士宣称这是纯属虚构。黑客通过网络关闭一两个关键系统还有可能,但是爆炸?别逗了。《虎胆龙威》中大部分爆炸都是通过物理手段而非通过网络攻击实现的。但是,震网的存在似乎又在证明,这并非不可能。震网代码中所蕴藏的技术、手段和智慧之丰富,远远超出了法里尔的见闻和预期。
虽然规模庞大、成就斐然,赛门铁克终究还是一家充满技术气质的公司,以保护客户的安全为己任。15年来,这家公司打败过的“对手”,既有屌炸天的黑客和网络犯罪分子,又有以猎取机构与政府情报的官方间谍。他们水平和特点各异,都算得上强大的对手,但没有谁会想去对目标进行物理层面的破坏。而且多年来,恶意代码的进化是渐进的。在90年代,恶意代码制作者的动机非常相似,虽然有一些确实具有微弱的破坏性,但恶意代码制作者的主要目的就是出名。那时,典型的病毒所追求的是张扬的、恶作剧式的效果。后来,当电子商务在互联网上生根发芽后,黑客行为进入了以金融犯罪为主要特征的阶段。病毒制作者的目的不再是吸引眼球,而是使出浑身解数让病毒在目标系统中藏得越久越好,以供他们盗取大量信用卡卡号和银行账户密码等值钱的信息。最近,随着官方情报部门的加入,在目标网络中潜伏数月至数年、旨在不间断获取国家机密和其他敏感信息的高风险间谍活动开始出现。
但震网显然走的更远。可以说,它的出现,是病毒进化过程中的一次“基因突变”。法里尔和他的同事们之前所检测过的所有恶意代码,包括以信用卡中心服务器和国防部绝密情报为目标的顶级作品,与之相比都相形见绌。震网的出现,创造了一个网络攻击的全新领域,在这个领域中,赌注更大、风险更大、回报也更大。(待续)
长久以来,业内都流传着一个未被证实的故事。这个故事似乎一直在暗示,早晚会有类似的事情发生。故事是这样的:1982年,美国中情局设法在控制俄罗斯天然气管道的软件中,植入了一个逻辑炸弹。代码一旦被触发,将导致管道中的阀门失灵。最后的结果是,这个[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")引发了一场可以从太空上观测到的剧烈爆炸。
钱哥回到卡尔弗城后,一直在思考一个问题:在伊朗,会不会有一些可能与震网有关的、原因不明的爆炸事件呢? 他查了查相关新闻报道,不禁倒吸一口凉气。他发现,最近几周真的有好几起莫名其妙的爆炸。7月底,一条伊朗向土耳其方向输送天然气的管道发生了爆炸,爆炸地点位于距伊土边境仅数英里的土耳其多乌巴亚泽特(Dogubayazit)城外。爆炸震碎了附近建筑的窗户,大火持续了几个小时才被扑灭。
另一起爆炸发生在伊朗西北部的大不里士(Tabriz)城外,爆炸的是另一条长达1600英里、从伊朗通往土耳其首都安卡拉的天然气管道。第三起爆炸发生在波斯湾哈尔克(Kharg)岛上,大火和冲击波席卷了这家国营石化厂,造成了4人死亡。几周后,位于阿萨鲁耶的帕迪斯(Pardis)石化厂再次爆炸,5人死亡、3人受伤。而且,这次爆炸发生与伊朗总统内贾德来此参观仅一周之隔。
这么多起爆炸,必定其来有自。库尔德叛军宣称对多乌巴亚泽特和大不里士的两起爆炸负责。伊朗国家通讯社(IRNA)将哈尔克岛大火归咎于石化厂中央锅炉产生的过高压力。帕迪斯石化厂爆炸的起因,则是工人在焊接管道时点燃了泄露的乙烷气。那么,这些爆炸中,会不会有那么一两起是震网引起的呢?钱哥想啊,想。
短短几周前,他们开始解构震网时,谁曾料到会有今天的大场面?如果,钱哥他们猜测之事为真,那么震网对伊朗的攻击,完全可以称得上史上第一次网络战争。
钱莫法3人组召开电话会议,讨论下一步该怎么办。直到现在,他们也还不能准确的说出,震网注入PLC的代码到底具有什么功能,更不清楚受PLC控制的目标到底是什么。但是,他们认为,必须将当前的研究结果发布出来。于是,2010年8月17日,他们公开发布了一条新闻,称:震网并不是什么间谍工具,而是专门用来实施物理破坏的数字武器。法里尔用他一贯低调的语气写道,“以前,我们曾报道过,震网盗取了数字证书并运用经典的后门技术把自己藏起来。现在来看,它的所作所为远远不止于此。”
为了揭示震网的破坏能力,他们引用了1982年西伯利亚天然气管道爆炸的例子。新闻发布前,公司要求公共关系团队对文章的用词和可能引发的反应进行了反复审阅,确认没有任何瑕疵后方准予发布,同时保留了关于“网络攻击导致物理破坏”的核心内容。文章一发出,他们就开始紧紧的盯着各大媒体,看业内是何反应。出乎他们意料的是,没有任何情绪化和戏剧化的反应出现。用钱哥的话来说,“只有安静,连掉根针的声音都听得见。”
钱哥觉得这太不正常了。毕竟,他们讨论的可是史无前例的大事件啊。他们原以为,赛门铁克发布研究成果之后,肯定会有其他研究者跟着发布自己的研究成果。这才是[恶意代码](http://www.aqniu.com/infosec-wiki/827.html "恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。")分析行业的正常工作模式。每当人们发现新的恶意代码,分属于不同公司的研究团队就会展开一场破解代码的竞赛,看谁能先把结果发布出来。一旦有一个团队发布结果,其他人就会很快跟上,发布自己的研究结果。如果多个团队得到的结果是相同的,那么,他们彼此的工作将成为某种意义上的“同行评议”,从而验证结果的正确性。然而,业界对震网研究结果不同寻常的沉默,实在是令人困惑。钱哥心想,难道只有我们一家在检测载荷部分代码吗?难道就没有其他人关心这事吗?
过了一会,他开始怀疑,他们在震网上花了这么多时间,到底值不值得。会不会有某个显而易见的问题,别人都看出来了、而只有他们几个还蒙在鼓里?回顾过去几周的所有发现后,钱哥斩钉截铁的确定,他们没有犯错,震网的重要性不容置疑,震网的攻击意图昭然若揭。
至于是否继续研究的问题,如果说之前的研究是为了对客户有个交待,现在他们已经没有什么需要回答的疑惑了。他们已经向世人宣告,震网是一个以造成物理破坏为目的的恶意程序。但是,他们没能找出,震网的目标到底是什么。在公布震网具有破坏意图之后,他们又开始担心,攻击者会不会突然感觉压力山大,并加速对目标实施破坏。如果是这样的话,那还不如不公布的好。
显然,担心事情会越闹越大的,并非只有他们一家。一直以来,从遭震网感染计算机发往槽洞的数据流量都比较稳定,但就在新闻发布5天之后,流量突然消失。看来,一定是伊朗内部有人看到了他们发布的消息。为了防止攻击者或其他人继续通过远程方式感染计算机并造成损害,伊朗方面终于下令,切断了国内所有染毒计算机与指挥控制服务器之间的连接。(待续)