假设C#程序仅使用托管的.NET代码,是否可能在该程序中出现缓冲区溢出安全漏洞?如果是这样,这样的脆弱性怎么可能呢?
答案 0 :(得分:49)
是的,但它们更难生产。如果使用某些不安全的结构,则只能获得缓冲区溢出,而不能使用“普通”C#代码。当您的代码以较低的信任度运行时,根本不应该存在内存损坏代码。
缓冲区溢出的几种可能性:
unsafe
关键字。不安全的代码就像C或c ++中的基于指针的代码一样容易出错。Marshal
类StructLayoutKind.Explicit
(运行时本身是用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等)中。