在筆者從事軟件測評領(lǐng)域工作的15 年里,積累了大量的實踐工作經(jīng)驗。在此跟大家分享對代碼安全審計工作的一些經(jīng)驗。
說到代碼安全審計,首先要了解這項工作的內(nèi)容和意義。代碼安全審計工作就是調(diào)查分析軟件系統(tǒng)的業(yè)務(wù)和技術(shù)需求,自動或者人工分析軟件的代碼,發(fā)現(xiàn)代碼之中的安全漏洞。以避免代碼中存在的安全漏洞在系統(tǒng)上線后被黑客或者惡意攻擊者所利用,實施諸如數(shù)據(jù)篡改、信息盜取、身份假冒、拒絕服務(wù)、抵賴、權(quán)限提升等攻擊,給軟件系統(tǒng)及用戶帶來巨大損失。所以代碼安全審計工作還是非常重要且必要的。
代碼安全審計工作主要有5 個關(guān)鍵因素:人、技術(shù)、策略、工具和流程[1]。
1)人。人是指具備軟件安全開發(fā)技術(shù)能力和知識的工程師,應(yīng)具備軟件安全知識和分析方法的豐富經(jīng)驗,這樣才能準(zhǔn)確有效地使用專業(yè)工具,排除誤報、定位漏洞。
2)技術(shù)。技術(shù)是指被測目標(biāo)系統(tǒng)所涉及的技術(shù),包括語言、框架、封裝、業(yè)務(wù)流程等。當(dāng)然這部分技術(shù)也應(yīng)該是第一關(guān)鍵因素——人所應(yīng)具備的。
3)策略。策略是指進(jìn)行代碼安全審計時所選擇的合適的策略。在實踐工作中,我們會利用專業(yè)的代碼安全審計工具結(jié)合有經(jīng)驗的工程師共同排查常見的代碼安全隱患,包括:審計和日志(Auditing and Logging)、認(rèn)證(Authentication)、授權(quán)(Authorization)、通訊安全(Communication Security)、數(shù)據(jù)訪問(Data Access)、部署考慮(Deployment Consideration)模擬、錯誤處理(Error Handling)、委托(Impersonnation and Delegation)、輸入和數(shù)據(jù)驗證(Input and Data Validation)、參數(shù)操縱(Parameter Manipulation)、敏感數(shù)據(jù)(Sensitive Data)和會話管理(Session Management)等。如圖1 所示:
圖1
這里以使用DMSCA 掃描JAVA 開源框架為例:如圖2 所示。
圖2
通過工具掃描,我們發(fā)現(xiàn)此開源框架存在大量各級風(fēng)險等級的安全漏洞。那么,安全掃描的規(guī)則又是如何制定的呢?
既然是“安全審計”,當(dāng)然要遵循各類安全標(biāo)準(zhǔn)[2],比如,PCI DSS 第三方支付行業(yè)數(shù)據(jù)安全標(biāo)準(zhǔn)、HIPAA 健康保險攜帶和責(zé)任法案、FISMA 聯(lián)邦信息安全管理法案、BSIMM 軟件安全構(gòu)建成熟度模型等國際通用標(biāo)準(zhǔn)模型,以及GB/T 20945-2013 信息安全技術(shù) 信息系統(tǒng)安全審計產(chǎn)品技術(shù)要求和測試評價方法、GB/T 34943-2017 CC++語言代碼漏洞測試規(guī)范、GB/T 34944-2017 Java 語言代碼漏洞測試規(guī)范、GB/T 34946-2017 C#語言代碼漏洞測試規(guī)范等國家標(biāo)準(zhǔn),除此之外還有語言最佳編碼實踐標(biāo)準(zhǔn)以及架構(gòu)設(shè)計標(biāo)準(zhǔn)等[3]。這些就是我們講的策略。
4)工具。出于我國近年日益重視的信息系統(tǒng)安全問題和面臨的風(fēng)險考慮,建議選取我國代碼安全審計廠商自主研發(fā)的國產(chǎn)工具。
5)流程。第一步 確定代碼安全審計的目標(biāo)。使用威脅模型(如果可用)導(dǎo)出目標(biāo),再理解架構(gòu)、技術(shù)和需求導(dǎo)出目標(biāo)。第二步 執(zhí)行初步掃描并分析安全問題結(jié)果。使用靜態(tài)分析工具或者輕量級的人工審查來尋找應(yīng)用程序中最應(yīng)當(dāng)需要查找的安全問題,如緩沖區(qū)溢出、跨站點腳本,SQL 注入等,初始掃描使我們能夠優(yōu)先考慮風(fēng)險最高的區(qū)域[4]。第三步 審查應(yīng)用程序的架構(gòu)所特有的代碼安全問題。最終審查用于調(diào)查本應(yīng)用程序架構(gòu)所特有的問題,一般表現(xiàn)為威脅建模或安全特征中出現(xiàn)的威脅,如自定義身份驗證或授權(quán)程序等。
完成所有步驟的安全代碼審查流程后,應(yīng)該執(zhí)行審查后期活動,這樣可以提高應(yīng)用程序的安全性及發(fā)現(xiàn)的漏洞的修復(fù)成功率。
后期活動包括:
1)已知bug 的優(yōu)先級排序。應(yīng)基于該bug 可能對您的客戶產(chǎn)生的影響大小確定優(yōu)先次序,并評估潛在的最大損害以及您的哪些客戶可能會受到影響。
2)修復(fù)正確bug。眾所周知,對一個bug 進(jìn)行修復(fù)后可能會引入一個新的bug。有時,已知bug的危險性比未知bug 要小。所以就要評價是否針對此類bug 進(jìn)行修復(fù)。
3)從錯誤中學(xué)習(xí)。與團(tuán)隊保持持續(xù)對話,探討錯誤是如何被犯下、被發(fā)現(xiàn)及被修復(fù)的。努力編寫清潔代碼,力求一次性通過審查。
完成了代碼審計工作后,會得到一系列可交付成果。實踐中是以代碼審計報告作為交付物的。其中代碼評估的目標(biāo)文檔描述了這些內(nèi)容:針對黑客有興趣的資產(chǎn)、代碼實現(xiàn)上的錯誤,這些錯誤將危及那些資產(chǎn)的安全,以及那在使用的技術(shù)和編程語言中的常見錯誤;針對每一個已經(jīng)識別漏洞的報告,包括所發(fā)現(xiàn)漏洞的概述、影響和嚴(yán)重性以及再現(xiàn)該漏洞的步驟和可用于修復(fù)該漏洞缺限的補(bǔ)救措施建議;安全代碼評估報告詳細(xì)說明風(fēng)險評估結(jié)果、成果和整體印象、審查期間發(fā)現(xiàn)的問題、進(jìn)行額外審查的建議,以及針對已確定漏洞進(jìn)行補(bǔ)救的建議。
除此之外,筆者對準(zhǔn)備開展代碼審計工作的機(jī)構(gòu)或個人有幾點建議:
1)組建服務(wù)團(tuán)隊。挑選具有軟件開發(fā)經(jīng)驗的員工組建代碼安全審計服務(wù)團(tuán)隊。
2)技術(shù)學(xué)習(xí)培訓(xùn)。提高服務(wù)團(tuán)隊軟件安全開發(fā)和編碼能力,深入了解軟件開發(fā)過程中涉及的各種工具、技術(shù)、安全知識和安全編碼最佳實踐及標(biāo)準(zhǔn)。
3)制定標(biāo)準(zhǔn)和基線。參考標(biāo)準(zhǔn)和合規(guī)要求,及服務(wù)目的,制定測評機(jī)構(gòu)的通用代碼安全審計服務(wù)標(biāo)準(zhǔn)和基線模版,指導(dǎo)后期具體項目服務(wù)測試標(biāo)準(zhǔn)和驗收條件。
4)確定服務(wù)模式。既實施環(huán)境,一般包括現(xiàn)場、在線、離線、按照項目或按照時間等。
5)選擇合適的工具或平臺。掃描分析工具能最大化滿足代碼安全審計服務(wù)標(biāo)準(zhǔn)和基線要求和服務(wù)模式要求,并能夠根據(jù)需要調(diào)整基線和增加安全規(guī)則和策略。集成基線和策略到工具平臺。
本文針代碼安全審計工作如何開展及要素進(jìn)行了詳細(xì)介紹,并分享了開展工作的幾點建議,希望能夠?qū)V大從業(yè)者有所參考。