沒有對 Integer overflow 進行說明可能會導致邏輯錯誤或 buffer overflow。
程序沒有對以下事實進行說明時,會產生 Integer overflow 錯誤:算術運算會導致數值大于數據類型的最大值或者小于數據類型的最小值。用戶輸入在與帶符號的值和不帶符號的值之間的隱式轉換進行交互時會產生一些錯誤,而這些錯誤經常會導致內存分配函數出現問題。如果攻擊者能夠使程序分配的內存不足或是在進行內存操作時,將一個帶符號的值作為不帶符號的值來解析,將會使程序很容易出現 buffer overflow。
例 1:以下代碼摘自 OpenSSH 3.3,演示了一個經典的 integer overflow 案例:
nresp = packet_get_int();
if (nresp > 0) {
response = xmalloc(nresp*sizeof(char*));
for (i = 0; i < nresp; i++)
response[i] = packet_get_string(NULL);
}
nresp 已賦值 1073741824,并且 sizeof(char*) 也有了它的值 4,那么操作 nresp*sizeof(char*) 的結果將會出現溢出,而且 xmalloc() 的參數將變為 0。大多數 malloc() 接口都會樂于分配一個 0 字節的緩存,因此會造成無限循環而致使溢出堆緩存 response。
char* processNext(char* strm) {
char buf[512];
short len = *(short*) strm;
strm += sizeof(len);
if (len <= 512) {
memcpy(buf, strm, len);
process(buf);
return strm + len;
} else {
return -1;
}
}
512,則不會進行處理。這里的問題在于:len 是一個帶符號整數,那么針對最大的結構長度的檢查也可以是帶符號的整數,但是為了調用 memcpy(),len 又會被轉換為不帶符號的整數。如果 len 為負數,那么它會顯示該結構有合適的大小(if 分支將會被采用),但是通過 memcpy() 拷貝的內存量將會變得很大,從而使攻擊者有機會在 strm 中溢出堆棧數據。
[1] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A1 Unvalidated Input
[2] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3510 CAT I, APP3550 CAT I
[3] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3510 CAT I, APP3550 CAT I
[4] blexim Basic Integer Overflows Phrack
[5] D. Plakosh Coding Flaws That Lead to Security Failures
[6] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 190
[7] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 - (PCI 1.2) Requirement 6.3.1.1
[8] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.1, Requirement 6.5.5
[9] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 - (PCI 2.0) Requirement 6.5.2
[10] Standards Mapping - SANS Top 25 2010 - (SANS 2010) Risky Resource Management - CWE ID 190
[11] Standards Mapping - SANS Top 25 2011 - (SANS Top 25 2011) Risky Resource Management - CWE ID 190
[12] Standards Mapping - SANS Top 25 2009 - (SANS 2009) Risky Resource Management - CWE ID 682
[13] Standards Mapping - FIPS200 - (FISMA) SI