C和C++安全编码(原书第2版)
上QQ阅读APP看书,第一时间看更新

第1章 夹缝求生

To live without evil belongs

only to the gods.

—Sophocles.Fragments.l.683

计算机系统并不易受攻击,易受攻击的是我们人类,只不过遭受的攻击通过计算机系统完成罢了。

2003年8月11日爆发的W32.Blaster.Worm蠕虫病毒很好地例证了软件中的安全缺陷是如何让我们变得易受攻击的。Blaster可以在毫无用户参与的情况下感染任何一台连接到互联网且未打补丁的计算机系统。微软提供的数据显示,至少有800万个Windows系统被该蠕虫感染[Lemos 2004]。Blaster的主要破坏力在于使用户无法正常使用自己的机器,并且能够渗透整个局域网,感染的用户必须设法删除该蠕虫并且升级系统才能正常工作。

Blaster蠕虫作恶前后的一系列事件,如图1.1所示,揭示了软件厂商、安全研究人员、发布漏洞利用代码者以及恶意攻击者之间错综复杂的关系。

图1.1 蠕虫时间表

首先,LSD研究小组发现了RPC [1](可通过TCP/IP交换信息)中存在一个缓冲区溢出漏洞,成因在于对“畸形”消息的错误处理。该漏洞影响监听RPC端口的一个分布式组件对象模型(DCOM)接口,后者处理由客户机发送给服务器的对象激活请求。对该漏洞的成功利用允许攻击者在受感染的系统上以本地权限执行任意的代码。

在这种情况下,LSD小组遵循了负责任的披露原则,在公开该漏洞前与软件厂商进行了合作,以寻求解决问题的办法。2003年7月16日,微软发布了微软安全公告MS03-026 [2],LSD发布了一个特别报告,而CERT协调中心(CERT/CC)则发布了一个漏洞说明VU#568148 [3],详细描述了该漏洞,并提供相应的补丁和应急方案的信息。第二天,CERT/CC还发布了名为“Buffer Overflow in Microsoft RPC”(微软RPC缓冲区溢出)的CERT公告CA-2003-16 [4]

9天后,也就是7月25日,一个名为Xfocus的安全研究小组以安全公告板和补丁的形式发布了该漏洞的利用代码。Xfocus自称是“一个在1998年创立于中国的非营利和自由技术组织,致力于研究和展示网络服务与通信安全方面的弱点”。实质上,Xfocus对微软提供的补丁程序进行了逆向工程,研究了该漏洞的原理,并且开发了相应的攻击该漏洞的方法,并将其公之于众[Charney 2003]。

H.D.Moore(Metasploit项目的创始人)改进了Xfocus的代码,使其可以对更多版本的操作系统生效。很快就有漏洞利用工具发布了,这使得黑客可以通过IRC网络发送命令。8月2日就已经发现了这些攻击的蛛丝马迹[de Kere 2003]。

由于DEF CON黑客大会将于8月2日~3日召开,因此大家普遍预计将会有针对该漏洞的蠕虫发布(并不是说参加DEF CON的人会这么做,而是由于该大会会引起人们对黑客技术的关注)。DHS(Department of Homeland Security,美国国土安全部)于8月1号发布了一个预警,FedCIRC(Federal Computer Incident Response Center,联邦计算机事故响应中心)、NCS(National Communications System,美国国家通信系统)以及NIPC(National Infrastructure Protection Center,美国国家基础设施保护中心)也在对漏洞利用行为积极进行监测。8月11日,也就是补丁程序发布后的第26天,发现Blaster蠕虫首次在互联网上传播。24小时后,Blaster感染了336000台计算机[Pethia 2003a]。截至8月14日,Blaster已经感染了超过100万台计算机,在高峰期,它每小时感染100000个系统[de Kere 2003]。

Blaster是一个通过TCP/IP进行传播的贪婪的蠕虫,它利用了Windows的DCOM RPC接口中的一个漏洞。当Blaster执行时,它首先检测计算机是否已感染以及蠕虫是否正在运行,如果是这样,它就不会重复感染该计算机,否则,Blaster将:


"windows auto update"="msblast.exe"

加入注册表的


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

键中,这样,每当启动Windows,该蠕虫程序都会运行。接下来,Blaster产生一个随机的IP地址,并试图感染具有该地址的计算机。该蠕虫利用Windows 2000或Windows XP上的DCOM RPC漏洞通过TCP 135端口发送数据。Blaster监听UDP端口69,以接收可以通过DCOM RPC漏洞利用连接的机器的请求。一旦接收到请求,随即将msblast.exe文件发送到对方计算机并且执行该蠕虫[Hoogstraten 2003]。

蠕虫利用cmd.exe建立一个远程shell进程“后门”,该后门监听TCP端口4444,从而允许攻击者在受危害的系统上发出远程命令。Blaster同时还试图对Windows Update网站发起拒绝服务(Denial-of-Service,DoS)攻击,以阻止用户下载补丁。蠕虫会在一个特定的日期以SYN洪水(SYN flood) [5]的形式对windowsupdate.com的80端口发起DoS攻击。

即便Blaster不能成功地感染目标系统,DCOM RPC缓冲区溢出漏洞利用蠕虫也会终止其扫描到的Windows NT、Windows 2000、Windows XP以及Windows 2003系统上运行的svchost.exe进程。对于Windows 2000和Windows NT而言,这会导致系统不稳定甚至挂起;而对于Windows XP和Windows 2003,默认情况下会造成系统重启。

Blaster的爆发并不令人惊讶。在Blaster利用的漏洞公布前的一个月,CERT/CC的主管Richard Pethia于2003年6月25日在主题为“网络安全、科学、研究和发展”的美国国土安全小组委员会的特委会会议[Pethia 2003a]上明确表示:

当今理应关注互联网的安全问题。与互联网有关的漏洞将用户置于危险的境地。适应于组织内部的大型机和小型的、规划良好的网络的安全措施,对互联网不再有效,因为这是一个复杂的、动态的互联网络世界,没有明确的边界,没有中央控制。安全问题通常没有得到很好地理解,在许多开发者、厂商、网络管理者乃至消费者心目中,这个问题很少得到足够的重视。

根据评估,Blaster蠕虫所造成的经济损失至少达5.25亿美元。这个数字是综合了生产效率的损失、浪费的工时、损失的销售额以及额外消耗的网络带宽等统计出来的[Pethia 2003b]。虽然看上去Blaster的危害已经非常大了,但是实际上它很容易造成更大的破坏。例如,它删除被感染计算机上的文件。基于一个使用了简单破坏模型的参数化“最坏情况”分析,Nicholas Weaver和Vern Paxson[Weaver 2004]估计通过攻击微软Windows中广泛使用的服务并且携带某种高破坏性的载荷(例如,破坏主硬盘控制器、覆写CMOS RAM或擦除闪存等),一个最可怕的蠕虫,可能造成多达500亿美元乃至更大的直接经济损失!

W32.Blaster.Worm利用的缺陷逻辑(即有问题的代码)如图1.2所示 [6]。错误在于第21~22行的while循环(用来从一个长字符串中解析出主机名字)没有加上足够的边界检测。一旦确定了问题,修正问题的工作就非常简单了。例如,通过往while循环的控制表达式中添加第二个条件,该条件可以使在pwszTemp或pwszServerName引用的宽字符串越界前终止搜索。

图1.2 W32.Blaster.Worm所利用的缺陷逻辑

[1] 远程过程调用(Remote Procedure Call,RPC)是一种进程间通信机制。它允许运行在一台计算机上的程序执行另一台远程系统上的代码。微软的实现以开放软件基金会(Open Software Foundation,OSF)的RPC协议为基础,并添加了微软独有的一些扩展特性。
[2] 参见www.microsoft.com/technet/security/bulletin/MS03-026.mspx。
[3] 参见www.kb.cert.org/vuls/id/568148。
[4] 参见www.cert.org/advisories/CA-2003-16.html。
[5] SYN 洪水(SYN flooding)是一种恶意客户端程序用户所使用的对计算机服务器进行拒绝服务攻击的方法,恶意程序利用伪造的IP 地址重复地对服务器的每一个端口发送SYN(同步)包。
[6] 特别感谢微软公司提供这段代码。