目錄
錯誤 #1(C 或 C++)
錯誤 #2(C 或 C++)
錯誤 #3(可以是任何語言,示例為 C#)
錯誤 #4
錯誤 #5
錯誤 #6 (C#)
錯誤 #7 (C#)
錯誤 #8 (C#)
錯誤 #9 (C#)
錯誤 #10 (Silverlight CLR C#)
我們都喜歡通過復查代碼來檢查安全性錯誤。甚至可以說,我們對此非常擅長。我們並不是在自誇我們是最好的,但我們通常都可以迅速地找出大量錯誤。你能做到嗎?
如果看到一個安全性錯誤,您能否識別出來?通過進行這一測驗來評估一下。每個代碼示例都至少有一個安全漏洞。嘗試找出錯誤並看一看您的得分。在代碼後面是對這些漏洞、注釋的總結,如果條件允許,還會講述安全性開發生命周期 (SDL) 如何幫助查找這些錯誤。感謝 Peter Torr 和 Eric Lippert 提供輸入和代碼示例。
錯誤 #1(C 或 C++)
void func(char *s1, char *s2) {
char d[32];
strncpy(d,s1,sizeof d - 1);
strncat(d,s2,sizeof d - 1);
...
}
答案:我們認為應該先來講一講雖然古老但卻非常便於理解的緩沖區溢出。對許多人而言此代碼已足夠安全,因為代碼使用的是受限的 strncpy 和 strncat 函數。但是,只有當緩沖區大小合適時,這些函數才是安全的,而在本例中緩沖區大小是錯誤的。徹頭徹尾的錯誤。
從技術上講,第一個調用是安全的,但第二個調用卻是錯誤的。strncpy 和 strncat 函數的最後一個參數是緩沖區中保留的空間量,而您剛剛通過調用 strncpy 占用了其中的一部分或全部空間。緩沖區溢出。Michael 在 2004 年發表了一篇博客文章,其中講述了與此完全相同的錯誤類型。
在 Visual C++ 2005 及以後的版本中,警告 C4996 是告訴您應將錯誤的函數調用替換為更安全的調用,而 /analyze 選項會發出 C6053 警告,指出 strncat 可能不會以零終止字符串。
老實說,由於種種原因,strncpy 和 strncat(及其 "n" 同類)要比 strcpy 和 strcat(及其同類)更糟糕。首先,返回值有點多余 — 它是指向緩沖區的指針,而緩沖區可能有效,也可能無效。您沒有辦法知道!其次,獲取正確的目標緩沖區大小的確很難。如果您找出了錯誤,可以給自己加一分。