2012-02-18 96 views
24

假設一個C#程序只使用託管.NET代碼,那麼在該程序中是否有可能存在緩衝區溢出安全漏洞?如果是這樣,那麼這樣的漏洞怎麼可能呢?在C#中緩衝區溢出攻擊是可能的嗎?

+0

經典意義上的緩衝區溢出,或只是任何種類的緩衝區溢出漏洞? – Dykam 2012-02-18 17:58:22

+0

查看「未選中」和「不安全」關鍵字。 – 2012-02-18 17:59:02

+0

@Dykam:就利用而言。 – poke 2012-02-18 18:01:20

回答

43

是的,但它們很難生產。如果您使用某些不安全的構造,而不是「普通的」C#代碼,則只能獲得緩衝區溢出。當代碼運行時信任度降低時,內存破壞代碼根本不應該成爲可能。

爲緩衝區溢出的一些可能性:

  1. 使用unsafe關鍵字,它允許指針。不安全的代碼就像c或C++中基於指針的代碼一樣容易出錯。
  2. 使用不安全的API,如從Marshal類的方法
  3. (僅適用於黑白),您可以禁用陣列範圍檢查(安全與性能之間的權衡)

也有一些其他的方式除緩衝區溢出外,還會破壞內存。

  1. StructLayoutKind.Explicit
  2. 錯誤的本地互操作簽名

(運行時本身是用C++寫的,所以在運行時的錯誤,也損壞內存或緩衝區溢出,但我認爲,出這個問題的範圍)

3

從絕對意義上說,是的,由於.NET運行時中的錯誤,緩衝區利用是可能的。然而,.NET阻止了大多數最終用戶代碼(除了'不安全'的用法),所以在現實生活中它的風險較小。

在現實生活中,像這樣的大多數問題都會從託管代碼調用的本地調用(COM dll等)中發生。

14

是,在不安全的環境:

unsafe void bufferOverflow(string s) 
{ 
    char* ptr = stackalloc char[10]; 

    foreach (var c in s) 
    { 
     *ptr++ = c; // Bufferoverflow if s.Length > 10 
    } 
} 

「允許不安全的代碼」必須檢查這種編譯。

你不能用傳統的數組緩衝區溢出。它將在訪問數組之前進行邊界檢查,除非它(CLR)可以保證它是安全的。

+2

+1用於提供示例並提及編譯檢查。 – 2012-02-18 18:12:00

+1

這有點不正確 - stackalloc不允許你緩衝溢出。 – 2017-10-18 02:20:45