C#中是否可能存在缓冲区溢出漏洞攻击?

C#中是否可能存在缓冲区溢出漏洞攻击?,c#,.net,security,C#,.net,Security,假设一个C#程序只使用托管的.NET代码,那么该程序中是否可能存在缓冲区溢出安全漏洞?如果是这样的话,这种漏洞怎么可能呢?只有在您使用关键字时才有可能 从绝对意义上说,是的,由于.NET运行时中的错误,缓冲区攻击是可能的。然而.NET阻止了大多数终端用户代码(除了“不安全”的使用)出现这些问题,所以在现实生活中风险较小 在现实生活中,像这样的大多数问题都会发生在从托管代码调用的本机调用(COM DLL等)中。是的,在不安全的环境中: unsafe void bufferOverflow(stri

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

只有在您使用关键字时才有可能

从绝对意义上说,是的,由于.NET运行时中的错误,缓冲区攻击是可能的。然而.NET阻止了大多数终端用户代码(除了“不安全”的使用)出现这些问题,所以在现实生活中风险较小


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

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

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

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


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

是的,但它们更难生成。只有使用某些不安全的构造,而不是使用“正常”C#代码,才能导致缓冲区溢出。当您的代码在信任度较低的情况下运行时,根本不可能出现内存损坏代码

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

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

  • StructLayoutKind.Explicit
  • 错误的本机互操作签名

  • (运行时本身是用C++编写的,所以运行时的bug也会损坏内存或溢出缓冲区,但我认为超出这个范围)经典意义上的缓冲区溢出。或者仅仅是任何类型的缓冲区溢出漏洞利用?检查

    未检查的
    不安全的
    关键字。@Dykam:从漏洞利用的意义上说。虽然.NET可能会使创建传统的缓冲区溢出漏洞成为一种挑战,即覆盖数据或代码,但它不能保证正确处理异常。例如,如果用户输入30个字符的用户名,应用程序将其交给接受16个字符字段的存储过程,则应引发异常。(没有人喜欢无声截断,对吧?),没有一个“捕获所有”处理程序会忽略异常,转而使用假定用户已通过身份验证的代码。+1用于提供示例并提及编译检查。这有点不正确-stackalloc不允许您缓冲区溢出。