依賴于適當的字符串終止可能會導致 buffer overflow。
string termination error 在以下情況下出現:
1. 數據通過某一函數進入程序,而該函數不會以 “\0” 結尾來結束輸入。
2. 數據被傳遞到某一函數,而該函數需要以 “\0” 結尾來結束輸入。
例 1:以下代碼讀取自 cfgfile,并使用 strcpy() 將輸入的內容拷貝到 inputbuf 中。但是,該代碼錯誤的假定了 inputbuf 將永遠包含一個 “\0” 終止符。
#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null terminate
strcpy(pathbuf,inputbuf); //requires null terminated input
...
cfgfile 中讀取的數據如期望的那樣都是以 “\0” 結尾,那么該代碼可正確的執行。但是如果攻擊者能夠篡改輸入的信息,以使其不包含所需 “\0” 這個字符,那么調用 strcpy() 將在內存中連續地進行復制,直到遇到任意 “\0” 結尾的字符。這就可能會溢出目標緩沖區,更有甚者,如果攻擊者能夠即時跟蹤 inputbuf 并控制內存內容,那么會使應用程序受到 buffer overflow 的攻擊。readlink() 對存儲在緩沖區 path 上的某個符號鏈接名進行了擴展,以使緩沖區 buf 包含可通過該符號鏈接而引用的文件的絕對路徑。而最終的 buf 長度值將通過 strlen() 來計算。
...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...
readlink() 而讀取至 buf 中的數值不會以 “\0” 結尾。在測試過程中,類似于這樣的漏洞可能不會被捕捉到,因為 buf 中未使用的內容或是對這些內容進行即時跟蹤的內存可能都是空的,因此使得 strlen() 看上去仿佛執行了正確的操作。然而,在默認情況下,strlen() 將持續遍歷內存,直到其在棧中遇到任意一個以 “\0” 結尾的字符,這就會導致 length 的值遠遠大于 buf 的大小,從而在隨后使用該值的操作中可能會造成 buffer overflow。 [1] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A5 Buffer Overflow
[2] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3510 CAT I, APP3590.1 CAT I
[3] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3510 CAT I, APP3590.1 CAT I
[4] Standards Mapping - Web Application Security Consortium 24 + 2 - (WASC 24 + 2) Buffer Overflow
[5] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 170
[6] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 - (PCI 1.2) Requirement 6.3.1.1
[7] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 - (PCI 2.0) Requirement 6.5.2
[8] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.5
[9] Standards Mapping - SANS Top 25 2009 - (SANS 2009) Risky Resource Management - CWE ID 665
[10] Standards Mapping - SANS Top 25 2010 - (SANS 2010) Risky Resource Management - CWE ID 665
[11] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press