避免緩衝區溢位

緩衝區溢位是安全性風險最常見的來源之一。 緩衝區溢位基本上是因為將未核取的外部輸入視為可信任的資料所造成。 使用 CopyMemorystrcatstrcpywcscpy等作業來複製此資料的行為,可以建立非預期的結果,這可讓系統損毀。 在最佳情況下,您的應用程式會中止核心傾印、分割錯誤或存取違規。 在最糟的情況下,攻擊者可以在程式中引進並執行其他惡意程式碼,以利用緩衝區溢位。 將未核取的輸入資料複製到堆疊式緩衝區,是惡意探索錯誤最常見的原因。

緩衝區溢位可能會以各種方式發生。 下列清單提供一些緩衝區過度執行情況的簡介,並提供一些想法和資源,協助您避免建立新的風險並減輕現有的風險:

靜態緩衝區溢出

當堆疊上宣告的緩衝區寫入時,會寫入資料超過配置保留的資料時,就會發生靜態緩衝區溢出。 當未驗證的使用者輸入資料直接複製到靜態變數時,就會發生此錯誤較不明顯的版本,因而造成潛在的堆疊損毀。

堆積滿溢

堆積溢出,例如靜態緩衝區溢出,可能會導致記憶體和堆疊損毀。 因為堆積溢出發生在堆積記憶體中,而不是在堆疊上,所以有些人員認為它們無法造成嚴重問題;不過,堆積溢出需要實際的程式設計小心,而且就像允許系統風險一樣,因為靜態緩衝區溢出。

陣列索引編制錯誤

陣列索引編制錯誤也是記憶體溢出的來源。 仔細檢查和索引管理有助於防止這種類型的記憶體溢出。

防止緩衝區溢位主要是撰寫良好的程式碼。 請視需要一律驗證所有輸入,並正常失敗。 如需撰寫安全程式碼的詳細資訊,請參閱下列資源:

  • Maguire、Steve [1993]、 撰寫實心程式碼、ISBN 1-55615-551-4、Microsoft Press、Redmond、Washington。
  • Howard、Michael 和 LeBlanc、David [2003]、 撰寫安全程式碼、2d ed.、ISBN 0-7356-1722-8、Microsoft Press、Redmond、Washington。

注意

某些語言和國家/地區可能無法使用這些資源。

 

安全字串處理是長期的問題,可透過遵循良好的程式設計作法,並經常使用現有系統並搭配安全、字串處理函式來解決。 Windows 殼層這類函式的範例會以 StringCbCat開頭。