用C語言寫的程式不安全

vaikan發表於2014-04-14

  關於C語言記憶體管理薄弱的問題幾年前我們就討論過。有人試圖反駁,說現代各種作業系統或runtime平臺的進步,對記憶體管理的風險提供了各種保護,比如地址空間隨機化,還有各種諸如Valgrind這樣的工具可以發現記憶體訪問bug,大大削弱危險程度。我十分推薦大家重新閱讀一下那次討論。

  我的觀點——當時和現在——都是C語言不適合用來寫安全性要求高的程式,任何缺乏記憶體檢查機制的程式語言都不適合。很簡單,就是不適合。它們應該僅限於用來寫一些小的核心繫統,最好是小到可以用一些常規的方法(被證明的方法)進行檢查,所有其它的,包括全部應用邏輯,都應該用受控程式碼實現(例如C#,Java或其它的,我沒有偏向)。

  心臟出血就是這種缺乏邊界檢查造成的結果的另一個例子。它無法被Valgrind這樣的工具檢查出,因為它不是普通的被觸發的動作——它需要是一種惡意的行為或是一種足夠智慧的測試協議才能發現(很難很難)。

  事實上,沒有哪個程式設計師能夠聰明到可以寫出完全避免心臟出血這樣的bug的程式。畢竟,程式設計師的學習和編碼關注的是他們的程式的邏輯。在沒有邊界檢查機制的程式語言裡,邏輯可能會走錯路,因為計算機可以訪問和執行任意記憶體內容,這些內容是和你的程式裡的程式碼和變數是沒關係的。所有沒有邊界檢查的程式語言將計算機的多個維度暴露給程式,如果你覺得自己比OpenSSL開發團隊強、能很好的處理這種情況,那是自欺欺人。

  我們無法在軟體中避免bug的存在,但我們可以堵住這些看起來無窮無盡的bug的源頭。因為它,很早之前我們的網際網路就遭受了Morris蠕蟲病毒的危害。現在,2年的時間裡,世界70%的網際網路流量都暴露無疑,代價慘重。如果不堵住這源頭,以後會讓我們損失更多。

  英文原文:The Heartbleed Bug

相關文章