- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 1107字
- 2020-10-30 17:56:48
2.8 小結
當在為一個特定數據結構分配的內存的邊界之外寫入數據時,就會發生緩沖區溢出。緩沖區溢出在C和C++程序中司空見慣,因為這兩種語言:(1)將字符串定義為以空字符結尾的字符數組;(2)不進行隱式的邊界檢查;(3)提供了不執行邊界檢查的標準字符串調用庫。這些屬性與程序員的漫不經心交織在一起,導致了緩沖區溢出漏洞的發生。
緩沖區溢出是一個棘手的問題,因為在軟件應用程序的開發和測試階段都難以偵測到它們。常用的C和C++編譯器在編譯時并不識別可能的緩沖區溢出情形,在運行時也不會報告緩沖區溢出異常。只有當測試數據能夠引發一個可偵測的溢出時,才能使用動態分析工具來探查緩沖區溢出。
并非所有的緩沖區溢出都會導致可利用的軟件漏洞。然而,如果程序的輸入數據是由(可能懷有惡意的)用戶控制的,那么緩沖區溢出就很可能會造成程序漏洞,從而易受攻擊。甚至那些不屬于明顯漏洞的緩沖區溢出也可能會招致危險。
緩沖區溢出是軟件漏洞的一個主要來源。未提供類型安全的語言,例如C和C++,尤其容易產生這種漏洞?,F有的利用代碼已經存在于多種流行的軟硬件平臺上,包括Windows、Linux、Solaris和其他一些常見的操作系統,以及常見的硬件架構如Intel、SPARC和Motorola。
針對這種情況,常見的緩解策略就是采用新的、提供更多安全保障的字符串操作庫?,F在已經有很多這種類型的替代庫和函數,它們有著自己的設計哲學,用戶可根據自身需要選用。例如,C11附錄K邊界檢查接口就是為既有函數調用設計的方便的替代品。因此,這些函數可以作為預防性的維護措施,以減少現有遺留代碼庫產生漏洞的可能性。在選擇一個適當的程序設計途徑時,往往需要在方便和安全之間作出權衡。對于一個給定的輸入集合,更安全的函數通常都擁有更多的錯誤條件,而不那么安全的函數則是盡力給出有效的結果。對庫的選擇也受到所選擇的語言、平臺以及可移植性問題的制約。
現在已經有一些可行的緩解策略,它們有助于消除由于緩沖區溢出所導致的漏洞。采用所有可用的避免策略是不實際的,因為每一種策略都要付出工作量,都有時間和許可費用的開銷。不過,有些策略彼此互補得很好。在審查源代碼的過程中,靜態分析可用于識別潛在的問題。源代碼審查和測試需要分析相同的問題,因此也會分攤一些開銷??梢越Y合使用動態分析和測試手段來識別溢出條件。
運行時解決方案,例如邊界檢查、探測儀和安全庫,都具有運行時性能開銷并且可能發生沖突。例如將探測儀與安全庫一起使用并無意義,因為它們多是以不同的方式執行或多或少相同的功能。
緩沖區溢出是最常見的軟件漏洞來源,因此絕不應輕視它。我們建議,只要有可能的話,最好采用多種策略進行深層防御(defense-in-depth)。然而,預防緩沖區溢出的首要策略是教育開發者如何避免寫出有漏洞的代碼。
- 數據科學實戰手冊(R+Python)
- 程序員面試白皮書
- JavaScript 從入門到項目實踐(超值版)
- Learning SQLite for iOS
- VMware vSphere 6.7虛擬化架構實戰指南
- ASP.NET 3.5程序設計與項目實踐
- 零基礎學Python網絡爬蟲案例實戰全流程詳解(高級進階篇)
- Oracle 18c 必須掌握的新特性:管理與實戰
- OpenCV 4計算機視覺項目實戰(原書第2版)
- D3.js By Example
- Building Business Websites with Squarespace 7(Second Edition)
- Python硬件編程實戰
- Python高性能編程(第2版)
- Spring Microservices
- Mastering VMware Horizon 6