假设一个C#程序只使用托管.NET代码,那么在该程序中是否有可能存在缓冲区溢出安全漏洞?如果是这样,那么这样的漏洞怎么可能呢?在C#中缓冲区溢出攻击是可能的吗?
回答
是的,但它们很难生产。如果您使用某些不安全的构造,而不是“普通的”C#代码,则只能获得缓冲区溢出。当代码运行时信任度降低时,内存破坏代码根本不应该成为可能。
为缓冲区溢出的一些可能性:
- 使用
unsafe
关键字,它允许指针。不安全的代码就像c或C++中基于指针的代码一样容易出错。 - 使用不安全的API,如从
Marshal
类的方法 - (仅适用于黑白),您可以禁用阵列范围检查(安全与性能之间的权衡)
也有一些其他的方式除缓冲区溢出外,还会破坏内存。
StructLayoutKind.Explicit
- 错误的本地互操作签名
(运行时本身是用C++写的,所以在运行时的错误,也损坏内存或缓冲区溢出,但我认为,出这个问题的范围)
只有在使用unsafe
关键字时才有效。
从绝对意义上说,是的,由于.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)可以保证它是安全的。
+1用于提供示例并提及编译检查。 – 2012-02-18 18:12:00
这有点不正确 - stackalloc不允许你缓冲溢出。 – 2017-10-18 02:20:45
- 1. 缓冲区溢出攻击
- 2. 常见缓冲区溢出攻击
- 3. PHP缓冲区溢出可能吗?
- 4. 在Ubuntu中练习缓冲区溢出攻击
- 5. 与execstack链接的fstack-protector能够防止缓冲区溢出攻击吗?
- 6. 缓冲区溢出攻击实验,意想不到的结果
- 7. C++溢出缓冲区
- 8. 缓冲区溢出(VS)缓冲区溢出(VS)堆栈溢出
- 9. 缓冲区溢出攻击 - 返回堆栈地址?
- 10. 获取SIGILL试图执行缓冲区溢出攻击
- 11. 缓冲区溢出
- 12. 缓冲区溢出缓冲区长度
- 13. - 缓冲区溢出和返回到libc攻击之间的区别
- 14. 缓冲区溢出与Web服务调用 - 有可能吗?
- 15. Grizzly项目是否负责缓冲区溢出或拒绝服务攻击?
- 16. 的strtok - 缓冲区溢出
- 17. 如何“干净地”在缓冲区溢出攻击后终止程序
- 18. 缓冲区溢出不溢出
- 19. 需要妥协的缓冲区溢出攻击的Web服务器
- 20. 完全托管的asp.net c#web应用程序中是否存在缓冲区溢出/溢出可能
- 21. c malloc防止缓冲区溢出
- 22. C#发生缓冲区溢出
- 23. C简单缓冲区溢出
- 24. C - 缓冲区溢出与strcpy()和strncpy()
- 25. 缓冲区溢出与gets()
- 26. PaX和缓冲区溢出
- 27. JSP缓冲区溢出
- 28. 缓冲区溢出为homeowrk
- 29. 过程缓冲区溢出
- 30. 试验缓冲区溢出
经典意义上的缓冲区溢出,或只是任何种类的缓冲区溢出漏洞? – Dykam 2012-02-18 17:58:22
查看“未选中”和“不安全”关键字。 – 2012-02-18 17:59:02
@Dykam:就利用而言。 – poke 2012-02-18 18:01:20