版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
ICS35.040L80中華人民共和國國家標(biāo)準(zhǔn)信息安全技術(shù)代碼安全審計(jì)規(guī)范IA國家市場監(jiān)督管理總局國家標(biāo)準(zhǔn)化管理委員會GB/T39412—2020前言 2規(guī)范性引用文件 3術(shù)語、定義和縮略語 3.1術(shù)語和定義 4審計(jì)概述 5審計(jì)過程 6安全功能缺陷審計(jì) 6.2數(shù)據(jù)加密與保護(hù) 7代碼實(shí)現(xiàn)安全缺陷審計(jì) 7.1面向?qū)ο蟪绦虬踩?7.2并發(fā)程序安全 7.3函數(shù)調(diào)用安全 7.4異常處理安全 7.6代碼生成安全 8資源使用安全缺陷審計(jì) 8.3數(shù)據(jù)庫使用 ⅠⅡGB/T39412—20209環(huán)境安全缺陷審計(jì) 9.1遺留調(diào)試代碼 9.2第三方軟件安全可靠 9.3保護(hù)重要配置信息 附錄A(資料性附錄)代碼安全審計(jì)報(bào)告 附錄B(資料性附錄)代碼示例 參考文獻(xiàn) ⅢGB/T39412—2020本標(biāo)準(zhǔn)按照GB/T1.1—2009給出的規(guī)則起草。請注意本文件的某些內(nèi)容可能涉及專利。本文件的發(fā)布機(jī)構(gòu)不承擔(dān)識別這些專利的責(zé)任。本標(biāo)準(zhǔn)由全國信息安全標(biāo)準(zhǔn)化技術(shù)委員會(SAC/TC260)提出并歸口。本標(biāo)準(zhǔn)起草單位:信息安全共性技術(shù)國家工程研究中心、中國科學(xué)院信息工程研究所、國家保密科技測評中心、北京信息安全測評中心、中國信息安全測評中心、中國電子技術(shù)標(biāo)準(zhǔn)化研究院、公安部第三研究所、國家計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心。本標(biāo)準(zhǔn)主要起草人:王彥杰、胡建勛、徐根煒、高振鵬、伊鵬達(dá)、肖樹根、康蕊、霍瑋、樸愛花、李豐、1GB/T39412—2020信息安全技術(shù)代碼安全審計(jì)規(guī)范本標(biāo)準(zhǔn)規(guī)定了代碼安全的審計(jì)過程以及安全功能缺陷、代碼實(shí)現(xiàn)安全缺陷、資源使用安全缺陷、環(huán)境安全缺陷等典型審計(jì)指標(biāo)及對應(yīng)的證實(shí)方法。本標(biāo)準(zhǔn)適用于指導(dǎo)代碼安全審計(jì)相關(guān)工作。2規(guī)范性引用文件下列文件對于本文件的應(yīng)用是必不可少的。凡是注日期的引用文件,僅注日期的版本適用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改單)適用于本文件。GB/TGB/TGB/T15272—1994程序設(shè)計(jì)語言C25069信息安全技術(shù)術(shù)語35273—2020信息安全技術(shù)個(gè)人信息安全規(guī)范3術(shù)語、定義和縮略語GB/T15272—1994、GB/T25069和GB/T35273—2020界定的以及下列術(shù)語和定義適用于本文件。代碼安全審計(jì)對代碼進(jìn)行安全分析,以發(fā)現(xiàn)代碼安全缺陷或違反代碼安全規(guī)范的動作。3.1.2安全缺陷代碼中存在的某種破壞軟件安全能力的問題、錯(cuò)誤。3.1.3跨站腳本攻擊攻擊者向頁面里面插入惡意HTML代碼,當(dāng)用戶瀏覽該頁面時(shí),嵌入到里面的HTML代碼會被執(zhí)行,從而達(dá)到攻擊者的特殊目的。3.1.4緩沖區(qū)溢出v向程序的緩沖區(qū)寫入超出其長度的內(nèi)容,從而破壞程序堆棧,使程序轉(zhuǎn)而執(zhí)行其他指令,以獲取程序或系統(tǒng)的控制權(quán)。3.1.5死鎖兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因競爭資源或彼此通信而造成的一種阻塞現(xiàn)象。2GB/T39412—20203.1.6錯(cuò)誤系統(tǒng)運(yùn)行中出現(xiàn)的可能導(dǎo)致系統(tǒng)崩潰或者暫停運(yùn)行的非預(yù)期問題。3.1.7特殊元素用于特定表達(dá)式或語言中分隔數(shù)據(jù)不同部分的字節(jié)、字符或字的序列。3.1.8異常導(dǎo)致程序中斷運(yùn)行的一種指令流。注:如果不對異常進(jìn)行正確的處理,則可能導(dǎo)致程序的中斷執(zhí)行。3.1.9注入將惡意命令插入數(shù)據(jù)庫請求參數(shù),并提交給數(shù)據(jù)庫執(zhí)行的攻擊行為。下列縮略語適用于本文件。應(yīng)用程序編程接口(偽隨機(jī)數(shù)產(chǎn)生器(域名系統(tǒng)(超文本標(biāo)記語言(超級文本傳輸協(xié)議(結(jié)構(gòu)化查詢語言(統(tǒng)一資源定位符(4審計(jì)概述針對軟件系統(tǒng)的代碼制定出安全缺陷審計(jì)條款,審計(jì)時(shí)可根據(jù)被審計(jì)的具體對象及應(yīng)用場景對相關(guān)條款進(jìn)行調(diào)整??紤]到語言的多樣性,以典型的結(jié)構(gòu)化語言(C)和面向?qū)ο笳Z言(為目標(biāo)進(jìn)行描述。代碼安全審計(jì)應(yīng)包括但不限于如下4個(gè)方面的具體條款。其中:安全措施37條審計(jì)條款;代碼實(shí)現(xiàn)25條審計(jì)條款;資源使用32條審計(jì)條款;環(huán)境安全3條審計(jì)條款;總計(jì)97條審計(jì)條款。代碼安全審計(jì)通過審計(jì)發(fā)現(xiàn)代碼的安全缺陷,以提高軟件系統(tǒng)安全性,降低安全風(fēng)險(xiǎn)。鑒于安全漏洞形成的綜合性和復(fù)雜性,代碼安全審計(jì)主要針對代碼層面的安全風(fēng)險(xiǎn)、代碼質(zhì)量,以及形成漏洞的各種脆弱性因素。通過代碼審計(jì)形成審計(jì)報(bào)告,列出代碼中針對審計(jì)列表的符合性/違規(guī)性條目,提出對代碼修訂的措施和建議。代碼安全審計(jì)包括內(nèi)部審計(jì)和外部審計(jì)。內(nèi)部審計(jì)由單位內(nèi)部的軟件質(zhì)量保證人員開展,審計(jì)的3GB/T39412—2020意義是發(fā)現(xiàn)和預(yù)防安全問題的發(fā)生。外部審計(jì)由第三方開展。外部審計(jì)需要較多的準(zhǔn)備工作,不宜頻繁安排。審計(jì)工作可安排在代碼編寫完成之后系統(tǒng)集成測試之前開展。由于資質(zhì)認(rèn)證、政策要求等因素,開展外部審計(jì)應(yīng)提前通知開發(fā)團(tuán)隊(duì),并預(yù)留足夠時(shí)間。內(nèi)部審計(jì)通過代碼安全審計(jì),保證軟件代碼安全質(zhì)量。內(nèi)部審計(jì)可安排在軟件開發(fā)生命周期內(nèi)的不同階段。歷史審計(jì)結(jié)果可以作為審計(jì)考慮的因素。若審計(jì)出的安全問題較多,則應(yīng)根據(jù)實(shí)際修復(fù)情況適當(dāng)增加審計(jì)次數(shù)。在代碼開發(fā)過程中,如果有頻繁改變代碼開發(fā)計(jì)劃或調(diào)整里程碑等異常情況時(shí),也應(yīng)增加審計(jì)次數(shù)。審計(jì)人員的主要工作職能是收集信息和代碼缺陷分析等,應(yīng)具備代碼審計(jì)的專業(yè)知識;應(yīng)能夠客觀地呈現(xiàn)代碼的問題,不應(yīng)隱瞞;應(yīng)對代碼等相關(guān)內(nèi)容保守秘密,不得泄露相關(guān)信息。代碼安全審計(jì)常用的方法是將代碼安全缺陷形成審計(jì)檢查列表,對照代碼逐一檢查。檢查列表應(yīng)根據(jù)被審計(jì)的對象和應(yīng)用場景進(jìn)行調(diào)整。考慮到審計(jì)內(nèi)容的復(fù)雜性,審計(jì)方法建議采用工具審計(jì)和人工審計(jì)相結(jié)合,多種手段綜合運(yùn)用的方式。采用專業(yè)代碼審計(jì)工具對代碼進(jìn)行審計(jì),形成審計(jì)報(bào)告,并對審計(jì)出的問題與標(biāo)準(zhǔn)相關(guān)審計(jì)項(xiàng)逐一人工核對。對于使用外部開源代碼較多的系統(tǒng),在審計(jì)時(shí)可先檢測開源代碼的使用率,開源代碼的安全缺陷可從已知漏洞角度檢查。由于審計(jì)工具的局限性,不可避免存在誤報(bào)和漏報(bào)。對于誤報(bào)問題,應(yīng)采用人工對比審計(jì)核查的方式開展。對于漏報(bào)問題應(yīng)采用多個(gè)工具交叉審計(jì)的方式開展。人工審計(jì)是工具審計(jì)的必要補(bǔ)充,人工審計(jì)主要解決工具審計(jì)的誤報(bào)和漏報(bào)問題。在人工審計(jì)實(shí)施中,可借助工具對代碼模塊、數(shù)據(jù)流、控制流等邏輯結(jié)構(gòu)進(jìn)行分析提取,并逐條比對分析。審計(jì)實(shí)施過程中,可根據(jù)審計(jì)工作需要劃分工作階段。如按進(jìn)度或里程碑劃分;按周、月、季度劃分;按功能模塊實(shí)施單元劃分;按人員分工交叉審計(jì)劃分等。對于審計(jì)出的缺陷,可根據(jù)缺陷的可利用性、影響程度、彌補(bǔ)代價(jià)等因素進(jìn)行分級排序。5審計(jì)過程審計(jì)過程包括四個(gè)階段:審計(jì)準(zhǔn)備、審計(jì)實(shí)施、審計(jì)報(bào)告、改進(jìn)跟蹤。審計(jì)準(zhǔn)備階段,主要開展基本情況調(diào)研、簽署保密協(xié)議、準(zhǔn)備檢查清單等工作;審計(jì)實(shí)施階段,主要開展資料檢查、代碼審查、結(jié)果分析等工作;報(bào)告階段包括審計(jì)結(jié)果的總結(jié)、陳述等工作,如有必要進(jìn)行相關(guān)問題的澄清和相關(guān)資料說明;改進(jìn)跟蹤工作由代碼開發(fā)團(tuán)隊(duì)進(jìn)行,主要對審計(jì)出的問題進(jìn)行修復(fù)。對于安全缺陷代碼修改后,再次進(jìn)行審計(jì)。代碼安全審計(jì)流程見圖1。4GB/T39412—2020圖1代碼安全審計(jì)流程代碼安全審計(jì)的目的包括軟件采購/外包測試、軟件產(chǎn)品的認(rèn)證測試、公司軟件代碼安全性自查等。為避免被審計(jì)單位的代碼被審計(jì)方用于非代碼審計(jì)用途,雙方應(yīng)簽署代碼審計(jì)保密協(xié)議,明確雙方的權(quán)利和義務(wù)。了解代碼的應(yīng)用場景、目標(biāo)客戶、開發(fā)內(nèi)容、開發(fā)者遵循的標(biāo)準(zhǔn)和流程等。通過閱讀代碼,了解程序代碼結(jié)構(gòu)、主要功能模塊,以及采用的編程語言。通過明確審計(jì)目的、背景調(diào)研、熟悉代碼等工作,形成代碼安全審計(jì)要點(diǎn),制定代碼安全的檢查列表。檢查列表包括檢查項(xiàng)和問題列表。入場實(shí)施環(huán)節(jié)中,審計(jì)人員和項(xiàng)目成員(關(guān)鍵代碼開發(fā)人員等)均應(yīng)參與。審計(jì)人員介紹審計(jì)的主要目標(biāo)、訪談對象和檢查的資料等。項(xiàng)目人員介紹項(xiàng)目進(jìn)展、項(xiàng)目關(guān)鍵成員、項(xiàng)目背景、實(shí)現(xiàn)功能以及項(xiàng)目的當(dāng)前狀態(tài)等。信息收集環(huán)節(jié)通過訪談等方式獲得代碼以及相應(yīng)需求分析文檔、設(shè)計(jì)文檔、測試文檔等資料。通過5GB/T39412—2020文檔資料了解代碼的業(yè)務(wù)邏輯等信息。在了解代碼基本信息的基礎(chǔ)上,通過深入分析設(shè)計(jì)文檔、訪談關(guān)鍵開發(fā)人員等方式,區(qū)分核心代碼和一般性代碼,其中核心代碼一般為涉及核心業(yè)務(wù)功能和核心軟件功能的代碼,一般性代碼為非核心業(yè)務(wù)功能和非核心軟件功能的代碼。5.3.3代碼安全缺陷檢測代碼安全缺陷檢測環(huán)節(jié)是根據(jù)制定的代碼安全的檢查項(xiàng),采用工具審計(jì)、人工審計(jì)、人工結(jié)合工具審計(jì)方式檢查是否存在安全缺陷,檢測完成后進(jìn)行安全性分析形成安全審計(jì)結(jié)果。在有軟件外包/采用開源軟件/合作開發(fā)情形下,應(yīng)對開源軟件或外包部分進(jìn)行代碼安全審計(jì)。對于核心代碼和一般性代碼在審計(jì)時(shí),采取重點(diǎn)審計(jì)和一般性審計(jì)措施,其中重點(diǎn)審計(jì)主要針對核心代碼進(jìn)行審計(jì),一般性審計(jì)主要針對一般性代碼進(jìn)行審計(jì)。審計(jì)實(shí)施完成后,組織召開評審會,將初始審計(jì)結(jié)果提供給被審計(jì)項(xiàng)目成員,并提供澄清誤解機(jī)會,允許項(xiàng)目成員提供其他需要補(bǔ)充的信息。評審會結(jié)束后,根據(jù)評審意見,調(diào)整審計(jì)結(jié)果,形成審計(jì)報(bào)告。審計(jì)報(bào)告包括審計(jì)的總體描述、審計(jì)結(jié)論等內(nèi)容,并對可能產(chǎn)生的安全風(fēng)險(xiǎn)進(jìn)行高、中、低分類描述。審計(jì)結(jié)論給出每條審計(jì)條款的符合/不符合的描述。審計(jì)報(bào)告的內(nèi)容示例參見附錄A。對審計(jì)中發(fā)現(xiàn)的問題進(jìn)行修改,對未修改的應(yīng)提供理由;對代碼的有效變更進(jìn)行記錄存檔。對于修復(fù)安全缺陷后的代碼,可通過再次審計(jì)來確認(rèn)問題是否解決。6安全功能缺陷審計(jì)審計(jì)指標(biāo):應(yīng)避免關(guān)鍵狀態(tài)數(shù)據(jù)被外部控制。審計(jì)人員應(yīng)檢查代碼中是否將與用戶信息或軟件自身安全密切相關(guān)的狀態(tài)信息,存儲在非授權(quán)實(shí)體都可以訪問的地方,如結(jié)果為肯定,則系統(tǒng)可能有關(guān)鍵狀態(tài)數(shù)據(jù)能被外部訪問或篡改的安全風(fēng)險(xiǎn)。不規(guī)范代碼示例參見B.2.1。審計(jì)指標(biāo):宜驗(yàn)證數(shù)據(jù)真實(shí)性,避免接收無效數(shù)據(jù)。審計(jì)人員宜檢查代碼是否對數(shù)據(jù)的真實(shí)性進(jìn)行驗(yàn)證,包括但不限于:a)宜檢查是否有數(shù)據(jù)源或通信源驗(yàn)證;b)宜檢查是否存在未驗(yàn)證或不正確驗(yàn)證數(shù)據(jù)的數(shù)字簽名;c)宜檢查是否缺失或進(jìn)行不恰當(dāng)完整性檢查;d)宜檢查安全相關(guān)的輸入是否僅依賴于加密技術(shù)而未進(jìn)行完整性檢查;e)宜檢查是否驗(yàn)證文件內(nèi)容而非文件名或擴(kuò)展名;6GB/T39412—2020f)宜檢查是否驗(yàn)證未經(jīng)校驗(yàn)和完整性檢查的不規(guī)范代碼示例參見B.2.2。如上檢查項(xiàng)的任一結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):宜防止以大小寫混合的方式繞過數(shù)據(jù)凈化和驗(yàn)證。審計(jì)人員宜檢查字符串在查找、替換、比較等操作時(shí),是否存在因大小寫問題而被繞過的情況。不規(guī)范代碼示例參見B.2.3。審計(jì)指標(biāo):不宜在過濾字符串之前對字符串進(jìn)行驗(yàn)證。審計(jì)人員宜檢查對字符串進(jìn)行驗(yàn)證之前是否存在對該字符串進(jìn)行過濾,來防止注入類攻擊的發(fā)生。對頭腳本特殊元素處理審計(jì)指標(biāo):應(yīng)對HTTP頭的腳本語法中的特殊元素進(jìn)行過濾和驗(yàn)證。審計(jì)人員應(yīng)檢查代碼是否對HTTP頭中的腳本特殊元素進(jìn)行過濾處理。因HTTP頭中的腳本含有特殊元素,可能會導(dǎo)致瀏覽器執(zhí)行惡意腳本。不規(guī)范代碼示例參見B.2.4。審計(jì)指標(biāo):應(yīng)正確處理命令中的特殊元素。審計(jì)人員應(yīng)檢查代碼對利用外部輸入來構(gòu)造命令或部分命令時(shí),是否對其中的特殊元素進(jìn)行了處理,命令注入通常發(fā)生在以下但不僅限于:a)數(shù)據(jù)從非可信源進(jìn)入到應(yīng)用程序中;b)數(shù)據(jù)是字符串的一部分,該字符串被應(yīng)用系統(tǒng)當(dāng)作命令來執(zhí)行的;c)通過執(zhí)行這個(gè)命令,應(yīng)用程序?yàn)楣粽咛峁┝斯粽卟粦?yīng)擁有的權(quán)限或能力。審計(jì)指標(biāo):宜避免對數(shù)據(jù)結(jié)構(gòu)控制域的刪除或意外增加。審計(jì)人員檢查代碼關(guān)于數(shù)據(jù)結(jié)構(gòu)控制域的操作:a)宜檢查代碼是否存在對數(shù)據(jù)結(jié)構(gòu)控制域的刪除而導(dǎo)致系統(tǒng)安全風(fēng)險(xiǎn)。不規(guī)范代碼示例參見b)宜檢查代碼是否存在對數(shù)據(jù)結(jié)構(gòu)控制域的意外增加而導(dǎo)致系統(tǒng)安全風(fēng)險(xiǎn)。不規(guī)范代碼示例參審計(jì)指標(biāo):應(yīng)保證字符串的存儲具有足夠的空間容納字符數(shù)據(jù)和結(jié)尾符。審計(jì)人員應(yīng)檢查代碼字符串的存儲空間是否能容納下結(jié)尾符,字符串不以結(jié)尾符結(jié)束會造成字符串越界訪問。規(guī)范/不規(guī)范代碼示例參見B.2.7。審計(jì)指標(biāo):不應(yīng)對環(huán)境變量的長度做出假設(shè)。審計(jì)人員應(yīng)檢查代碼在使用環(huán)境變量時(shí)是否對環(huán)境變量的長度做出特定值的假設(shè),因環(huán)境變量可由用戶進(jìn)行設(shè)置修改,故對環(huán)境變量的長度做出假設(shè)可能會發(fā)生錯(cuò)誤。規(guī)范/不規(guī)范代碼示例參見7GB/T39412—2020審計(jì)指標(biāo):執(zhí)行比較時(shí)不應(yīng)部分比較或不充分的比較。審計(jì)人員應(yīng)檢查比較條件是否充分,防止不充分比較造成邏輯繞過風(fēng)險(xiǎn)。審計(jì)指標(biāo):不應(yīng)將結(jié)構(gòu)體的長度等同于其各個(gè)成員長度之和。審計(jì)人員應(yīng)檢查代碼是否將結(jié)構(gòu)體的長度等同于其各成員長度之和,不應(yīng)將結(jié)構(gòu)體長度等同于各成員長度之和。結(jié)構(gòu)對象可能存在無名的填充字符從而造成結(jié)構(gòu)體長度與各個(gè)成員長度之和并不相等。不規(guī)范代碼示例參見B.2.9。審計(jì)指標(biāo):應(yīng)避免數(shù)值賦值越界。審計(jì)人員應(yīng)檢查代碼是否存在數(shù)值賦值超出數(shù)值類型范圍,應(yīng)避免賦值越界。不規(guī)范代碼示例參審計(jì)指標(biāo):應(yīng)避免除零錯(cuò)誤。審計(jì)人員應(yīng)檢查代碼是否存在除零操作,應(yīng)避免除零錯(cuò)誤。規(guī)范/不規(guī)范代碼示例參見B.2.11。審計(jì)指標(biāo):數(shù)值范圍比較時(shí),不宜遺漏邊界值檢查。審計(jì)人員宜檢查代碼在進(jìn)行數(shù)值范圍比較時(shí),是否遺漏了最小值、最大值邊界值檢查。規(guī)范/不規(guī)范代碼示例參見B.2.12。審計(jì)指標(biāo):代碼宜避免將可信和不可信數(shù)據(jù)組合在同一結(jié)構(gòu)體中,違背信任邊界。審計(jì)人員宜檢查代碼是否將來自可信源和非可信源的數(shù)據(jù)混合在同一數(shù)據(jù)結(jié)構(gòu)體或同一結(jié)構(gòu)化的消息體中,模糊了二者的邊界。審計(jì)指標(biāo):條件語句中不宜缺失默認(rèn)情況。審計(jì)人員宜檢查代碼中條件語句是否存在缺失默認(rèn)情況的情形。審計(jì)指標(biāo):不宜包含無法執(zhí)行的死代碼。審計(jì)人員宜檢查代碼是否存在無法執(zhí)行的死代碼。審計(jì)指標(biāo):不應(yīng)出現(xiàn)表達(dá)式永真或永假代碼。審計(jì)人員應(yīng)檢查代碼是否存在表達(dá)式邏輯永真或永假代碼的情況。8GB/T39412—2020審計(jì)指標(biāo):應(yīng)避免跨站腳本攻擊。審計(jì)人員應(yīng)檢查代碼中用戶提交的數(shù)據(jù)放到頁面中,被送到瀏覽器進(jìn)行顯示前,是否進(jìn)行了驗(yàn)證或過濾。應(yīng)用不宜在重定向后執(zhí)行額外代碼。審計(jì)人員宜檢查應(yīng)用是否存在重定向后執(zhí)行額外代碼的情況,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):不應(yīng)開放不可信站點(diǎn)的URL重定向。審計(jì)人員應(yīng)檢查代碼是否存在URL重定向到不可信站點(diǎn)的情況,因重定向到不可信站點(diǎn),可能會發(fā)生訪問安全風(fēng)險(xiǎn)。6.2數(shù)據(jù)加密與保護(hù)審計(jì)指標(biāo):密碼相關(guān)實(shí)現(xiàn)技術(shù)應(yīng)符合國家密碼相關(guān)管理規(guī)定。審計(jì)人員應(yīng)檢查代碼中使用的密碼相關(guān)實(shí)現(xiàn)技術(shù)是否符合國家密碼管理部門相關(guān)管理規(guī)定,若不符合,則提示存在安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)確保產(chǎn)生安全的隨機(jī)數(shù)。審計(jì)人員應(yīng)檢查代碼是否產(chǎn)生安全的隨機(jī)數(shù),具體審計(jì)要求包括但不限于:a)應(yīng)檢查是否采用能產(chǎn)生充分信息熵的算法或方案。代碼的不規(guī)范示例參見B.2.13;b)應(yīng)檢查是否避免隨機(jī)數(shù)的空間太小;c)應(yīng)檢查是否避免CSPRNG每次都使用相同的種子、可預(yù)測的種子(如進(jìn)程ID或系統(tǒng)時(shí)間的當(dāng)前值)或空間太小的種子;d)應(yīng)檢查是否避免使用具有密碼學(xué)缺陷的CSPRNG用于加密場景。如上檢查項(xiàng)的任一結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):不應(yīng)使用安全相關(guān)的硬編碼。審計(jì)人員應(yīng)檢查代碼中是否存在跟安全相關(guān)的硬編碼,如果代碼泄漏或被非法獲取,這些硬編碼的值可能會被攻擊者利用。審計(jì)指標(biāo):應(yīng)避免敏感信息暴露。9GB/T39412—2020審計(jì)人員應(yīng)檢查代碼中是否有敏感信息暴露,重點(diǎn)檢查暴露的途徑包含但不限于:a)通過發(fā)送數(shù)據(jù)導(dǎo)致的信息暴露;b)通過數(shù)據(jù)查詢導(dǎo)致的信息暴露;c)通過差異性(響應(yīng)差異性、行為差異性、時(shí)間差異性)導(dǎo)致的信息暴露;d)通過錯(cuò)誤消息導(dǎo)致的信息暴露;e)敏感信息的不恰當(dāng)跨邊界移除導(dǎo)致信息暴露;f)通過進(jìn)程信息導(dǎo)致的信息暴露;g)通過調(diào)試信息導(dǎo)致的信息暴露;h)信息在釋放前未清除導(dǎo)致信息暴露;i)通過輸出流或日志將系統(tǒng)數(shù)據(jù)暴露到未授權(quán)控制的范圍;j)通過緩存導(dǎo)致的信息暴露;k)通過日志文件導(dǎo)致的信息暴露;l)通過源代碼導(dǎo)致的信息暴露,如測試代碼、源代碼、注釋等;敏感信息使用HTTP請求傳遞導(dǎo)致信息暴露;n)備份文件導(dǎo)致信息暴露;登錄表單中,宜禁止瀏覽器的口令自動填充功能。不規(guī)范代碼示例參見B.2.14。審計(jì)指標(biāo):應(yīng)確保個(gè)人信息保護(hù)。審計(jì)人員應(yīng)檢查代碼中對個(gè)人信息保護(hù)是否符合國家相關(guān)法律法規(guī)的要求。若存在個(gè)人信息保護(hù)不當(dāng),可能造成個(gè)人信息泄漏。6.3.1.1身份鑒別過程中暴露多余信息審計(jì)指標(biāo):應(yīng)避免在處理身份鑒別的過程中暴露多余信息。審計(jì)人員應(yīng)檢查賬號在注冊或認(rèn)證過程中,是否存在暴露多余信息的情況。攻擊者可能會利用獲取到的多余信息,進(jìn)行認(rèn)證暴力破解。審計(jì)指標(biāo):應(yīng)避免身份鑒別被繞過。審計(jì)人員應(yīng)檢查代碼中身份鑒別機(jī)制是否存在被繞過的路徑或通道,鑒別算法的關(guān)鍵步驟是否被省略或跳過。審計(jì)指標(biāo):應(yīng)對身份鑒別連續(xù)多次登錄失敗頻率進(jìn)行限制。審計(jì)人員應(yīng)檢查代碼中是否實(shí)現(xiàn)對身份鑒別多次登錄失敗的頻率進(jìn)行限制。如結(jié)果為否定,則系統(tǒng)存在身份認(rèn)證被暴力破解的安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):宜使用多因素認(rèn)證機(jī)制。GB/T39412—2020審計(jì)人員宜檢查是否采用多因素認(rèn)證,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)確保登錄過程中口令不可明文顯示。審計(jì)人員應(yīng)檢查代碼中是否實(shí)現(xiàn)在登錄過程中口令是否明文顯示。審計(jì)指標(biāo):應(yīng)避免明文存儲口令。審計(jì)人員應(yīng)檢查代碼中是否存在明文存儲口令的情況。審計(jì)指標(biāo):應(yīng)避免明文傳遞口令。審計(jì)人員應(yīng)檢查代碼中是否存在明文傳遞口令的情況。審計(jì)指標(biāo):應(yīng)確保權(quán)限管理安全以及其他訪問控制措施的安全。審計(jì)人員應(yīng)檢查代碼中的權(quán)限與訪問控制功能相關(guān)部分,包括但不限于:a)應(yīng)檢查是否缺失認(rèn)證機(jī)制,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);b)應(yīng)檢查是否缺失授權(quán)機(jī)制,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);c)應(yīng)檢查是否違背最小特權(quán)原則,以高于功能所需的特權(quán)級別在執(zhí)行一些操作,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);d)應(yīng)檢查放棄特權(quán)后,是否檢查其放棄是否成功,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);e)應(yīng)檢查是否創(chuàng)建具有正確訪問權(quán)限的文件,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);f)應(yīng)檢查是否避免關(guān)鍵資源的不正確權(quán)限授予,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);g)應(yīng)檢查是否存在攻擊者使用欺騙或捕獲重放攻擊等手段繞過身份認(rèn)證的情況,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);h)應(yīng)檢查是否避免不恰當(dāng)?shù)匦湃畏聪駾NS,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。代碼的不規(guī)范/規(guī)范用法示例參見B.2.15;i)對于客戶端/服務(wù)器架構(gòu)的產(chǎn)品,應(yīng)檢查是否存在僅在客戶端而非服務(wù)器端執(zhí)行認(rèn)證,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);j)應(yīng)檢查是否避免過于嚴(yán)格的賬戶鎖定機(jī)制(賬戶鎖定保護(hù)機(jī)制過于嚴(yán)格且容易被觸發(fā),就允許攻擊者通過鎖定合法用戶的賬戶來拒絕服務(wù)合法的系統(tǒng)用戶如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);k)應(yīng)檢查是否未對信道兩端的操作者進(jìn)行充分的身份認(rèn)證,或未充分保證信道的完整性,從而允許中間人攻擊發(fā)生,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);l)應(yīng)檢查是否避免通信通道源的驗(yàn)證不當(dāng),確保請求來自預(yù)期源,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);m)應(yīng)檢查通信信道是否正確指定目的地來預(yù)防如下風(fēng)險(xiǎn):攻擊者在目的地偽裝成受信任的服務(wù)器來竊取數(shù)據(jù)或引起拒絕服務(wù)。如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。GB/T39412—20未加限制的外部可訪問鎖審計(jì)指標(biāo):宜對外部可訪問鎖加以限制,不允許被預(yù)期范圍之外的實(shí)體影響。審計(jì)人員宜檢查代碼中的鎖是否可被預(yù)期范圍之外的實(shí)體控制或影響,如結(jié)果為肯定,則系統(tǒng)存在易受到拒絕服務(wù)攻擊的安全風(fēng)險(xiǎn)。6.4.1對輸出日志中特殊元素處理審計(jì)指標(biāo):應(yīng)對輸出日志中的特殊元素進(jìn)行過濾和驗(yàn)證。審計(jì)人員應(yīng)檢查代碼是否對輸出日志中的特殊元素做過濾和驗(yàn)證。因?qū)μ厥庠匚醋鲞^濾,可能會造成信息泄露。6.4.2信息丟失或遺漏審計(jì)指標(biāo):宜避免安全相關(guān)信息丟失或遺漏。審計(jì)人員宜檢查代碼是否未記錄或不恰當(dāng)記錄安全相關(guān)信息,安全相關(guān)信息丟失或遺漏可能會給追溯攻擊行為帶來影響。信息丟失或遺漏形式包含但不限于:a)截?cái)嗯c安全有關(guān)信息的顯示、記錄或處理,掩蓋攻擊的來源或?qū)傩?;b)不記錄或不顯示信息(如日志而該信息對確定攻擊來源、攻擊性質(zhì)、攻擊行動是否安全具有重要意義。7代碼實(shí)現(xiàn)安全缺陷審計(jì)7.1面向?qū)ο蟪绦虬踩?.1.1泛型和非泛型數(shù)據(jù)類型審計(jì)指標(biāo):不宜混用具有泛型和非泛型的數(shù)據(jù)類型。審計(jì)人員宜檢查代碼是否存在泛型和非泛型之間數(shù)據(jù)類型的混用現(xiàn)象,應(yīng)避免泛型和非泛型數(shù)據(jù)類型的混用。規(guī)范/不規(guī)范代碼示例參見B.3.1。7.1.2包含敏感信息類的安全審計(jì)指標(biāo):包含敏感信息的類不應(yīng)可復(fù)制和可序列化。審計(jì)人員應(yīng)檢查代碼中包含敏感信息類的相關(guān)行為是否安全,包括但不限于:a)應(yīng)檢查代碼中包含敏感信息的類是否可復(fù)制,如語言中實(shí)現(xiàn)了復(fù)制。包含敏感信息的類不應(yīng)被復(fù)制。b)應(yīng)檢查代碼中包含敏感信息的類是否可實(shí)現(xiàn)了序列化接口,使類可序列化。包含敏感信息的類不應(yīng)可序列化。審計(jì)指標(biāo):在類進(jìn)行比較時(shí),不宜只使用名稱比較。審計(jì)人員宜檢查代碼中當(dāng)判定一個(gè)對象是否屬于特定的類或兩個(gè)對象的類是否相同時(shí),宜比較類對象,不能僅基于類名稱進(jìn)行判定。GB/T39412—20207.1.4類私有可變成員的引用審計(jì)指標(biāo):應(yīng)禁止返回類的私有可變成員的引用。審計(jì)人員應(yīng)檢查代碼中是否存在返回類私有可變成員的引用的情況。如結(jié)果為肯定,則可能存在內(nèi)部狀態(tài)被非預(yù)期修改的風(fēng)險(xiǎn)。7.1.5存儲不可序列化的對象到磁盤審計(jì)指標(biāo):不應(yīng)將不可序列化的對象存儲到磁盤。審計(jì)人員應(yīng)檢查代碼是否試圖將不可序列化的對象寫到磁盤中,將不可序列化的對象存儲到磁盤上,會導(dǎo)致對象反序列化失敗,可能引起任意代碼執(zhí)行風(fēng)險(xiǎn)。代碼的不規(guī)范/規(guī)范用法示例參見B.3.2。7.2并發(fā)程序安全7.2.1不同會話間信息泄露審計(jì)指標(biāo):代碼應(yīng)避免不同會話之間發(fā)生信息泄露。審計(jì)人員應(yīng)檢查代碼在應(yīng)用的不同會話之間是否會發(fā)生信息泄露,尤其是在多線程環(huán)境下。7.2.2發(fā)布未完成初始化的對象審計(jì)指標(biāo):不宜發(fā)布未完成初始化的對象。審計(jì)人員宜檢查代碼在多線程環(huán)境中,是否存在對象初始化尚未完成前,就可被其他線程引用的情況。7.2.3共享資源的并發(fā)安全審計(jì)指標(biāo):共享資源宜使用正確的并發(fā)處理機(jī)制。審計(jì)人員宜檢查代碼中共享資源的使用及并發(fā)處理的過程,包括但不限于:a)宜檢查代碼在多線程環(huán)境中對共享數(shù)據(jù)的訪問是否為同步訪問,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);b)宜檢查代碼中線程間的共享對象是否聲明正確的存儲持續(xù)期,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);c)宜檢查代碼中是否在并發(fā)上下文中使用不可重入的函數(shù),如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);d)宜檢查代碼中是否避免了檢查時(shí)間與使用時(shí)間資源沖突;e)宜檢查代碼中多個(gè)線程中等待彼此釋放鎖的可執(zhí)行片段是否避免了死鎖情況發(fā)生,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);f)宜檢查代碼對共享資源執(zhí)行敏感操作時(shí)是否檢查加鎖狀態(tài),如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。規(guī)范/不規(guī)范代碼示例參見B.3.3;g)宜檢查代碼是否將敏感信息存儲在沒有被鎖定或被錯(cuò)誤鎖定的內(nèi)存中(將敏感信息存儲于加鎖不恰當(dāng)?shù)膬?nèi)存區(qū)域,可能會導(dǎo)致該內(nèi)存通過虛擬內(nèi)存管理器被寫入到在磁盤上的交換文件中,從而使得數(shù)據(jù)更容易被外部獲取如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);h)宜檢查代碼中是否存在關(guān)鍵資源多重加鎖,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);i)宜檢查代碼中是否存在關(guān)鍵資源多重解鎖,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);j)宜檢查代碼中是否存在對未加鎖的資源進(jìn)行解鎖,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);k)宜檢查代碼中在異常發(fā)生時(shí)是否釋放已經(jīng)持有的鎖,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。GB/T39412—20207.2.4子進(jìn)程訪問父進(jìn)程敏感資源審計(jì)指標(biāo):在調(diào)用子進(jìn)程之前應(yīng)關(guān)閉敏感文件描述符,避免子進(jìn)程使用這些描述符來執(zhí)行未經(jīng)授權(quán)的I/O操作。審計(jì)人員宜檢查代碼是否存在調(diào)用子進(jìn)程之前有未關(guān)閉敏感文件描述符的情形。當(dāng)一個(gè)新進(jìn)程被創(chuàng)建或執(zhí)行時(shí),子進(jìn)程繼承任何打開的文件描述符,如不關(guān)閉則可能會造成未經(jīng)授權(quán)的訪問。規(guī)范/不規(guī)范代碼示例參見B.3.4。7.2.5釋放線程專有對象審計(jì)指標(biāo):應(yīng)及時(shí)釋放線程專有對象。審計(jì)人員應(yīng)檢查代碼是否及時(shí)釋放線程專有對象,防止內(nèi)存泄漏造成拒絕服務(wù)攻擊。7.3函數(shù)調(diào)用安全審計(jì)指標(biāo):應(yīng)避免外部控制的格式化字符串。審計(jì)人員應(yīng)檢查代碼中是否存在函數(shù)接受格式化字符串作為參數(shù)的情況,格式化字符串是否來自外部,如果是,則可能引起注入類安全風(fēng)險(xiǎn)。規(guī)范/不規(guī)范代碼示例參見B.3.5。7.3.2對方法或函數(shù)參數(shù)驗(yàn)證審計(jì)指標(biāo):宜對方法或函數(shù)的參數(shù)進(jìn)行驗(yàn)證。審計(jì)人員宜檢查代碼是否存在對方法或函數(shù)的參數(shù)進(jìn)行合法性或安全性校驗(yàn)。規(guī)范/不規(guī)范代碼審計(jì)指標(biāo):函數(shù)功能調(diào)用宜正確指定參數(shù)。審計(jì)人員宜檢查函數(shù)/方法調(diào)用時(shí)參數(shù)指定是否正確,是否存在如下情況:a)不正確數(shù)量的參數(shù);b)參數(shù)順序不正確;c)參數(shù)類型不正確;以上檢查項(xiàng)的任一結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn)。7.3.4返回棧變量地址審計(jì)指標(biāo):不宜返回棧變量地址。審計(jì)人員宜檢查代碼中是否存在在函數(shù)中返回棧變量地址的情形。因棧變量在函數(shù)調(diào)用結(jié)束后就會被釋放,再使用該變量地址時(shí)可能會出現(xiàn)意想不到的結(jié)果。不規(guī)范代碼示例參見B.3.7。7.3.5實(shí)現(xiàn)不一致函數(shù)審計(jì)指標(biāo):不宜使用具有不一致性實(shí)現(xiàn)的函數(shù)或方法。審計(jì)人員宜檢查代碼是否存在使用了在不同版本具有不一致實(shí)現(xiàn)的函數(shù)或方法。因使用在不同操作系統(tǒng)或不同版本實(shí)現(xiàn)不一致的函數(shù)或方法,可能導(dǎo)致代碼被移植到不同環(huán)境時(shí)改變行為。GB/T39412—20207.3.6暴露危險(xiǎn)的方法或函數(shù)審計(jì)指標(biāo):不應(yīng)暴露危險(xiǎn)的方法或函數(shù)。審計(jì)人員應(yīng)檢查代碼中的API或其他與外部交互的接口是否暴露了危險(xiǎn)方法或函數(shù),暴露危險(xiǎn)的方法或函數(shù)可能會帶來非授權(quán)訪問攻擊。危險(xiǎn)方法或函數(shù)暴露的形式主要包括方法/函數(shù)原本設(shè)計(jì)為非外部用戶使用、原本設(shè)計(jì)為部分用戶訪問等。代碼的不規(guī)范/規(guī)范用法示例參見B.3.8。7.4異常處理安全審計(jì)指標(biāo):宜恰當(dāng)進(jìn)行異常處理。審計(jì)人員宜檢查代碼中異常處理是否安全,包括但不限于:a)宜檢查是否對異常進(jìn)行檢查并處理;b)宜檢查是否采用標(biāo)準(zhǔn)化的、一致的異常處理機(jī)制來處理代碼中的異常;c)宜檢查錯(cuò)誤發(fā)生時(shí),是否提供正確的狀態(tài)代碼或返回值來表示發(fā)生的錯(cuò)誤;d)宜檢查是否對執(zhí)行文件I/O的返回值進(jìn)行檢查;e)宜檢查是否對函數(shù)或方法返回值是否為預(yù)期值進(jìn)行了檢查;f)宜檢查是否返回定制的錯(cuò)誤頁面給用戶來預(yù)防敏感信息的泄露。如上檢查項(xiàng)的任一結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn)。7.5.1不兼容的指針類型審計(jì)指標(biāo):不宜使用不兼容類型的指針來訪問變量。審計(jì)人員宜檢查代碼是否使用不兼容類型的指針來訪問變量。通過不兼容類型的指針修改變量可能會導(dǎo)致不可預(yù)測的結(jié)果。代碼的不規(guī)范用法示例參見B.3.9。7.5.2利用指針減法確定內(nèi)存大小審計(jì)指標(biāo):宜避免使用指針的減法來確定內(nèi)存大小。審計(jì)人員宜檢查代碼是否采用一個(gè)指針減去另一個(gè)指針的方式來確定內(nèi)存大小。如果兩個(gè)指針不是同一類型,那么使用指針的減法來確定內(nèi)存大小的計(jì)算可能會不正確,導(dǎo)致不可預(yù)測的結(jié)果。代碼的不規(guī)范/規(guī)范用法示例參見B.3.10。7.5.3將固定地址賦值給指針審計(jì)指標(biāo):不宜把固定地址賦值給指針。審計(jì)人員宜檢查代碼是否將一個(gè)NULL或0以外的固定地址賦值給指針。將固定地址賦值給指針會降低代碼的可移植性,并為攻擊者進(jìn)行注入代碼攻擊提供便利。7.5.4試圖訪問非結(jié)構(gòu)體類型指針的數(shù)據(jù)域?qū)徲?jì)指標(biāo):不應(yīng)把指向非結(jié)構(gòu)體類型指針強(qiáng)制轉(zhuǎn)換為指向結(jié)構(gòu)類型的指針并訪問其字段。審計(jì)人員應(yīng)檢查代碼是否將指向非結(jié)構(gòu)體類型的指針,強(qiáng)制轉(zhuǎn)換為指向結(jié)構(gòu)類型的指針并訪問其字段,如果結(jié)果為肯定,則可能存在內(nèi)存訪問錯(cuò)誤或數(shù)據(jù)損壞的風(fēng)險(xiǎn)。審計(jì)指標(biāo):不應(yīng)使用偏移越界的指針。GB/T39412—2020審計(jì)人員應(yīng)檢查代碼在使用指針時(shí)是否存在偏移越界的情況,因指針偏移越界可能會造成訪問緩沖區(qū)溢出風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)避免無效指針的使用。審計(jì)人員應(yīng)檢查代碼是否存在使用無效指針的情況,因使用無效指針,可能會產(chǎn)生非預(yù)期行為。7.6代碼生成安全審計(jì)指標(biāo):應(yīng)構(gòu)建安全的編譯環(huán)境。審計(jì)人員應(yīng)檢查編譯環(huán)境安全,包括但不限于:a)應(yīng)檢查編譯器是否從官方或其他可靠渠道獲取,并確保其安全可靠;b)應(yīng)檢查編譯器是否存在不必要的編譯功能。審計(jì)指標(biāo):應(yīng)構(gòu)建安全的鏈接環(huán)境。審計(jì)人員應(yīng)檢查鏈接環(huán)境安全,包括但不限于:a)應(yīng)檢查編譯后的目標(biāo)文件是否安全,確保鏈接后生成的可執(zhí)行文件的安全;b)應(yīng)檢查鏈接依賴庫是否安全,避免引入不安全的依賴庫。8資源使用安全缺陷審計(jì)審計(jì)指標(biāo):應(yīng)避免重復(fù)釋放資源。審計(jì)人員應(yīng)檢查代碼是否存在重復(fù)釋放資源的情況。重復(fù)釋放資源可能會造成系統(tǒng)崩潰。8.1.2資源或變量不安全初始化審計(jì)指標(biāo):宜避免不安全的資源或變量初始化。審計(jì)人員宜檢查代碼是否對資源或變量進(jìn)行了安全的初始化,包括但不限于:a)宜檢查代碼是否對關(guān)鍵變量進(jìn)行初始化,未初始化關(guān)鍵變量易導(dǎo)致系統(tǒng)按非預(yù)期值執(zhí)行,如結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);b)宜檢查代碼是否采用了不安全或安全性較差的缺省值來初始化內(nèi)部變量。缺省值通常和產(chǎn)品一起發(fā)布,容易被熟悉產(chǎn)品的潛在攻擊者獲取而帶來系統(tǒng)安全風(fēng)險(xiǎn),如結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);c)宜檢查代碼中關(guān)鍵的內(nèi)部變量或資源是否采用了可信邊界外的外部輸入值進(jìn)行初始化,如結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn)。8.1.3初始化失敗后未安全退出審計(jì)指標(biāo):初始化失敗后應(yīng)安全退出程序。審計(jì)人員應(yīng)檢查代碼在初始化失敗后能否安全退出。GB/T39412—20208.1.4引用計(jì)數(shù)的更新不正確審計(jì)指標(biāo):應(yīng)避免引用計(jì)數(shù)的更新不正確。審計(jì)人員應(yīng)檢查代碼中管理資源的引用計(jì)數(shù)是否正確更新,引用計(jì)數(shù)更新不正確,可能會導(dǎo)致資源在使用階段就被過早釋放,或雖已使用完畢但得不到釋放的安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):宜避免不安全的資源清理。審計(jì)人員宜檢查代碼中資源清理部分的相關(guān)功能,檢查代碼在使用資源后是否恰當(dāng)?shù)貓?zhí)行臨時(shí)文件或輔助資源的清理,避免清理環(huán)節(jié)不完整。8.1.6將資源暴露給非授權(quán)范圍審計(jì)指標(biāo):不應(yīng)將資源暴露給非授權(quán)的范圍。審計(jì)人員應(yīng)檢查代碼是否將文件和目錄等資源暴露給非授權(quán)的范圍,如果存在,則提示代碼存在信息暴露的風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)避免未經(jīng)控制的遞歸。審計(jì)人員應(yīng)檢查代碼是否避免未經(jīng)控制的遞歸,未控制遞歸可造成資源消耗過多的安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):執(zhí)行迭代或循環(huán)應(yīng)恰當(dāng)?shù)叵拗蒲h(huán)執(zhí)行的次數(shù),以避免無限循環(huán)。審計(jì)人員應(yīng)檢查代碼中軟件執(zhí)行迭代或循環(huán),是否充分限制循環(huán)執(zhí)行的次數(shù),以避免無限循環(huán)的發(fā)生導(dǎo)致攻擊者占用過多的資源。審計(jì)指標(biāo):宜避免算法復(fù)雜度攻擊。審計(jì)人員宜檢查代碼中算法是否存在最壞情況下非常低效,復(fù)雜度高,會嚴(yán)重降低系統(tǒng)性能。如果是,則攻擊者就可以利用精心編制的操作來觸發(fā)最壞情況的發(fā)生,從而引發(fā)算法復(fù)雜度攻擊。審計(jì)指標(biāo):宜遵守正確的行為次序避免早期放大攻擊數(shù)據(jù)。審計(jì)人員宜檢查代碼是否存在實(shí)體在授權(quán)或認(rèn)證前執(zhí)行代價(jià)高的操作的情況,不合理執(zhí)行代價(jià)高的操作可能會造成早期放大攻擊。規(guī)范/不規(guī)范代碼示例參見B.4.1。8.2.1內(nèi)存分配釋放函數(shù)成對調(diào)用審計(jì)指標(biāo):應(yīng)成對調(diào)用內(nèi)存分配和釋放函數(shù)。審計(jì)人員應(yīng)檢查代碼中分配內(nèi)存和釋放內(nèi)存函數(shù)是否成對調(diào)用,如來分配或釋放資源。當(dāng)內(nèi)存分配和釋放函數(shù)不成對調(diào)用時(shí),可能會引起程序崩潰的風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)避免在釋放堆內(nèi)存前清理不恰當(dāng)而導(dǎo)致敏感信息暴露。GB/T39412—2020審計(jì)人員應(yīng)檢查代碼在釋放堆內(nèi)存前是否采用合適的方式進(jìn)行信息清理。示例:如C語言中是否使用函數(shù)調(diào)整存儲敏感信息的緩沖區(qū)大小,如存在該操作,將存在可能暴露敏感信息的風(fēng)險(xiǎn)。函數(shù)不是從內(nèi)存中刪除,而通常是將舊內(nèi)存塊的內(nèi)容復(fù)制到一個(gè)新的、更大的內(nèi)存塊,這可能暴露給攻擊者使用“或其他方法來進(jìn)行讀取敏感信息的“堆檢查”攻擊。審計(jì)指標(biāo):宜及時(shí)釋放動態(tài)分配的內(nèi)存。審計(jì)人員宜檢查代碼是否有動態(tài)分配的內(nèi)存使用完畢后未釋放導(dǎo)致內(nèi)存泄漏的情形。內(nèi)存泄漏可能會導(dǎo)致資源耗盡從而帶來拒絕服務(wù)的安全風(fēng)險(xiǎn)。規(guī)范/不規(guī)范代碼示例參見B.4.2。8.2.4訪問已釋放內(nèi)存審計(jì)指標(biāo):不應(yīng)引用或訪問已被釋放后的內(nèi)存。審計(jì)人員應(yīng)檢查代碼是否存在內(nèi)存被釋放再次被訪問的情況。內(nèi)存被釋放后再次訪問會出現(xiàn)非預(yù)期行為。審計(jì)指標(biāo):不宜依賴數(shù)據(jù)/內(nèi)存布局。審計(jì)人員宜檢查代碼邏輯是否依賴于對協(xié)議數(shù)據(jù)或內(nèi)存在底層組織形式的無效假設(shè)。當(dāng)平臺或協(xié)議版本變動時(shí),數(shù)據(jù)組織形式可能會發(fā)生變化從而帶來非預(yù)期行為。8.2.6內(nèi)存緩沖區(qū)邊界操作審計(jì)指標(biāo):應(yīng)避免內(nèi)存緩沖區(qū)邊界操作發(fā)生越界。審計(jì)人員應(yīng)檢查代碼在內(nèi)存緩沖區(qū)邊界操作時(shí)是否存在越界現(xiàn)象,因內(nèi)存緩沖區(qū)訪問越界可能會造成緩沖區(qū)溢出漏洞。規(guī)范/不規(guī)范代碼示例參見B.4.3。8.2.7緩沖區(qū)復(fù)制造成溢出審計(jì)指標(biāo):應(yīng)避免未檢查輸入數(shù)據(jù)大小就進(jìn)行緩沖區(qū)復(fù)制。審計(jì)人員應(yīng)檢查代碼在進(jìn)行緩沖區(qū)復(fù)制時(shí),是否存在未對輸入數(shù)據(jù)大小進(jìn)行檢查的現(xiàn)象,因未檢查輸入數(shù)據(jù)大小,可能會造成緩沖區(qū)溢出。不規(guī)范代碼示例參見B.4.4。8.2.8使用錯(cuò)誤長度訪問緩沖區(qū)審計(jì)指標(biāo):應(yīng)避免使用錯(cuò)誤的長度值訪問緩沖區(qū)。審計(jì)人員應(yīng)檢查代碼在訪問緩沖區(qū)時(shí)使用長度值是否正確,因使用錯(cuò)誤的長度值來訪問緩沖區(qū)可能會造成緩沖區(qū)溢出風(fēng)險(xiǎn)。規(guī)范/不規(guī)范代碼示例參見B.4.5。審計(jì)指標(biāo):應(yīng)限制堆空間的消耗,防止堆空間耗盡。審計(jì)人員應(yīng)檢查代碼是否有導(dǎo)致堆空間耗盡的情況,具體檢查包括但不限于:a)是否存在內(nèi)存泄漏;b)是否存在死循環(huán);c)不受限制的反序列化;d)創(chuàng)建大量的線程;e)解壓一個(gè)較大壓縮文件。GB/T39412—20208.3數(shù)據(jù)庫使用8.3.1及時(shí)釋放數(shù)據(jù)庫資源審計(jì)指標(biāo):宜及時(shí)釋放數(shù)據(jù)庫資源。審計(jì)人員宜檢查代碼中使用數(shù)據(jù)庫后是否及時(shí)釋放數(shù)據(jù)庫連接或采用數(shù)據(jù)庫連接池,未及時(shí)釋放數(shù)據(jù)庫連接可能會造成數(shù)據(jù)庫拒絕服務(wù)風(fēng)險(xiǎn)。注入審計(jì)指標(biāo):應(yīng)正確處理命令中的特殊元素。審計(jì)人員應(yīng)檢查代碼利用用戶可控的輸入數(shù)據(jù)構(gòu)造命令時(shí),是否對外部輸入數(shù)據(jù)中的特殊元素進(jìn)行處理,如果未處理,那么這些數(shù)據(jù)有可能被解釋為命令而非普通用戶的輸入數(shù)據(jù)。攻擊者可對此加以利用來修改查詢邏輯,從而繞過安全檢查或插入可以修改后端數(shù)據(jù)庫的額外語句。審計(jì)指標(biāo):不應(yīng)使用過期的文件描述符。審計(jì)人員應(yīng)檢查代碼是否在文件描述符關(guān)閉后再次使用。特定文件或設(shè)備的文件描述符被釋放后被重用,可能會造成引用了其他的文件或設(shè)備。8.4.2不安全的臨時(shí)文件審計(jì)指標(biāo):應(yīng)安全使用臨時(shí)文件。審計(jì)人員應(yīng)檢查代碼中使用臨時(shí)文件是否安全,因不安全使用臨時(shí)文件造成敏感信息泄露,包括但不限于:a)應(yīng)檢查代碼中是否創(chuàng)建或使用不安全的臨時(shí)文件,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn);b)應(yīng)檢查代碼中臨時(shí)文件是否在程序終止前移除,如果結(jié)果為否定,則提示存在安全風(fēng)險(xiǎn);c)應(yīng)檢查代碼中是否在具有不安全權(quán)限的目錄中創(chuàng)建臨時(shí)文件,如果結(jié)果為肯定,則提示存在安全風(fēng)險(xiǎn)。8.4.3文件描述符窮盡審計(jì)指標(biāo):不宜導(dǎo)致文件描述符窮盡。審計(jì)人員宜檢查代碼是否存在導(dǎo)致文件描述符窮盡情形,包括但不限于:a)是否對打開文件描述符未做關(guān)閉處理;b)是否到達(dá)關(guān)閉階段之前,失去對文件描述符的所有引用;c)進(jìn)程完成后是否未關(guān)閉文件描述符。審計(jì)指標(biāo):應(yīng)避免路徑遍歷。審計(jì)人員應(yīng)檢查代碼是否存在由外部輸入構(gòu)造的標(biāo)識文件或目錄的路徑名,路徑遍歷會造成非授權(quán)訪問資源的風(fēng)險(xiǎn)。注:路徑遍歷指未將路徑名限制在受限目錄。8.4.5及時(shí)釋放文件系統(tǒng)資源審計(jì)指標(biāo):應(yīng)及時(shí)釋放文件系統(tǒng)資源。GB/T39412—2020審計(jì)人員應(yīng)檢查代碼是否及時(shí)釋放不再使用的文件句柄,不及時(shí)釋放文件句柄可能會引起文件資源占用過多,造成拒絕服務(wù)風(fēng)險(xiǎn)。審計(jì)指標(biāo):不應(yīng)對同一端口進(jìn)行多重綁定。審計(jì)人員應(yīng)檢查代碼是否有多個(gè)套接字綁定到相同端口,從而導(dǎo)致該端口上的服務(wù)有被盜用或被欺騙的風(fēng)險(xiǎn)。8.5.2對網(wǎng)絡(luò)消息容量的控制審計(jì)指標(biāo):宜避免對網(wǎng)絡(luò)消息容量的控制不充分。審計(jì)人員宜檢查代碼是否控制網(wǎng)絡(luò)傳輸流量不超過被允許的值。如果代碼沒有機(jī)制來跟蹤流量傳輸,系統(tǒng)或應(yīng)用程序會很容易被濫用于傳輸大流量(超過了請求值或客戶端被允許的值從而帶來拒絕服務(wù)的安全風(fēng)險(xiǎn)。審計(jì)指標(biāo):應(yīng)避免字節(jié)序使用不一致性。審計(jì)人員應(yīng)檢查代碼在跨平臺或網(wǎng)絡(luò)通信處理輸入時(shí)是否考慮到字節(jié)順序,避免字節(jié)序使用不一致。不能正確處理字節(jié)順序問題,可能會導(dǎo)致不可預(yù)期的程序行為。審計(jì)指標(biāo):應(yīng)采用加密傳輸方式保護(hù)敏感數(shù)據(jù)。審計(jì)人員應(yīng)檢查代碼是否實(shí)現(xiàn)了對網(wǎng)絡(luò)通信中敏感數(shù)據(jù)進(jìn)行加密傳輸,特別是身份鑒別信息、重要信息等。8.5.5會話過期機(jī)制缺失審計(jì)指標(biāo):宜制定會話過期機(jī)制。審計(jì)人員宜檢查代碼中會話過程是否存在會話過期機(jī)制,如結(jié)果為否定,則提示代碼存在保護(hù)機(jī)制被繞過的風(fēng)險(xiǎn)。規(guī)范/不規(guī)范代碼示例參見B.4.6。審計(jì)指標(biāo):宜確保會話標(biāo)識符的隨機(jī)性。審計(jì)人員宜檢查代碼中會話標(biāo)識符是否具有隨機(jī)性,防止會話標(biāo)識符被窮舉造成安全風(fēng)險(xiǎn)。9環(huán)境安全缺陷審計(jì)審計(jì)指標(biāo):代碼中不應(yīng)遺留調(diào)試代碼。審計(jì)人員應(yīng)檢查部署到應(yīng)用環(huán)境的代碼是否含有調(diào)試或測試功能的代碼,該部分代碼是否會造成意外的后門入口。9.2第三方軟件安全可靠審計(jì)指標(biāo):應(yīng)對第三方代碼來源情況進(jìn)行審計(jì),確保引入的第三方軟件安全可靠。GB/T39412—2020審計(jì)人員應(yīng)檢查引入的第三方代碼來源是否安全可靠,避免不安全的第三方軟件引入安全風(fēng)險(xiǎn)。9.3保護(hù)重要配置信息審計(jì)指標(biāo):宜對重要的配置信息進(jìn)行安全保護(hù)審計(jì)人員宜檢查代碼中使用的重要配置信息是否進(jìn)行了安全保護(hù),因?qū)χ匾渲眯畔⒈Wo(hù)不當(dāng),可能帶來信息泄漏安全風(fēng)險(xiǎn)。GB/T39412—2020附錄A(資料性附錄)代碼安全審計(jì)報(bào)告本附錄給出了第5章代碼安全審計(jì)過程中的審計(jì)報(bào)告的示例。A.2報(bào)告內(nèi)容審計(jì)總體信息應(yīng)包括但不限于以下信息:審計(jì)日期;b)審計(jì)團(tuán)隊(duì)成員信息;e)代碼的信息,包括但不限于:代碼功能描述、被審計(jì)代碼的版本號、代碼語言類型、代碼總行數(shù)等。A.2.2審計(jì)流程與內(nèi)容審計(jì)流程與內(nèi)容應(yīng)包括但不限于:審計(jì)流程;A.2.3發(fā)現(xiàn)的安全缺陷匯總發(fā)現(xiàn)的安全缺陷匯總應(yīng)包括但不限于以下信息:a)該版本代碼發(fā)現(xiàn)的異常情況匯總;b)可能造成的嚴(yán)重后果。A.2.4發(fā)現(xiàn)的安全缺陷分析發(fā)現(xiàn)的安全缺陷分析應(yīng)包括但不限于以下信息:a)高風(fēng)險(xiǎn)安全缺陷分析;b)中風(fēng)險(xiǎn)安全缺陷分析;c)低風(fēng)險(xiǎn)安全缺陷分析。審計(jì)總結(jié)應(yīng)包括但不限于以下信息:a)審計(jì)結(jié)果匯總,例如,審計(jì)條款符合數(shù)量,審計(jì)條款不符合數(shù)量,審計(jì)條款不適用數(shù)量,不符合的審計(jì)條款原因等;c)安全缺陷改進(jìn)建議。GB/T39412—2020附錄B(資料性附錄)本附錄給出了第6章、第7章、第8章、第9章代碼安全審計(jì)要求中各審計(jì)條款代碼不規(guī)范用法示例和規(guī)范用法示例。B.2安全功能B.2.1關(guān)鍵狀態(tài)數(shù)據(jù)被外部控制代碼示例避免關(guān)鍵狀態(tài)數(shù)據(jù)被外部控制,以下給出了不規(guī)范用法(C語言)示例。示例:上述代碼本意是執(zhí)行一個(gè)命令,顯示一個(gè)受限目錄的內(nèi)容,然后執(zhí)行其他操作。假定它是通過運(yùn)行權(quán)限來繞過操作系統(tǒng)的權(quán)限檢查。攻擊者只能查看DIR目錄下的內(nèi)容,程序并沒有修改“PATH”環(huán)境變量,通過設(shè)置PATH為用戶可控制的目錄(如“通過運(yùn)行上面的代碼,當(dāng)被執(zhí)行,查詢“PATH”找到”程序。B.2.2驗(yàn)證未經(jīng)校驗(yàn)和完整性檢查的c代碼示例是否驗(yàn)證未經(jīng)校驗(yàn)和完整性檢查的以下給出了不規(guī)范用法(語言)示例。示例:Cookiec=cookies[i}上述代碼示例從瀏覽器讀取一個(gè)值確定用戶的角色,攻擊者容易修改本地存儲中的“成特權(quán)升級。B.2.3以大小寫混合的方式繞過凈化和驗(yàn)證代碼示例對于防止以大小寫混合的方式繞過凈化和驗(yàn)證的情況,以下給出了不規(guī)范用法(java語言)示例。示例:}GB/T39412—2020上述代碼示例只有當(dāng)輸入為“時(shí),代碼才會執(zhí)行,而當(dāng)輸入為“SCRIPT”或者“時(shí)并不會通過該方法進(jìn)行過濾,將造成XSS攻擊。B.2.4對HTTP頭的web腳本語法中的特殊字符進(jìn)行過濾和驗(yàn)證代碼示例對HTTP頭的腳本語法中的特殊字符進(jìn)行過濾和驗(yàn)證,以下給出了不規(guī)范用法(語言)示例。示例:上述代碼示例中,用戶控制的數(shù)據(jù)被添加到HTTP并返回到客戶端。由于數(shù)據(jù)沒有經(jīng)過凈化,用戶將能夠執(zhí)行危險(xiǎn)腳本標(biāo)簽。B.2.5對數(shù)據(jù)結(jié)構(gòu)控制域的刪除代碼示例避免對數(shù)據(jù)結(jié)構(gòu)控制域的刪除,以下給出了不規(guī)范用法(C語言)示例。示例:intcounter;for(counter=0;counter!=10;counter++){foo[counter]='a';}個(gè)字符被寫入結(jié)果,字符沒有終止,調(diào)用時(shí),將可能產(chǎn)生不可預(yù)知的結(jié)果。B.2.6對數(shù)據(jù)結(jié)構(gòu)控制域的意外增加代碼示例避免對數(shù)據(jù)結(jié)構(gòu)控制域的意外增加,以下給出了不規(guī)范用法(C語言)示例。示例:foo[0]='a';foo[1]='a';foo[3]='c';上述代碼第一個(gè)將不進(jìn)作為字符串時(shí),字符3]將永遠(yuǎn)不會被打印。B.2.7字符串的存儲具有足夠的空間容納字符數(shù)據(jù)和結(jié)尾符代碼示例保證字符串的存儲具有足夠的空間容納字符數(shù)據(jù)和結(jié)尾符,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C語言)示例。GB/T39412—2020{sizeti;for(i=0;src[i]&&(i〈n);++i){dest[i]=src[i];}}上述代碼中的循環(huán)把數(shù)據(jù)從src復(fù)制到尾部之后的字節(jié)中。示例2:{sizeti;for(i=0;src[i]&&(i〈n-1);++i){dest[i]=src[i];}}該方案對循環(huán)終止條件進(jìn)行修改,在dest的尾部添加終止符。B.2.8對環(huán)境變量的長度做出假設(shè)代碼示例不對環(huán)境變量的長度作出假設(shè),示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(Cvoidf(){}返回的字符串復(fù)制到一個(gè)固定長度的緩沖區(qū)。假設(shè)$是已經(jīng)定義了的,定義PATH_MAX并確保并沒有超過PATH_的特性。環(huán)境變量$并不需要比PATH_字符少,如果它超過了PATH_MAX字符,可能會導(dǎo)致緩沖區(qū)溢出。示例2:voidf(){{{}}GB/T39412—2020該方案采用函數(shù)計(jì)算字符串的長度,并動態(tài)分配所需要的空間,避免造成緩沖區(qū)溢出。B.2.9將結(jié)構(gòu)體的長度等同于其各個(gè)成員長度之和代碼示例不將結(jié)構(gòu)體的長度等同于其各個(gè)成員長度之和,示例給出了不規(guī)范用法(C語言)示例。示例:structbuffer{charbufferC[buffer_size];}buff;{sizeof(sizet)+sizeof(buff.bufferC);}上述代碼假設(shè)結(jié)構(gòu)的長度等于其各個(gè)成員的長度之和,但由于結(jié)構(gòu)填充的原因,結(jié)構(gòu)的實(shí)際長度可能增大。B.2.10數(shù)值賦值越界代碼示例避免數(shù)值賦值越界,以下給出了不規(guī)范用法(C語言)示例。示例:main(void){inti;i=-2147483648;i=i-1;return(0);}上述代碼存在整數(shù)下溢的問題,i的值已是最低負(fù)值,所以減去1后,新的i值是2147483647。避免除零錯(cuò)誤,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C語言)示例。{}GB/T39412—2020上述代碼的函數(shù)把兩個(gè)數(shù)值進(jìn)行相除而沒有驗(yàn)證輸入作為分母的值是否為零,將導(dǎo)致可能被零除的錯(cuò)誤。示例2:{}該方案通過驗(yàn)證分母的輸入值,確保除零錯(cuò)誤不會發(fā)生。B.2.12數(shù)值范圍比較時(shí)遺漏邊界值檢查代碼示例數(shù)值范圍比較時(shí),不遺漏邊界值檢查,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C語言)示例。{intvalue;{value=-1;}return(value);}上述代碼僅驗(yàn)證給定的數(shù)組索引小于數(shù)組的最大長度,未檢查最小值。將可能發(fā)生負(fù)值被作為輸入的數(shù)組索引,導(dǎo)致越界讀取,可能造成訪問敏感內(nèi)存的風(fēng)險(xiǎn)。示例2:if(index〉=0&&index〈len)…該方案檢查輸入的數(shù)組索引以驗(yàn)證數(shù)組在所需的最大值和最小范圍內(nèi),if語句修改為包括最小范圍檢查。B.2.13采用能產(chǎn)生充分信息熵的算法或方案代碼示例采用能產(chǎn)生充分信息熵的算法或方案,示例給出了不規(guī)范用法(C語言)示例,示例:{srandom(usrID);returnrandom();}上述代碼的功能是給用戶產(chǎn)生唯一的隨機(jī)ID。因?yàn)閭坞S機(jī)數(shù)生成器的種子永遠(yuǎn)是用戶ID,所以產(chǎn)生的將會永遠(yuǎn)相同并劫持該GB/T39412—2020B.2.14信息泄露代碼示例對于避免信息泄露的情況,示例1、示例2給出了不規(guī)范用法(C語言)示例。{{{}上述代碼示例是檢查登錄用戶名密碼是否正確的提示信息。當(dāng)用戶輸入錯(cuò)誤的用戶名但密碼正確和當(dāng)輸入用戶名是正確的,但密碼是錯(cuò)誤的情況時(shí),反饋不同的信息。這種差異使攻擊者了解到登錄功能狀態(tài),攻擊者可以通過嘗試不同的值,嘗試獲取正確的用戶名。示例2:…上述代碼將打印環(huán)境變量到標(biāo)準(zhǔn)錯(cuò)誤流中。B.2.15不恰當(dāng)?shù)匦湃畏聪駾NS代碼示例避免不恰當(dāng)?shù)匦湃畏聪駾NS,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C;{trusted=true;trusted=false;}上述代碼使用DNS查找以決定入站請求是否來自受信宿主,若攻擊者損害DNS緩存,則可獲得受信任的狀態(tài)。示例2:;GB/T39412—2020{正向解析*/{反向解析*/{trusted=true;}}trusted=false;}正向解析*/{執(zhí)行指令返回…}反向解析*/{…執(zhí)行指令返回域名*…}該方案執(zhí)行適當(dāng)?shù)恼蚝头聪駾NS查找,以檢測DNS欺騙。B.3代碼實(shí)現(xiàn)B.3.1混用具有泛型和非泛型的原始數(shù)據(jù)類型代碼示例語言)示例。}addToList(list,1GB/T39412—2020}上述代碼可以編譯,但會產(chǎn)生未經(jīng)檢查的警告,因?yàn)榉椒ㄊ褂玫氖窃紨?shù)據(jù)類型而不是參數(shù)類型(ad-方法中的參數(shù))。由返回的值不是一個(gè)正確的類型(是一個(gè)而不是類型導(dǎo)致代碼執(zhí)行時(shí)拋出異常。示例2:list.add(str}addToList(list,"1"}該方案通過改變方法的簽名加強(qiáng)正確的類型檢查來強(qiáng)化類型安全性。B.3.2將不可序列化的對象存儲到磁盤上代碼示例語言)示例。@Entity}}上述代碼示例中為業(yè)務(wù)應(yīng)用程序提供到客戶信息的訪問。作是不可序列化對象,當(dāng)容器試圖將對象寫入系統(tǒng)的時(shí),這可能導(dǎo)致序列化失敗和應(yīng)用程序崩潰。示例2:該方案會話作用域的對象實(shí)現(xiàn)接口,以確保對象被正確序列化。B.3.3加鎖檢查缺失代碼示例避免加鎖檢查缺失,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C語言)示例。{GB/T39412—2020/*訪問共享資源*/}上述代碼的函數(shù)將嘗試獲取鎖在共享資源上執(zhí)行操作。代碼不檢查__返回值是否正確,將可能導(dǎo)致不可預(yù)知的結(jié)果。示例2:{intresult;if(0=result)return(result);/*訪問共享資源*/}B.3.4避免子進(jìn)程使用敏感文件描述符來執(zhí)行未經(jīng)授權(quán)的I/O操作代碼示例調(diào)用子進(jìn)程之前應(yīng)關(guān)閉敏感文件描述符,避免子進(jìn)程使用這些描述符來執(zhí)行未經(jīng)授權(quán)的I/O操作,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范用法(C語言)示例。{if(NULL==f){return(-1);}return(0);}上述代碼沒有遵循規(guī)則,因?yàn)檎{(diào)用打開的文件在函數(shù)返回之前沒有關(guān)閉。示例2:{if(NULL==f){return(-1);}if(fclose(f)==EOF){return(-1);}return(0);}該方案f指針指向的文件在返回到調(diào)用者之前關(guān)閉。GB/T39412—2020B.3.5外部控制的格式化字符串代碼示例避免外部控制的格式化字符串,以下給出了不規(guī)范用法(C語言)示例。示例:{charbuf[128];}上述代碼使用將命令行參數(shù)復(fù)制到緩沖區(qū),使攻擊者將能夠查看到堆棧的內(nèi)容并使用包含格式化指令序列的命令行參數(shù)修改堆棧內(nèi)容。B.3.6對方法或函數(shù)參數(shù)進(jìn)行驗(yàn)證代碼示例對方法或函數(shù)參數(shù)進(jìn)行驗(yàn)證,示例1給出了不規(guī)范用法(java語言)示例,示例2給出了規(guī)范用法語言)示例。}voiduseState(){…}上述代碼示例中和沒有驗(yàn)證它們的參數(shù)。惡意的調(diào)用程序可能會傳遞給一個(gè)非法的參數(shù),并將導(dǎo)致出現(xiàn)安全風(fēng)險(xiǎn)。示例2:if(state==null){}if(isInvalidState(state)){…}}voiduseState(){…}…}該方案對參數(shù)進(jìn)行了驗(yàn)證,同時(shí)在使用內(nèi)部的狀態(tài)前也進(jìn)行了檢查,減少了潛在的安全風(fēng)險(xiǎn)。B.3.7返回棧變量地址代碼示例不返回棧上的變量地址,以下給出了不規(guī)范用法(C語言)示例。GB/T39412—2020示例:charname[STRMAXfillInName(name);returnname;}上述代碼返回一個(gè)棧地址,對于調(diào)用該函數(shù)將可能造成預(yù)想不到的結(jié)果。B.3.8暴露危險(xiǎn)的方法或函數(shù)代碼示例不暴露危險(xiǎn)的方法或函數(shù),示例1給出了不規(guī)范用法(java語言)示例,示例2給出了規(guī)范用法語言)示例。Statementstmt=conn.createStatementstmt.execute("DROPDATABASE"+databaseName}上面代碼示例中,方法將刪除輸入?yún)?shù)中指定名稱的數(shù)據(jù)庫。示例中的方法是被聲明為因此會被暴露給應(yīng)用程序中的任何類。在應(yīng)用程序內(nèi)刪除一個(gè)數(shù)據(jù)庫被視為一個(gè)危險(xiǎn)的操作,應(yīng)限制訪問危險(xiǎn)的方法。示例2:該方案通過聲明方法為來完成,只將它暴露給封閉的類。B.3.9使用不兼容類型的指針來訪問變量代碼示例不使用不兼容類型的指針來訪問變量,以下給出了不規(guī)范用法(C語言)示例。示例:{if(sizeof(int)==sizeof(float{floatf=0.0f;}B.3.10使用指針的減法來確定內(nèi)存大小代碼示例避免使用指針的減法來確定內(nèi)存大小,示例1給出了不規(guī)范用法(C語言)示例,示例2給出了規(guī)范structnode{intdata;GB/T39412—2020{while(current!=NULL){t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年新教材高中歷史第三單元遼宋夏金多民族政權(quán)的并立與元朝的統(tǒng)一第11課遼宋夏金元的經(jīng)濟(jì)與社會梯度作業(yè)含解析新人教版必修中外歷史綱要上
- 2025樣板間裝修合同書格式模板
- 2025年長沙貨運(yùn)從業(yè)資格證考試題目及答案大全
- 2025年貴陽貨運(yùn)從業(yè)資格證考試題目和答案
- 2025年南昌模擬考貨運(yùn)從業(yè)資格
- 中國承接導(dǎo)軌項(xiàng)目投資可行性研究報(bào)告
- 上?,F(xiàn)代化工職業(yè)學(xué)院《通訊數(shù)據(jù)獲取與分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025土石方運(yùn)輸合同范文
- 2025設(shè)計(jì)委托合同
- 上海思博職業(yè)技術(shù)學(xué)院《嵌入式應(yīng)用開發(fā)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年初級應(yīng)急救援員理論考試復(fù)習(xí)題庫(含答案)
- 行政案例分析-第一次形成性考核-國開(SC)-參考資料
- 2024年度標(biāo)準(zhǔn)化消防設(shè)施保養(yǎng)協(xié)議版B版
- 《紅色江西贛土地》課件
- 消防火災(zāi)自動報(bào)警主機(jī)更換增加綜合施工專題方案
- 2024年度北京租大客車旅游租車合同范本
- 形式邏輯金岳霖課后習(xí)題答案
- 2024新反洗錢法學(xué)習(xí)課件
- 2024年新疆區(qū)公務(wù)員錄用考試《行測》真題及答案解析
- 《數(shù)字營銷》全套教學(xué)課件
- 中國特色社會主義理論與實(shí)踐研究學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
評論
0/150
提交評論