0. 前言

这篇文章对CVE-2011-0027整数溢出漏洞进行了分析,之前在没有系统看过0day安全之前也曾经分析过一个整数溢出漏洞,只不过导致溢出的运算不太一样,感兴趣的可以去看一下那篇文章。

在分析这个漏洞的过程中,花费精力最多的其实是环境的搭建,因为漏洞已经比较老了,遇到了各种坑。之前的漏洞分析最晚在周四也能完成,这次到周四才把环境搭建好。

本文首先对MDAC进行了简单的介绍,然后花费了一定篇幅说明了搭建环境过程中遇到的各种问题,之后大致按照《漏洞战争》中的流程对漏洞进行了调试分析。总体来说漏洞原理其实并不复杂,只是环境搭建花费了很多时间。

1. 先决知识

1.1 漏洞简介

在MDAC处理RecordSet时,没有正确验证其指定缓冲区大小的CacheSize属性,如果属性值过大,会导致整数溢出,造成实际分配的空间大小小于原来指定的内存空间。由于漏洞发生在堆上,最终会导致堆溢出。

1.2 MDAC是什么

MDAC全程是Microsoft Data Access Components,即微软数据库访问组件。它为应用程序访问数据库提供了一个标准的接口。

MDAC在应用程序层使用的编程语言接口叫做ActiveX Data Objects(ADO),使用ADO可以建立Connection对象,表示一个对数据库的会话连接,Connection对象包含一个Execute方法,应用程序通过这个方法执行想要的操作。ADO还支持Command对象,可以使用Command对象建立一个参数化的命令并执行;Recodset对象代表的就是数据库中表格形式的数据,Execute或者Command执行后返回的数据就是Recordset格式的,Recordset对象支持各种用于控制数据的选项。通常来说,Recordset对象表示的是整行数据,或者一行数据中的其中几列,而访问单独的列要使用Field对象。虽然通过RecordSet每次只能访问一行的数据,但是这并不表示每次访问的时候都需要访问一次数据库,RecordSet可以缓存多行数据,而CacheSize就表示了它可以缓存的数据大小。

更详细的关于ADO的信息可以查看参考资料3

1.3 进一步的知识点

在HTML中可以使用<XML>标签插入需要的数据,并提供方法访问这些数据,这一过程实际上就是在使用MDAC对数据库进行访问,这里使用的对象就是上面介绍的ADO。

因此可以在访问XML中的数据时使用我们上面介绍的一些对象和方法的名称,也可以在这一过程中,触发CacheSize中存在的整数溢出漏洞。

2. 漏洞分析

2.0 关于环境配置(绝望的一周)

这个东西我搞了一周,终于在周四得到了正确的异常和symbol信息……中间遇到各种问题:操作系统版本的问题、Windbg版本的问题、IE的版本问题、symbol找不到……