在净stackalloc缓冲区溢出保护(Buffer overflow protection for

2019-08-17 00:20发布

从stackalloc C#参考:

使用stackalloc的自动启用在公共语言运行库(CLR)缓冲器超限检测功能。 如果检测到缓冲区溢出,则终止该处理尽可能快地以最小化恶意代码被执行的可能性。

具体地讲,什么样的保护机制是.NET实现?
并且将它还能检测缓冲区欠载? 面对哪已知攻击是保护弱势?


用于上下文,例如用于MS C ++编译器的信息可在这里:
ISV的Windows软件的安全防御措施 :

堆栈缓冲区溢出检测能力引入到C / C ++编译器在Visual Studio .NET 2002和后续版本已更新。 / GS是指示编译器添加启动代码,和功能收尾和序言代码,以生成并检查被放置在函数的堆栈的随机数一个编译器开关。

请注意,VISUAL C ++ 2005(或更高版本)也重新排列堆栈上的数据,以使其更难预测地破坏了该数据。 例子包括:
•移动缓冲区比非缓冲更高的内存。 这个步骤可以帮助保护驻留在堆栈上的函数指针。
•移动指针和缓冲区参数,以降低运行时的内存来缓解各种缓冲区溢出攻击。

Answer 1:

是的,.NET抖动所产生的那种叠层金丝雀检查也存在于由Microsoft C / C ++编译器与/ GS编译选项生成本地代码。 基本方案是在堆栈的顶部,在方法条目写入存储的随机32位值。 在方法退出检验该值仍然存在。 在值的变化为堆栈缓冲区溢出非常高的预测,即恶意软件使用采取的程序的控制的种类。

一些代码一起玩:

class Program {
    static void Main(string[] args) {
        Kaboom();
    }
    static unsafe void Kaboom() {
        byte* ptr = stackalloc byte[1];
        for (int ix = 0; ix < 42; ++ix) ptr[ix] = 0;
    }
}

运行此代码触发Windows错误报告对话框,甚至与调试器连接。 你可以看到在输出窗口崩溃的原因:

程序 '[3636] ConsoleApplication33.exe:母语' 已退出,代码-1073740791(0xc0000409)。

异常代码在NTSTATUS.H SDK头文件中定义:

//
// MessageId: STATUS_STACK_BUFFER_OVERRUN
//
// MessageText:
//
// The system detected an overrun of a stack-based buffer in this application. This overrun could 
// potentially allow a malicious user to gain control of this application.
//
#define STATUS_STACK_BUFFER_OVERRUN      ((NTSTATUS)0xC0000409L)    // winnt

你可以看到,调试+的Windows +拆卸做到这一点的代码。 KABOOM的基本部分:

00000000  push        ebp                               ; setup stack frame
00000001  mov         ebp,esp 
00000003  sub         esp,8                             ; stack space for local variables
00000006  xor         eax,eax 
00000008  mov         dword ptr [ebp-8],eax             ; zero-initialize local variables
0000000b  mov         dword ptr [ebp-4],eax 
0000000e  mov         dword ptr [ebp-4],esp
00000011  mov         dword ptr [ebp-8],0EDDB7EDFh      ; canary stored here

// For loop code omitted

0000002d  cmp         dword ptr [ebp-8],0EDDB7EDFh      ; check canary value
00000034  je          0000003B 
00000036  call        727767A8                          ; crash program
0000003b  lea         esp,[ebp]                         ; normal exit, pop stack frame
0000003e  pop         ebp 
0000003f  ret 

实际金丝雀值更改每次代码即时编译时间。



文章来源: Buffer overflow protection for stackalloc in .Net