Sei Cert:c Coding Standard@2016
SEI CERT C 編碼標準(2016 年版)的核心論點旨在為使用 C 程式語言開發安全、可靠和安全的系統提供指導。這份標準的核心理念是,透過識別並消除導致程式碼出現非定義行為 (Undefined Behavior, UB) 和其他危險建構,可以顯著降低軟體漏洞的風險,進而提升系統的整體穩健性和安全性。
本標準強調,C 程式語言本身在提供低階控制和效能的同時,也伴隨著許多可能導致非定義行為的陷阱。非定義行為是指 C 語言標準未規定其結果的行為,在不同的編譯器、平台或執行環境中可能產生任意結果,從程式崩潰到允許攻擊者執行任意程式碼。因此,編寫符合標準且不觸發非定義行為的程式碼,是建立高可信度系統的基石。
標準的主要論點可以歸納為以下幾個方面:
-
消除非定義行為是安全的基礎:C 語言標準明確定義了多種非定義行為。這些行為一旦在程式執行中發生,編譯器或執行環境可以做任何事情,包括產生預期的結果、導致程式異常終止、靜默地產生錯誤結果,甚至為攻擊者提供可利用的途徑。SEI CERT C 編碼標準的核心目標之一就是指導開發人員如何避免這些非定義行為,確保程式行為的可預測性和穩定性,這是安全防禦的第一道防線。標準中列出的許多規則都直接對應 C 語言標準附錄 J.2 中列出的非定義行為清單,並提供了具體的程式碼範例和修正方法。
-
強調最佳實踐以防止常見漏洞:除了嚴格避免非定義行為外,標準還提供了針對 C 語言中常見和關鍵漏洞類型的最佳實踐。這些漏洞類型包括但不限於緩衝區溢位(如字串、陣列和記憶體操作不當)、整數安全問題(如溢位、繞回、截斷和轉換錯誤)、格式化字串漏洞、併發問題(如資料競爭和死鎖)以及記憶體管理錯誤(如使用已釋放的記憶體、二次釋放和記憶體洩漏)。標準的每一條規則都針對一個或多個特定的程式設計問題,提供了非安全範例和符合規範的解決方案,具有高度的實用性。
-
區分規則 (Rules) 與建議 (Recommendations):標準將指導方針分為「規則」和「建議」。「規則」代表了必須遵守的規範性要求,違反規則可能導致嚴重的安全、可靠性或安全性問題。「建議」則是非強制性的指引,遵循它們可以提高程式碼品質,但不違反建議不一定表示程式碼存在缺陷。這種分類幫助開發團隊根據專案需求和資源,優先處理最關鍵的安全問題,並逐步改進程式碼品質。
-
風險評估框架:為了幫助開發團隊優先處理規則違反問題,標準為每條規則提供了風險評估,包括嚴重性 (Severity)、可能性 (Likelihood) 和修復成本 (Remediation Cost)。這些因素結合起來計算出優先級別,將規則分為 Level 1、Level 2 和 Level 3。Level 1 的規則通常代表著高嚴重性、高可能性且成本中等或低的修復工作,應優先處理。這個框架提供了一個基於風險的決策依據,使得資源可以更有效地分配。
-
強調工具自動化分析的作用:標準鼓勵使用靜態分析工具來自動檢查程式碼是否符合規範。許多規則的定義方式考慮到了可分析性,並且標準與 ISO/IEC TS 17961 C 安全編碼規則技術規範相一致,後者專門為分析工具制定要求。雖然不能保證工具能夠檢測到所有違反規則的情況(靜態分析的完備性和健全性限制),但自動化分析可以大大提高檢測效率和覆蓋範圍,是實施編碼標準的關鍵手段。
-
規範開發過程:編碼標準的有效實施不僅僅是提供規則,還需要將其整合到軟體開發生命週期中。這包括開發團隊對標準進行培訓、在開發過程中持續應用標準、使用工具進行一致性檢查,以及建立偏差處理機制(在極少數情況下,可以記錄並批准對特定規則的偏差,但需有充分的安全論證)。標準還強調了與行業標準和政府法規(如美國國防部的要求)的關聯,說明遵守此類標準日益成為軟體採購和開發的強制性要求。
-
強調程式品質的系統性提升:標準不僅僅關注安全性,還將可靠性 (Reliability) 和安全性 (Safety) 作為同等重要的目標。許多安全實踐,如妥善的記憶體管理和錯誤處理,也直接影響程式的可靠性和穩健性。遵守標準有助於減少崩潰、數據損壞和其他異常行為,從而生產出更可靠、更穩定的系統。
綜上所述,SEI CERT C 編碼標準的核心論點是通過系統性地識別和規避 C 語言中的危險編程建構(特別是非定義行為),輔以風險評估和自動化工具,來提升軟體系統的安全、可靠和安全性。它提供了一個詳細且實踐性強的框架,供開發人員、組織和工具供應商遵循,以改進 C 程式碼的品質和安全性屬性。標準的成功應用需要技術實踐的改變、流程的調整以及對安全編程原則的普遍認知。
comments
comments for this post are closed