天天看點

CSS09-Robust Signatures for Kernel Data Structures

Abstract

1.             rootkits 經常使用 DKOM ( Direct Kernel Object Manipulation ) 技術隐藏自己

2.            傳統工具試圖通過線性掃描整個記憶體區域中的這些隐藏資料結構通過手動指定一些特征。這種方式比較脆弱并依賴于一些資料結構中不重要的特征字段,比較容易被繞過。

3.            本文提出了一種自動查找核心資料結構(例如程序資料結構)中特征值的方法,并通過 fuzzing 的方式證明了這些特征值的修改不會引起核心崩潰。

4.             使用動态分析的方法,采樣了目标資料結構,獲知了那些域是經常用到的——進而不能被 DKOM ——而使用 fuzzing 證明了剩下哪些域可以被修改而不會引起系統崩潰。

5.            實驗中,比對了現有的所有惡意軟體的特征值,并開發了原型 rootkit 使用我們新發現的特征值

作業系統通過建立相關核心對象來登記和審計系統資源,DKOM(Direct Kernel Object Manipulation) Rootkit [3] 則通過修改這些核心對象來隐藏特定資源。Fu Rootkit 是DKOM Rootkit 的代表,它通過修改活 動程序清單實作程序隐藏。

Windows 系統枚舉程序使用的是活動程序清單PsActive ProcessList ,它是一個雙向連結清單,每個結點對應一 個程序的EPROCESS 資料結構,所有結點通過EPROCESS 結構中的ActiveProcessLinks 雙向指針鍊在一起。要 隐藏某個程序,隻需修改對應EPROCESS 的ActiveProcessLinks ,将其從連結清單中摘除即可。由于系統執行線 程排程使用的是其他的資料結構,是以這樣的修改不會影響程序運作。

Introduction

1.     現有的對 DKOM 的清除對于一些繞過技術比較無奈,比如

[47] 中說的,許多程序特征碼可以簡單的修改一個程序頭部的比特位進而繞過,而該比特位不會影響程序的正常運作。這引發出下面的問題:給定資料結構中到底哪些域才是必要的?

2.     特征選擇機制(feature selection mechanism )使用下面兩步決定資料結構中哪些部分對于功能是關鍵的。

  • 監控作業系統執行,标記哪些域經過讀寫
  • 看哪些域修改過之後不會引起崩潰

3.     標明了 robust 域之後,在核心資料結構中收集了許多例子,并使用了動态常量檢測技術【 12 】發現了它們的可以用于簽名的一些值的限制。

contributions :

1.               提供了大量證據,現有的特征值都是可以輕易繞過的

2.               開發了系統級的 robust feature 選擇方法

3.               基于發現的 robust feature ,提出了一種産生 signature 的方法

paper 的結果可以立即應用于許多目前的安全掃描工具上:例如 XXX

Related work

1.      病毒開發者可以修改自己的代碼使之不被檢測到,而對于定長度的多态病毒的可靠性探測已經被證明是 NP 完全問題。

2.      對于網絡蠕蟲的探測也存在類似問題,開始的方法是使用簡單的特征碼來過濾資料包,如 snort 。後來發現檢測多态混雜攻擊也是一個 NP 完全問題。

3.     總之,特征值方法就是一個 NP 完全問題

盡管看起來沒前途了,但還是有一些希望的:在病毒代碼中,惡意輸入的文法由攻擊者定義,但是其語義隻要保持不變就好了。而 rootkit 中, kernel 資料結構的文法由 OS 控制,攻擊者隻能修改包含在結構體中的資料,并且不能搞壞原有功能。

1.     許多方式可以找到隐藏程序:【 18 】跟蹤了 CR3 寄存器的值,當虛拟機執行的時候,來區分一個單獨的虛拟位址空間。【 34 】通過檢查排程器的線程表來查找隐藏程序,但是繞過這種方法的惡意程式也已經出來了【 1 】。【 47 】【 35 】【 43 】描述了修改核心資料結構中的某些位而不會引起異常。

Overview :

CSS09-Robust Signatures for Kernel Data Structures

一個掃描器的範例

CSS09-Robust Signatures for Kernel Data Structures

一個隐藏的範例:将 Eprocess 結構體的 size 設成 0x00 ,這樣程序可以被排程器排程,但不會出現在任務管理器中

架構:分 3 部分

1.               抽樣我們選的資料結構,看哪些 field 最常用,從未用到的部分可以被 attacker 控制

2.               最常通路的域進行 fuzz ,決定哪些可以被修改而不會 crash 的部分,也可以被 attacker 控制

3.               收集正确的例子,基于其建立 signature

1.               抽樣和 fuzzing 階段分别基于 Xen 和 vmware 實作。 xen 能獲得監控記憶體的能力,而 vmware 可以存儲狀态

2.               修改 xen 代碼,将包含監控資料的頁 Present 位置 0 ,這樣通路時可以實時記錄

3.               fuzzing 的幾種資料類型: 0 ,随機,随機素數,随機聚合類型(如結構體)

4.               signature 的生成: 4 種檢測: 0 ,常量,按位與( bitwise and ),對齊

讨論:

1.                對 profile 和 fuzzing 的評估: network_listener 31337 端口測試,看是否正常

2.               >對 signature 的生成的評估

實驗結果:

最終的準确性對比psscan2 和PTFinder ,可以發現隐藏程序

缺點:

如何保證fuzzing 的覆寫面足夠完全

采樣階段也不可能将每個核心資料結構都添加進來

這樣還是會有遺漏

另:除了Eprocess 結構體外,還有别的方法可以隐藏rootkit 嗎?

繼續閱讀