在筆者從事軟件測(cè)評(píng)領(lǐng)域工作的15 年里,積累了大量的實(shí)踐工作經(jīng)驗(yàn)。在此跟大家分享對(duì)代碼安全審計(jì)工作的一些經(jīng)驗(yàn)。
說到代碼安全審計(jì),首先要了解這項(xiàng)工作的內(nèi)容和意義。代碼安全審計(jì)工作就是調(diào)查分析軟件系統(tǒng)的業(yè)務(wù)和技術(shù)需求,自動(dòng)或者人工分析軟件的代碼,發(fā)現(xiàn)代碼之中的安全漏洞。以避免代碼中存在的安全漏洞在系統(tǒng)上線后被黑客或者惡意攻擊者所利用,實(shí)施諸如數(shù)據(jù)篡改、信息盜取、身份假冒、拒絕服務(wù)、抵賴、權(quán)限提升等攻擊,給軟件系統(tǒng)及用戶帶來巨大損失。所以代碼安全審計(jì)工作還是非常重要且必要的。
代碼安全審計(jì)工作主要有5 個(gè)關(guān)鍵因素:人、技術(shù)、策略、工具和流程[1]。
1)人。人是指具備軟件安全開發(fā)技術(shù)能力和知識(shí)的工程師,應(yīng)具備軟件安全知識(shí)和分析方法的豐富經(jīng)驗(yàn),這樣才能準(zhǔn)確有效地使用專業(yè)工具,排除誤報(bào)、定位漏洞。
2)技術(shù)。技術(shù)是指被測(cè)目標(biāo)系統(tǒng)所涉及的技術(shù),包括語言、框架、封裝、業(yè)務(wù)流程等。當(dāng)然這部分技術(shù)也應(yīng)該是第一關(guān)鍵因素——人所應(yīng)具備的。
3)策略。策略是指進(jìn)行代碼安全審計(jì)時(shí)所選擇的合適的策略。在實(shí)踐工作中,我們會(huì)利用專業(yè)的代碼安全審計(jì)工具結(jié)合有經(jīng)驗(yàn)的工程師共同排查常見的代碼安全隱患,包括:審計(jì)和日志(Auditing and Logging)、認(rèn)證(Authentication)、授權(quán)(Authorization)、通訊安全(Communication Security)、數(shù)據(jù)訪問(Data Access)、部署考慮(Deployment Consideration)模擬、錯(cuò)誤處理(Error Handling)、委托(Impersonnation and Delegation)、輸入和數(shù)據(jù)驗(yàn)證(Input and Data Validation)、參數(shù)操縱(Parameter Manipulation)、敏感數(shù)據(jù)(Sensitive Data)和會(huì)話管理(Session Management)等。如圖1 所示:

圖1
這里以使用DMSCA 掃描JAVA 開源框架為例:如圖2 所示。

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