qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

安全性测试——Buffer overrun

安全性测试——Buffer overrun

  什么是BO?

  BO的概念很容易理解,只需要C语言的基本知识就足够了。申请了一段内存,而填入的数据大于这块内存,填入的数据就覆盖掉了这段内存之外的内存了。比如,

void foo(char* input)
{
char buf[100];
strcpy(buf, input);
}

  没有进行长度检查,如果黑客通过操作input,可能重写返回地址,从而产生安全性问题。

  为什么BO是一个安全问题?

  当copy的数据大于在stack声明的buffer,导致buffer被overwritten,从而产生基于stack的buffer overrun。在stack声明的变量位于函数调用者的返回地址,返回地址被攻击者重写,利用BO执行恶意代码从而控制计算机。

X86 EBP Stack Frame
Highest address
Arguments
Return address
Previous EBP
Saved rigisters
local storageLowest address

  在C语言中,当调用一个函数的时候,在汇编或者机器码的level是如何实现的呢?假设调上边的函数foo的时候,程序的stack将会是下边图表的样子。首先,输入参数会放到栈中去,然后是这个函数执行完的下一个指令的地址,也就是return address, 然后是EBP,再然后就是这个函数的本地变量的内存空间。比如这个函数申请了100个字节的空间。当BO发生的时候,数据就会覆盖掉buf之后的内存,关键的部分是return address可以被覆盖。那么黑客就可以把return address的值修改成这个buf的一个地址,比如起始地址buf[0]的地址,而这个buf里边填入黑客自己的代码。这样当这个函数退出的时候,程序会执行return address所指定的代码,也就是黑客的代码了。

  安全性测试

  在最高的层次上,安全漏洞发掘方法可被分为白盒、黑盒和灰盒测试方法三大类。测试者可以获得的资源决定了这三种方法的差别。白盒测试需要使用所有可用的资源,包括源代码,而黑盒测试只访问软件的输入和观察到的输出结果。介于两者之间的是灰盒测试,它在黑盒测试的基础上通过对可用的二进制文件的逆向工程而获得了额外的分析信息。

  白盒测试包括各种不同的源代码分析方法。可以人工完成也可以通过利用自动化工具完成,这些自动化工具包括编译时检查器、源代码浏览器或自动源代码审核工具。

  灰盒测试定义是首先它包括了黑盒测试审核,此外还包括通过逆向工程(RE)获得的结果,逆向工程也被称为逆向代码工程(RCE)。分析编译后得到的汇编指令能够帮助阐明类似的故事,但是要付出更多的努力。在汇编代码层次上进行安全评估而不是在源代码层次上进行安全评估,这种安全评估典型地被称作二进制审核(binary auditing)。二进制审核也被称为是一种”从里向外”的技术:研究者首先识出反汇编结果中令其感兴趣的可能存在的漏洞,然后反向追溯到源代码中以确定漏洞是否可以被别人所利用。

  调试器能够显示应用程序正在运行时CPU寄存器的内容和内存状态。Win32平台下的流行调试器包括OllyDbg18,其运行时的一个屏幕快照。此外还有Microsoft WinDbg(也被人称做”wind bag”)19。WinDbg是Windows软件调试工具包20中的一部分,可从Microsoft的网站上免费下载。OllyDbg是一个由Oleh Yuschuk开发的调试器,用户友好性稍好于WinDbg。这两个调试器都允许用户创建自定制的扩展功能组件,有许多第三方插件可用于扩展OllyDbg的功能21。UNIX环境下也有各种各样的调试器,GNU Project Debugger22(GDB)是最流行的也是最容易被移植的调试器。GDB是一个命令行调试器,许多UNIX/Linux产品中都包含这个调试器。

  在执行黑盒测试时,源代码是不可用的,通过黑盒测试来执行。可以考虑结合模糊测试来进行。

  Fuzz Test

  Fuzz Test概念

  传统的Fuzz指的是一种黑盒测试技术或随机测试技术,用来发现软件的缺陷(flaws)。模糊测试是这样的一个过程:向产品有意识地输入无效数据以期望触发错误条件或引起产品的故障。这些错误条件可以指导找出那些可挖掘的安全漏洞.

  1990年Miller等人发现,通过简单的Fuzz testing可以使运行于UNIX系统上的至少25%的程序崩溃;2002年Aitel通过自己设计实现的Fuzz工具SPIKE成功地发现了多个未知漏洞;安全漏洞困扰了许多流行的客户端应用程序,包括Microsoft的Internet Explorer、Word和Excel,它们中的许多漏洞在2006年通过模糊测试技术被发现。模糊测试技术的有效应用产生了许多新的工具和日益广泛的影响。可见,Fuzz测试在安全领域的重要性。

  安全性必须被融入软件开发生命周期(SDLC),而不是到了最后才草率处理。模糊测试可以并且应该是任何完整SDLC的一部分,不仅在测试阶段需要考虑,在开发阶段也同样需要考虑。缺陷被发现得越及时,修补缺陷的成本就越低。

  Fuzz技术的原理

  Fuzz技术的原理简单,基本的思想是将随机数据作为程序的输入,并监视程序执行过程中产生的任何异常,记录下导致异常的输人数据,从而定位软件中缺陷的位置。

  Fuzz 阶段

  模糊测试方法的选择依赖不同的因素,可能有很大的变化。没有一种绝对正确的模糊测试方法。模糊测试方法的选择完全取决于目标应用程序、研究者的技能,以及需要测试的数据所采用的格式。然而,无论要对什么进行测试,也不论确定选择了哪种方法,模糊测试总要经历几个基本的阶段。

  其中,识别输入:几乎所有可被人利用的漏洞都是因为应用程序接受了用户的输入并且在处理输入数据时没有首先清除非法数据或执行确认例程。

  经验介绍

  API测试:

  Memory Boundary Test for GetPluginVersion:

  Buffer is bigger than needed Buffer;

  content is setted to be 0xFF before calling the fuction

  Input buffer with sizeWChar is bigger than the actual value

  Expected Results:The lower bytes of the buffer is the actual vertion information,and other bytes is the setted 0xFF before calling the fuction.

  阅读源代码,也可以查找这类Bug,如查看Strcpy,memcopy等函数调用之前,是否有做判断?另外,不安全调用CreateProcess()也会引起漏洞。

  借助工具如Prefast,Fxcop等工具进行测试。

  AP测试:

  黑盒测试:

  举例,假设Name域应该接受一个字符串值,Age域应该接受一个整数值。如果用户偶然改变了两个域的实际输入范围并且在Age域输入了一个字符串后会发生什么呢?字符串值会被自动转换为基于ASCII码的整数值吗?是否会显示一条错误报告消息?应用程序会崩溃吗?借助模糊自动化测试实现;

  也可以通过工具或源代码检查来进行。


posted on 2013-07-15 10:08 顺其自然EVO 阅读(283) 评论(0)  编辑  收藏 所属分类: 测试学习专栏


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜