本文主要為了助力企業(yè)有效防范軟件安全漏洞,提升網(wǎng)絡(luò)安全防護(hù)能力,本期主題為第五十期:可達(dá)的assertion的相關(guān)介紹。
01 什么是可達(dá)的assertion?
程序包含一個(gè)可以被攻擊者觸發(fā)的assert()或類(lèi)似語(yǔ)句,這將導(dǎo)致應(yīng)用程序退出或其他不必要的嚴(yán)重行為。
assertion(斷言)在軟件開(kāi)發(fā)中是一種常用的調(diào)試方式,很多開(kāi)發(fā)語(yǔ)言中都支持這種機(jī)制。在實(shí)現(xiàn)中,assertion可作為程序中的一條語(yǔ)句,對(duì)一個(gè)boolean表達(dá)式進(jìn)行檢查,一個(gè)正確程序必須保證這個(gè)boolean表達(dá)式的值為true;如果該值為false,說(shuō)明程序已經(jīng)處于不正確的狀態(tài)下,系統(tǒng)將給出警告或退出。
一般來(lái)說(shuō),assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開(kāi)發(fā)和測(cè)試時(shí)開(kāi)啟,為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的。在語(yǔ)法上,為了支持assertion,Java增加了一個(gè)關(guān)鍵字assert。
02 可達(dá)的assertion漏洞的構(gòu)成條件有哪些?
當(dāng)斷言用于公共方法中的參數(shù)檢查時(shí),就可能會(huì)出現(xiàn)“可達(dá)的assertion”安全漏洞。
03 可達(dá)的assertion漏洞會(huì)造成哪些后果?
當(dāng)斷言禁用時(shí),參數(shù)的驗(yàn)證將失效,可能導(dǎo)致非預(yù)期的結(jié)果。
雖然斷言有助于捕獲邏輯錯(cuò)誤并減少出現(xiàn)更嚴(yán)重的漏洞的機(jī)會(huì),但它仍然可能導(dǎo)致拒絕服務(wù)。例如,如果一個(gè)服務(wù)器處理多個(gè)并發(fā)連接,并且在一個(gè)連接中出現(xiàn)assert(),導(dǎo)致所有其他連接被丟棄,這是一個(gè)可到達(dá)的斷言,將導(dǎo)致拒絕服務(wù)。
04 可達(dá)的assertion漏洞的防范和修補(bǔ)方法有哪些?
斷言不應(yīng)該用于公共方法中的參數(shù)檢查。參數(shù)檢查通常是方法的一部分,無(wú)論斷言是啟用還是禁用,都必須遵守此規(guī)則。
05 可達(dá)的assertion漏洞樣例
public class case1_bad {
public static void main(String[] args) {
System.out.println(fun());
boolean flag=1>2;
assert true;
}
public static int getAbsAdd(int x, int y) {
assert x != Integer.MIN_VALUE;
assert y != Integer.MAX_VALUE;
nt absX = Math.abs(x);
int absY = Math.abs(y);
assert (absX <= Integer.MAX_VALUE - absY);
return absX + absY;
}
public static int fun() {
boolean flag = 3 > 2;
assert flag;
return 1;
}
}
使用悟空代碼安全檢測(cè)工具檢測(cè)上述程序代碼,則可以發(fā)現(xiàn)代碼中存在著“可達(dá)的assertion”的安全漏洞。
在(case1_bad.java)文件第(12、13、16)行使用斷言驗(yàn)證方法參數(shù),當(dāng)斷言被禁用時(shí),驗(yàn)證代碼不會(huì)執(zhí)行,參數(shù)檢查通常是方法的一部分,無(wú)論斷言是啟用還是禁用,都必須維護(hù)此合約。
可達(dá)的assertion在CWE中被編號(hào)為CWE-617: Reachable Assertion