你好。我叫王鹏鹏,是VC++IDEQA的新成员。四个多月前我加入了微软和VC++IDE团队。这四个月对我来说是一段很充实的经历。似乎还是昨天,我在努力完成我的第一个.NET“hello world”作业。我的导师,阿尔文(是的,阿尔文·查尔顿那个谈论Excel的家伙),是个“邪恶”的家伙,他让我写下我的“你好世界”给他听 说话 使用四种不同的语言,并且要正确本地化(所有语言字符串都在资源中指定,并随应用程序一起提供)。然后事情发生得很快:我开始学习不同的UI测试技术,修复测试错误,处理测试基础设施,分析和修复测试结果自动分析工具…
今天,我将讨论我最近参与的一个项目:IDE的模糊测试,作为部门的一部分 – 奥卡的广泛安全测试。首先,介绍一下安全测试的背景知识。简单地说,安全测试就是检测产品的任何安全问题,比如缓冲区溢出、整数溢出、内存峰值和CPU峰值。它是 非常 对我们的客户至关重要。好吧,我相信下面这个例子可以解释为什么。
2003年,Blaster蠕虫感染了超过一百万台电脑。那是因为安全漏洞 Microsoft RPC服务 http://support.microsoft.com/kb/826955 . 这只是RPCSS中的两行代码,如下所示:
虽然 (*pwszTemp!=L ‘’ )
*pwszServerName++=*pwszTemp++;
控制输入(pwszTemp指向的数据)的黑客可以溢出缓冲区,并放置一个指向他拥有的恶意程序的指针。当另一个应用程序执行并意外尝试访问此恶意程序指针时,炸弹!这有助于解释 为什么微软和我们的部门大力推动安全测试。
模糊测试是一种有效的安全测试方法。它是通过模糊化输入来实现的(例如IDE) , 例如 VC++项目文件(.vcproj)和资源文件(.rc.),将模糊输入提供给正在测试的程序,并监视任何安全问题。通过模糊化输入,我的意思是,随机抽取一个或多个有效输入长度可变的部分,并用其他内容替换它。这个东西可能是0x00000000,0xFFFFFFFF,!@#$,或者我用四种不同的语言说“你好世界” J …其思想是,当被测试程序使用/解析模糊输入时,它可能有机会遇到另一个缓冲区溢出。正如您所想象的,这种模糊化方法不是很聪明(事实上,我们称之为哑巴模糊化),因为它随机选择要模糊的内容以及检测安全问题的方式和机会很低。另一个聪明的方法是理解输入的结构,并相应地模糊它。例如,.vcproj文件是xml文件。将标签和内容模糊化为单独的部分是有意义的。很有可能(我是说从黑盒测试的角度来看)这将触及不同的代码路径,并提供更好的测试覆盖率。好吧,如果你觉得这样更舒服的话,没有什么能阻止你做20%的哑巴模糊和80%的智能模糊。
我正在为.vcproj、.bsc、.rc和其他一些文件做模糊测试。例如,对于.rc文件,我编写了一个基于组件的自动化测试,要求IDE打开fuzzed.rc文件,解析它,遍历其中的所有资源项。我使用了一个模糊化工具,将有效的输入模糊化,并将其提供给自动化测试。当自动化运行时,此工具还会在后台检测安全问题。重复10万次。我的一些测试还在运行…我想我得去检查他们的状态了。
王鹏鹏
Visual C++ IDE Team