避免緩衝區溢出
緩衝區溢位是造成安全風險的最常見原因之一。 緩衝區滿溢基本上是因為將未核取的外部輸入視為可信任的數據所造成。 使用複製此數據的動作,例如 CopyMemory、strcat、strcpy或 wcscpy等作業,可以建立非預期的結果,以允許系統損毀。 在最好的情況下,您的應用程式會因核心傾印、分割錯誤或存取違規而終止。 在最壞的情況下,攻擊者可以藉由在您的程序中引進和執行其他惡意程式碼,來利用緩衝區滿溢。 將未檢查的輸入數據複製到基於堆疊的緩衝區是最常見的可利用的漏洞成因。
緩衝區滿溢可能通過多種方式發生。 下列清單提供一些緩衝區滿溢情況的簡短簡介,並提供一些想法和資源,以協助您避免建立新的風險並減輕現有的風險:
-
靜態緩衝區滿溢
-
當對已宣告在堆疊上的緩衝區寫入超過其分配容量的數據時,就會發生靜態緩衝區溢位。 當未驗證的使用者輸入數據直接複製到靜態變數,造成潛在的堆疊損毀時,就會發生較不明顯的此錯誤版本。
-
堆積滿溢
-
堆區溢出,如同靜態緩衝區溢出,可能會導致記憶體和堆疊損毀。 因為堆積緩衝區溢位發生在堆積記憶體中,而不是在堆疊上發生,因此有些人認為它們無法造成嚴重的問題;不過,堆積緩衝區溢位需要謹慎的程式設計,同樣有可能造成系統風險,與靜態緩衝區溢位一樣。
-
陣列索引編製錯誤
-
陣列索引錯誤也是記憶體溢出的來源。 仔細進行界限檢查和索引管理有助於防止這種類型的記憶體溢位。
防止緩衝區滿溢主要是關於撰寫良好的程序代碼。 請務必驗證所有輸入,並在必要時以合宜的方式處理失敗。 如需撰寫安全程式代碼的詳細資訊,請參閱下列資源:
- 馬奎爾,史蒂夫 [1993],撰寫穩固程式代碼,ISBN 1-55615-551-4,Microsoft Press,Redmond,Washington。
- 霍華德、邁克爾和勒布朗、戴維 [2003],撰寫安全代碼,第二版,ISBN 0-7356-1722-8,Microsoft出版社,華盛頓雷德蒙德。
注意
某些語言和國家/地區可能無法使用這些資源。
安全字串處理是一個長期問題,這需要透過遵循良好的程式設計做法,並且通常通過使用和改造具備安全字串處理功能的現有系統來持續解決。 此類 Windows 殼層函式的範例始於 StringCbCat。