本發(fā)明涉及軟件測試,尤其涉及一種程序安全測試方法、裝置、電子設備及存儲介質。
背景技術:
1、目前,在程序上線運行之前或運行過程中通常需要對程序代碼進行測試,其中sast(static?application?security?testing,靜態(tài)程序安全測試)是一種被廣泛應用的代碼測試方法。sast的原理是由源代碼生成ir(intermediate?representation,中間表示),然后對ir進行污點分析,即跟蹤程序中的特定數(shù)據(jù)(被稱為“污點”)如何在程序中傳播,同時,加以定制的掃描規(guī)則,完成漏洞掃描。
2、相關技術中,使用頻率較高的掃描規(guī)則包括ssrf(server-side?requestforgery,服務器端請求偽造)、路徑注入、命令注入等,但由于sast本身無法得知程序運行時的結果,以及字符串的值的來源可能包括多種而sast無法從多種數(shù)據(jù)源中讀取數(shù)據(jù),這導致相關技術中sast對參數(shù)字符拼接類的異常情況的誤報率較高。
3、以ssrf為例,漏洞是否可以被污點利用的關鍵在于是否可以控制url(uniformresource?locator,統(tǒng)一資源定位系統(tǒng))中的host(主機名,用于指示目標服務器的地址)部分。然而由于url是字符串類型,在代碼中經常會由多個參數(shù)在不同位置通過不同方式進行字符拼接組成,而ssrf很難對變量值的傳遞進行分詞,且sast無法將程序運行起來,因此很難確定url中的host部分是否可控,導致sast易對字符串拼接調用得到的參數(shù)產生誤報。
技術實現(xiàn)思路
1、有鑒于此,本發(fā)明實施例提供了一種程序安全測試方法、裝置、電子設備及存儲介質,以提高程序安全測試準確性。
2、根據(jù)本發(fā)明的一方面,提供了程序安全測試方法,所述方法包括:
3、基于目標源代碼,確定所述目標源代碼中的參數(shù)拼接調用;
4、基于各所述參數(shù)拼接調用,得到各參數(shù)鏈式結構,其中,每個所述參數(shù)鏈式結構中包括多個參數(shù)以及多個所述參數(shù)之間的調用關系;
5、針對所述參數(shù)鏈式結構中包括的各個參數(shù),基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽,其中,所述可利用性標簽用于指示所述參數(shù)能否被污點代碼利用,所述預設檢測規(guī)則包括字符串字面值檢測規(guī)則以及變量檢測規(guī)則;
6、將可利用性標簽為否的參數(shù)放置于掃描規(guī)則過濾器中,以使所述掃描規(guī)則過濾器忽略所述可利用性標簽為否的參數(shù)的漏洞掃描。
7、在一種可能的實施例中,所述方法還包括:基于所述參數(shù)的可利用性標簽,確定所述參數(shù)的下游參數(shù)的可利用性標簽,其中,所述下游參數(shù)為在所述參數(shù)鏈式結構中直接或間接引用所述參數(shù)的參數(shù)。
8、在一種可能的實施例中,所述針對所述參數(shù)鏈式結構中包括的各個參數(shù),基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽,包括:
9、在所述參數(shù)為字符串字面值的情況下,基于預設明確類正則集以及疑似類正則集對所述參數(shù)進行匹配,在所述參數(shù)與所述明確類正則集匹配成功的情況下,確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為否,在所述參數(shù)與所述疑似類正則集匹配成功的情況下,確定所述參數(shù)的可利用標簽為不確定;
10、在所述參數(shù)為變量類型的情況下,基于預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
11、在所述參數(shù)為屬性類型的情況下,基于所述預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
12、在所述參數(shù)為方法調用類型,則對調用所述參數(shù)的方法名以及所述預設參數(shù)名正則集進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是。
13、在一種可能的實施例中,所述在所述參數(shù)為變量類型的情況下,基于預設參數(shù)名正則集對所述參數(shù)進行匹配,包括:
14、在所述參數(shù)的變量類型為字符串字面值的情況下,基于所述字符串字面值檢測規(guī)則對所述參數(shù)進行檢測;
15、在所述參數(shù)為無賦值語句或從配置文件中取值的情況下,基于所述預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
16、在所述參數(shù)為通過拼接語句賦值的情況下,針對賦值所述參數(shù)的各參數(shù)執(zhí)行基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽的步驟。
17、在一種可能的實施例中,所述基于目標源代碼,確定所述目標源代碼中的參數(shù)拼接調用,包括:
18、將所述目標源代碼轉換為ir;
19、識別所述ir中的連接標識符;
20、基于所述連接標識符連接的參數(shù),確定所述目標源代碼中的參數(shù)拼接調用。
21、根據(jù)本發(fā)明的另一方面,提供了一種程序安全測試裝置,所述裝置包括:
22、確定模塊,用于基于目標源代碼,確定所述目標源代碼中的參數(shù)拼接調用;
23、獲取模塊,用于基于各所述參數(shù)拼接調用,得到各參數(shù)鏈式結構,其中,每個所述參數(shù)鏈式結構中包括多個參數(shù)以及多個所述參數(shù)之間的調用關系;
24、檢測模塊,用于針對所述參數(shù)鏈式結構中包括的各個參數(shù),基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽,其中,所述可利用性標簽用于指示所述參數(shù)能否被污點代碼利用,所述預設檢測規(guī)則包括字符串字面值檢測規(guī)則以及變量檢測規(guī)則;
25、掃描模塊,用于將可利用性標簽為否的參數(shù)放置于掃描規(guī)則過濾器中,以使所述掃描規(guī)則過濾器忽略所述可利用性標簽為否的參數(shù)的漏洞掃描。
26、在一種可能的實施例中,所述檢測模塊,用于基于所述參數(shù)的可利用性標簽,確定所述參數(shù)的下游參數(shù)的可利用性標簽,其中,所述下游參數(shù)為在所述參數(shù)鏈式結構中直接或間接引用所述參數(shù)的參數(shù)。
27、在一種可能的實施例中,所述針對所述參數(shù)鏈式結構中包括的各個參數(shù),基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽,包括:
28、在所述參數(shù)為字符串字面值的情況下,基于預設明確類正則集以及疑似類正則集對所述參數(shù)進行匹配,在所述參數(shù)與所述明確類正則集匹配成功的情況下,確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為否,在所述參數(shù)與所述疑似類正則集匹配成功的情況下,確定所述參數(shù)的可利用標簽為不確定;
29、在所述參數(shù)為變量類型的情況下,基于預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
30、在所述參數(shù)為屬性類型的情況下,基于所述預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
31、在所述參數(shù)為方法調用類型,則對調用所述參數(shù)的方法名以及所述預設參數(shù)名正則集進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
32、所述在所述參數(shù)為變量類型的情況下,基于預設參數(shù)名正則集對所述參數(shù)進行匹配,包括:
33、在所述參數(shù)的變量類型為字符串字面值的情況下,基于所述字符串字面值檢測規(guī)則對所述參數(shù)進行檢測;
34、在所述參數(shù)為無賦值語句或從配置文件中取值的情況下,基于所述預設參數(shù)名正則集對所述參數(shù)進行匹配,若匹配成功,則確定所述參數(shù)以及引用所述參數(shù)的各參數(shù)的可利用性標簽為是;
35、在所述參數(shù)為通過拼接語句賦值的情況下,針對賦值所述參數(shù)的各參數(shù)執(zhí)行基于預設檢測規(guī)則確定所述參數(shù)的可利用性標簽的步驟。
36、根據(jù)本發(fā)明的另一方面,提供了一種電子設備,包括:
37、處理器;以及
38、存儲程序的存儲器,
39、其中,所述程序包括指令,所述指令在由所述處理器執(zhí)行時使所述處理器執(zhí)行上述任一所述的程序安全檢測方法。
40、根據(jù)本發(fā)明的另一方面,提供了一種存儲有計算機指令的非瞬時計算機可讀存儲介質,其中,所述計算機指令用于使計算機執(zhí)行上述任一所述的程序安全檢測方法。
41、本發(fā)明實施例中提供的一個或多個技術方案,通過建立目標代碼的參數(shù)鏈式結構,每個參數(shù)鏈式結構中都包括多個參數(shù)之間的引用關系,并基于預設的檢測規(guī)則對各參數(shù)進行可利用性檢測,確定不可被污點數(shù)據(jù)利用的參數(shù)加入至掃描規(guī)則過濾器中,在后續(xù)的掃描過程中,掃描規(guī)則過濾器會忽略掉這些不可利用的參數(shù),避免sast對這些不可被污點數(shù)據(jù)利用的參數(shù)產生誤報,提高程序安全檢測的準確性。