2012-02-18 94 views
24

假设一个C#程序只使用托管.NET代码,那么在该程序中是否有可能存在缓冲区溢出安全漏洞?如果是这样,那么这样的漏洞怎么可能呢?在C#中缓冲区溢出攻击是可能的吗?

+0

经典意义上的缓冲区溢出,或只是任何种类的缓冲区溢出漏洞? – Dykam 2012-02-18 17:58:22

+0

查看“未选中”和“不安全”关键字。 – 2012-02-18 17:59:02

+0

@Dykam:就利用而言。 – poke 2012-02-18 18:01:20

回答

43

是的,但它们很难生产。如果您使用某些不安全的构造,而不是“普通的”C#代码,则只能获得缓冲区溢出。当代码运行时信任度降低时,内存破坏代码根本不应该成为可能。

为缓冲区溢出的一些可能性:

  1. 使用unsafe关键字,它允许指针。不安全的代码就像c或C++中基于指针的代码一样容易出错。
  2. 使用不安全的API,如从Marshal类的方法
  3. (仅适用于黑白),您可以禁用阵列范围检查(安全与性能之间的权衡)

也有一些其他的方式除缓冲区溢出外,还会破坏内存。

  1. StructLayoutKind.Explicit
  2. 错误的本地互操作签名

(运行时本身是用C++写的,所以在运行时的错误,也损坏内存或缓冲区溢出,但我认为,出这个问题的范围)

3

从绝对意义上说,是的,由于.NET运行时中的错误,缓冲区利用是可能的。然而,.NET阻止了大多数最终用户代码(除了'不安全'的用法),所以在现实生活中它的风险较小。

在现实生活中,像这样的大多数问题都会从托管代码调用的本地调用(COM dll等)中发生。

14

是,在不安全的环境:

unsafe void bufferOverflow(string s) 
{ 
    char* ptr = stackalloc char[10]; 

    foreach (var c in s) 
    { 
     *ptr++ = c; // Bufferoverflow if s.Length > 10 
    } 
} 

“允许不安全的代码”必须检查这种编译。

你不能用传统的数组缓冲区溢出。它将在访问数组之前进行边界检查,除非它(CLR)可以保证它是安全的。

+2

+1用于提供示例并提及编译检查。 – 2012-02-18 18:12:00

+1

这有点不正确 - stackalloc不允许你缓冲溢出。 – 2017-10-18 02:20:45