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