转:伊朗导弹测试突发爆炸致重大伤亡 疑为Stuxnet病毒感 ...

来源:百度文库 编辑:超级军网 时间:2024/05/03 19:19:31


转自:w w w.evolife.cn/html/2011/62612.html

伊朗导弹测试突发爆炸致重大伤亡 疑为Stuxnet病毒感染

据国外媒体报道,上周末伊朗一家军火库发生爆炸,伊朗伊斯兰革命卫队重要指挥官哈桑·德黑兰尼·穆加达姆等多人丧生。穆加达姆的一个兄弟19日说,这名导弹专家当时正测试一枚新式洲际弹道导弹。

以色列媒体推断,导弹爆炸可能起因电脑控制系统遭Stuxnet蠕虫病毒感染。



洲际弹道导弹用来对付美以

伊朗官方媒体《伊朗报》当天刊登对穆加达姆兄弟穆罕默德·德黑兰尼的采访。这名伊朗伊斯兰革命卫队军官说,导弹在测试过程中爆炸,穆加达姆等人当场身亡。

“他当时正在做导弹的最后测试,”穆罕默德·德黑兰尼说,“项目与一枚洲际弹道导弹有关……整个项目全部采用高技术、完全保密。”

伊朗伊斯兰革命卫队最初通报,爆炸系“事故”,在军事人员转移军需品时发生。



爆炸军火库位于厄尔布尔士省,首都德黑兰西南方向40公里处,本月12日连续发生两起爆炸,德黑兰部分城区可以听到爆炸声并能感到爆炸引发的震动。

伊朗伊斯兰革命卫队声明,爆炸导致17名革命卫队成员当场身亡,4人伤重不治。一些外国媒体说,爆炸致死36人,包括多名“顶尖”导弹专家。

伊朗武装力量总参谋长哈桑·费鲁兹—阿巴迪16日说,爆炸导致军火库所处军事基地一个重要军工项目停产两周,这个项目生产的“实验性产品”可以用于对付美国和以色列。他没有介绍项目具体情况。



爆炸致死多名“顶尖”导弹专家

穆罕默德·德黑兰尼告诉《伊朗报》记者,穆加达姆颇受伊朗最高领袖大阿亚图拉赛义德·阿里·哈梅内伊赏识。

哈梅内伊14日出席伊朗政府在德黑兰为爆炸遇难人员举行的高规格葬礼。穆罕默德·德黑兰尼本人曾是哈梅内伊的保镖。

穆加达姆在伊朗伊斯兰革命卫队中分管号召力非常强的“推动独立圣战组织”。伊朗反政府组织称他是伊朗导弹部队级别最高和资历最深的指挥官。




穆加达姆上世纪80年代参加伊朗与伊拉克战争,成为炮兵专家,随后创建伊朗伊斯兰革命卫队地对地导弹部队。

革命卫队在爆炸发生后发表的声明中说,不会忘记穆加达姆“在国防事业中令人印象深刻的作用”以及“他在发起并组建卫队炮兵和导弹部队方面的成就”。

穆罕默德·德黑兰尼说,穆加达姆曾访问黎巴嫩,帮助真主党武装建立导弹部队。穆加达姆还参与伊朗航天工程,协助运载火箭把一颗伊朗造卫星送入轨道。



电脑系统遭蠕虫病毒“控制”?

伊朗军方排除爆炸系“敌特破坏”可能性,否认美国或以色列参与制造爆炸。但以色列“杰布卡档案”网站说,爆炸原因可能是电脑控制系统遭Stuxnet蠕虫病毒“控制”。

这家安全与情报新闻网站18日援引以色列军方和伊朗消息人士的话报道,爆炸导弹为“泥石—2”型,当天测试对象为一种新式弹头。

穆加达姆召集伊朗顶尖导弹专家现场观摩并征求意见,他本人操纵电脑模拟程序,通过大屏幕向专家展示。导弹收到电脑一道指令后突然爆炸。

报道推断,两次爆炸先后为弹头爆炸和导弹发动机固体燃料爆炸,第一次爆炸威力最大。由于方圆500米内所有设备和建筑都被炸成碎片,现场导弹专家无人生还,调查人员找不到目击者,也难以发现任何物证。



这家网站说,伊朗情报人员初步判断,爆炸有两种可能:一是西方情报部门或以色列情报机构摩萨德在导弹项目参与人员中植入内线,后者操纵电脑发出爆炸指令;二是导弹电脑控制系统遭Stuxnet感染,自动下令弹头爆炸,操作人员无法及时察觉。

相比之下,第二种情况可能性更大。如果确为蠕虫病毒感染,伊朗“泥石—2”型导弹和“流星—3”型中程弹道导弹电脑控制系统可能全部遭到攻击。查杀这种病毒可能需要几个月、而不是伊朗总参谋长费鲁兹—阿巴迪所说的两周。

伊朗大约3万个互联网终端以及布什尔核电站员工个人电脑去年遭Stuxnet蠕虫病毒感染。伊朗指认美国和以色列发动网络攻击。

转自:w w w.evolife.cn/html/2011/62612.html

伊朗导弹测试突发爆炸致重大伤亡 疑为Stuxnet病毒感染

据国外媒体报道,上周末伊朗一家军火库发生爆炸,伊朗伊斯兰革命卫队重要指挥官哈桑·德黑兰尼·穆加达姆等多人丧生。穆加达姆的一个兄弟19日说,这名导弹专家当时正测试一枚新式洲际弹道导弹。

以色列媒体推断,导弹爆炸可能起因电脑控制系统遭Stuxnet蠕虫病毒感染。



洲际弹道导弹用来对付美以

伊朗官方媒体《伊朗报》当天刊登对穆加达姆兄弟穆罕默德·德黑兰尼的采访。这名伊朗伊斯兰革命卫队军官说,导弹在测试过程中爆炸,穆加达姆等人当场身亡。

“他当时正在做导弹的最后测试,”穆罕默德·德黑兰尼说,“项目与一枚洲际弹道导弹有关……整个项目全部采用高技术、完全保密。”

伊朗伊斯兰革命卫队最初通报,爆炸系“事故”,在军事人员转移军需品时发生。



爆炸军火库位于厄尔布尔士省,首都德黑兰西南方向40公里处,本月12日连续发生两起爆炸,德黑兰部分城区可以听到爆炸声并能感到爆炸引发的震动。

伊朗伊斯兰革命卫队声明,爆炸导致17名革命卫队成员当场身亡,4人伤重不治。一些外国媒体说,爆炸致死36人,包括多名“顶尖”导弹专家。

伊朗武装力量总参谋长哈桑·费鲁兹—阿巴迪16日说,爆炸导致军火库所处军事基地一个重要军工项目停产两周,这个项目生产的“实验性产品”可以用于对付美国和以色列。他没有介绍项目具体情况。



爆炸致死多名“顶尖”导弹专家

穆罕默德·德黑兰尼告诉《伊朗报》记者,穆加达姆颇受伊朗最高领袖大阿亚图拉赛义德·阿里·哈梅内伊赏识。

哈梅内伊14日出席伊朗政府在德黑兰为爆炸遇难人员举行的高规格葬礼。穆罕默德·德黑兰尼本人曾是哈梅内伊的保镖。

穆加达姆在伊朗伊斯兰革命卫队中分管号召力非常强的“推动独立圣战组织”。伊朗反政府组织称他是伊朗导弹部队级别最高和资历最深的指挥官。




穆加达姆上世纪80年代参加伊朗与伊拉克战争,成为炮兵专家,随后创建伊朗伊斯兰革命卫队地对地导弹部队。

革命卫队在爆炸发生后发表的声明中说,不会忘记穆加达姆“在国防事业中令人印象深刻的作用”以及“他在发起并组建卫队炮兵和导弹部队方面的成就”。

穆罕默德·德黑兰尼说,穆加达姆曾访问黎巴嫩,帮助真主党武装建立导弹部队。穆加达姆还参与伊朗航天工程,协助运载火箭把一颗伊朗造卫星送入轨道。



电脑系统遭蠕虫病毒“控制”?

伊朗军方排除爆炸系“敌特破坏”可能性,否认美国或以色列参与制造爆炸。但以色列“杰布卡档案”网站说,爆炸原因可能是电脑控制系统遭Stuxnet蠕虫病毒“控制”。

这家安全与情报新闻网站18日援引以色列军方和伊朗消息人士的话报道,爆炸导弹为“泥石—2”型,当天测试对象为一种新式弹头。

穆加达姆召集伊朗顶尖导弹专家现场观摩并征求意见,他本人操纵电脑模拟程序,通过大屏幕向专家展示。导弹收到电脑一道指令后突然爆炸。

报道推断,两次爆炸先后为弹头爆炸和导弹发动机固体燃料爆炸,第一次爆炸威力最大。由于方圆500米内所有设备和建筑都被炸成碎片,现场导弹专家无人生还,调查人员找不到目击者,也难以发现任何物证。



这家网站说,伊朗情报人员初步判断,爆炸有两种可能:一是西方情报部门或以色列情报机构摩萨德在导弹项目参与人员中植入内线,后者操纵电脑发出爆炸指令;二是导弹电脑控制系统遭Stuxnet感染,自动下令弹头爆炸,操作人员无法及时察觉。

相比之下,第二种情况可能性更大。如果确为蠕虫病毒感染,伊朗“泥石—2”型导弹和“流星—3”型中程弹道导弹电脑控制系统可能全部遭到攻击。查杀这种病毒可能需要几个月、而不是伊朗总参谋长费鲁兹—阿巴迪所说的两周。

伊朗大约3万个互联网终端以及布什尔核电站员工个人电脑去年遭Stuxnet蠕虫病毒感染。伊朗指认美国和以色列发动网络攻击。
再转点有关Stuxnet的资料贴,其实原来在回帖里也贴过,但放一起方便大家多了解这个东西,是今年1月19号的文章。





来源:w w w.ifanr.com/31407







以色列从来没有公开承认的核武器研究机构处于 Negev 沙漠中的 Dimona 群楼里。在过去的两年中,这里被赋予了新的使命 – 为了打击伊朗的核武器发展,美国和以色列的联合团队在这里进行着秘密的测试。

在 Dimona 的铁丝网后面,以色列安装了和伊朗在 Natanz(核武器研发中心)运行的一模一样的离心器。伊朗正是靠这种离心器来浓缩铀。专家们说,正是在 Dimona 这里,美以联军测试了 Stuxnet 病毒的效果,这个专门为了摧毁伊朗离心器的电脑病毒。结果是,Stuxnet 成功的摧毁了伊朗五分之一的离心器,从而让伊朗拥有核武器的时间延迟了好几年。

正准备退休的以色列特种部队摩萨德首长 Meir Dagan 和美国国务卿希拉里最近分别宣布伊朗的核武器项目已经倒退了好几年。希拉里说由于美国领导的经济制裁,伊朗买不到很多急需的核武器部件。

Dagan 则说,伊朗碰到了一些技术上的问题,他们可能直到 2015 年才能制造出核武器。这个和以色列一直以来信奉的“伊朗很快就将拥有核武器”有着很大的反差。

但使伊朗核武器发展倒退数年的最大原因看起来是 Stuxnet,这个迄今为止最复杂的网络武器。在过去 3 个月接受访谈的美国和欧洲的安全专家剖析了 Stuxnet 病毒,他们认为这个是个比他们想象中更复杂,也更狡诈的病毒。

在 2008 年早期,德国西门子公司和美国的爱达荷州的国家实验室达成合作协议,同意让该实验室检查西门子公司用来控制操作工业机械的电脑控制程序。伊朗浓缩铀的机器中也恰好使用了西门子的控制程序。不出意料,隶属于美国能源部门的该实验室发现了西门子控制程序的漏洞。

Stuxnet 有两个重要的组成部分。一个是让离心器疯狂旋转,直到失去控制。另一个部分是秘密的录制机器正常运作下的状态,然后再回播给控制人员,以达到蒙蔽的作用。(这个和电影里把监控摄像头蒙蔽的手段是一模一样。)所以,伊朗的技术人员看着机器运作的正常数据的同时,离心器已经开始失去控制了。





这波攻击并非是完全的成功:有部分的机器全部被破坏停产了,还有一部分似乎幸存了下来。不过我们现在也不知道 Stuxnet 的攻击是不是已经结束了,因为有些专家相信病毒里还存在为未来攻击做准备的种子。

美国和以色列的官员对 Stuxnet 三缄其口。但每次被问及此事的时候,以色列的官员就露出开心的笑容。奥巴马的大规模杀伤武器主智囊 Gary Samore 日前在一个关于伊朗的会议上并没有正面回复 Stuxnet,但他微笑着说:“我很高兴得知伊朗遇到了一些离心器的问题,美国和其盟友会尽一切能力来使这事更加麻烦点”。

两年前,以色列还是坚信只有用武力才能摧毁伊朗的核武器设施。但现在,Stuxnet 不费一枪一弹就实现了拖延时间的目地。

在 2008 年初期,美国国安局和爱达荷实验室一起研究了西门子的流程控制系统 7,也就是 P.C.S.-7。这个系统里广泛的被用在各种机械流程控制的程序,叫做 Step 7。而这个系统的漏洞,在当年 7 月份就已经通过 PowerPoint 的格式流传开了。

09 年 6 月,Stuxnet 病毒开始流传。但奇怪的是,这个病毒并不像其他病毒那样邪恶。德国汉堡的安全专家 Langner 发现,Stuxnet 只在一群有着特殊配置的西门子控制器的情况下才会启动。而这种配置,往往只出现在离心器上。比如,有段程序只会在 984 个机器连在一起的时候才会运行。

巧合的是,国际核武器监督组织在 2009 年底 在Natanz 的调查中发现,伊朗取出了 984 台工作不正常的机器。

Langner 说:这明显不是黑客设计的。这是一批深知伊朗核武器运行情况的人有组织有目的的设计了这一病毒。以色列为了测试 Stuxnet 的功效,特地搞到了和伊朗一模一样的 P-1 离心器。很明显,效果显著。

不过在伊朗核反应堆工作的俄罗斯科学家们对此忧心忡忡,他们担心伊朗会重蹈类似前苏联切诺贝利的核泄漏灾难。


更详细点的来自赛门铁克的资料:


详细解读Stuxnet的感染流程

来源:w w w.symantec.com/connect/blogs/stuxnet-1

  两个月前,赛门铁克首次披露了W32.Stuxnet针对工业生产控制系统(ICS) 进行攻击,如应用于管道和核动力工厂的控制系统。读者可参见赛门铁克2010年7月19日的博客– “W32.Stuxnet 攻击微软零日漏洞利用USB设备大肆传播”。

        2010年9月29日,我们还将在Virus Bulletin 会议上发布一篇包含W32.Stuxnet详尽技术细节的论文。同时我们也注意到,最近非常多的人开始对Stuxnet感染系统且不易检测的事情表示关注。

        由于Stuxnet针对某个特定的工业生产控制系统进行攻击,而这些行为不会在测试环境中出现,因此在测试环境下观察到的病毒行为不全面,很可能产生误导。事实上,运行后,Stuxnet会立即尝试进入一个可编程逻辑控制器(PLC) 的数据块—DB890。这个数据块其实是Stuxnet自己加的,并不属于目标系统本身。Stuxnet 会监测并向这个模块里写入数据,以根据情况和需求实时改变PLC的流程。

        在这篇博客里,我们会深入探讨Stuxnet的PLC感染方式和Rootkit功能,特别是以下几个方面:

它如何选择作为攻击目标的工业生产控制系统;
感染PLC代码块的方法;
注入PLC的恶意代码;
在被感染Windows机器中的PLC Rootkit代码。
        这四点我们会分开讲,因为用来实现这些目的的代码差异很大。

        Stuxnet的目的是通过修改PLC来改变工业生产控制系统的行为,包括拦截发送给PLC的读/写请求,以此判断系统是否为潜在的攻击目标;修改现有的PLC代码块,并往PLC中写入新的代码块;利用Rootkit功能隐藏PLC感染,躲避PLC管理员或程序员的检测。这些任务之间差别很大,比如,在被感染的Windows 机器中隐藏感染代码使用的是标准的C/C++ 代码,而Stuxnet 试图在工业生产控制系统及PLC中执行的恶意代码则是用MC7字节码写的。MC7 是PLC 环境中运行的一种汇编语言,并常用STL 进行编写。

        在讨论Stuxnet攻击PLC的技术之前,让我们先来看看PLC是如何访问和编写的。






要进入PLC, 首先需要安装特殊的软件;Stuxnet 会专门针对编写PLC某些模块的WinCC/Step 7软件进行攻击。安装这些软件后,程序员可以通过数据线连接PLC,以访问其中的内容,重新配置PLC,下载程序至PLC,或调试之前加载的代码。一旦PLC被配置和编译后,Windows机器就可以断开和PLC的联系了,PLC会自行运行。为了使您有一个更直观的感受,下图显示了在实际操作中,实验室里一些基本的设备配置:




下面的截图显示了Step7 STL编译器中Stuxnet恶意代码的一部分。其中,编写Stuxnet功能代码块的MC7代码的开始部分是可视的;下面显示的代码来自于反汇编后的FC1873模块。





Step 7 软件使用库文件s7otbxdx.dll 来和PLC通信。当Step7 程序准备进入PLC时,它会调用该DLL文件中不同的例程。例如,如果一个代码块需要用Step 7从PLC中读出,那么,例程s7blk_read就会被调用到。s7otbxdx.dll中的代码会进入PLC, 读出其中的代码,并把它传回Step 7程序,如下图所示:



  现在让我们看看当Stuxnet是如何进入PLC的。运行后,Stuxnet会将原始的s7otbxdx.dll文件重命名为s7otbxsx.dll。然后,它将用自身取代原始的DLL文件。现在,Stuxnet就可以拦截任何来自其他软件的访问PLC的命令。





被Stuxnet修改后的s7otbxdx.dll 文件保留了原来的导出表,导出函数为109个,这就令Stuxnet可以应付所有相同的请求。大部分导出命令会转发给真正的DLL,即重命名后的s7otbxsx.dll,并不会出现什么难对付的状况;事实上,109种导出形式中的93种都会照这样处理。然而,真正的“诡计”使用在剩下的16种导出命令中。这16种导出不会被简单的转发,而是被改动后的DLL 拦截了。被拦截的导出命令为在PLC中读、写、定位代码块的例程。通过拦截这些请求,Stuxnet 可以在PLC 管理员没有察觉的情况下,修改发送至PLC 或从PLC返回的数据。同时,通过利用这些例程,Stuxnet 可以将恶意代码隐藏在PLC 中。

        为了更好的了解Stuxnet 如何进入和感染PLC,我们先来看看各种类型的数据。PLC 会处理由管理员加载到PLC的代码和数据。这里,我们将简要介绍一下最常见的模块和他们的功能:

数据模块(DB)包含了程序相关的数据,比如数字,结构等。
系统数据模块(SDB) 包含了PLC 的配置信息; 它们是根据连接到PLC 的硬件模块的数量/种类设立的。
组织模块(OB) 是程序的入口。他们由CPU 循环执行。针对Stuxnet, 有两个特别需要的OB:
OB1 是PLC 程序的入口。它没有特别的时间要求,总是循环执行。
OB35 是一个标准的“看门狗”模块,系统会每100ms执行一次。这个功能可能包含了所有用于监控紧要输入的逻辑,以达到立即响应,执行功能的目的。
功能模块(FC)都是标准的代码快。它们包含了会被PLC 执行的代码。一般说来,OB1模块会引用至少一个FC 模块。
下面的部分会详细讲述之前提到的威胁的四大方面。

1. 如何选择需要感染的PLC。

        Stuxnet会根据目标系统的特点,使用不同的代码来感染PLC。

        一个感染的序列包括了许多PLC 模块(代码模块和数据模块),用以注入PLC来改变目标PLC 的行为。这个威胁包括了三个感染序列。其中两个非常相似,功能也相同,我们将其命名为序列A和B。第三个序列我们命名为序列C。Stuxnet通过验证“指纹”来判断系统是否为计划攻击的目标。它会检查:

PLC种类/家族:只有CPU 6ES7-417 和6ES7-315-2 会被感染。
系统数据模块:SDB 会被解析;根据他们包含的数据,感染进程会选择A,B或其它感染方式开始行动。当解析SDB 时,代码会搜索这两个值是否存在-- 7050h and 9500h;然后根据这两个数值的出现次数,选择序列A 或B 中的一种来感染PLC。
        代码还会在SDB 模块的50h 子集中搜索字节序2C CB 00 01, 这个字节序反映了通信处理器CP 342-5 (用作Profibus-DP) 是否存在。

        而选择序列C进行感染的条件则由其他因素构成。

2. 感染方法

        Stuxnet使用“代码插入”的感染方式。当Stuxnet 感染OB1时,它会执行以下行为:

增加原始模块的大小;
在模块开头写入恶意代码;
在恶意代码后插入原始的OB1 代码。




Stuxnet也会用类似于感染OB1的方式感染OB35。它会用自身来取代标准的协同处理器DP_RECV 代码块,然后在Profibus (一个标准的用作分布式I/O的工业网络总线) 中挂钩网络通信。

        利用A/B方法的感染步骤如下:

检查PLC 类型;该类型必须为S7/315-2;
检查SDB 模块,判断应该写入序列A 或B 中的哪一个;
找到DP_RECV,将其复制到FC1869,并用Stuxnet嵌入的一个恶意拷贝将其取代;
在序列中写入恶意模块(总共20个),由Stuxnet 嵌入;
感染OB1,令恶意代码可以在新的周期开始时执行;
感染OB35, 它将扮演“看门狗”的角色。
3. 感染代码

        被注入OB1 功能的代码是用来感染序列A 和B的。这些序列包含了以下模块:

代码块:FC1865 至FC1874, FC1876 至FC1880 (注意:FC1869并非Stuxnet的一部分,而是PLC的DP_RECV模块的一个拷贝);
数据模块:DB888 至DB891。
        序列A 和B 用DP_RECV 挂钩模块来拦截Profibus 中的数据包,并根据在这些模块中找到的数值,来构造其他的数据包并发送出去。这由一个复杂的状态机控制(状态机被建立在上面提到的FC 模块中)。这个状态机可部分受控于数据块DB890 中的DLL。

        在某些条件下,序列C会被写入一个PLC。这个序列比A和B包含更多的模块:

FC6055 至FC6084;
DB8062, DB8063;
DB8061, DB8064 至DB8070 (在运行中产生)。
        序列C主要为了将I/O信息读写入PLC的内存文件映射的I/O 区域,以及外围设备的I/O。

        程序A/B 的控制流如下图所示,在之前的Step7 编辑器的截图中也有部分显示(数据模块FC1873):




而序列C 的程序流则更加复杂,可以从下面的图表中看到:




4. Rootkit

        Stuxnet PLC rootkit代码全部藏身于假冒的s7otbxdx.dll中。为了不被PLC所检测到,它至少需要应付以下情况:

对自己的恶意数据模块的读请求;
对受感染模块(OB1 , OB35, DP_RECV) 的读请求;
可能覆盖Stuxnet自身代码的写请求。
        Stuxnet包含了监测和拦截这些请求的代码,它会修改这些请求以保证Stuxnet 的PLC 代码不会被发现或被破坏。下面列出了几个Stuxnet用被挂钩的导出命令来应付这些情况的例子:

s7blk_read: 监测读请求,而后Stuxnet 会返回:
真实请求的DP_RECV (保存为FV1869);
错误信息,如果读请求会涉及到它的恶意模块;
OB1或OB35的干净版本的拷贝
s7blk_write: 监测关于OB1/OB35的写请求,以保证他们的新版本也会被感染。
s7blk_findfirst / s7blk_findnext: 这些例程被用于枚举PLC中的模块。恶意模块会被自动跳过。
s7blk_delete: 监测对模块的“删除”操作。
        如上文所述,Stuxnet 是一个非常复杂的威胁,而其中的PLC 感染代码令问题更加难以解决。仅仅关于注入的MC7代码(我们于几个月前通过逆向工程获得)就可以讨论很久。若想了解更多关于PLC 感染例程和Stuxnet的总体情况,请务必关注我们即将于Virus Bulletin会议中发布的白皮书。


更详细点的来自赛门铁克的资料:


详细解读Stuxnet的感染流程

来源:w w w.symantec.com/connect/blogs/stuxnet-1

  两个月前,赛门铁克首次披露了W32.Stuxnet针对工业生产控制系统(ICS) 进行攻击,如应用于管道和核动力工厂的控制系统。读者可参见赛门铁克2010年7月19日的博客– “W32.Stuxnet 攻击微软零日漏洞利用USB设备大肆传播”。

        2010年9月29日,我们还将在Virus Bulletin 会议上发布一篇包含W32.Stuxnet详尽技术细节的论文。同时我们也注意到,最近非常多的人开始对Stuxnet感染系统且不易检测的事情表示关注。

        由于Stuxnet针对某个特定的工业生产控制系统进行攻击,而这些行为不会在测试环境中出现,因此在测试环境下观察到的病毒行为不全面,很可能产生误导。事实上,运行后,Stuxnet会立即尝试进入一个可编程逻辑控制器(PLC) 的数据块—DB890。这个数据块其实是Stuxnet自己加的,并不属于目标系统本身。Stuxnet 会监测并向这个模块里写入数据,以根据情况和需求实时改变PLC的流程。

        在这篇博客里,我们会深入探讨Stuxnet的PLC感染方式和Rootkit功能,特别是以下几个方面:

它如何选择作为攻击目标的工业生产控制系统;
感染PLC代码块的方法;
注入PLC的恶意代码;
在被感染Windows机器中的PLC Rootkit代码。
        这四点我们会分开讲,因为用来实现这些目的的代码差异很大。

        Stuxnet的目的是通过修改PLC来改变工业生产控制系统的行为,包括拦截发送给PLC的读/写请求,以此判断系统是否为潜在的攻击目标;修改现有的PLC代码块,并往PLC中写入新的代码块;利用Rootkit功能隐藏PLC感染,躲避PLC管理员或程序员的检测。这些任务之间差别很大,比如,在被感染的Windows 机器中隐藏感染代码使用的是标准的C/C++ 代码,而Stuxnet 试图在工业生产控制系统及PLC中执行的恶意代码则是用MC7字节码写的。MC7 是PLC 环境中运行的一种汇编语言,并常用STL 进行编写。

        在讨论Stuxnet攻击PLC的技术之前,让我们先来看看PLC是如何访问和编写的。






要进入PLC, 首先需要安装特殊的软件;Stuxnet 会专门针对编写PLC某些模块的WinCC/Step 7软件进行攻击。安装这些软件后,程序员可以通过数据线连接PLC,以访问其中的内容,重新配置PLC,下载程序至PLC,或调试之前加载的代码。一旦PLC被配置和编译后,Windows机器就可以断开和PLC的联系了,PLC会自行运行。为了使您有一个更直观的感受,下图显示了在实际操作中,实验室里一些基本的设备配置:




下面的截图显示了Step7 STL编译器中Stuxnet恶意代码的一部分。其中,编写Stuxnet功能代码块的MC7代码的开始部分是可视的;下面显示的代码来自于反汇编后的FC1873模块。





Step 7 软件使用库文件s7otbxdx.dll 来和PLC通信。当Step7 程序准备进入PLC时,它会调用该DLL文件中不同的例程。例如,如果一个代码块需要用Step 7从PLC中读出,那么,例程s7blk_read就会被调用到。s7otbxdx.dll中的代码会进入PLC, 读出其中的代码,并把它传回Step 7程序,如下图所示:



  现在让我们看看当Stuxnet是如何进入PLC的。运行后,Stuxnet会将原始的s7otbxdx.dll文件重命名为s7otbxsx.dll。然后,它将用自身取代原始的DLL文件。现在,Stuxnet就可以拦截任何来自其他软件的访问PLC的命令。





被Stuxnet修改后的s7otbxdx.dll 文件保留了原来的导出表,导出函数为109个,这就令Stuxnet可以应付所有相同的请求。大部分导出命令会转发给真正的DLL,即重命名后的s7otbxsx.dll,并不会出现什么难对付的状况;事实上,109种导出形式中的93种都会照这样处理。然而,真正的“诡计”使用在剩下的16种导出命令中。这16种导出不会被简单的转发,而是被改动后的DLL 拦截了。被拦截的导出命令为在PLC中读、写、定位代码块的例程。通过拦截这些请求,Stuxnet 可以在PLC 管理员没有察觉的情况下,修改发送至PLC 或从PLC返回的数据。同时,通过利用这些例程,Stuxnet 可以将恶意代码隐藏在PLC 中。

        为了更好的了解Stuxnet 如何进入和感染PLC,我们先来看看各种类型的数据。PLC 会处理由管理员加载到PLC的代码和数据。这里,我们将简要介绍一下最常见的模块和他们的功能:

数据模块(DB)包含了程序相关的数据,比如数字,结构等。
系统数据模块(SDB) 包含了PLC 的配置信息; 它们是根据连接到PLC 的硬件模块的数量/种类设立的。
组织模块(OB) 是程序的入口。他们由CPU 循环执行。针对Stuxnet, 有两个特别需要的OB:
OB1 是PLC 程序的入口。它没有特别的时间要求,总是循环执行。
OB35 是一个标准的“看门狗”模块,系统会每100ms执行一次。这个功能可能包含了所有用于监控紧要输入的逻辑,以达到立即响应,执行功能的目的。
功能模块(FC)都是标准的代码快。它们包含了会被PLC 执行的代码。一般说来,OB1模块会引用至少一个FC 模块。
下面的部分会详细讲述之前提到的威胁的四大方面。

1. 如何选择需要感染的PLC。

        Stuxnet会根据目标系统的特点,使用不同的代码来感染PLC。

        一个感染的序列包括了许多PLC 模块(代码模块和数据模块),用以注入PLC来改变目标PLC 的行为。这个威胁包括了三个感染序列。其中两个非常相似,功能也相同,我们将其命名为序列A和B。第三个序列我们命名为序列C。Stuxnet通过验证“指纹”来判断系统是否为计划攻击的目标。它会检查:

PLC种类/家族:只有CPU 6ES7-417 和6ES7-315-2 会被感染。
系统数据模块:SDB 会被解析;根据他们包含的数据,感染进程会选择A,B或其它感染方式开始行动。当解析SDB 时,代码会搜索这两个值是否存在-- 7050h and 9500h;然后根据这两个数值的出现次数,选择序列A 或B 中的一种来感染PLC。
        代码还会在SDB 模块的50h 子集中搜索字节序2C CB 00 01, 这个字节序反映了通信处理器CP 342-5 (用作Profibus-DP) 是否存在。

        而选择序列C进行感染的条件则由其他因素构成。

2. 感染方法

        Stuxnet使用“代码插入”的感染方式。当Stuxnet 感染OB1时,它会执行以下行为:

增加原始模块的大小;
在模块开头写入恶意代码;
在恶意代码后插入原始的OB1 代码。




Stuxnet也会用类似于感染OB1的方式感染OB35。它会用自身来取代标准的协同处理器DP_RECV 代码块,然后在Profibus (一个标准的用作分布式I/O的工业网络总线) 中挂钩网络通信。

        利用A/B方法的感染步骤如下:

检查PLC 类型;该类型必须为S7/315-2;
检查SDB 模块,判断应该写入序列A 或B 中的哪一个;
找到DP_RECV,将其复制到FC1869,并用Stuxnet嵌入的一个恶意拷贝将其取代;
在序列中写入恶意模块(总共20个),由Stuxnet 嵌入;
感染OB1,令恶意代码可以在新的周期开始时执行;
感染OB35, 它将扮演“看门狗”的角色。
3. 感染代码

        被注入OB1 功能的代码是用来感染序列A 和B的。这些序列包含了以下模块:

代码块:FC1865 至FC1874, FC1876 至FC1880 (注意:FC1869并非Stuxnet的一部分,而是PLC的DP_RECV模块的一个拷贝);
数据模块:DB888 至DB891。
        序列A 和B 用DP_RECV 挂钩模块来拦截Profibus 中的数据包,并根据在这些模块中找到的数值,来构造其他的数据包并发送出去。这由一个复杂的状态机控制(状态机被建立在上面提到的FC 模块中)。这个状态机可部分受控于数据块DB890 中的DLL。

        在某些条件下,序列C会被写入一个PLC。这个序列比A和B包含更多的模块:

FC6055 至FC6084;
DB8062, DB8063;
DB8061, DB8064 至DB8070 (在运行中产生)。
        序列C主要为了将I/O信息读写入PLC的内存文件映射的I/O 区域,以及外围设备的I/O。

        程序A/B 的控制流如下图所示,在之前的Step7 编辑器的截图中也有部分显示(数据模块FC1873):




而序列C 的程序流则更加复杂,可以从下面的图表中看到:




4. Rootkit

        Stuxnet PLC rootkit代码全部藏身于假冒的s7otbxdx.dll中。为了不被PLC所检测到,它至少需要应付以下情况:

对自己的恶意数据模块的读请求;
对受感染模块(OB1 , OB35, DP_RECV) 的读请求;
可能覆盖Stuxnet自身代码的写请求。
        Stuxnet包含了监测和拦截这些请求的代码,它会修改这些请求以保证Stuxnet 的PLC 代码不会被发现或被破坏。下面列出了几个Stuxnet用被挂钩的导出命令来应付这些情况的例子:

s7blk_read: 监测读请求,而后Stuxnet 会返回:
真实请求的DP_RECV (保存为FV1869);
错误信息,如果读请求会涉及到它的恶意模块;
OB1或OB35的干净版本的拷贝
s7blk_write: 监测关于OB1/OB35的写请求,以保证他们的新版本也会被感染。
s7blk_findfirst / s7blk_findnext: 这些例程被用于枚举PLC中的模块。恶意模块会被自动跳过。
s7blk_delete: 监测对模块的“删除”操作。
        如上文所述,Stuxnet 是一个非常复杂的威胁,而其中的PLC 感染代码令问题更加难以解决。仅仅关于注入的MC7代码(我们于几个月前通过逆向工程获得)就可以讨论很久。若想了解更多关于PLC 感染例程和Stuxnet的总体情况,请务必关注我们即将于Virus Bulletin会议中发布的白皮书。
这玩意传播方式才是巨大的突破,伊朗的内网跟外网是物理隔离的。
achtung 发表于 2011-11-22 08:33
这玩意传播方式才是巨大的突破,伊朗的内网跟外网是物理隔离的。
有啥新奇的,肯定是内鬼无疑,难道还能顺着电力线进去。
achtung 发表于 2011-11-22 08:33
这玩意传播方式才是巨大的突破,伊朗的内网跟外网是物理隔离的。
不可能完全隔离。总要有数据交互,即便是通过某种存储介质。
jiandingzhe 发表于 2011-11-22 22:25
不可能完全隔离。总要有数据交互,即便是通过某种存储介质。
爆炸的单位应该有专用网吧?{:yi:}
ccsosnfs 发表于 2011-11-22 22:47
爆炸的单位应该有专用网吧?
即使专用网,也要装软件吧。所以不可能和外界完全地数据隔离的。这样,总会有漏进去的机会。
而且对于嵌入式设备,可能没那么警惕。
看资料是通过转数据的刻录光盘感染进去的,这在以前是不可想象的。
买通几个内鬼,把病毒感染到数据交互的介质上,然后就balabalabala,绝对不可能靠先在网络上传播,指望病毒扩散到伊朗核设施的电脑上,这么做太容易暴露意图
挺专业的帖子
看主楼的介绍,这个病毒应当是两部分:
1:感染用于向工控系统烧录程序的软件。
2:被感染的软件会在向工控设备烧录程序的时候,额外加上一段,这段的作用是扰乱工控设备的运行。
df6621505 发表于 2011-11-23 10:04
买通几个内鬼,把病毒感染到数据交互的介质上,然后就balabalabala,绝对不可能靠先在网络上传播,指望病毒 ...
本来就是通过国际互联网散布的,这个病毒之所以被怀疑是对付伊朗,也是因为分析染毒计算机数量发现的,互联网上染毒计算机多数分布在伊朗境内。
阿依大意了,被打了闷棍。
肯定是内鬼注入的。
我就是搞西门子数控设备维护的,所以这篇文章大致的技术细节能看的懂。我说两句哦,现在中国的高精尖控制系统,有一大部分是采用德国西门子PLC系统作为控制核心。所谓PLC就是取代了继电器,使得逻辑控制能够使用较为交易的方式而不是用复杂的硬件接线来实现。Stuxnet是攻击采用WINCC人机界面的核电站PLC系统,有一定的专用性,当然也可以攻击同样采用PLC的其他系统,比如物料分配系统,流水线,工业加工,炼钢等工业系统。可以说西门子PLC是整个国家采用最多的一种逻辑控制器,市场上占有了很大的份额,这样一攻击可以导致国家工业在短期内崩坏,如果要重新恢复的话,是需要程序调试员很大的功夫,并且造成其他一些昂贵的电气和机械的损坏,这些配件有些国内买不到还需要到德国去采购,短期内甚至长期以内都不能恢复生产。我是完全看到了这种攻击的潜在危害性,但如果这种病毒在工厂设备中横行那其实就是某个国家对中国宣战了。

编写这个病毒得人,弄不好就是跟我一起混西门子论坛的那些老外,他们中高手是不少的,水平高的就是那几个人。伊朗的情报系统可以从哪里查查看一些情报,我认为完全可以通过业界对专家水平的风评来查到是谁编写了这个病毒,毕竟能熟悉PLC系统的专家比起一般的编程者那是少了很多。

xzh_021 发表于 2011-11-29 18:00
我就是搞西门子数控设备维护的,所以这篇文章大致的技术细节能看的懂。我说两句哦,现在中国的高精尖控制系 ...


终于有个比较专业的回复了,我相关的知识不多,请问依据这边文章看Stuxnet是否能较轻易运用的其他目标中?看似Stuxnet是专门为对付伊朗的离心机制造的。
xzh_021 发表于 2011-11-29 18:00
我就是搞西门子数控设备维护的,所以这篇文章大致的技术细节能看的懂。我说两句哦,现在中国的高精尖控制系 ...


终于有个比较专业的回复了,我相关的知识不多,请问依据这边文章看Stuxnet是否能较轻易运用的其他目标中?看似Stuxnet是专门为对付伊朗的离心机制造的。
留个记号,待一个月后回来 进一步学习