微軟開源了Checked C,一個旨在對C和C++增加邊界檢查的研究項目。
C和C++語言上最大的漏洞之一可能就是越界的內存訪問。根據美國國家標準技術研究所的國家漏洞數據庫數據,從2010年至2015年,緩沖區溢出占所有安全漏洞的10-16%。由于大部分系統軟件(操作系統、數據庫、編譯器、解釋器、瀏覽器等)都使用C和C++兩種語言之一編寫,許多系統都面臨內存沖突問題,這使得它們面臨故障或者受到攻擊,導致隱私信息泄露和系統被控制。來自微軟和馬里蘭大學的一群研究者正在嘗試解決這些問題,實現了Checked C,它是一個C語言的擴展和C++語言的子集,為這些語言增加邊界檢查。
不像現代語言(如Java、C#)這些自帶自動邊界檢測,將該功能加入到C語言非常困難,項目參與者、微軟研究員David Tarditi解釋道:
為C語言增加邊界檢查有兩個障礙。第一是運行時邊界信息的存放位置,第二是如何高效的進行邊界檢查。在實踐中發現,改變所有C語言指針類型和數組,以攜帶邊界信息不是一個有效的方案。C語言可能被用于系統基礎,一些硬件和標準指定了數據布局,且數據布局無法改變。同時C程序還與現存的操作系統交互,這些軟件都需要特定的數據布局。
Checked C允許程序員在C/C++中編寫“確保邊界檢查”的代碼。為了實現這個功能Checked C增加了新的指針和數組類型,它們可以在編譯期和運行時進行邊界檢查:
ptr該規范確定了變量操作行為,包括指針類型的間接尋址、數組引用、賦值、指針加法、比較、取址(&)、含邊界檢查數組類型和指針類型的轉換等。
現存的C程序可以繼續工作,很明顯C*仍然未檢查,且指針的算數運算會破壞當前代碼。但是編譯器可以通過增加參數在指針非正常使用時發出警告或者錯誤。
Checked C在GitHub上開源,包含規范、一個clang的實現和一個LLVM的實現。對此項目感興趣的開發者被邀請參與項目,即可以改進規范、提出新的功能例如類型轉換或者內存管理、增加測試,也可以擴展其他編譯器對Checked C的支持。
過去也有其他嘗試對C語言增加邊界檢查,包括使用靜態分析、增強編譯器或者運行時以避免修改語言本身、程序驗證或者創造基于C的新語言。規范的第九章“相關工作”包含了這些其他實現的細節,并且解釋了為什么作者選擇了擴展語言。
查看英文原文:Checked C - A Safer C/C++ from Microsoft