MS08-065漏洞分析:远程代码执行与信息泄露的边界

本文深入分析了MS08-065漏洞的技术细节,探讨了MSMQ服务中的RPC函数漏洞如何从信息泄露演变为潜在的远程代码执行风险,并通过伪代码和汇编指令展示了攻击窗口和利用难度。

今天,我们发布了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”是我们之前拥有的字符串指针。如果攻击者成功更改此指针处的内存内容,则长度可能大于我们之前计算的长度…

1
6b96ac53 56               push    esi

“esi”是我们新分配的缓冲区

1
6b96ac54 ff15c8f4996b     call    dword ptr [mqqm!_impwcscpy (6b99f4c8)]

我们对其执行wscpy()。如果“edi”处的字符串长度发生变化,则我们遇到缓冲区溢出

  • SVRD 博主 发布内容“按原样”提供,不提供任何保证,也不授予任何权利。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计