独家连载 | 零日漏洞:震网病毒全揭秘(45)
作者:星期四, 十一月 12, 20150

640.webp

在胡尔斯波斯的帮助下,另外两个神秘数值露出了真容。钱哥和莫楚顺藤摸瓜,又查到了两款控制离心机转速的变频器。法里尔则拼出了详细的攻击路线路。至此,针对315型PLC的攻击案告破,赛门铁克志得意满,昭告天下……

第十三章 数字弹头(接上)

破解震网之谜的临门一脚,来自一位名叫罗布·胡尔斯波斯(Rob Hulsebos)的荷兰程序员。11月初,这位现场总线协议方面的专家给钱哥发了一封邮件。他此前在博客上看到,赛门铁克第二次在网上公开寻求技术支援,要解决的正是现场总线卡和关键基础设施方面的问题。于是,他主动做出了回应。这封邮件只有两段文字,大部分是钱哥已经掌握的有关现场总线的相关信息,但有几句至关重要的话正是钱哥特别需要的。胡尔斯波斯写道,与现场总线卡相连接的每个外部设备,都会有一个由现场总线卡分配给它的ID码。这个ID码的大小是2个字节、16位。

钱哥记起来了,之前有两个没破解出来的“神秘数值”——7050h和9500h,正好也是16位。

他走到莫楚的隔间,拿起黑莓手机,让他看了看这封邮件。两人四目交接,试图从对方眼中找到些什么。莫楚迅速打开浏览器,对现场总线外部设备的ID码进行了搜索,看到了一大长串产品手册的链接。钱哥让莫楚打开一个PDF文件,里面有一张与现场总线网卡适配的常见设备清单。清单上,设备名和16位的ID一一对应。莫楚从上往下搜了一遍,在清单底部找到了一个目标:9500h。清单上显示,这个ID码对应的是一家芬兰公司生产的某型变频器。接着,钱哥又搜了一遍,希望把另一个“神秘数值”也找出来,可惜未如愿。他只好给生产现场总线卡的公司发了封邮件,询问ID为7050h的是什么外部设备。发出邮件的时候,他已经做好了石沉大海的准备,但没想到,公司居然回信了!信中说,这是一家伊朗公司生产的某型变频器。

变频器是一种输入电流调节装置,用于控制发动机和涡轮机上的电流变化,以调整其转速。频率调高,发动机的转速就会加快。ID为9500h的变频器,由芬兰伟肯(Vacon)公司生产;ID为7050h的变频器则没有具体的型号标识,由伊朗法拉罗·巴耶利(Fararo Paya)公司生产。莫楚怀疑,后者是前者的伊朗山寨版本。如果事实的确如此,那么估计伊朗国产变频器的用户,应该就在伊朗境内。

640.webp (2)

之后,他们下载了关于变频器的所有资料,包括各个品牌的几十本说明书。虽然没找到上述两款设备的说明书,但他们发现,有些说明书虽然来自不同品牌,但其中列出的控制指令却大同小异。其中一条STL指令,正是法里尔从震网代码中看到的“47F and 1”,它的意思是:“启动变频器,发送字符串47F,将值设为1。”莫楚看到这句话,禁不住把它大声念了出来。他无法相信,四个月来,他们一直在奋斗在破解震网的第一线,夜以继日、加班加点,就是为了确定它攻击的目标。结果,最后的答案居然来自几条Google检索结果!这真是让人既难掩兴奋,又意犹未尽。

这时,天色已晚,钱哥和莫楚也精疲力尽了。于是,他们给法里尔写了一封邮件,把他们的发现和写着相关指令的说明书文件一并发了过去。钱哥写道,“仔细看看,看你能不能在里面找到些干货。”

法里尔一早醒来,打开手机看到了邮件,立刻飞一般的赶到了办公室。他把从震网代码中提取出来的所有配置数据和指令拉了个清单,然后一条一条的对着说明书查。不久,他就找到了所有的匹配项。之前他就怀疑,震网有可能通过PLC直接更改了某个设备的运行频率。因为,震网代码中有一些类似10640的数字,他猜测数字的含义可能是1064赫兹(单位为分赫兹)。现在可好,新的证据来了。

利用这些说明书,他在两小时内完成了震网中所有指令的翻译,据此拼出了震网攻击的完整谱系,并把结果发给了莫楚和钱哥。

在震网开始攻击S7-315型PLC之前,会首先确认系统中用的频率控制器是伟肯公司或法拉罗巴耶利公司生产的,且其运行频率在807赫兹至1210赫兹之间。此外,震网寻找的目标,是一个安装有186个变频器的工厂,且所有变频器的运行频率必须高于800赫兹。变频器的用途非常广,但运行频率在600赫兹以上的却很少。钱哥上网搜索后看到,美国核管制委员会规定,这种变频器属于限制出口类产品。那么,震网的目标是核设施这一点已经是板上钉钉了。朗纳的推测,总算有了来自代码中的证据的支持。

钱哥热血澎湃,慨然感喟:美哉震网!壮哉我钱莫法男子天团!

破解震网代码的工作花了他们好几个月。这几个月中,此三人真可谓“勉力争寸进,凝神履薄冰”。热眼回望,正是“循证谨严、浑然一体”。最后,法里尔绘制了一张堪称“工笔”的流程图,把震网315攻击的过程从头到尾、一步一步的摆了出来。

每当震网发现安装Step 7软件的计算机时,会将假冒Step 7 .DLL文件解包出来,并替换掉西门子原版.DLL。然后它会耐心等待,直到有程序员登录这台计算机上的Step 7,并读取或编写S7-315型PLC用的代码段。这时,震网会将恶意代码注入这段代码,并等待程序员将他的笔记本连接到PLC上,或者用U盘把这段代码复制到PLC上。这个过程可能需要几天甚至几周,但一旦恶意代码进入PLC,对设备的破坏性攻击就无可挽回了。

在13天的侦察后,震网会把变频器的频率提升至1410赫兹,并持续15分钟;然后降低至正常运行频率范围内的1064赫兹,持续26天。在这26天当中,震网会将所需信息全部收集完毕。之后,最精彩的戏码出现了。它会让频率在2赫兹的水平上持续50分钟,然后再恢复到1064赫兹。再过26天,攻击会再重复一遍。每次破坏性攻击进行时,对监控系统的中间人攻击都会起效,管理员会看到预先准备好的“正常数据”,此外,对安全报警系统的攻击早已根除了“通风报信”的可能性。

至此,赛门铁克完全吃透了震网攻击S7-315型PLC的来龙去脉。不过却对S7-417型PLC的攻击尚无头绪。一个导弹上,居然同时装载着两个目标迥异的弹头。

S7-417型PLC属于西门子的高端产品,内存为30M,标价1万美元,可以买20个S7-315。似乎是为了凸显它的身价,攻击此PLC的代码也更庞大。由于系统复杂度较高,针对417型PLC的恶意代码共包括40个代码段,而攻击S7-315的只有15段。

这段代码之所以如此复杂,一方面是由于目标环境更复杂,另一方面则是由于执行步骤更多。此外,它的结构非常怪异,给逆向工程带来了极大的困难。一个指针套一个指针,一个跳转接一个跳转,很难搞清楚代码的执行顺序到底如何。这两组恶意代码之间的悬殊差异,似乎可以表明它们由不同团队使用共同工具创作而成。

很明显,攻击者在针对417型PLC的代码中,倾注了相当多的思考和努力。因此,当法里尔发现这段代码有问题时,觉得很诧异。而且,这似乎是攻击者有意为之。在用于检测“417型PLC配置是否匹配震网目标”的代码段中,攻击者插入了一段“异常”代码——故意放置一个意外错误而使程序无法正常执行。而且,代码中根本没有攻击曾被激活的迹象。震网需要产生一段关键的中间代码来激活攻击,但用来生成这段中间代码的程序并不完整。

对于417攻击代码是否有效,暂且不能得出结论。因为它是一段处于执行过程中的代码,或是在已经完成任务之后、由于其他原因被废弃了。法里尔想起了以前的一个新闻,其中有位伊朗官员说,共在伊朗发现了震网的5个不同版本。而目前为止,赛门铁克和其他机构的研究者,却只看到过3个版本。那么,会不会有这种可能,对417型PLC实施完整攻击的代码,藏在震网的其他版本中?

从他们在已有3个版本中发现的线索来看,确实有可能存在其他的未知版本。比如,从版本号上看,这3个版本分别为2009年6月出现的1.001版、2010年3月出现的1.100版和2010年4月出现的1.101版。版本号之间存在空缺,说明至少还有一个版本号为1.00的更早版本。当然,也许这个版本根本就没有上线。

不论417攻击代码的目标是什么,它的攻击方式肯定有别于315。与后者不同,针对417型PLC的弹头,其目标系统由984个设备(6组、每组164个)构成。在攻击期间,每组164个设备中,只有110个会遭到破坏。不幸的是,417代码中并没有什么像315攻击代码中的变频器ID码那样,可以帮助他们识别出设备型号的“神秘数值”。与此同时,德国方面的朗纳团队也在研究417攻击代码,他们猜测,这段代码的目标并非某个单独的离心机,而是整个级联机组,可能是控制级联机组气流出入的管道和阀门。但是,由于缺乏代码细节层面的有力证据,两个团队都没能得出417代码目标问题的结论。经过几个月的工作并取得诸多成果后,他们不得不暂时在这里停下脚步。看来,震网似乎还想让这个连环猜谜游戏继续下去。

由于无法充分理解417攻击代码,赛门铁克团队决定,先把自己已经取得的进展发布出来。这个进展,就是对315攻击代码的完整破解。

2010年11月12日,在VirusBlockAda公司首次宣布发现震网整整4个月后,赛门铁克发布了一条博客,称震网的攻击对象是某个特定型号的变频器,通过攻击,实现了对其配置的操控。“震网的目标仅限于特定型号、运行特征显著的变频器,从这一点来看,我们推测,其目标范围非常有限。”钱哥写的既隐晦又谨慎,完全是赛门铁克的风格。虽然他没有明确提到伊朗核设施,也没提离心机,但是明眼人却能一望即知。(待续)

译者:李云凡

关键词:

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章