核心概念
本文提出一個靜態分析框架,旨在編譯期間偵測 C++ 程式碼中的釋放後使用(use-after-free)錯誤,並向程式設計師報告錯誤,以利於軟體開發早期階段修復漏洞,提升軟體安全性。
摘要
論文資訊
- 作者:Vlad-Alexandru Teodorescu & Dorel Lucanu
- 出處:第八屆形式化方法研討會 (FROM 2024)
- 出版資訊:EPTCS 410, 2024, pp. 99–115, doi:10.4204/EPTCS.410.7
研究背景
C++ 程式語言中的指標功能雖然強大,但若使用不當,容易造成程式錯誤和安全漏洞,例如釋放後使用錯誤。釋放後使用錯誤發生於程式嘗試存取已經釋放的記憶體區塊時,可能導致程式崩潰或安全漏洞。
研究方法
本論文提出的靜態分析框架透過以下步驟偵測釋放後使用錯誤:
- 程式碼轉換: 將 C++ 程式碼轉換為簡化的模型語言,區分變數類型(擁有者、指標、值),並將記憶體操作轉換為特定指令(allocate、lookup、mutate、deallocate)。
- 控制流程圖分析: 建立程式碼的控制流程圖,並使用資料流分析計算每個節點的指向集(points-to-set),追蹤指標可能指向的記憶體區塊。
- 錯誤偵測: 根據指向集資訊,檢查是否存在釋放後使用錯誤,例如指標指向已經釋放的記憶體區塊。
實驗結果
作者使用人工撰寫的測試案例和真實世界的專案評估框架的效能。結果顯示該框架能夠有效偵測多種釋放後使用錯誤,並提供詳細的錯誤訊息,協助程式設計師快速定位問題。
優點
- 早期偵測: 在編譯階段就能偵測錯誤,有助於及早發現並修復問題。
- 精確分析: 透過指向集分析,精確追蹤指標指向的記憶體區塊,減少誤報率。
- 易於使用: 整合至 Clang 編譯器,方便程式設計師使用。
局限性
- 需要程式碼註解: 對於未明確標註 const 的函式或變數,可能產生誤報。
- 無法處理共享所有權: 無法有效分析 std::shared_ptr 等共享所有權的類型。
未來方向
- 改進類型分類規則,以識別共享所有權語義。
- 提升分析能力,自動推導 const 等資訊,減少對程式碼註解的依賴。
- 研究跨函式分析,以偵測更複雜的錯誤模式。
統計資料
超過 66% 的網際網路活躍網站受到 Heartbleed 漏洞影響。
測試框架時,使用了超過 100 個手寫的小型測試案例和 5 個真實世界的專案。
在 102 個錯誤偵測測試中,針對現代 C++ 程式碼的準確率為 96.96%,常規程式碼為 85.7%,而基礎程式碼則為 52.94%。
引述
"Making secure software is crucial, as vulnerabilities exploited by malicious actors not only lead to monetary losses, but possibly loss of human lives."
"Fixing these vulnerabilities is costly if they are found at the end of development, and the cost will be even higher if found after deployment. That is why it is desirable to find the bugs as early in the development process as possible."