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工程团队