首页
社区
课程
招聘
[原创]FireFox释放后重引用漏洞分析(CVE-2011-0065)
发表于: 2019-7-12 15:44 11467

[原创]FireFox释放后重引用漏洞分析(CVE-2011-0065)

2019-7-12 15:44
11467

漏洞描述

FireFox 3.6.x版本之前存在释放后重引用漏洞,此漏洞是由于uxl.dll在处理mChannel标签时,在OnChannelRedirect中对mChannel对象进行创建时,在随后调用Release释放对象,但是释放后没有对指向对象的指针做标记,在随后引用mChannel标签时,因为指针已经释放了,导致call的地址不可读,从而引发UAF漏洞。

漏洞环境

漏洞软件:FireFox(火狐浏览器)

 

漏洞软件版本:FireFox 3.6.16

 

漏洞Dll模块:xul.dll

 

漏洞编号:CVE-2011-0065

 

漏洞类型:UAF

 

分析环境:Windows XP Sp3

 

分析工具:Windbg

 

FireFox符号地址:b5dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4&6L8h3u0G2L8s2y4Q4x3X3g2E0L8%4A6A6L8r3I4S2i4K6u0W2L8%4u0Y4i4K6u0r3k6X3W2J5k6h3k6G2P5l9`.`.

SRV*C:\WindbgSymbol*d37K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4&6L8h3u0G2L8s2y4Q4x3X3g2E0L8%4A6A6L8r3I4S2i4K6u0W2L8%4u0Y4i4K6u0r3k6X3W2J5k6h3k6G2P5l9`.`.

漏洞PoC:

#!/usr/bin/python
#coding:utf-8

print "[+]Create File"

buffer = "\n"
buffer += "\n"
buffer += "\n"
buffer += "\n"
buffer += "\n"
buffer += "\n"

f = open("firefox_poc.html",'w')
f.write(buffer)
print "[+]Success"
f.close()

漏洞复现

使用Python运行PoC会生成一个HTML文件,用存在漏洞的FireFox打开就会触发漏洞

 








先加载一下符号表,用浏览器打开PoC,FireFox会崩溃,然后用WinDbg附加程序,就会到达漏洞触发现场

(5f4.7d8): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0419f110 ebx=0431ff44 ecx=0492fc00 edx=031b1760 esi=804b0002 edi=80000000
eip=02e3c574 esp=0012f604 ebp=0012f814 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
02e3c574 e0e8            loopne  02e3c55e                                [br=0]

可以看到这是一片无意义的区域,通过kb堆栈回溯看一下到达无意义区域之前的情况

0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Frame IP not in any known module. Following frames may be wrong.
0012f600 107f4e75 0419f110 804b0002 00000000 0x2e3c574
0012f814 107f5659 0431ff44 043af1c0 00000001 xul!gfxFontUtils::ReadNames+0x14735
0012f844 107f6155 0431ff44 0012f8fc 00000001 xul!gfxFontUtils::ReadNames+0x14f19
0012f9b0 0036d120 a1a4fa20 00375cf6 0000000a xul!gfxFontUtils::ReadNames+0x15a15
0012f9e8 107f61a3 0431ff20 00000001 100b2902 nspr4!PR_Now+0x40
0012f9f4 100b2902 00000001 043deec0 0313d100 xul!gfxFontUtils::ReadNames+0x15a63
0012fa10 100b21d2 00000048 00000000 00000000 xul!gfxMatrix::HasNonTranslation+0x2c52
00000000 00000000 00000000 00000000 00000000 xul!gfxMatrix::HasNonTranslation+0x2522

可以看到栈顶的返回地址,用ub命令查看107f4e75地址之前的指令

0:000> ub 107f4e75
xul!gfxFontUtils::ReadNames+0x1471f:
107f4e5f 8bce            mov     ecx,esi
107f4e61 e81a6991ff      call    xul!NS_CycleCollectorSuspect2_P+0x2a0 (1010b780)
107f4e66 8b4350          mov     eax,dword ptr [ebx+50h]
107f4e69 8b08            mov     ecx,dword ptr [eax]
107f4e6b be02004b80      mov     esi,804B0002h
107f4e70 56              push    esi
107f4e71 50              push    eax
107f4e72 ff5118          call    dword ptr [ecx+18h]

看一下call触发的现场

eax=02f416f0 ebx=043caee4 ecx=037a4400 edx=02935ee0 esi=804b0002 edi=80000000
eip=107f4e72 esp=0012f200 ebp=0012f408 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
xul!gfxFontUtils::ReadNames+0x14732:
107f4e72 ff5118          call    dword ptr [ecx+18h]  ds:0023:037a4418=02eafcbc

可以看到就是call调用导致程序进入了无意义的区域,call调用的是一处指针,但是寄存器ecx的值是无意义的,ecx是一处虚函数地址,因为指针释放后虚函数的地址变成了无意义的地址,所以造成了UAF漏洞。

漏洞分析

我们重新打开PoC,触发异常附加调试

0:019> g
ModLoad: 7e550000 7e6c1000   C:\WINDOWS\system32\shdocvw.dll
ModLoad: 765e0000 76673000   C:\WINDOWS\system32\CRYPT32.dll
ModLoad: 76db0000 76dc2000   C:\WINDOWS\system32\MSASN1.dll
ModLoad: 75430000 754a1000   C:\WINDOWS\system32\CRYPTUI.dll
ModLoad: 5fdd0000 5fe25000   C:\WINDOWS\system32\NETAPI32.dll
ModLoad: 76680000 76726000   C:\WINDOWS\system32\WININET.dll
ModLoad: 76c00000 76c2e000   C:\WINDOWS\system32\WINTRUST.dll
ModLoad: 76c60000 76c88000   C:\WINDOWS\system32\IMAGEHLP.dll
ModLoad: 74d90000 74dfd000   C:\WINDOWS\system32\RichEd20.dll
(6bc.22c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0191b2c0 ebx=051d1544 ecx=05315800 edx=04041670 esi=804b0002 edi=80000000
eip=01c4068c esp=0012f604 ebp=0012f814 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
01c4068c 00a2c4010a00    add     byte ptr [edx+0A01C4h],ah  ds:0023:040e1834=00

栈回溯看一下

0:000> kv
ChildEBP RetAddr  Args to Child              
WARNING: Frame IP not in any known module. Following frames may be wrong.
0012f600 107f4e75 04a40240 804b0002 00000000 0x2f5462c
0012f814 107f5659 044a49e4 058c2d70 00000001 xul!gfxFontUtils::ReadNames+0x14735
0012f844 107f6155 044a49e4 0012f8fc 00000001 xul!gfxFontUtils::ReadNames+0x14f19
0012f9b0 0036d120 52f531b0 00375d00 0000000a xul!gfxFontUtils::ReadNames+0x15a15
0012f9e8 107f61a3 044a49c0 00000001 100b2902 nspr4!PR_Now+0x40
0012f9f4 100b2902 00000001 045b9b80 03cb2600 xul!gfxFontUtils::ReadNames+0x15a63
0012fa10 100b21d2 00000048 00000000 00000000 xul!gfxMatrix::HasNonTranslation+0x2c52
00000000 00000000 00000000 00000000 00000000 xul!gfxMatrix::HasNonTranslation+0x2522

此时栈顶的返回地址是0x107f4e75,用ub命令看一下0x107f4e75之前的指令,漏洞就是出现在xul.dll模块中的

0:000> ub 107f4e75
xul!gfxFontUtils::ReadNames+0x1471f:
107f4e5f 8bce            mov     ecx,esi
107f4e61 e81a6991ff      call    xul!NS_CycleCollectorSuspect2_P+0x2a0 (1010b780)
107f4e66 8b4350          mov     eax,dword ptr [ebx+50h]
107f4e69 8b08            mov     ecx,dword ptr [eax]
107f4e6b be02004b80      mov     esi,804B0002h
107f4e70 56              push    esi
107f4e71 50              push    eax
107f4e72 ff5118          call    dword ptr [ecx+18h]

根据C++成员函数this指针调用约定,上面的ecx是虚表基地址,eax是对象地址,call dword ptr [ecx+18h]调用的就是某个对象的方法,这个方法是一个虚函数。

 

由于每次调试时分配的堆地址不一样,因此为了断点设置的通用性,这里采用函数偏移的断点设置方法,查看xul!gfxFontUtils::ReadNames+0x1471f发现有两个同名的函数

0:000> u xul!gfxFontUtils::ReadNames+0x1471f
Matched: 107e04e8 xul!gfxFontUtils::ReadNames ()
Matched: 107e0740 xul!gfxFontUtils::ReadNames ()
Ambiguous symbol error at 'xul!gfxFontUtils::ReadNames+0x1471f'

从触发漏洞时栈顶的返回地址0x107f4e75可以知道,这里调用的是:

107e0740 xul!gfxFontUtils::ReadNames ()

因此,对0x107e0740下断点

0:000> bp 0x107e0740
0:000> bl
 0 e 107e0740     0001 (0001)  0:**** xul!gfxFontUtils::ReadNames

从PoC代码中还可以看到关键函数onChannelRedirect,可以直接在WinDbg中搜索这个函数,发现有很多类都包含了onChannelRedirect








 

触发漏洞的类是xul!nxObjectLoadingContext,该类也包含了onChannelRedirect方法,参数也一起列出来了,前两个参数是类对象

 

 

因此,对xul!nsObjectLoadingContent::onChannelRedirect下断点,重新加载PoC,断在了xul!nsObjectLoadingContent::onChannelRedirect处

 

 

 

此时查看三个参数,发现第二个参数是对象067a3e90,其余参数均为0


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2019-7-12 15:47 被0xbird编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 3850
活跃值: (292)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
firefox符号表393K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4&6L8h3u0G2L8s2y4Q4x3X3g2E0L8%4A6A6L8r3I4S2i4K6u0W2L8%4u0Y4i4K6u0r3k6X3W2J5k6h3k6G2P5q4!0q4z5q4!0n7c8W2)9&6z5g2!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2)9&6b7#2!0n7x3q4!0q4y4g2)9&6c8q4)9^5x3q4!0q4z5q4!0m8c8g2!0n7c8W2!0q4z5g2)9&6y4#2!0m8c8g2!0q4y4g2!0m8y4q4!0n7x3g2!0q4z5q4!0n7y4q4!0m8y4g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0n7c8W2)9&6y4q4!0q4y4g2)9&6b7W2)9&6c8g2)9%4b7W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0W2M7Y4u0G2M7W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4x3@1q4Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6t1$3M7i4g2G2N6q4)9K6b7V1&6G2N6q4)9J5y4X3&6T1M7%4m8Q4x3@1u0r3L8%4g2F1k6q4)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4x3V1y4Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6t1$3M7i4g2G2N6q4)9K6b7Y4m8S2N6r3S2Q4x3U0k6I4N6h3!0@1i4K6y4n7i4K6y4m8i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4x3V1k6X3K9i4u0W2k6X3!0^5i4K6t1$3M7i4g2G2N6q4)9K6b7W2)9%4c8q4!0q4x3#2)9^5x3q4)9^5x3W2!0q4z5q4!0m8c8W2!0n7y4#2!0q4y4W2!0m8y4g2!0n7b7#2!0q4y4q4!0n7z5q4!0n7b7W2!0q4y4W2)9^5c8W2)9&6x3q4!0q4y4q4!0n7c8g2)9&6b7W2!0q4y4#2!0m8b7#2!0m8y4W2!0q4y4g2)9^5c8W2!0n7y4#2!0q4z5q4!0m8x3g2!0m8z5q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4W2)9^5x3#2!0n7x3#2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4g2!0m8y4g2!0n7c8q4!0q4y4g2!0m8y4q4)9&6b7g2!0q4y4g2)9^5b7g2)9&6c8g2!0q4y4W2!0n7x3#2)9&6y4g2!0q4z5g2)9^5x3#2!0n7c8q4!0q4y4W2!0n7x3W2!0m8x3g2!0q4y4W2)9&6x3q4)9&6c8g2!0q4y4g2!0m8c8g2)9&6b7g2!0q4x3#2)9^5x3q4)9^5x3R3`.`.
2019-10-25 09:33
0
雪    币: 245
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
dodohit firefox符号表3abK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4&6L8h3u0G2L8s2y4Q4x3X3g2E0L8%4A6A6L8r3I4S2i4K6u0W2L8%4u0Y4i4K6u0r3k6X3W2J5k6h3k6G2P5q4!0q4z5q4!0n7c8W2)9&6z5g2!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2)9&6b7#2!0n7x3q4!0q4y4g2)9&6c8q4)9^5x3q4!0q4z5q4!0m8c8g2!0n7c8W2!0q4z5g2)9&6y4#2!0m8c8g2!0q4y4g2!0m8y4q4!0n7x3g2!0q4z5q4!0n7y4q4!0m8y4g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0n7c8W2)9&6y4q4!0q4y4g2)9&6b7W2)9&6c8g2)9%4b7W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0W2M7Y4u0G2M7W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4x3@1p5`. "Not Found", &q ...
同问
2020-5-24 11:05
0
游客
登录 | 注册 方可回帖
返回