这篇文章对CVE-2011-0027整数溢出漏洞进行了分析,之前在没有系统看过0day安全之前也曾经分析过一个整数溢出漏洞,只不过导致溢出的运算不太一样,感兴趣的可以去看一下那篇文章。
在分析这个漏洞的过程中,花费精力最多的其实是环境的搭建,因为漏洞已经比较老了,遇到了各种坑。之前的漏洞分析最晚在周四也能完成,这次到周四才把环境搭建好。
本文首先对MDAC进行了简单的介绍,然后花费了一定篇幅说明了搭建环境过程中遇到的各种问题,之后大致按照《漏洞战争》中的流程对漏洞进行了调试分析。总体来说漏洞原理其实并不复杂,只是环境搭建花费了很多时间。
在MDAC处理RecordSet
时,没有正确验证其指定缓冲区大小的CacheSize
属性,如果属性值过大,会导致整数溢出,造成实际分配的空间大小小于原来指定的内存空间。由于漏洞发生在堆上,最终会导致堆溢出。
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。
在HTML中可以使用<XML>标签插入需要的数据,并提供方法访问这些数据,这一过程实际上就是在使用MDAC对数据库进行访问,这里使用的对象就是上面介绍的ADO。
因此可以在访问XML中的数据时使用我们上面介绍的一些对象和方法的名称,也可以在这一过程中,触发CacheSize
中存在的整数溢出漏洞。
这个东西我搞了一周,终于在周四得到了正确的异常和symbol信息……中间遇到各种问题:操作系统版本的问题、Windbg版本的问题、IE的版本问题、symbol找不到……