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

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

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

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

  1. 使用unsafe关键字,它允许指针。 不安全的代码就像c或c ++中基于指针的代码一样容易出错。
  2. 使用不安全的API,例如Marshal类中的方法
  3. (仅限单声道)您可以禁用arrays范围检查(安全性能与性能权衡)

除了缓冲区溢出之外,还有一些其他方法可以破坏内存。

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

(运行时本身是用C ++编写的,因此运行时的错误也会破坏内存或溢出缓冲区,但我认为这个问题超出了这个范围)

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

 unsafe void bufferOverflow(string s) { char* ptr = stackalloc char[10]; foreach (var c in s) { *ptr++ = c; // Bufferoverflow if s.Length > 10 } } 

必须检查“允许不安全的代码”以进行编译。

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

仅当您使用unsafe关键字时。

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

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