.NET Framework JIT编译器漏洞分析:MS11-044安全更新详解

本文详细分析了.NET Framework中JIT编译器的漏洞CVE-2011-1271,该漏洞可能导致远程代码执行。文章解释了漏洞的技术原理,包括编译器错误优化导致的空值检查缺失,并提供了代码示例和汇编分析。

MS11-044: .NET Framework中的JIT编译器问题

今天,我们发布了MS11-044安全更新,以解决CVE-2011-1271,这是一个.NET Framework中的远程代码执行漏洞。在此,我们希望提供更多关于此漏洞的技术信息,并解释为什么我们认为此问题不太可能被利用。

CVE-2011-1271的根本原因是JIT编译器中的一个错误,该错误会导致编译器错误地确定某个对象始终为null(或非null),并因此省略某些检查。

例如:

1
2
3
4
if ((value == null || value == new string[0]) == false)
{
    Console.WriteLine("Post-check Value is: " + value);
}

对应的汇编代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
00000027  test        esi,esi               ; value == null?
00000029  je          00000075
0000002b  xor         edx,edx               ; new string[0]
0000002d  mov         ecx,6D913BD2h
00000032  call        FFD20BC8
00000037  cmp         eax,esi               ; value == new string[0]?
00000039  je          00000075
0000003b  mov         ecx,dword ptr ds:[03532090h]  ; "Post-check value is: "
00000041  xor         edx,edx               ; 此处错误
00000043  call        6D70B7E8              ; String.Concat()
00000048  mov         esi,eax               ;
0000004a  call        6D72BE08              ; get Console.Out
0000004f  mov         ecx,eax
00000051  mov         edx,esi
00000053  mov         eax,dword ptr [ecx]
00000055  call        dword ptr [eax+000000D8h]     ; Console.WriteLine()

在偏移量0x41处,优化器错误地得出结论,认为value始终为null,因此它直接传递null给String.Concat()。

对于CVE-2011-1271,当运行与上述描述非常相似的C#或IL代码序列时,JIT编译器可能会引入逻辑缺陷。根据.NET应用程序的业务逻辑,如果NULL检查(或非NULL检查)用于做出安全决策,例如检查某些凭据,并且攻击者控制的数据可能直接或间接利用此缺失的逻辑并基于此获得优势,那么存在远程代码执行的可能性。然而,我们认为对于大多数已部署的.NET应用程序来说,这不是常见情况。

特别感谢.NET团队的Reid Borsuk。

Fermin Serna和Chengyun Chu,MSRC工程团队

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计