如今,軟件安全是重中之重。任何的安全漏洞都不能被忽視——尤其是開發(fā)嵌入式系統(tǒng)軟件時,您的代碼必須安全可靠,且沒有編碼錯誤。
提及軟件安全,您可能想到的是密碼和訪問控制,或者是病毒、欺騙攻擊(spoofing)和網絡釣魚攻擊,這些是常見的安全問題。而數據加密和身份驗證協(xié)議等安全功能可以緩解這些漏洞。
但即使已經實施了這些安全功能,軟件仍可能受到攻擊。
為確保軟件安全,您需要從源頭——代碼層面——進行著手。否則,編碼錯誤將會危及您的應用程序。
編碼錯誤危及軟件安全
據軟件工程研究所(SEI)估計,高達90%的已報告安全事件是源于軟件代碼或設計中的漏洞被利用。這些漏洞使黑客能夠訪問私人數據或未經授權的控制系統(tǒng)。
可見,一個簡單的編碼錯誤就可能引發(fā)黑客攻擊威脅——黑客可能會控制您的計算機、智能家居設備、家庭娛樂設備甚至是汽車。更糟糕的是,黑客甚至可能控制核電站。
安全漏洞示例:C語言中的緩沖區(qū)溢出
為說明這種情況可能如何發(fā)生,我們來看一個例子。緩沖區(qū)溢出是C語言編程中常見的安全漏洞。
當數據被寫入到已分配內存的邊界之外時,就會發(fā)生緩沖區(qū)溢出。
為說明這種情況可能如何發(fā)生,我們來看一個例子。緩沖區(qū)溢出是C語言編程中常見的安全漏洞。
延伸閱讀:什么是緩沖區(qū)溢出?如何防止緩沖區(qū)溢出漏洞?
例如:
char buff[10]; buff[10] = 'a';
此處聲明了一個10字節(jié)的數組(索引范圍0到9)。但程序隨后試圖向數組邊界外的一個字節(jié)寫入字符。若程序后續(xù)使用了數組相鄰的內存區(qū)域,則會導致意外行為。
這已經夠糟糕了,而情況可能會進一步惡化——緩沖區(qū)溢出可能使黑客獲得系統(tǒng)控制權。
緩沖區(qū)溢出如何招致黑客攻擊?
黑客可以利用緩沖區(qū)溢出漏洞進行攻擊,致使程序崩潰、數據損壞,或直接竊取信息。
程序運行時會使用一塊稱為“棧”的內存區(qū)域。當前執(zhí)行函數作用域內的變量將存儲在棧中。函數調用的地址也會被存儲,以便返回語句能返回到正確的位置。
當函數返回到調用函數時,程序將從上次中斷的地方繼續(xù)執(zhí)行。因此,如果棧中的返回地址被篡改為指向某些惡意的替代指令,那么,這些指令將在函數返回時被執(zhí)行。
如果程序正在接收數據——且未設置檢查機制來確保輸入緩沖區(qū)不會溢出——那么就有可能設計一個包含惡意代碼的輸入或“有效負載”。這種惡意代碼會溢出輸入緩沖區(qū),并將棧中的返回地址覆蓋為惡意代碼的地址。
預防安全漏洞至關重要
預防緩沖區(qū)溢出等安全漏洞至關重要。而實現(xiàn)這一目標的方法,就是確保在編碼時就杜絕可被利用的漏洞。
畢竟,如果窗戶敞開著,加裝再堅固的門鎖也毫無意義。因此,提高安全性的關鍵,就是確保代碼安全。
確保C語言代碼安全的四種方法
編寫安全的代碼至關重要。在C語言編程中,有四個關鍵信息來源可幫助您確保代碼安全。
1. CWE
您可以從通用缺陷枚舉(CWE)中識別安全弱點。
什么是CWE?
CWE是由社區(qū)開發(fā)的C語言常見軟件安全弱點列表,由MITRE公司維護。該列表可用作弱點識別、緩解和預防的基線。
CWE軟件安全弱點列表
CWE列表對弱點進行了優(yōu)先級排序。其中的“Top 25”(前25)條是綜合了二十多個不同機構的意見評選出來的。他們根據弱點出現(xiàn)的頻率和重要性對其進行評估。CWE中列出的(C語言程序中的)許多弱點都與緩沖區(qū)溢出有關。
這份Top 25列表還附帶了一組有效的“強效緩解措施”。這些措施可幫助開發(fā)者減少甚至徹底消除Top 25中的整類安全弱點,同時也有助于應對CWE列表中記錄的其他800多個弱點。
CWE致力于從源頭遏制漏洞,其實現(xiàn)方式是教育設計人員、程序員和測試人員如何在軟件發(fā)布前就消除常見錯誤。
2. CERT C
您可以將CERT C編碼標準應用于您的代碼。
什么是CERT C?
CERT C編碼標準由軟件工程研究所(SEI)的CERT部門發(fā)布。SEI是卡內基梅隆大學運營的研發(fā)中心,它的資金主要來源于美國國防部和國土安全部。
CERT C安全規(guī)則
安全編碼專家會持續(xù)在維基平臺上完善CERT C指南。每項指南包括:
– 標題
– 描述
– 不合規(guī)代碼示例
– 合規(guī)解決方案示例
該指南涵蓋編碼和實現(xiàn)錯誤,以及低級設計錯誤。其目標是消除不安全的編碼實踐和可能導致漏洞的未定義行為。
CERT C將漏洞定義為:一組允許攻擊者違反明確或隱含安全策略的條件。
缺陷可能較為輕微,也可能不會影響軟件的性能或運行結果,但它仍可能被攻擊者利用,從而導致重大的安全漏洞。
3. ISO/IEC TS 17961:2013 "C Secure"
您可以應用ISO/IEC TS 17961:2013 “C Secure” 編碼規(guī)則。
什么是ISO/IEC TS 17961:2013?
ISO/IEC TS 17961:2013制定了一套編碼規(guī)則,這些規(guī)則使靜態(tài)代碼分析工具能夠診斷超出語言標準要求的不安全代碼。
C Secure編碼規(guī)則
ISO/IEC TS 179671:2013包含了C語言安全編碼的規(guī)則,每條規(guī)則都包含示例。
C Secure旨在制定可以自動強制執(zhí)行的安全編碼規(guī)則,用于檢測C語言編程中的安全缺陷。要被視作安全缺陷,軟件漏洞必須能被惡意用戶或攻擊者的行為觸發(fā)。
實施這些規(guī)則的分析工具必須能夠有效發(fā)現(xiàn)安全編碼錯誤,且不會產生過多的誤報。
4. MISRA C
您也可以使用MISRA來確保C語言的安全編碼。
什么是MISRA?
MISRA為安全相關系統(tǒng)的開發(fā)提供最佳實踐指南。其C語言編碼標準已被多個行業(yè)廣泛采用。
MISRA C 安全規(guī)則
MISRA C:2012 修訂版1于2016年發(fā)布。該版本為C語言編程提供了額外的安全指南,包括新的規(guī)則和指令,并附有合規(guī)和不合規(guī)的代碼示例。
這些指南可用于預防導致安全問題和安全漏洞的編碼錯誤。
為什么MISRA C安全規(guī)則是嵌入式系統(tǒng)的理想選擇?
MISRA C安全規(guī)則是嵌入式系統(tǒng)的理想選擇。這是因為MISRA C的安全性可與其它C語言安全編碼標準相媲美。此外,MISRA C在嵌入式系統(tǒng)行業(yè)中深受信賴,更是汽車行業(yè)首選的編碼標準。
MISRA C安全規(guī)則示例
MISRA C安全規(guī)則可防止編碼錯誤和安全漏洞,例如緩沖區(qū)溢出。
以下是MISRA C安全規(guī)則的示例:
MISRA C 規(guī)則 18.1
“對指針操作數進行算術運算后得到的指針,其地址應指向與該指針操作數相同的數組內的元素。”
此規(guī)則與以下CERT C規(guī)則作用相同:
ARR30-C
“請勿創(chuàng)建或使用越界指針或數組下標。”
兩者都與C語言中的多個CWE漏洞相關,其中之一是:
CWE-119:對內存緩沖區(qū)邊界內的操作限制不當
“該軟件在內存緩沖區(qū)上執(zhí)行操作,但可能讀取或寫入超出緩沖區(qū)預期邊界范圍的內存位置。”
遵循MISRA C規(guī)則或CERT規(guī)則可確保代碼安全,并規(guī)避CWE中的常見漏洞。這是因為寫入越界指針(或指針操作數)可能導致緩沖區(qū)溢出,從而產生易受攻擊的代碼;而讀取越界指針(或指針操作數)則可能意外泄露信息給黑客。
因此,通過確保遵循這些規(guī)則,將避免嚴重的編碼錯誤。您可以使用靜態(tài)代碼分析工具(如Perforce QAC)來強制執(zhí)行MISRA和CERT規(guī)則。
MISRA C與其他標準的比較
MISRA C編碼標準也適用于軟件安全性比功能安全性更受重視的環(huán)境。
事實上,MISRA針對MISRA C:2012標準發(fā)布了兩個附錄,以幫助開發(fā)者將MISRA規(guī)則映射到C Secure和CERT C標準。
MISRA C和C Secure比較
MISRA C:2012 – 附錄2展示了每條MISRA規(guī)則如何映射到ISO/IEC TS 17961:2013中的C Secure規(guī)則。
MISRA C對C Secure的覆蓋:90%規(guī)則,10%指令。C Secure中的每條規(guī)則都對應MISRA C中的一條規(guī)則或指令。任何完全支持MISRA C的靜態(tài)代碼分析工具(如Perforce QAC),也將符合C Secure標準。因此,您可以靈活互換使用這些標準以確保安全。
MISRA C和CERT C比較
MISRA C:2012 – 附錄3展示了每條規(guī)則如何映射到CERT C規(guī)則。
MISRA C對CERT C的覆蓋:60%規(guī)則,20%指令,15%超出范圍,5%未覆蓋。CERT C是為C11設計的。MISRA C:2012是為C99設計的。
在CERT C規(guī)范中,有15條特定于C11的規(guī)則超出了MISRA C:2012的范圍。而在(MISRA C:2012范圍內的)CERT C規(guī)則中,只有四條未被覆蓋。因此,MISRA C覆蓋了CERT C中的大部分安全規(guī)則。
注:使用Perforce QAC可自動檢測這四條規(guī)則的全部違規(guī)情況。
將MISRA安全規(guī)則應用于您的代碼
MISRA編碼標準為確保C語言代碼的安全性提供了一套最佳實踐準則。采用MISRA安全規(guī)則是保障軟件整體安全性的明智之選。
如果您需要采用一種編碼標準,以增強對軟件安全性的信心,建議考慮MISRA C標準。該C語言編碼規(guī)范內容全面,并已在安全與關鍵任務項目中被證明行之有效。
使用Perforce QAC編寫安全代碼
您可以借助Perforce QAC自動執(zhí)行MISRA規(guī)則(適用于C或C++語言),這將大幅減少手動代碼審查所需的時間,從而釋放開發(fā)資源,確保項目按時交付,同時提升軟件質量。
Perforce QAC 主要通過以下機制幫助開發(fā)人員高效編寫安全代碼:
1. 精準定位違規(guī)代碼,即時修復
實時診斷:支持 MISRA C 和 CERT C 標準,能在 IDE 中直接以“氣泡”形式標記違規(guī)代碼,實現(xiàn)“邊寫邊查”。
增量分析:僅分析修改過的代碼文件,無需等待全量編譯,大幅提升修復效率。
所見即所得:雙擊報錯即可跳轉至代碼具體行(如死代碼、非法指針轉換),快速修正。
2. 風險分級,聚焦核心
嚴重性過濾:允許開發(fā)者通過過濾器(Severity Filter)屏蔽次要警告,優(yōu)先解決“除以零”、“空指針”等高危致命漏洞。
復雜度監(jiān)控:自動計算函數圈復雜度,幫助團隊快速識別出難以維護、易藏漏洞的“高風險代碼塊”進行重構。
3. 閉環(huán)管理,審計無憂
合規(guī)例外管理:針對無法修復的規(guī)則違規(guī),提供規(guī)范的“抑制(Suppression)”與“偏差(Deviation)”審批流程,杜絕隨意忽略報錯。
自動化報告:一鍵生成詳細的合規(guī)性報表與趨勢圖,為項目安全交付和外部審計提供可追溯的證據。
Perforce中國授權合作伙伴——上海龍智
-
C語言
+關注
關注
183文章
7644瀏覽量
145558 -
嵌入式開發(fā)
+關注
關注
18文章
1146瀏覽量
50121
發(fā)布評論請先 登錄
軟件編程規(guī)范(MISRA-C)
汽車電子行業(yè)的MISRA C標準分享
靜態(tài)代碼測試工具Helix QAC 2023.1更新快訊:主打編碼標準覆蓋率
靜態(tài)代碼分析器工具Helix QAC 2023.2: 提供 100% 的 MISRA C:2012 和 MISRA C:2023 規(guī)則覆蓋率
靜態(tài)代碼分析工具Helix QAC 2023.3:將100%覆蓋MISRA C++:2023?規(guī)則
Helix QAC—軟件靜態(tài)測試工具
embOS的MISRA-C:2012一致性
代碼靜態(tài)測試工具Perforce QAC 2025.1新特性
Helix QAC 2025.1 重磅發(fā)布!MISRA C:2025? 100%覆蓋
Perforce QAC產品簡介:面向C/C++的靜態(tài)代碼分析工具(已通過SO 26262認證)
Perforce QAC 2025.2版本更新:虛擬內存優(yōu)化、100%覆蓋CERT C規(guī)則、CI構建性能提升等
C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性
汽車網絡安全開發(fā)語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持
C語言安全編碼指南:MISRA C、CERT C、CWE 與 C Secure 標準對比與Perforce QAC應用詳解
評論