CVE-2011-0065
环境 | 备注 | |
操作系统 | Windows 7 x86 sp1 | 专业版 |
漏洞软件 | Firefox | 版本号:3.6.16 |
调试器 | Windbg | 版本号:6.12.0002.633 |
0x00 漏洞描述
在Firefox浏览器3.5.19之前的版本,以及3.6.17之前的3.6.x版本中存在UAF漏洞.mChannel对象在被释放后,成为悬挂指针,然后又在后面被重新引用,导致利用漏洞可以执行任意代码
0x01 定位漏洞源码
首先在Windbg调试器中添加Firefox的符号表地址:
SRV*c:\localsymbols*http://symbols.mozilla.org/firefox
然后,用Windbg附加Firefox浏览器进程,并打开以下poc.html
<html>
<body>
<object id="d"><object>
<script type="text/javascript">
var e;
e=document.getElementById("d"); e.QueryInterface(Components.interfaces.nsIChannelEventSink).onChannelRedirect(null,new Object('0c'),0);
e.data = ""; </script>
</body>
</html>
打开后触发异常,此时栈顶的返回地址如下图所示(0x66434e75)
图一 栈回溯
用ub命令查看0x66434e75地址前面的指令,漏洞正是出现在xul.dll模块中
根据c++成员函数this指针调用约定,可以知道上边的ecx为虚表地址,eax为对象地址,而call dword ptr [ecx+18h]调用的正是某个对象的方法,即虚函数。
下面开始在漏洞触发前下断点,先在漏洞触发点所在的函数开头下断
出现了两个同名的函数,根据图一的栈回溯返回地址,我们可以知道我们要找的函数是第二个
因此,对0x66434d6d所在的函数下断点
另外,从poc.html中可以看到关键函数onChannelRedirect,结合触发漏洞的类为xul!nsObjectLoadingContent,我们直接在这个类里搜索关键函数
因此,对xul!nsObjectLoadingContent::onChannelRedirect函数下断点,重新加载poc.html执行后,发现确实可以断下
此时在xul!nsObjectLoadingContent::onChannelRedirect函数下断下,查看它的三个参数,其中第二个参数是对象(0x06c692d0),其余参数都为0
分析该函数的反汇编
上面的调试信息以及给出了源码的文件路径及行数,因此我们可以直接查看源码,可以通过在线源码地址http://hg.mozilla.org/releases/mozilla-1.9.2/file/c24f21581d77/content/base/src/nsObjectLoadingContent.cpp获取到。
在1028行处,将新对象aNewChannel赋给mChannel对象,但由于Firefox本身的垃圾回收机制,在onChannelRedirect函数调用完毕后,它会回收不再使用的对象,即仅在本函数内使用的aNewChannel对象,此时mchannel就成了悬挂指针
继续执行下去会断在我们前面设置的第二个断点nsObjectLoadingContent::LoadObject函数
同样的,找到函数源码
在1204行,引用了悬挂指针mChannel对象的虚函数
分析到这里,我们可以得出结论:
在nsObjectLoadingCoChannelRedirect函数中,当mChannel对象未被分配时,会临时赋予一个新对象值,而该新对象值在函数返回后会被回收释放,导致mChannel成为悬挂指针,
程序又在后面的nsObjectLoadingContent::LoadObject函数中引用了悬挂指针mChannel,最终导致UAF漏洞的发生。
最新文章
- python使用pdkdf2加盐密码
- 分布式搜索引擎Elasticsearch的查询与过滤
- 一次线上http接口调用不通相关的解决过程
- Java实现Excel导入数据库,数据库中的数据导入到Excel
- float浮动问题:会造成父级元素高度坍塌;
- Redis快速入门
- appscan 安全漏洞修复办法
- iOS开发:创建真机调试证书
- EventSystem
- HDU -2546饭卡(01背包+贪心)
- global变量
- 枚举与剪枝_观察算式(比标准答案还要牛B)
- dotnet调用node.js写的socket服务(websocket/socket/socket.io)
- 第25篇 jQuer快速学习(上)---选择器和DOM操作
- 从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类
- SpringMVC+MyBatis 事务管理一
- Redis学习——Redis持久化之AOF备份方式保存数据
- (译)学习JavaScript闭包
- uni-app 如何在当前页调上个页面的方法
- 基于Vue.js的uni-app前端框架结合.net core开发跨平台project
热门文章
- U3D Shader基础
- uoj#351. 新年的叶子(概率期望)
- 在VMware上克隆Linux虚拟机及其网卡配置方法
- 关于setTimeout(fn,0)
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
- bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习
- Codeforces Round #431 (Div. 2) B
- window.addeventlistener使用方法
- 爬虫(ProxyHandler)——代理
- HDU 1024 A - Max Sum Plus Plus DP + 滚动数组