本發(fā)明涉及源代碼檢測領域,并且更具體地,涉及一種基于序列化中間表示的源代碼分布式檢測系統(tǒng)及方法。
背景技術:
隨著網(wǎng)絡技術和應用的飛速發(fā)展,信息系統(tǒng)安全正面臨著前所未有的挑戰(zhàn)。網(wǎng)絡化和互聯(lián)互通性已經(jīng)成為當前軟件和信息系統(tǒng)的發(fā)展方向。信息系統(tǒng)與互聯(lián)網(wǎng)或其他網(wǎng)絡的互連,使信息系統(tǒng)遭受攻擊的概率增大,也導致了信息系統(tǒng)面臨的安全威脅空前地增加。另一方面,隨著構建在信息系統(tǒng)之上的各種業(yè)務應用的不斷豐富,以及軟件和信息系統(tǒng)復雜程度的不斷提高,信息系統(tǒng)中隱藏的各種安全隱患也越來越多,并且通常難以被發(fā)現(xiàn)和消除。
最近幾年,重大安全事件的頻頻發(fā)生揭示了當前信息系統(tǒng)安全形勢的嚴峻性。僅僅依靠傳統(tǒng)的安全防護機制來保障信息安全的做法已經(jīng)逐漸力不從心。軟件代碼是構建系統(tǒng)信息的基礎組件,軟件代碼中安全漏洞和未聲明功能(后門)的存在是安全事件頻繁發(fā)生的根源。忽視軟件代碼自身的安全性,而僅僅依靠外圍的防護、事后的修補等方法,舍本逐末,必然事倍功半。只有通過管理和技術手段保障軟件代碼自身的安全性,再輔以各種安全防護手段,才是解決當前安全問題的根本解決之道。
然而,隨著軟件開發(fā)技術以及應用需求的不斷發(fā)展,軟件中的代碼量也在不斷地增加。有些軟件工程或應用的代碼量甚至達到了海量。目前的各種源代碼檢測工具均集成開發(fā)工具中,而當需要進行檢測的源代碼的量過大時,本地開發(fā)工具通常需要花費超乎尋常的時間。并且,由于本地計算資源的局限性,對海量源代碼進行檢測時通常會導致計算機失去響應。這種情況會導致用戶體驗差且無法獲得有效的檢測結果。
技術實現(xiàn)要素:
為了解決上述問題,本發(fā)明提供一種分布式源代碼檢測系統(tǒng),所述系統(tǒng)包括:
協(xié)調(diào)節(jié)點,對待檢測的源代碼進行識別,以確定所述待檢測的源代碼的編程語言和編譯器版本,使用集成編譯器根據(jù)所述編程語言和編譯器版本對待檢測的源代碼進行編譯以生成中間表示,以代碼翻譯單元為單位對中間表示進行序列化從而生成關聯(lián)中間表示文件和至少一個獨立中間表示文件,其中在關聯(lián)中間表示文件中標識關聯(lián)關系;以及對獨立代碼檢測結果和關聯(lián)代碼檢測結果進行匯總分析,以確定分布式源代碼檢測結果;
至少一個代理檢測節(jié)點,根據(jù)檢測類型從多個規(guī)則庫中選擇至少一個規(guī)則庫,并且使用所述至少一個規(guī)則庫對所述至少一個獨立中間表示文件進行檢測,以確定至少一個獨立代碼檢測結果;以及
關聯(lián)檢測節(jié)點,根據(jù)所述檢測關聯(lián)關系以及至少一個獨立代碼檢測結果對所述關聯(lián)中間表示文件進行檢測,以確定關聯(lián)代碼檢測結果。
優(yōu)選地,其中所述至少一個代理檢測節(jié)點中的每個均包括:
缺陷知識庫,用于存儲多個規(guī)則庫并且根據(jù)檢測類型從多個規(guī)則庫中選擇至少一個規(guī)則庫。
優(yōu)選地,其中所述集成編譯器包括以下內(nèi)容中的至少一個:C/C++編譯器、Java/JSP編譯器、C#編譯器、Python編譯器以及PHP編譯器。
優(yōu)選地,所述多個規(guī)則庫為:缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫及開源組件檢測規(guī)則庫。
優(yōu)選地,所述缺陷檢測規(guī)則庫包括以下內(nèi)容中的至少一個:常見缺陷列表、安全隱患列表以及編程錯誤列表。
優(yōu)選地,所述合規(guī)檢測規(guī)則庫包括以下內(nèi)容中的至少一個:計算機安全應急響應組CERT安全編碼規(guī)范和汽車產(chǎn)業(yè)軟件可靠性協(xié)會MISRA的C/C++安全編碼規(guī)范。
優(yōu)選地,所述開源組件檢測規(guī)則庫包括通過搜索引擎和/或大數(shù)據(jù)網(wǎng)絡所收集的開源組件信息。
優(yōu)選地,所述至少一個代理檢測節(jié)點和關聯(lián)檢測節(jié)點均包括以下內(nèi)容中的至少一個:C/C++檢測器、Java/JSP檢測器、C#檢測器、Python檢測器、PHP檢測器以及溯源檢測器。
優(yōu)選地,所述協(xié)調(diào)節(jié)點對分布式源代碼檢測結果進行分析以確定是否需要進行額外檢測,
如果不需要進行額外檢測,則根據(jù)分布式源代碼檢測結果生成檢測報告;以及
如果需要進行額外檢測,則通過接口單元將分布式源代碼檢測結果、待檢測的源代碼以及檢測類型發(fā)送給缺陷管理系統(tǒng),以進行額外檢測。
優(yōu)選地,還包括采用離線或在線方式來更新所述缺陷知識庫。
根據(jù)本發(fā)明的另一方面,提供一種分布式源代碼檢測方法,所述方法包括:
對待檢測的源代碼進行識別,以確定所述待檢測的源代碼的編程語言和編譯器版本,
使用集成編譯器根據(jù)所述編程語言和編譯器版本對待檢測的源代碼進行編譯以生成中間表示,
以代碼翻譯單元為單位對中間表示進行序列化從而生成關聯(lián)中間表示文件和至少一個獨立中間表示文件,其中在關聯(lián)中間表示文件中標識關聯(lián)關系;
根據(jù)檢測類型從多個規(guī)則庫中選擇至少一個規(guī)則庫,并且使用所述至少一個規(guī)則庫對所述至少一個獨立中間表示文件進行檢測,以確定至少一個獨立代碼檢測結果;
根據(jù)所述檢測關聯(lián)關系以及至少一個獨立代碼檢測結果對所述關聯(lián)中間表示文件進行檢測,以確定關聯(lián)代碼檢測結果;以及
對獨立代碼檢測結果和關聯(lián)代碼檢測結果進行匯總分析,以確定分布式源代碼檢測結果。
優(yōu)選地,還包括使用缺陷知識庫來存儲多個規(guī)則庫。
優(yōu)選地,其中所述集成編譯器包括以下內(nèi)容中的至少一個:C/C++編譯器、Java/JSP編譯器、C#編譯器、Python編譯器以及PHP編譯器。
優(yōu)選地,所述多個規(guī)則庫為:缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫及開源組件檢測規(guī)則庫。
優(yōu)選地,,所述缺陷檢測規(guī)則庫包括以下內(nèi)容中的至少一個:常見缺陷列表、安全隱患列表以及編程錯誤列表。
優(yōu)選地,所述合規(guī)檢測規(guī)則庫包括以下內(nèi)容中的至少一個:計算機安全應急響應組CERT安全編碼規(guī)范和汽車產(chǎn)業(yè)軟件可靠性協(xié)會MISRA的C/C++安全編碼規(guī)范。
優(yōu)選地,所述開源組件檢測規(guī)則庫包括通過搜索引擎和/或大數(shù)據(jù)網(wǎng)絡所收集的開源組件信息。
優(yōu)選地,還包括對分布式源代碼檢測結果進行分析以確定是否需要進行額外檢測,如果不需要進行額外檢測,則根據(jù)分布式源代碼檢測結果生成檢測報告。
優(yōu)選地,還包括對分布式源代碼檢測結果進行分析以確定是否需要進行額外檢測,如果需要進行額外檢測,則將分布式源代碼檢測結果、待檢測的源代碼以及檢測類型發(fā)送給缺陷管理系統(tǒng),以進行額外檢測。
優(yōu)選地,還包括采用離線或在線方式來更新所述缺陷知識庫。
附圖說明
通過參考下面的附圖,可以更為完整地理解本發(fā)明的示例性實施方式:
圖1為根據(jù)本發(fā)明優(yōu)選實施方式的分布式源代碼檢測系統(tǒng)的結構示意圖;
圖2為根據(jù)本發(fā)明優(yōu)選實施方式的接口單元的結構示意圖;
圖3為根據(jù)本發(fā)明優(yōu)選實施方式的集成編譯器的結構示意圖;
圖4為根據(jù)本發(fā)明優(yōu)選實施方式的分布式檢測單元的結構示意圖;以及
圖5為根據(jù)本發(fā)明優(yōu)選實施方式的分布式源代碼檢測方法的流程圖。
具體實施方式
現(xiàn)在參考附圖介紹本發(fā)明的示例性實施方式,然而,本發(fā)明可以用許多不同的形式來實施,并且不局限于此處描述的實施例,提供這些實施例是為了詳盡地且完全地公開本發(fā)明,并且向所屬技術領域的技術人員充分傳達本發(fā)明的范圍。對于表示在附圖中的示例性實施方式中的術語并不是對本發(fā)明的限定。在附圖中,相同的單元/元件使用相同的附圖標記。
除非另有說明,此處使用的術語(包括科技術語)對所屬技術領域的技術人員具有通常的理解含義。另外,可以理解的是,以通常使用的詞典限定的術語,應當被理解為與其相關領域的語境具有一致的含義,而不應該被理解為理想化的或過于正式的意義。
圖1為根據(jù)本發(fā)明優(yōu)選實施方式的分布式源代碼檢測系統(tǒng)100的結構示意圖。分布式源代碼檢測系統(tǒng)100針對源代碼安全需求,在對源代碼進行分布式的高精度安全缺陷分析及溯源檢測的基礎上,還可與源代碼版本管理系統(tǒng)(例如,版本控制系統(tǒng)SVN、分布式版本控制系統(tǒng)GIT)、缺陷管理系統(tǒng)(例如,缺陷跟蹤系統(tǒng)Bugzilla,Bug-Tracking System)等進行無縫對接,以最小代價實現(xiàn)源代碼安全的可視化管理,大幅提升的軟件安全質量。分布式源代碼檢測系統(tǒng)100采用源代碼靜態(tài)分析技術,自動將獲取到的待檢測軟件源代碼在相應的編譯環(huán)境中進行編譯,再通過數(shù)據(jù)流分析技術、符號執(zhí)行技術、內(nèi)存精確建模技術等進行分布式分析并檢查源代碼程序的語法、結構、過程、接口等來確定源代碼的安全性。
分布式源代碼檢測系統(tǒng)100分析及檢測的策略源自于多年的源代碼安全積累,并兼容國際權威源代碼安全標準和規(guī)范,包括常見缺陷列表(CWE,Common Weakness Enumeration)、開放式Web應用程序安全項目(OWASP,Open Web Application Security Project)、一般弱點列舉(CWE,Common Weakness Enumeration)、計算機安全應急響應組(CERT,Computer Emergency Response Team)的安全編程標準及汽車產(chǎn)業(yè)軟件可靠性協(xié)會(MISRA,Motor Industry Software Reliability Association)的C/C++安全編碼規(guī)范等。分布式源代碼檢測系統(tǒng)100支持代碼注入、跨站腳本、輸入驗證、API誤用、密碼管理、資源管理錯誤、配置錯誤、不良實現(xiàn)、異常處理、代碼風格、代碼質量及危險函數(shù)等13個大類,600多個小類的檢測策略,從而確保源代碼安全檢測結果的精準和權威性。
如圖1所示,分布式源代碼檢測系統(tǒng)100包括:協(xié)調(diào)節(jié)點101、關聯(lián)檢測節(jié)點106和代理檢測節(jié)點107-1、107-2、…、107-N。其中協(xié)調(diào)節(jié)點101包括:接口單元102、源代碼安全管理單元103、集成編譯器104以及匯總分析單元105。其中關聯(lián)檢測節(jié)點106包括缺陷知識庫、C/C++檢測器、Java/JSP檢測器、C#檢測器、Python檢測器、PHP檢測器以及溯源檢測器。其中,代理檢測節(jié)點107-1、107-2、…、107-N包括缺陷知識庫、C/C++檢測器、Java/JSP檢測器、C#檢測器、Python檢測器、PHP檢測器以及溯源檢測器。其中,關聯(lián)檢測節(jié)點106和代理檢測節(jié)點107-1、107-2、…、107-N可以構成分布式檢測單元。
優(yōu)選地,接口單元102用于實現(xiàn)分布式源代碼檢測系統(tǒng)100與外部設備或系統(tǒng)的信息交換。例如,接口單元102可以從代碼源接收待檢測的源代碼以及檢測類型。其中,待檢測的源代碼可以由各種類型程序語言所編寫的代碼,例如,C、C++、Java、JSP、C#、Python以及PHP等。所屬領域技術人員應當了解的是,本發(fā)明并不限于對上述程序語言進行檢測,而是可以對任何已知的程序語言進行檢測。其中,檢測類型用于區(qū)分待檢測的源代碼要進行的檢測項目,例如,缺陷檢測、合規(guī)檢測和/或開源組件檢測。優(yōu)選地,檢測項目可以是缺陷檢測、合規(guī)檢測和/或開源組件檢測中的任意一項、兩項或全部。檢測類型可以使用代碼或任何方式來表示這7種檢測項目,例如,使用代碼1表示檢測項目為缺陷檢測、代碼2表示檢測項目為合規(guī)檢測、代碼3表示檢測項目為開源組件檢測、代碼4表示檢測項目為缺陷檢測和合規(guī)檢測、代碼5表示檢測項目為缺陷檢測和開源組件檢測、代碼6表示檢測項目為合規(guī)檢測和開源組件檢測以及代碼7表示檢測項目為缺陷檢測、合規(guī)檢測和開源組件檢測。此外,當分布式源代碼檢測系統(tǒng)100對檢測結果進行分析并且確定需要進行額外檢測時,接口單元102將檢測結果發(fā)送給缺陷管理系統(tǒng)。以及,當用戶希望對待檢測的源代碼復檢時,接口單元102將檢測結果發(fā)送給第三方檢測系統(tǒng)。通常,缺陷管理系統(tǒng)可以將分布式源代碼檢測系統(tǒng)100的檢測結果與自身的檢測結果進行整合。其中,檢測結果中可以包括BUG信息。此外,分布式源代碼檢測系統(tǒng)100接收缺陷管理系統(tǒng)反饋的BUG信息以提供定制化開發(fā)服務。第三方檢測系統(tǒng)通常將檢測結果作為參考或比對對象,并且根據(jù)自身的檢測邏輯對待檢測源代碼進行獨立檢測。接口單元102實現(xiàn)第三方檢測工具對接,實現(xiàn)驅動第三方檢測系統(tǒng)完成檢測任務并接收檢測結果的功能。此外,分布式源代碼檢測系統(tǒng)100還可以通過接口單元102從第三方檢測系統(tǒng)獲取其針對待檢測的源代碼進行檢測的檢測結果。
優(yōu)選地,源代碼安全管理單元103是分布式源代碼檢測系統(tǒng)100的樞紐單元。源代碼安全管理單元103提供人機交互界面、負責接收用戶的指令、從外部獲取并存儲待檢測的軟件源代碼、對集成編譯器、缺陷知識庫及檢測單元等模塊下發(fā)工作指令并接收反饋結果。用戶可以通過源代碼安全管理單元103的交互界面完成用戶管理、角色管理、檢測項目管理、源碼管理、普通任務管理、計劃任務管理、統(tǒng)計分析等操作。
優(yōu)選地,源代碼安全管理單元103對所述待檢測的源代碼進行識別,以確定所述待檢測的源代碼的編程語言和編譯器版本。通常,在對待檢測的源代碼進行編譯之前,需要獲得與源代碼相關的信息。源代碼的編程語言和編譯器版本是對源代碼進行編譯所必需的信息。例如,在對待檢測的源代碼進行識別后,確定源代碼為C、C++、Java、JSP、C#、Python或者PHP。在確定了編程語言和編譯器版本后才能對源代碼進行正確地編譯。此外,源代碼安全管理單元103還可以識別所述待檢測的源代碼的其他信息,例如代碼行數(shù)等信息。優(yōu)選地,源代碼安全管理單元103向缺陷知識庫發(fā)送包括所述檢測類型的檢測請求,以向缺陷庫指示在進行源代碼檢測時需要哪些規(guī)則庫。
此外,源代碼安全管理單元103還用與對所確定的分布式源代碼檢測結果進行分析以確定是否需要進行額外檢測。如果不需要進行額外檢測,則根據(jù)分布式源代碼檢測結果生成檢測報告;如果需要進行額外檢測,則通過接口單元將分布式源代碼檢測結果、待檢測的源代碼以及檢測類型發(fā)送給缺陷管理系統(tǒng),以進行額外檢測。缺陷管理系統(tǒng)可以根據(jù)分布式源代碼檢測結果、待檢測的源代碼以及檢測類型對待檢測的源代碼進行檢測,并且可能根據(jù)檢測結果來提供針對性的策略。
例如,當匯總分析單元105所確定的檢索結果中的缺陷數(shù)量遠低于平均值時,可能會觸發(fā)額外檢測。通暢地,普通軟件工程師的缺陷密度一般為50~250個缺陷/KLOC(缺陷/千行源代碼)。由于有嚴格的軟件開發(fā)質量管理機制和多重測試環(huán)節(jié),成熟的軟件公司的缺陷率要低得多,普通軟件開發(fā)公司的缺陷密度為4~40個缺陷/KLOC、并且高水平的軟件公司的缺陷密度為2~4個缺陷/KLOC。目前,國產(chǎn)軟件平均的缺陷密度為6個缺陷/KLOC。針對不同的用戶,當缺陷/千行源代碼明顯低于行業(yè)平均值時,源代碼安全管理單元103會觸發(fā)額外檢測。例如,如果檢測結果中表明,普通軟件開發(fā)公司的源代碼的缺陷/千行源代碼小于0.1,那么可能觸發(fā)額外檢測。
優(yōu)選地,集成編譯器104根據(jù)所述編程語言和編譯器版本對所述關聯(lián)代碼部分和至少一個獨立代碼部分進行編譯,以獲得關聯(lián)代碼編譯文件和至少一個獨立代碼編譯文件。集成編譯器104用于為主要的編程語言提供編譯環(huán)境,例如為C、C++、JAVA、JSP、C#、Python等編程語言的源代碼提供編譯環(huán)境,從而使相應的源代碼能夠完成編譯以生成編譯信息。在編譯的過程中,集成編譯器104能夠產(chǎn)生函數(shù)調(diào)用關系、控制流信息、變量別名信息、指針信息、數(shù)據(jù)依賴關系及接口等信息。然后,集成編譯器104能夠這些信息統(tǒng)一匯總后傳遞給相應的編程語言檢測引擎進行安全檢測。優(yōu)選地,集成編譯器104包括C/C++編譯器、Java/JSP編譯器、C#編譯器、Python編譯器以及PHP編譯器等。
優(yōu)選地,集成編譯器104使用C/C++編譯器對C/C++源代碼進行編譯以獲得的編譯信息;使用Java/JSP編譯器對Java/JSP源代碼進行編譯以獲得的編譯信息;使用C#編譯器對C#源代碼進行編譯以獲得的編譯信息;使用Python編譯器對Python源代碼進行編譯以獲得的編譯信息;以及使用PHP編譯器對PHP編譯器源代碼進行編譯以獲得的編譯信息。
優(yōu)選地,集成編譯器104根據(jù)所述編程語言和編譯器版本對待檢測的源代碼進行編譯以生成中間表示,以代碼翻譯單元為單位對中間表示進行序列化從而生成關聯(lián)中間表示文件和至少一個獨立中間表示文件,其中在關聯(lián)中間表示文件中標識關聯(lián)關系。例如,由代碼部分A和D組成的關聯(lián)代碼部分進行編譯和序列化以生成與代碼部分A和D相關聯(lián)的關聯(lián)中間表示文件。此外,集成編譯器104對至少一個獨立代碼部分進行編譯和序列化以生成至少一個獨立中間表示文件。例如,對由代碼部分B、C和E進行編譯和序列化以生成與代碼部分B、C和E分別對應的獨立中間表示文件B、C和E。此外,集成編譯器104在關聯(lián)代碼編譯文件中標識檢測關聯(lián)關系。由于各個代碼部分A-E之間具有諸如調(diào)用之類的關聯(lián)關系,必須對這種關聯(lián)關系進行標識以用于后續(xù)對獨立檢測結果進行匯總。通常,本發(fā)明將檢測關聯(lián)關系放置于關聯(lián)中間表示文件中,這是因為對關聯(lián)中間表示文件進行檢測的節(jié)點為分布式源代碼檢測系統(tǒng)100的關聯(lián)檢測節(jié)點。
優(yōu)選地,缺陷知識庫(圖1中未示出)是存儲源代碼檢測策略的數(shù)據(jù)庫。缺陷知識庫存儲多個規(guī)則庫,包括缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫以及開源組件檢測規(guī)則庫等。缺陷知識庫可以提供的檢測缺陷種類包括緩沖區(qū)溢出、SQL注入、跨站腳本、代碼質量、危險函數(shù)等13個大類,600多個小類,并且可檢測的開源組件規(guī)則庫達60萬條。
優(yōu)選地,缺陷檢測規(guī)則庫源自多年的源代碼安全積累,并兼容國際權威源代碼安全標準和規(guī)范,例如以下3個國際標準或規(guī)范:常見缺陷列表CWE,是MITRE公司繼CVE之后的又一個安全漏洞詞典。CWE為程序員和安全從業(yè)者提供了一個有條理的軟件缺陷類型庫。CWE旨在讓人們更好地理解軟件缺陷并創(chuàng)建能夠識別、修復以及阻止此類缺陷的自動化工具;OWASP TOP 10:開放式web應用程序安全項目十大安全隱患列表,是OWASP最重要的項目之一。OWASP TOP 10不但總結了web應用程序最可能、最常見、最危險的十大安全隱患,還包括了如何消除這些隱患的建議;以及CWE/SANS 25種最危險的編程錯誤,是SANS學院、MITRE公司及美國和歐洲很多頂級軟件安全專家共同合作的成果。CWE/SANS TOP 25可以幫助程序員編寫更安全的代碼,幫助用戶衡量軟件是否安全。
優(yōu)選地,合規(guī)檢測規(guī)則庫支持主流國際標準和規(guī)范的代碼合規(guī)檢測規(guī)則,包括:計算機安全應急響應組CERT安全編程標準、汽車產(chǎn)業(yè)軟件可靠性協(xié)會MISRA的C/C++安全編碼規(guī)范等。其中CERT創(chuàng)建的源代碼分析實驗室為軟件系統(tǒng)提供了適用于CERT安全編碼標準的一致性測試。這種測試包括用于Java的CERT Oracle安全編碼標準、用于C的CERT C語言安全編碼標準、用于C++的CERT C++語言安全編碼標準,用于Perl的CERT Perl安全編碼標準。汽車產(chǎn)業(yè)軟件可靠性協(xié)會MISRA的C/C++安全編碼規(guī)范是MISRA針對C、C++語言提出的開發(fā)標準,旨在增進嵌入式系統(tǒng)的安全性及可移植性。
優(yōu)選地,開源組件檢測規(guī)則庫包括通過搜索引擎和/或大數(shù)據(jù)網(wǎng)絡所收集的開源組件信息。由于開源組件存在的已知漏洞和授權協(xié)議會給軟件帶來風險,而個別研發(fā)人員為了貪圖方便,直接引用來自互聯(lián)網(wǎng)的開源組件進行編碼,這些開源組件往往已經(jīng)存在漏洞,這將降低開發(fā)軟件的整體安全性。因此,本發(fā)明在現(xiàn)有搜索引擎爬蟲的基礎上,建立了開源組件檢測規(guī)則庫,以使得溯源檢測器(下面將會詳細介紹)通過加載該規(guī)則庫,檢測源代碼中是否引用了開源組件。進一步地,確定所使用的開源組件是否存在軟件使用授權的問題,從而幫助用戶規(guī)避開源組件的法律風險。同時,本發(fā)明還可檢測軟件中引用的開源組件存在哪些安全漏洞,從而最大程度降低開源代碼引入的安全風險并且解決傳統(tǒng)源代碼檢測技術無法進行溯源檢測的問題。
優(yōu)選地,缺陷知識庫根據(jù)檢測類型將所述多個規(guī)則庫中的至少一個規(guī)則庫發(fā)送給用于進行檢測的部件,其中每個規(guī)則庫與一種檢測策略相關聯(lián)。如上所述,檢測類型可以使用代碼或任何方式來表示檢測項目。例如,在檢測類型的代碼為1時,缺陷知識庫將缺陷檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為2時,缺陷知識庫103將合規(guī)檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為3時,缺陷知識庫103將開源組件檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為4時,缺陷知識庫103將缺陷檢測規(guī)則庫和合規(guī)檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為5時,缺陷知識庫103將缺陷檢測規(guī)則庫和開源組件檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為6時,缺陷知識庫103將合規(guī)檢測規(guī)則庫和開源組件檢測規(guī)則庫發(fā)送給用于進行檢測的部件;在檢測類型的代碼為7時,缺陷知識庫103將缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫和開源組件檢測規(guī)則庫發(fā)送給用于進行檢測的部件。優(yōu)選地,每個規(guī)則庫與一種檢測策略相關聯(lián),即缺陷檢測規(guī)則庫與缺陷檢測策略相關聯(lián)、合規(guī)檢測規(guī)則庫與合規(guī)檢測策略相關聯(lián),以及開源組件檢測規(guī)則庫與開源組件檢測策略相關聯(lián)。
優(yōu)選地,缺陷知識庫會定期或不定期進行更新。其中定期更新可以是例如,每天、每周或每月進行更新。不定期更新通常是在缺陷知識庫中的任意規(guī)則庫的內(nèi)容發(fā)生改變時進行更新。此外,通常會通過在線或離線的方式來更新缺陷知識庫103。
優(yōu)選地,分布式檢測單元根據(jù)至少一個規(guī)則庫和所述檢測關聯(lián)關系對所述至少一個獨立中間表示文件和關聯(lián)中間表示文件進行檢測,以確定分布式源代碼檢測結果。分布式檢測單元包括關聯(lián)檢測節(jié)點106和代理檢測節(jié)點107-1、107-2、...、107-N。通常,關聯(lián)檢測節(jié)點106位于分布式源代碼檢測系統(tǒng)100的主節(jié)點上,而代理檢測節(jié)點107-1、107-2、...、107-N位于分布式源代碼檢測系統(tǒng)100的各個分節(jié)點上。優(yōu)選地,各個分節(jié)點位于與主節(jié)點相近或遠離的其他計算機設備上。各個分節(jié)點通過有線或無線通信鏈路與主節(jié)點連接,以進行數(shù)據(jù)交換。優(yōu)選地,分布式源代碼檢測系統(tǒng)100中除了代理檢測節(jié)點107-1、107-2、...、107-N之外的其他部件均可位于主節(jié)點或協(xié)調(diào)節(jié)點上。優(yōu)選地,代理檢測節(jié)點107-1、107-2、...、107-N根據(jù)所述至少一個規(guī)則庫對獨立中間表示文件進行檢測,以確定獨立代碼檢測結果。關聯(lián)檢測節(jié)點106根據(jù)所述檢測關聯(lián)關系以及獨立代碼檢測結果對所述關聯(lián)中間表示文件進行檢測,以確定關聯(lián)代碼檢測結果。分布式源代碼檢測系統(tǒng)100隨后對獨立代碼檢測結果和關聯(lián)代碼檢測結果進行匯總分析,以確定分布式源代碼檢測結果。分布式源代碼檢測系統(tǒng)100將分布式源代碼檢測結果作為對待檢測的源代碼進行檢測的結果。
優(yōu)選地,關聯(lián)檢測節(jié)點和代理檢測節(jié)點均包括:C/C++檢測器、Java/JSP檢測器、C#檢測器、Python檢測器、PHP檢測器以及溯源檢測器等。各個檢測器接收來自集成編譯器的相應編程語言的編譯信息,結合缺陷知識庫提供的至少一個規(guī)則庫(每個規(guī)則庫對應一個檢測策略)對源代碼進行檢測。優(yōu)選地,獨立代碼檢測結果和關聯(lián)代碼檢測結果均可以包括BUG信息、缺陷類型、缺陷起始位置、缺陷結束位置等信息。優(yōu)選地,關聯(lián)檢測節(jié)點106可以將從缺陷知識庫獲取的至少一個規(guī)則庫傳送給代理檢測節(jié)點107-1、107-2、...、107-N中的任意一個并且進行定期更新。優(yōu)選地,所述更新方式可以在線或離線更新。
具體地,代理檢測節(jié)點可從獨立代碼編譯文件中獲取編譯信息并且關聯(lián)檢測節(jié)點可從關聯(lián)代碼編譯文件和獨立代碼檢測結果中獲取編譯信息。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的C/C++源代碼的編譯信息并且將其傳輸?shù)紺/C++檢測器,C/C++檢測器根據(jù)加載的C/C++檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的Java/JSP/html/xml源代碼的編譯信息并且將其傳輸?shù)絁ava/JSP檢測器,Java/JSP檢測器根據(jù)加載的Java/JSP/html/xml檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的C#/ASPX源代碼的編譯信息并且將其傳輸?shù)紺#/ASPX檢測器,C#/ASPX檢測器根據(jù)加載的C#檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的Python源代碼的編譯信息并且將其傳輸?shù)絇ython檢測器,Python檢測器根據(jù)加載的Python檢測策略進行檢測,得出分析結果。以及,關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的接收PHP源代碼的編譯信息并且將其傳輸?shù)絇HP檢測器,PHP檢測器根據(jù)加載的PHP檢測策略進行檢測,得出分析結果。
圖2為根據(jù)本發(fā)明優(yōu)選實施方式的接口單元200的結構示意圖。接口單元200用于實現(xiàn)分布式源代碼檢測系統(tǒng)與外部設備或系統(tǒng)的信息交換。例如,接口單元200負責與外部的代碼源、外部代碼版本管理系統(tǒng)、缺陷管理系統(tǒng)以及第三方系統(tǒng)等進行對接,從而從SVN、GIT等代碼庫讀取待檢測的源代碼并傳送到源代碼安全管理單元等待檢測。并且,接口單元200能夠將源代碼安全管理單元發(fā)送的源代碼的BUG信息傳輸?shù)紹ugzilla等缺陷管理系統(tǒng),同時接收缺陷管理系統(tǒng)反饋的BUG信息并轉發(fā)回源代碼安全管理單元。為了提供定制化開發(fā)服務,接口單元200與第三方檢測工具對接,實現(xiàn)驅動第三方檢測引擎完成檢測任務并接收檢測結果的功能。即,接口單元200通過與代碼庫SVN、GIT及Bugzilla等系統(tǒng)對外開放的通用接口對接,實現(xiàn)源代碼的讀取及BUG信息的交互。通過定制化開發(fā)與第三方檢測引擎接口對接,實現(xiàn)檢測任務的下發(fā)和檢測結果的接收。
如圖2所示,接口單元200包括:代碼源接口201、缺陷管理系統(tǒng)接口202以及第三方檢測系統(tǒng)接口203。其中,代碼源接口201用于與代碼源204進行通信,并且代碼源可以是各種類型的設備,例如外部代碼庫SVN、GIT、用戶終端、個人計算機等。代碼源接口201可以從代碼源204接收待檢測的源代碼以及檢測類型。其中,待檢測的源代碼可以由各種類型程序語言所編寫的代碼,例如,C、C++、Java、JSP、C#、Python以及PHP等。其中,檢測類型用于區(qū)分待檢測的源代碼要進行的檢測項目,例如,缺陷檢測、合規(guī)檢測和/或開源組件檢測。優(yōu)選地,檢測項目可以是缺陷檢測、合規(guī)檢測和/或開源組件檢測中的任意一項、兩項或全部。
缺陷管理系統(tǒng)接口202用于與缺陷管理系統(tǒng)205進行通信。缺陷管理系統(tǒng)205例如是Bugzilla等。當分布式源代碼檢測系統(tǒng)對分布式源代碼檢測結果進行分析并且確定需要進行額外檢測時,缺陷管理系統(tǒng)接口202將分布式源代碼檢測結果發(fā)送給缺陷管理系統(tǒng)205。通常,缺陷管理系統(tǒng)205可以將分布式源代碼檢測系統(tǒng)的分布式源代碼檢測結果與自身的檢測結果進行整合。其中,檢測結果中可以包括BUG信息。此外,分布式源代碼檢測系統(tǒng)接收缺陷管理系統(tǒng)205反饋的BUG信息以提供定制化開發(fā)服務和更好地進行軟件源代碼缺陷管理。
第三方檢測系統(tǒng)接口203用于與第三方檢測系統(tǒng)205進行通信。第三方檢測系統(tǒng)接口203為非標配接口,按用戶需求提供個性化開發(fā)。第三方檢測系統(tǒng)接口203負責給第三方檢測系統(tǒng)206下達檢測命令,并接收第三方檢測工具的檢測結果。針對已經(jīng)購買了Fortify SCA、Checkmarx及Coverity Scan等工具的用戶,本發(fā)明通過提供第三方檢測系統(tǒng)接口203,可驅動以上3個工具對源代碼進行復檢,并統(tǒng)一反饋檢測結果,既互補優(yōu)化源代碼檢測結果,也保護了用戶的原有投入。第三方檢測系統(tǒng)206通常將分布式源代碼檢測結果作為參考或比對對象,并且根據(jù)自身的檢測邏輯對待檢測源代碼進行獨立檢測。此外,分布式源代碼檢測系統(tǒng)還可以通過第三方檢測系統(tǒng)接口203從第三方檢測系統(tǒng)206獲取其針對待檢測的源代碼進行檢測的檢測結果。
接口單元200是安全開發(fā)生命周期管理功能實現(xiàn)的基礎。通過接口單元200,報名費可將源代碼安全檢測工作融入到已有開發(fā)和測試流程中,最大程度幫助用戶自動化完成源代碼安全檢測工作,從而降低源代碼檢測成本開銷。
圖3為根據(jù)本發(fā)明優(yōu)選實施方式的集成編譯器300的結構示意圖。集成編譯器300根據(jù)所述編程語言和編譯器版本對待檢測的源代碼進行編譯以生成中間表示,以代碼翻譯單元為單位對中間表示進行序列化從而生成關聯(lián)中間表示文件和至少一個獨立中間表示文件,其中在關聯(lián)中間表示文件中標識關聯(lián)關系。優(yōu)選地,集成編譯器300可以位于代理檢測節(jié)點和/或關聯(lián)檢測節(jié)點中。集成編譯器300用于為主要的編程語言提供編譯環(huán)境,例如為C、C++、JAVA、JSP、C#、Python等編程語言的源代碼提供編譯環(huán)境,從而使相應的源代碼能夠完成編譯以生成編譯信息。在編譯的過程中,集成編譯器104能夠產(chǎn)生函數(shù)調(diào)用關系、控制流信息、變量別名信息、指針信息、數(shù)據(jù)依賴關系及接口等信息。然后,集成編譯器300能夠這些信息統(tǒng)一匯總后傳遞給相應的編程語言檢測引擎進行安全檢測。
如圖3所示,集成編譯器300包括:C/C++編譯器301、Java/JSP編譯器302、C#編譯器303、Python編譯器304以及PHP編譯器305。優(yōu)選地,C/C++編譯器301對C/C++源代碼進行編譯以獲得的編譯信息。Java/JSP編譯器302對Java/JSP源代碼進行編譯以獲得的編譯信息。C#編譯器303對C#源代碼進行編譯以獲得的編譯信息。Python編譯器304對Python源代碼進行編譯以獲得的編譯信息。PHP編譯器305對PHP編譯器源代碼進行編譯以獲得的編譯信息。
集成編譯器300內(nèi)的5個編譯器根據(jù)所述待檢測的源代碼的編程語言和編譯器版本完成對相應編程語言的源代碼代碼部分的編譯動作后,將產(chǎn)生的編譯信息傳遞給相應編程語言檢測器進行檢測。源代碼靜態(tài)檢測技術一般有直接語法分析和編譯源代碼后進行分析兩種方式,優(yōu)選地,本發(fā)明以第二種方式作為實例進行說明,但是本發(fā)明的思路也適用于第一種方式。優(yōu)選地,本發(fā)明編譯源代碼后進行分析可探測程序執(zhí)行路徑,避免虛假路徑帶來的誤報,同時編譯后產(chǎn)生的函數(shù)調(diào)用關系、控制流信息、變量別名信息、指針信息、數(shù)據(jù)依賴關系及接口等信息,讓采用這種方式的源代碼分析工具提供更好的檢測效果。但是,操作人員手動創(chuàng)建編譯環(huán)境不是一件簡單的事情,本發(fā)明的集成編譯器300可自動為待檢測的源代碼創(chuàng)建編譯環(huán)境,并且對使用者完全透明,在保證檢測精度的同時極大的提高了源代碼檢測工作的效率。
圖4為根據(jù)本發(fā)明優(yōu)選實施方式的分布式檢測單元400的結構示意圖。分布式檢測單元400根據(jù)至少一個規(guī)則庫和所述檢測關聯(lián)關系對所述至少一個獨立中間表示文件和關聯(lián)中間表示文件進行檢測,以確定分布式源代碼檢測結果。分布式檢測單元400包括關聯(lián)檢測節(jié)點410和代理檢測節(jié)點420-1、420-2、...、420-N。優(yōu)選地,代理檢測節(jié)點420-1、420-2、...、420-N根據(jù)所述至少一個規(guī)則庫對獨立中間表示文件進行檢測,以確定獨立代碼檢測結果。關聯(lián)檢測節(jié)點410根據(jù)所述檢測關聯(lián)關系以及獨立代碼檢測結果對所述關聯(lián)中間表示文件進行檢測,以確定分布式源代碼檢測結果。其中,關聯(lián)檢測節(jié)點410和代理檢測節(jié)點420-1、420-2、...、420-N均包括C/C++檢測器401、Java/JSP檢測器402、C#檢測器403、Python檢測器404、PHP檢測器405以及溯源檢測器406。各個檢測器接收來自集成編譯器的相應編程語言的編譯信息,結合缺陷知識庫提供的至少一個規(guī)則庫(每個規(guī)則庫對應一個檢測策略)對源代碼進行檢測。分布式檢測單元400將分布式源代碼檢測結果反饋到源代碼安全管理單元。優(yōu)選地,分布式源代碼檢測結果可以包括BUG信息、缺陷類型、缺陷起始位置、缺陷結束位置等信息。
具體地,代理檢測節(jié)點420-1、420-2、...、420-N可從獨立中間標識文件中獲取編譯信息并且關聯(lián)檢測節(jié)點410可從關聯(lián)中間表示文件和獨立代碼檢測結果中獲取編譯信息。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的C/C++源代碼的編譯信息并且將其傳輸?shù)紺/C++檢測器(例如,C/C++檢測器401),C/C++檢測器根據(jù)加載的C/C++檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的Java/JSP/html/xml源代碼的編譯信息并且將其傳輸?shù)絁ava/JSP檢測器(例如,Java/JSP檢測器402),Java/JSP檢測器根據(jù)加載的Java/JSP/html/xml檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的C#/ASPX源代碼的編譯信息并且將其傳輸?shù)紺#/ASPX檢測器(例如,C#/ASPX檢測器403),C#/ASPX檢測器根據(jù)加載的C#檢測策略進行檢測,得出分析結果。關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的Python源代碼的編譯信息并且將其傳輸?shù)絇ython檢測器(例如,Python檢測器404),Python檢測器根據(jù)加載的Python檢測策略進行檢測,得出分析結果。以及,關聯(lián)檢測節(jié)點和代理檢測節(jié)點均可根據(jù)所獲取的接收PHP源代碼的編譯信息并且將其傳輸?shù)絇HP檢測器(例如,PHP檢測器405),PHP檢測器根據(jù)加載的PHP檢測策略進行檢測,得出分析結果。
優(yōu)選地,關聯(lián)檢測節(jié)點410和代理檢測節(jié)點420-1、420-2、...、420-N采用數(shù)據(jù)流分析、符號執(zhí)行、內(nèi)存精確建模技術等源代碼靜態(tài)分析技術,在保證源代碼安全檢測效率的前提下極大地提高了檢測精度。其中,數(shù)據(jù)流分析是一種在不運行程序的條件下,從程序中獲取數(shù)據(jù)流信息的技術。數(shù)據(jù)流信息最終被傳遞給檢測單元進行進一步缺陷分析。在數(shù)據(jù)流信息獲取方面,分析的精度問題至關重要。本發(fā)明的檢測單元主要從流不敏感、流敏感和路徑敏感三個方面來增加分析的精度。例如:流不敏感分析給出的是一個函數(shù)整體的數(shù)據(jù)流信息;流敏感的分析給出函數(shù)控制流圖上每一個點對應的信息;以及路徑敏感分析對函數(shù)控制流圖上每個點可能給出多個信息,沿著不同的路徑到達同一個程序點可能會產(chǎn)生不同的狀態(tài)信息,路徑敏感分析保留這些不同的信息。
優(yōu)選地,符號執(zhí)行的目的是降低檢測的誤報率。在本發(fā)明的檢測單元中引入模擬符號執(zhí)行,忽略程序中不可達的代碼路徑中存在的缺陷。符號模擬執(zhí)行是假設程序的所有輸入值都是符號值,根據(jù)程序中的每條路徑對程序進行符號模擬執(zhí)行。在程序分支處,記錄程序對變量的約束信息,同時求解約束條件,判斷該條路徑是否可執(zhí)行,從而可以剪除不可執(zhí)行路徑。采用這種方式的優(yōu)點是最大可能的檢測了程序的所有路徑;并且避免了虛假路徑帶來的誤報問題。
傳統(tǒng)靜態(tài)分析技術不能對內(nèi)存進行更精確分析,因此本發(fā)明的檢測單元采用內(nèi)存精確建模技術,可以精確的模擬指針運算,多級指針解引用以及區(qū)分內(nèi)存中數(shù)組的每個不同的元素和結構體的不同的域。通過對內(nèi)存建模,可以對指針表達式的值進行精確分析,并區(qū)分指向同一個對象內(nèi)部的指針各自不同的偏移量,使得針對指針的檢測更加精確。指針在源代碼中非常普遍,使用指針能夠有速度快、節(jié)約內(nèi)存等優(yōu)點,但指針的使用不當也會造成安全隱患,如空指針解引用就可能會造成系統(tǒng)崩潰。因此,對指針的精確模擬,可以有效地檢測源代碼中的指針相關安全問題。
優(yōu)選地,溯源檢測器406根據(jù)開源組件檢測規(guī)則庫對待檢測的源代碼中使用的開源組件進行檢測。本發(fā)明在現(xiàn)有搜索引擎爬蟲的基礎上,建立了開源組件檢測規(guī)則庫,以使得溯源檢測器406通過加載該規(guī)則庫,檢測源代碼中是否引用了開源組件。進一步地,確定所使用的開源組件是否存在軟件使用授權的問題,從而幫助用戶規(guī)避開源組件的法律風險。同時,本發(fā)明還可檢測軟件中引用的開源組件存在哪些安全漏洞,從而最大程度降低開源代碼引入的安全風險并且解決傳統(tǒng)源代碼檢測技術無法進行溯源檢測的問題。
溯源檢測器406遍歷待檢測的源代碼的組件信息,與缺陷知識庫的開源組件檢測規(guī)則庫進行比對,如匹配到具體的開源組件,便將該組件的信息及存在的安全漏洞信息反饋到源代碼安全管理單元。溯源檢測器406結合了互聯(lián)網(wǎng)基礎,通過搜索引擎和大數(shù)據(jù)技術,可確保獲取到的開源組件信息是最多且最全的。通過海量的開源組件規(guī)則庫可幫助企業(yè)及時發(fā)現(xiàn)軟件中存在哪些開源組件,存在哪些安全風險。
優(yōu)選地,接口單元407可用于將至少一個獨立中間表示文件下發(fā)給相應的代理檢測節(jié)點420-1、420-2、...、420-N并且用于從代理檢測節(jié)點420-1、420-2、...、420-N獲取獨立代碼檢測結果。
圖5為根據(jù)本發(fā)明優(yōu)選實施方式的分布式源代碼檢測方法500的流程圖。分布式源代碼檢測方法500針對源代碼安全需求,在對源代碼進行高精度安全缺陷分析及溯源檢測的基礎上,還可與源代碼版本管理系統(tǒng)(例如,版本控制系統(tǒng)SVN、分布式版本控制系統(tǒng)GIT)、缺陷管理系統(tǒng)(例如,缺陷跟蹤系統(tǒng)Bugzilla,Bug-Tracking System)等進行信息交換,以最小代價實現(xiàn)源代碼安全的可視化管理,大幅提升的軟件安全質量。分布式源代碼檢測方法500采用源代碼靜態(tài)分析技術,自動將獲取到的待檢測軟件源代碼在相應的編譯環(huán)境中進行編譯,再通過數(shù)據(jù)流分析技術、符號執(zhí)行技術、內(nèi)存精確建模技術等進行分析并檢查源代碼程序的語法、結構、過程、接口等來確定源代碼的安全性。分布式源代碼檢測方法500支持代碼注入、跨站腳本、輸入驗證、API誤用、密碼管理、資源管理錯誤、配置錯誤、不良實現(xiàn)、異常處理、代碼風格、代碼質量及危險函數(shù)等13個大類,600多個小類的檢測策略,從而確保源代碼安全檢測結果的精準和權威性。
如圖5所示,分布式源代碼檢測方法500從步驟501處開始。在步驟501,對待檢測的源代碼進行識別,以確定所述待檢測的源代碼的編程語言和編譯器版本。通常,在對待檢測的源代碼進行編譯之前,需要獲得與源代碼相關的信息。源代碼的編程語言和編譯器版本是對源代碼進行編譯所必需的信息。例如,在對待檢測的源代碼進行識別后,確定源代碼為C、C++、Java、JSP、C#、Python或者PHP。在確定了編程語言和編譯器版本后才能對源代碼進行正確地編譯。此外,分布式源代碼檢測方法500還可以識別所述待檢測的源代碼的其他信息,例如代碼行數(shù)等信息。優(yōu)選地,分布式源代碼檢測方法500向缺陷知識庫發(fā)送包括所述檢測類型的檢測請求,以向缺陷庫指示在進行源代碼檢測時需要哪些規(guī)則庫
在步驟502,使用集成編譯器根據(jù)所述編程語言和編譯器版本對待檢測的源代碼進行編譯以生成中間表示。
在步驟503。以代碼翻譯單元為單位對中間表示進行序列化從而生成關聯(lián)中間表示文件和至少一個獨立中間表示文件,其中在關聯(lián)中間表示文件中標識關聯(lián)關系。
優(yōu)選地,在步驟504,據(jù)檢測類型從多個規(guī)則庫中選擇至少一個規(guī)則庫,并且使用所述至少一個規(guī)則庫對所述至少一個獨立中間表示文件進行檢測,以確定至少一個獨立代碼檢測結果。優(yōu)選地,每個規(guī)則庫與一種檢測策略相關聯(lián),即缺陷檢測規(guī)則庫與缺陷檢測策略相關聯(lián)、合規(guī)檢測規(guī)則庫與合規(guī)檢測策略相關聯(lián),以及開源組件檢測規(guī)則庫與開源組件檢測策略相關聯(lián)。缺陷知識庫是存儲源代碼檢測策略的數(shù)據(jù)庫。缺陷知識庫存儲多個規(guī)則庫,包括缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫以及開源組件檢測規(guī)則庫等。如上所述,檢測類型可以使用代碼或任何方式來表示檢測項目。例如,在檢測類型的代碼為1時,獲取缺陷檢測規(guī)則庫;在檢測類型的代碼為2時,獲取合規(guī)檢測規(guī)則庫;在檢測類型的代碼為3時,獲取開源組件檢測規(guī)則庫;在檢測類型的代碼為4時,獲取缺陷檢測規(guī)則庫和合規(guī)檢測規(guī)則庫;在檢測類型的代碼為5時,獲取缺陷檢測規(guī)則庫和開源組件檢測規(guī)則庫;在檢測類型的代碼為6時,獲取合規(guī)檢測規(guī)則庫和開源組件檢測規(guī)則庫;以及在檢測類型的代碼為7時,后去缺陷檢測規(guī)則庫、合規(guī)檢測規(guī)則庫和開源組件檢測規(guī)則庫。
在步驟505,根據(jù)所述檢測關聯(lián)關系以及至少一個獨立代碼檢測結果對所述關聯(lián)中間表示文件進行檢測,以確定關聯(lián)代碼檢測結果。根據(jù)所述編程語言和編譯器版本對關聯(lián)代碼部分和至少一個獨立代碼部分進行編譯以及序列化,以獲得關聯(lián)中間表示文件和至少一個獨立中國建表示文件,其中在關聯(lián)代碼編譯文件中標識檢測關聯(lián)關系。
在步驟506,對獨立代碼檢測結果和關聯(lián)代碼檢測結果進行匯總分析,以確定分布式源代碼檢測結果。
已經(jīng)通過參考少量實施方式描述了本發(fā)明。然而,本領域技術人員所公知的,正如附帶的專利權利要求所限定的,除了本發(fā)明以上公開的其他的實施例等同地落在本發(fā)明的范圍內(nèi)。
通常地,在權利要求中使用的所有術語都根據(jù)他們在技術領域的通常含義被解釋,除非在其中被另外明確地定義。所有的參考“一個/所述/該[裝置、組件等]”都被開放地解釋為所述裝置、組件等中的至少一個實例,除非另外明確地說明。這里公開的任何方法的步驟都沒必要以公開的準確的順序運行,除非明確地說明。