假設一個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. 常見緩衝區溢出攻擊
- 4. PHP緩衝區溢出可能嗎?
- 5. 在C中recv()有可能發生緩衝區溢出嗎?
- 6. 在Ubuntu中練習緩衝區溢出攻擊
- 7. 與execstack鏈接的fstack-protector能夠防止緩衝區溢出攻擊嗎?
- 8. 可能的緩衝區溢出問題
- 9. 緩衝區溢出攻擊實驗,意想不到的結果
- 10. C++溢出緩衝區
- 11. 緩衝區溢出(VS)緩衝區溢出(VS)堆棧溢出
- 12. 獲取SIGILL試圖執行緩衝區溢出攻擊
- 13. 緩衝區溢出攻擊不適用於內核模塊
- 14. 用緩衝區溢出攻擊修改返回地址
- 15. 如何克服緩衝區溢出攻擊?
- 16. 緩衝區溢出攻擊 - 返回堆棧地址?
- 17. 緩衝區溢出
- 18. 緩衝區溢出緩衝區長度
- 19. - 緩衝區溢出和返回到libc攻擊之間的區別
- 20. 緩衝區溢出與Web服務調用 - 有可能嗎?
- 21. Grizzly項目是否負責緩衝區溢出或拒絕服務攻擊?
- 22. 什麼是堆棧隨機化,它如何防止緩衝區溢出攻擊?
- 23. 的strtok - 緩衝區溢出
- 24. 我如何防止在iOS格式字符串攻擊,緩衝區溢出?
- 25. 如何「乾淨地」在緩衝區溢出攻擊後終止程序
- 26. 緩衝區溢出不溢出
- 27. 需要妥協的緩衝區溢出攻擊的Web服務器
- 28. 完全託管的asp.net c#web應用程序中是否存在緩衝區溢出/溢出可能
- 29. 我不能溢出緩衝區
- 30. C - 緩衝區溢出與strcpy()和strncpy()
經典意義上的緩衝區溢出,或只是任何種類的緩衝區溢出漏洞? – Dykam 2012-02-18 17:58:22
查看「未選中」和「不安全」關鍵字。 – 2012-02-18 17:59:02
@Dykam:就利用而言。 – poke 2012-02-18 18:01:20