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