GB∕T 39412-2020 信息安全技術(shù) 代碼安全審計規(guī)范_第1頁
GB∕T 39412-2020 信息安全技術(shù) 代碼安全審計規(guī)范_第2頁
GB∕T 39412-2020 信息安全技術(shù) 代碼安全審計規(guī)范_第3頁
GB∕T 39412-2020 信息安全技術(shù) 代碼安全審計規(guī)范_第4頁
GB∕T 39412-2020 信息安全技術(shù) 代碼安全審計規(guī)范_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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

評論

0/150

提交評論