今天,我们发布了MS08-065补丁,以修复MSMQ中的一个问题。您会注意到该公告被评为“重要”,并指出可能存在远程代码执行。然而,我们想向您展示,实际上修复问题的严重性仅限于信息泄露。
如果MSMQ服务默认安装在任何受影响的Windows配置上,我们会将此漏洞评为“严重”。默认关闭的缓解措施将评级从“严重”降低一级至“重要”。我们希望通过揭示漏洞的一些细节来帮助您理解信息泄露的威胁。快速浏览代表此问题的伪代码将让您了解此问题是否会在现实世界中被利用。
1
2
3
4
5
6
7
8
9
10
11
12
|
WCHAR *
SomeRpcFunction (int ptr)
{
...
WCHAR *buf = ((blah *) ptr)->SomeString;
DWORD size = sizeof(WCHAR) * (wcslen(buf) + 1)
... do一些健全性检查 ...
WCHAR *buf2 = allocatememory(size);
wcscpy(buf2, buf);
...
return buf2;
}
|
攻击者可以为“ptr”传入任何他想要的地址,函数将愉快地尝试解引用它。如果攻击者正确执行此操作,将通过函数返回的字符串发生一些信息泄露。对于代码执行,攻击者的工作要困难得多。这必须是一个时序攻击。攻击者需要在字符串长度计算和wscpy()之间的时间窗口内(使用单独的线程)修改内存。内存修改必须使字符串的长度比几行代码前计算字符串长度时更大。在现实世界场景中,我们预计以可靠的方式利用此竞争条件将非常困难。我们还可以从汇编角度查看攻击窗口,以汇编指令衡量:
1
2
3
|
6b96ac16 8b780c mov edi,dword ptr [eax+0Ch]
6b96ac19 897de4 mov dword ptr [ebp-1Ch],edi
6b96ac1c 57 push edi
|
“edi”是指向字符串的指针
1
|
6b96ac1d ff15c0f4996b call dword ptr [mqqm!_impwcslen (6b99f4c0)]
|
我们将其传递给wsclen()。计算出的字符串长度将在“eax”中
1
2
|
6b96ac23 59 pop ecx
6b96ac24 8d440002 lea eax,[eax+eax+2]
|
注意编译器对“eax”的优化;此指令与eax = 2*(eax+1)相同。“eax”现在表示存储字符串所需的字节数
1
2
3
|
6b96ac28 8945e0 mov dword ptr [ebp-20h],eax
6b96ac2b 3d00000400 cmp eax,40000h
6b96ac30 7615 jbe mqqm!QMGetRemoteQueueName+0x73 (6b96ac47)
|
做一些错误检查
1
2
3
4
5
6
7
|
6b96ac32 a1dc1b9b6b mov eax,dword ptr [mqqm!s_FN (6b9b1bdc)]
6b96ac37 8945cc mov dword ptr [ebp-34h],eax
6b96ac3a 6899000000 push 99h
6b96ac3f 50 push eax
6b96ac40 be06000ec0 mov esi,0C00E0006h
6b96ac45 eb52 jmp mqqm!QMGetRemoteQueueName+0xc5 (6b96ac99)
6b96ac47 50 push eax
|
“eax”是我们需要的字节数(见0x6b96ac24)
1
|
6b96ac48 e88879ffff call mqqm!MIDL_user_allocate (6b9625d5)
|
我们分配一个大小为“eax”的缓冲区
1
|
6b96ac4d 8bf0 mov esi,eax
|
将ptr保存在“esi”中
1
2
|
6b96ac4f 8975dc mov dword ptr [ebp-24h],esi
6b96ac52 57 push edi
|
“edi”是我们之前拥有的字符串指针。如果攻击者成功更改此指针处的内存内容,则长度可能大于我们之前计算的长度…
“esi”是我们新分配的缓冲区
1
|
6b96ac54 ff15c8f4996b call dword ptr [mqqm!_impwcscpy (6b99f4c8)]
|
我们对其执行wscpy()。如果“edi”处的字符串长度发生变化,则我们遇到缓冲区溢出
- SVRD 博主
发布内容“按原样”提供,不提供任何保证,也不授予任何权利。