C#中是否可以使用缓冲区溢出漏洞?

时间:2012-02-18 17:57:49

标签: c# .net security

假设C#程序仅使用托管的.NET代码,是否可能在该程序中出现缓冲区溢出安全漏洞?如果是这样,这样的脆弱性怎么可能呢?

4 个答案:

答案 0 :(得分:49)

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

缓冲区溢出的几种可能性:

  1. 使用允许指针的unsafe关键字。不安全的代码就像C或c ++中的基于指针的代码一样容易出错。
  2. 使用不安全的API,例如Marshal
  3. 中的方法
  4. (仅限单声道)您可以禁用阵列范围检查(安全性与性能权衡)
  5. 除了缓冲区溢出之外,还有一些其他方法可以破坏内存。

    1. StructLayoutKind.Explicit
    2. 错误的原生互操作签名
    3. (运行时本身是用C ++编写的,所以运行时的错误也会破坏内存或溢出缓冲区,但我认为这个问题超出了这个范围)

答案 1 :(得分:19)

是的,在不安全的环境中:

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

    foreach (var c in s)
    {
        *ptr++ = c; // Bufferoverflow if s.Length > 10
    }
}
必须检查“允许不安全的代码”以进行编译。

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

答案 2 :(得分:5)

仅当您使用unsafe关键字时。

答案 3 :(得分:5)

从绝对意义上讲,是的,由于.NET运行时中的错误,缓冲区漏洞是可能的。但是,.NET会阻止大多数最终用户代码(“不安全”使用除外)这些问题,因此在现实生活中风险较小。

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