安全社区

黑盾云安全社区,与你一起分享安全领域的知识与智慧

震网蠕虫中的一个Bug差点令其“出师未捷身先死

安全研究2015-04-30 10:50:10 4602次围观

由于内部代码中存在一个Bug,使其可以感染古老的Windows系统。超级蠕虫病毒震网(Stuxnet)差一点暴露,从而无法完成破坏。

业内众所周知,该病毒可以隐秘地破坏控制离心机的计算机系统。它由美国和以色列的神秘黑客所设计,被用于破坏位于伊朗那达兹郡的铀浓缩设施。该病毒导致伊朗的浓缩铀项目推迟了两年之久,但由于其自身的代码缺陷,震网差点未能发挥作用。

为了完成行动目标,Stuxnet必须保证自己无法被伊朗人检测到。不幸的是,一个编程错误可能会让它传播到较老版本的Windows上。由于病毒并不支持老版本的Windows,这可能会引发系统崩溃,大量的出现的系统蓝屏可能会引起那达兹核试验室工作人员们的注意。

and与or的故事

在上周结束的RSA安全大会上,BlueCoat的技术分析人员表示,当震网开始引发Windows 95和Windows 98系统崩溃时,它的任务可能还没开始就即将结束。

“震网编程团队里的某个人可能度过了糟糕的一天,并将代码中的and错误地写成了or。结果是,震网在执行安装策略时会进行or检查,这导致它会自动注入所有版本的Windows,甚至是Win 95和Win 98这些它并不支持的操作系统。”

“类似一种在某个项目上花费了很多年时间,但由于造成了远程系统崩溃,突然前功尽弃的意思。”

不过从实际情况来看,震网还是在2010年被发现之前成功地干扰了离心机。这可能是因为碰巧震网在那时没有碰到任何运行老版本Windows的机器,也有可能是伊朗科学家对Win 95和Win 98的蓝屏错误早就习以为常。

同病相怜的Conficker

安全研究人员还发现,震网并不是唯一一个存在Bug的著名恶意软件。Conficker蠕虫自身存在的Bug也削弱了其自身的潜在破坏力。

Conficker 蠕虫攻击网络上的Windows设备,从理论上讲,它几乎可以感染任何人。但由于负责生成随机地址的代码中存在一个Bug,它只能扫描到IPv4总地址数 量的四分之一:它的随机数生成函数会产生15位的整数,从0到0x7fff(0~RAND_MAX),它调用这个函数两次,本意是生成一个32位的 IPv4地址。不过,事实上它生成的只是30位整数,比32位的整数还差了两位。

“如果你连续攻击受害者,会很容易被检测到,因此黑客在这方面采取了聪明的办法,每次攻击一个随机地址。”

“有趣的事情在于,RAND_MAX变量只有15位,这意味着当Conficker通过调用两次该函数来生成IP地址时,得到的只是一个30位随机数,这导致病毒并没有扫描整个地址空间,而只是扫描了其中的四分之一。”

如果企业的客户由于这个原因并没有感染该蠕虫,他们可能要感谢自己的好运了。

与Bug有缘的恶意软件

还有更多的例子。2007年被披露的风暴(Storm)蠕虫由于更新版本时的一个错误而变成了和风细雨。黑客在更新病毒版本、编写代码中关于选取入侵系统类型的部分时,将Windows错拼成了Windoss。(有点敬业精神好不好?)

2014 年被披露的活力狗熊(Energetic Bear),又名蜻蜓(DragonFly),是一个用于渗透和破坏系统的恶意软件。该软件在安全研究人员的手里变成了小玩具,因为研究人员找到了它从缓 存中计算公钥和私钥的方式,获得受害者自由访问列表的方式,甚至是它未来版本的架构细节。

通过同样的方法,利用SimpleLocker被加密的安卓文件也可以被恢复。在总结银行木马Yaludle的漏洞时,安全人员表示,“SQL注入很漂亮,但不讲卫生”。

以彼之道,还施彼身

恶意软件分析并不只是逆向工程师的工作,只要做足准备,研究人员利用系统漏洞甚至可以控制攻击者发动攻击的服务器。

举 例而言,安全研究人员可以轻而易举地将Conficker无害化。一旦该病毒注入了一台电脑,就会从MaxMind上下载IP-地理地址数据库,以找到自 己在真实世界所处的位置。由于Conficker并不攻击乌克兰的电脑,如果这个数据库中的所有IP都映射到乌克兰,那么会引发蠕虫自杀,停止传播。通过 向Conficker推送改动后的MaxMind数据库,安全人员完全可以击败Conficker的攻击。

我们鼓励每一个人都来做这些事。”

(回复“malwarebug”,可获得演讲资料地址)

提醒:

研 究人员在RSA大会上展示的PPT和他们的演讲内容有所不一样。PPT上显示的代码实际上表明,Stuxnet并不会向Win 95和Win98系统上传播,这可能是因为研究人员所展示的是Stuxnet的修复版。他们所阐释的通过逆向工程发现的Bug只是老版本的内容,因此他们 有可能只是将Stuxnet代码中正确的一部分拿了出来,而在会议上介绍了那些有缺陷的部分。

以下C语言部分展示了Stuxnet进行x86安装检测的源代码:

if ( GetVersionExW(&OsVersion)

&& OsVersion.dwPlatformId == VER_PLATFORM_WIN32_NT

&& (OsVersion.dwMajorVersion >=5 || OsVersion.dwMajorVersion <= 6))

Install();

安全人员表示,以下这行代码

(OsVersion.dwMajorVersion >=5 || OsVersion.dwMajorVersion <= 6))

对于Windows 9x、XP、200x、Vista和7而言都会返回True,这是没错的。但是这段代码

OsVersion.dwPlatformId == VER_PLATFORM_WIN32_NT

对Windows 9x系统会返回False,因为Windows 95和Windows 98的dwPlatformId值都是1,VER_PLATFORM_WIN32_NT是2。因此,如果按照以上代码来运行,Install()永远不会 在Windows 9x版本上被调用。

上一篇: 一周海外安全事件回顾(20150412-0419):FireEye的转

下一篇: 一个WordPress漏洞所引发的INSERT注入思考