C#中是否可以使用缓冲区溢出漏洞?
假设C#程序仅使用托管的.NET代码,是否可能在该程序中出现缓冲区溢出安全漏洞? 如果是这样,这种脆弱性将如何可能?
是的,但它们更难生产。 如果使用某些不安全的结构,则只能获得缓冲区溢出,而不能使用“普通”C#代码。 当代码以较低的信任运行时,根本不应该存在内存损坏代码。
缓冲区溢出的几种可能性:
- 使用
unsafe
关键字,它允许指针。 不安全的代码就像c或c ++中基于指针的代码一样容易出错。 - 使用不安全的API,例如
Marshal
类中的方法 - (仅限单声道)您可以禁用arrays范围检查(安全性能与性能权衡)
除了缓冲区溢出之外,还有一些其他方法可以破坏内存。
-
StructLayoutKind.Explicit
- 错误的本机互操作签名
(运行时本身是用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等)中。