二进制级别自动漏洞检测(一)

关于自动缓冲区溢出漏洞检测技术学习(MAYHEM)

关于MAYHEM的总览

文章利用了HTTP服务orzHttpd 来展示遇到的主要问题和MAYHEM的工作流程。(利用MAYHEM找到的一个漏洞作为例子)

#define BUFFSIZE 4096

typedef struct{
	char buf[BUFSIZE];
	int used;
}STATIC_BUFFER_t;

typedef struct conn{
	STATIC_BUFFER_t read_buf;
	...//omitted
}CONN_t;

static void serverlog(LOG_TYPE_t type, const char *format,....)
{
	...//omitted
	if(format != NULL){
		va_start(ap, format);
		vsprintf(buf, format, ap);
		va_end(ap);
	}
	fprintf(log, buf);//vulnerable point
	fflush(log);
}

HTTP_STATE_t http_read_request(CONN_t *conn)
{
	...//omitted
	while(conn->read_buf.used<BUFSIZE){
		sz = static_buffer_read(conn, &conn->read_buf);
		if(sz < 0){
			..
			conn->read_buf.used += sz;
			if(memcmp(&conn->read_buf.buf[conn->read_buf.uesd] - 4, "\r\n\r\n", 4) == 0)
			{
				break;
			}
		}
		if(conn->read_buf.used >= BUFSIZE){
			conn->status.st = HTTP_STATUS_400;
			return HTTP_STATE_ERROR;	
		}
		...
	}
	serverlog(ERROR_LOG,
					"%s\n",
					conn->read_buf.buf);
}

问题就出现在注释的位置调用serverlog 函数,可以在最后看到该函数调用了fprintf() 使用用户给的字符串格式,可变参数函数(如fprintf)使用自定义格式字符串说明符来确定如何遍历内存堆栈。这个漏洞使用fprintf 获取缓冲区的控制权,将shellcode或者其他格式写入所需的位置。
有漏洞的程序堆栈
由上面的例子推广开几个发现漏洞的关键点;

  1. 发现底层细节事件,发现漏洞需要底层(返回地址和栈指针)
  2. 需要找到大量的执行路径,因为代码中许多部分中的路径数量与输入的大小相关。例如:memcmp展开一个循环,在每次迭代中创建符号执行的新路径。更长的输入意味着更多的条件、更多的分支和更大的可扩展性,这样导致大多数利用都不是短字符串。
  3. 检查越多的路径越好,MAYHEM需要通过循环进行推理,读取输入,为每个可能的路径派生一个新的解释器(???interpreter),并检查错误。
  4. 更多的在本机执行(个人理解是:更多的指令执行来发现问题),符号执行因为指令的语义实在软件中模拟的所以运行的很慢,攻击者在连接到套接字之前需要百万条指令来设置基本服务器。

总体设计图
MAYHEM由两个并发的进程组成:一个再本机CPU上执行CEC;一个符号执行服务器SES。CEC运行在目标系统上,SES在任何平台上,等待CEC的连接。CEC接受一个二进制程序以及可能的符号源(输入规范)作为输入,并开始与SES通信。然后,SES符号执行CEC发送过来的BB和集中类型的测试用例,包括普通测试.

  1. 指定哪些输入源可能处于攻击者控制之下.
  2. CEC加载目标程序并且连接到SES初始化所有的符号输入源.初始化后,CEC在CPU上进行具体执行.在执行期间,CEC检测并且执行动态污点分析.
  3. 在CEC遇到受污染的分支约束或者跳转目标就挂起具体执行.有污染说明有可能是攻击者依赖的输入.CEC就会将所有受污染的BB送到SES,由SES进行判断哪个分支是可执行的.CEC会收到SES发来的下一个目标分支.
  4. SES和CEC是同时运行的,收到来自CEC发来的一堆收到污染的指令,SES把指令转换为一个中间语言,并且符号执行相应的IL.CEC会提供关于符号执行所需的具体值,比如指令的操作数.
    路径公式: 路径公式反映了到达特定代码行的约束条件.每一个跳转约束会增加一个新的约束在输入中.例如:例子中判断输入缓冲区大小是否超出范围的if会产生两条路径.一个是如果碰到\r\n\r\n结尾的输入所执行的;另一个是没有碰到\r\n\r\n的输入所执行的.
    **有漏洞的路径公式:**判断漏洞的检测方法:1)攻击者可以获取指令指针(??instruction pointer)2)可以执行payload
  5. 找到一个受污染的分支,SES决定是否需要用SMT解释器去分支执行。如果需要执行分支,所有新获取的分支都要送到路径选择器去优化。在选择路径时,SES会将更改的路径通知CEC,并恢复相应的执行状态。如果达到系统资源上限将会生成检查点,而不是派生新的执行器(4section)。在流程的最后将为已停止的执行器生成测试用例,而SES将通知CEC接下来应该执行哪个检查点。
  6. 在执行期间,SES在执行器和CEC形成检查点/恢复之间切换,为支持这样的功能CEC需要一个虚拟层来保证程序与计算机底层之间的交互,以及多程序执行状态之间的检查点恢复。(4section-C)
  7. 当检测到污染的跳转指令后,会建立一个可利用路径公式,利用SMT求解器来查找是否有满足的情况,如果发现了又满足要求的输入就是一个漏洞,如果受污染的分支指令上没有漏洞SES会继续探索执行路径。
    以上是对MAYHEM的最新的认识,之后会继续分析文章并配合自己的想法来找到新的思路
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值