如果運(yùn)行的操作系統(tǒng)和應(yīng)用中存在漏洞,那攻擊者大概率會(huì)找到一個(gè)利用它的方法。唯一確定的解決隱患方式就是從程序庫(kù)中修復(fù)問(wèn)題。但是,在安全補(bǔ)丁發(fā)布前,系統(tǒng)依然有被攻陷的風(fēng)險(xiǎn)。許多人不得不接受這種情況。
不過(guò),事情可能出現(xiàn)了轉(zhuǎn)機(jī):輪換移動(dòng)目標(biāo)防御技術(shù)(rotational Moving Target Defense, rMTD)。
rMTD是一種讓已有的漏洞難以被利用的理念。這個(gè)理念可以用多種不同技術(shù)實(shí)現(xiàn):可以是靜態(tài)的,在應(yīng)用編譯的時(shí)候植入,又被稱(chēng)為“編譯時(shí)應(yīng)用自我防護(hù)(Compile Time Application Self Protection, CASP)”;也可以是在運(yùn)行時(shí)動(dòng)態(tài)使用,稱(chēng)為“運(yùn)行時(shí)應(yīng)用自我防護(hù)(Runtime Application Self Protection, RASP)”。CASP和RASP并不互斥,完全可以結(jié)合到一起。
CASP通過(guò)在編譯的時(shí)候修改應(yīng)用產(chǎn)生的匯編代碼,從而確保沒(méi)有任何兩個(gè)匯編會(huì)產(chǎn)生完全相同的匯編指令組。攻擊者一般會(huì)基于從一個(gè)生成的靜態(tài)編譯中獲得的已知匯編布局,進(jìn)行他們的攻擊。一旦他們構(gòu)建了自己的攻擊方式,就會(huì)針對(duì)系統(tǒng)中有同樣二進(jìn)制碼的位置進(jìn)行操作。他們會(huì)利用應(yīng)用或者操作系統(tǒng)的靜態(tài)編譯特性,劫持系統(tǒng)。
如果要類(lèi)比的話(huà),就像一個(gè)小偷獲得了你的保險(xiǎn)箱的復(fù)制品,并有足夠的時(shí)間來(lái)發(fā)現(xiàn)如何破解它。唯一的區(qū)別是,對(duì)于黑客攻擊人員而言,他們相比保險(xiǎn)箱,會(huì)更容易獲得軟件的復(fù)制品,同時(shí)相關(guān)漏洞已知并且已經(jīng)被發(fā)布。而通過(guò)CASP防護(hù),同一個(gè)保險(xiǎn)箱(也就是應(yīng)用)會(huì)在遮掩(二進(jìn)制布局)下看上去不一樣。
RASP則是在應(yīng)用運(yùn)行的時(shí)候創(chuàng)建無(wú)序狀態(tài)。二進(jìn)制布局會(huì)在每次應(yīng)用運(yùn)行的時(shí)候動(dòng)態(tài)變化。攻擊者無(wú)法再對(duì)應(yīng)用的堆棧布局,或者函數(shù)和庫(kù)的地址做出猜想。類(lèi)比的話(huà),就是在高速公路上狂奔的同時(shí),車(chē)子在切換引擎并重新設(shè)置車(chē)內(nèi)組件。
CASP和RASP會(huì)通過(guò)一系列的技術(shù)實(shí)現(xiàn),以下是一些總結(jié):
CASP技術(shù)
1. 匯編代碼修改
將程序庫(kù)中原有的匯編指令組替換成一個(gè)完全不同,但是邏輯上一致的指令組。ABI(Application Binary Interface,應(yīng)用二進(jìn)制接口)是和程序庫(kù)進(jìn)行函數(shù)調(diào)用的接口。對(duì)于匯編指令的修改不會(huì)影響到ABI。應(yīng)用和二進(jìn)制之間的接口保持不變。
攻擊者會(huì)檢查匯編指令組的布局,然后規(guī)劃攻擊。他們的工具能讓他們檢查編譯后的代碼以及產(chǎn)生的匯編指令,從而能夠去尋找代碼漏洞(比如緩沖區(qū)溢出、緩沖區(qū)反向溢出、整型溢出、雙自由調(diào)用等)。一旦一個(gè)漏洞被發(fā)現(xiàn),攻擊者會(huì)根據(jù)二進(jìn)制的匯編布局來(lái)對(duì)修改附近的匯編指令進(jìn)行攻擊。通過(guò)修改對(duì)攻擊者而言未知的匯編代碼,就能無(wú)效攻擊,因?yàn)槎M(jìn)制的匯編布局被修改了。
2. 隨機(jī)化每個(gè)程序庫(kù)中每個(gè)函數(shù)的起始地址
每個(gè)程序庫(kù)或者模組都會(huì)顯示應(yīng)用能調(diào)用的函數(shù)。默認(rèn)情況下,每個(gè)函數(shù)的起始地址在編譯的時(shí)候都會(huì)被固定。
攻擊者可以檢查編譯后的二進(jìn)制內(nèi)容,然后輕易得到每個(gè)函數(shù)的地址,而不需要對(duì)源代碼進(jìn)行檢查。這個(gè)信息之后就會(huì)被用于攻擊。當(dāng)堆棧被劫持的時(shí)候,攻擊代碼能夠指定攻擊者想調(diào)用的程序庫(kù)中的地址,從而打開(kāi)一個(gè)shell。
3. 數(shù)據(jù)結(jié)構(gòu)防護(hù)
二進(jìn)制中的數(shù)據(jù)結(jié)構(gòu)記憶布局會(huì)在編譯的時(shí)候隨機(jī)化,數(shù)據(jù)字段會(huì)實(shí)時(shí)被動(dòng)態(tài)加密,防止它們被改寫(xiě)或者讀取。
數(shù)據(jù)結(jié)構(gòu)經(jīng)常會(huì)包含緩沖,比如字符串緩沖或者數(shù)組緩沖。這些都會(huì)成為實(shí)現(xiàn)緩沖區(qū)溢出攻擊的目標(biāo)。為了能夠通過(guò)定義在數(shù)據(jù)結(jié)構(gòu)中的緩沖對(duì)堆棧進(jìn)行劫持,攻擊者必須找到在數(shù)據(jù)結(jié)構(gòu)中緩沖區(qū)的位置。通過(guò)在編譯時(shí)隨機(jī)化數(shù)據(jù)結(jié)構(gòu)布局,就能讓攻擊者無(wú)法再在數(shù)據(jù)結(jié)構(gòu)中定位緩沖區(qū)的位置。
RASP技術(shù)
1. 隨機(jī)化動(dòng)態(tài)程序庫(kù)地址
在運(yùn)行時(shí),程序庫(kù)的地址會(huì)隨機(jī)化。所有涉及到程序庫(kù)里的引用都會(huì)被更新顯示新的地址。這個(gè)方式會(huì)讓攻擊者更難在劫持進(jìn)程的時(shí)候,從應(yīng)用內(nèi)調(diào)用外部程序庫(kù)。
2. 隨機(jī)化動(dòng)態(tài)函數(shù)地址
程序庫(kù)中定義的每個(gè)函數(shù)的地址都在編譯的時(shí)候給予了一個(gè)靜態(tài)地址。除了隨機(jī)化程序庫(kù)的地址外,每個(gè)函數(shù)的地址也會(huì)在執(zhí)行的狀態(tài)下,在一個(gè)應(yīng)用調(diào)用它的時(shí)候發(fā)生改變。
3. 動(dòng)態(tài)stack canary
相比于一個(gè)容易繞過(guò)的固定隨機(jī)值的靜態(tài)stack canary,動(dòng)態(tài)的canary可以隨著時(shí)間動(dòng)態(tài)隨機(jī)化。通過(guò)動(dòng)態(tài)隨機(jī)化stack canary,攻擊者沒(méi)有足夠的時(shí)間在它變化前猜對(duì)其數(shù)值。
4. 影子堆棧
影子堆棧是指在編譯中生成的堆棧的復(fù)制,但是影子堆棧中至儲(chǔ)存返回地址。返回地址在影子堆棧中被加密,這樣就不會(huì)被攻擊者所修改。在應(yīng)用從堆棧讀取返回地址跳轉(zhuǎn)到前一個(gè)執(zhí)行狀態(tài)前,返回地址會(huì)被加密并且會(huì)和影子堆棧中的數(shù)值進(jìn)行對(duì)比。如果兩者匹配,執(zhí)行就會(huì)跳轉(zhuǎn)到返回地址指向的下一個(gè)指令;如果兩者不匹配,那就可能是被攻擊者修改了地址,那就出現(xiàn)了應(yīng)用故障,造成應(yīng)用崩潰,然后事件會(huì)被記錄。
5. PLT
PLT(Procedure Linkage Table,程序鏈接表)是一個(gè)定位其他程序庫(kù)中函數(shù)的搜索表。外部程序庫(kù)的函數(shù)地址在進(jìn)程執(zhí)行過(guò)程中隨機(jī)存儲(chǔ)在PLT中,而非靜態(tài)的。
這樣就可以防止攻擊者從一個(gè)已知的程序庫(kù)里調(diào)用函數(shù)來(lái)生成一個(gè)終端。比如攻擊者可以通過(guò)發(fā)現(xiàn)PLT中的strcpy()函數(shù)并調(diào)用實(shí)現(xiàn)攻擊;但是如果通過(guò)動(dòng)態(tài)改變定義在外部程序庫(kù)的函數(shù)位置,攻擊者就無(wú)法在通過(guò)發(fā)現(xiàn)外部函數(shù)的地址實(shí)現(xiàn)return0to-PLT攻擊。
rMTD可能是下一代防范0day攻擊的前線能力,能使計(jì)算機(jī)和系統(tǒng)對(duì)攻擊者有更強(qiáng)的抵御能力。隨著這項(xiàng)技術(shù)更加成熟并在行業(yè)內(nèi)得到廣泛使用,它可能像防毒軟件一樣普及。
點(diǎn)評(píng)
安全所在的階段越早,最后的安全效果也就越明顯。在應(yīng)用、系統(tǒng)的代碼層面就嵌入安全能力,可以讓安全防線進(jìn)一步前置,從而拓寬防御的縱深,使得攻擊者的攻擊難度增大。這兩年,國(guó)內(nèi)的RASP產(chǎn)品在逐漸發(fā)展,因?yàn)镽ASP產(chǎn)品更多適用于應(yīng)用在運(yùn)行時(shí)的防護(hù),是傳統(tǒng)的網(wǎng)站應(yīng)用防護(hù)中的新武器;而CASP則更多需要在開(kāi)發(fā)早期就投入使用,無(wú)論是市場(chǎng)的信任度,還是技術(shù)的穩(wěn)定性都還需要一定時(shí)間來(lái)提升。但是,rMTD確實(shí)是未來(lái)開(kāi)發(fā)安全值得重視的方向。