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