董國良,臧 洌,李 航,甘 露,郭詠科
(1.南京航空航天大學 計算機科學與技術學院,江蘇 南京 211106;2.江南計算技術研究所,江蘇 無錫 214083)
動態污點分析技術(dynamic taint analysis,DTA)是指對非信任來源的數據進行標記,追蹤并記錄其在程序執行中的傳播過程,檢測污點數據的非法使用,以達到獲取關鍵位置與輸入數據關聯信息的分析方法[1]。在對攻擊進行有效分析的同時獲得程序的漏洞所在,且錯誤率較低,實用性很強[2],被廣泛應用于信息安全驗證、惡意代碼分析[3]、隱私泄露分析、協議格式逆向分析[4]等領域[5]。國內近年來的研究成果包括李根博士團隊研發的Hunter[6]和北大王鐵磊博士研究的TaintScope[7],以及基于類型[8]和基于虛擬化[9]技術的動態污點分析技術等。
目前的動態污點分析平臺主要存在準確率與性能兩方面的問題[10],其中準確率問題主要體現在由于“過污染”(over-tainting)引起的誤報,以及由于“欠污染”(under-tainting)造成的漏報問題。另外,早期的粗粒度污點分析[11]平臺在污點標記屬性、污點傳播策略及污點檢測規則定義過程中存在不夠完善的情況,使得漏洞挖掘效率不高,檢測結果不夠準確。
針對上述問題,文中分別在污點分析的三個階段對現有問題進行改進和優化。在污點標識過程中擴充污點狀態定義,添加除“污染”和“未污染”外的第三種污點狀態“間接污染”,細化污點標記過程中定義的污點狀態屬性;在污點傳播過程中,針對X86平臺匯編指令設計了較為完善的污點傳播策略,增加“污點清除”傳播狀態行為實體,分析造成污點清除的目標指令和操作并將其添加入污點傳播策略;在污點檢測階段,進一步擴充安全檢測規則,將觸發的安全規則按照危險嚴重性分為漏洞觸發、危險操作和安全操作三個級別,并根據不同級別設計了不同的安全響應策略。基于上述方法實現了改進的細粒度動態污點分析[12]原型系統ODDTA,并通過實驗對其進行驗證。
ODDTA的框架結構如圖1所示。
ODDTA原型系統主要包括信息捕獲、二進制動態插樁、污點標記、污點傳播、污點檢測、污點信息存儲及日志生成等模塊。其中信息捕獲模塊主要使用HOOK機制對二進制目標程序的主要輸入函數進行監控,獲取目標程序的指令流。二進制動態插樁模塊負責在程序運行動態編譯二進制代碼時,將插樁代碼置于目標程序中,獲取程序運行時的特征數據,其生成的指令為經過二次提升的類匯編指令。污點分析的核心模塊包括污點標記、污點傳播和污點檢測三個部分,所有細粒度的污點狀態信息均以影子內存[13]形式存放于內存中,在污點分析整個過程中進行維護和存取。在線分析后產生的安全相關報告信息由日志生成模塊生成,用于離線的漏洞檢測與分析。
污點標記是將外部引入的數據標記為污點數據,并對其設置污點標簽,其標記方式極大影響著污點傳播處理與污點狀態信息存儲的效率。但在現有的污點分析工具中,因為污點標記定義和設計的不夠完善,不能檢測出某些間接污染的情況,如以下代碼所示程序:
1 void func(char *source,int length)
2 {
3 char buf [10];
4 strncpy(buf, source,length);
5 }
6 void main()
7 {
8 char src[256];
9 scanf(“%s”,src);
10 intlen=strlen(src);
11 func (src,len);
12 }
變量len的值由系統函數strlen()得出,并非直接通過賦值或算術邏輯運算得出,若strlen()中的參數包含污點數據,則len與污點數據相關。傳統的污點分析只標記變量是被“污染的”或“未被污染的”,且在污點傳播過程中,對“污染的”變量只考慮直接由算術運算指令或數據傳送指令等直接傳遞的污點數據和污染鏈,所以不會將變量len標識為“污染的”,這種欠污染的污點標記和傳播方式會導致漏報。
對此,文中提出了第三種污點標記狀態“間接污染”,當檢測到變量由某些參數包含污點數據的函數間接所得,則標記該變量為“間接污染”。采用統一的標記模型集中存儲污點信息,對內存中的污點數據采用
污點傳播指根據二進制程序指令的特點,為不同類型的指令制定不同的傳播策略,根據此策略追蹤污點數據的運行過程。污點傳播分析不僅要關注污點數據的產生與引用位置,更重要的是找出污點傳播路徑與影響范圍[14]。文中的動態污點分析過程即從信息流傳播入手,研究執行時的二進制類匯編代碼,對污點相關的數據流和控制流傳播過程加以分析,制定針對不同類別指令類型的污點傳播策略,確定污點傳播行為實體(對污點屬性的具體操作),并實時更新和維護影子內存中的污點狀態屬性。
1.3.1 污點傳播指令分析
分析了X86體系架構各類指令的執行特性,結合污點數據信息流傳播方式,在動態污點傳播模塊將指令歸納為以下幾類:
數據轉移類:包含X86匯編指令中的數據傳送指令、算術指令、位操作指令、標志處理指令、串操作指令。數據轉移類指令包含數據信息流傳播,是數據流流入、數據流流出與參數地址的作用之集。
控制跳轉類:包含控制信息流傳播,其主要對象為條件跳轉指令,如控制轉移指令的Jcc類。在程序運行中,運行路徑的選擇是由條件跳轉指令判斷轉移的。
傳播無關類:指執行不會引發數據信息流與控制信息流的傳播的無關指令,例如NOP、HLT、JMP、CALL等。
1.3.2 污點傳播策略設計
在污點傳播策略設計過程中,除了針對上述幾類指令進行分析外,還應考慮控制流污點傳播、污點清除行為、間接污染與檢測盲點[15]等情況下的污點傳播過程。其中檢測盲點問題是指由于無效用例導致漏洞未被觸發時的潛在漏洞情況。如包含潛在緩沖區溢出漏洞的程序,只有當漏洞觸發,且溢出的字符串覆蓋并修改了返回值時(即改變了數據,又影響了控制流),傳統的污點分析系統才將其確定為漏洞觸發,而當輸入字符串長度不足以造成緩沖區溢出,或者已經造成溢出但未修改到返回值,則此時漏洞被忽略,存在檢測的盲點,造成漏報。污點分析傳播策略如表1所示。

表1 指令類別與對應的污點傳播策略
(1)數據轉移類。
數據轉移類指令的傳播行為包括污點添加、污點傳遞和不傳播。針對包含顯式操作數的指令,如MOV、ADD等指令,若源操作數包含污點數據,則執行后源與目的操作數均被污染。對包含隱式操作數(implicit operands)的指令,如指令DIV EBX,其顯式操作數(explicit operands)只有EBX,但根據指令的執行語義,除數為EBX,隱含的被除數為EDX,商保存在EAX中,其余數保存在EDX中,所以該算術指令的執行同樣引發數據信息流傳播。
(2)條件跳轉類(控制流傳播分析)。
控制流操縱了程序的運行路徑,確定了執行流程,其在主方向選擇上間接影響了數據流的傳播。為保證污點分析的精確性,將數據流與控制流結合分析,從路徑轉移和數據傳播兩方面確定污點關聯信息。
在動態污點傳播過程中,一次實際執行對應一條固定的運行路徑。文中進行的控制流傳播分析基于程序控制流圖(CFG),分析由指令跳轉引發的控制轉移過程,研究分支路徑的跳轉條件,獲取執行路徑的污點約束針對跳轉類指令。在匯編指令中,跳轉指令分為直接跳轉指令(JMP)和條件跳轉指令(JCC)。條件跳轉分為兩類,其中多數以標志位為判斷,包括JZ、JS、JC等,也有部分非判斷標志位的指令,包括JCXZ、JECXZ等,其以CX、ECX是否為零作為判斷條件。文中提出的控制流分析的主要對象為標志位污點信息。
(3)傳播無關類。
傳播行為僅包含不傳播,無污點信息流操作。
(4)函數級污點傳播分析。
針對間接污染和潛在漏洞問題,在指令級污點分析外提出了函數級的污點傳播分析,對相關函數和其對應的指令(已標記為“間接污染”)進行監控,記錄和分析數據狀態信息和數據流傳播信息,在污點檢測模塊誤用檢測時進行安全規則匹配,根據污點檢測處理方式對分析結果進行處理。
(5)污點清除類。
傳統的污點分析系統,在污點傳播階段只考慮污點信息的增加與傳遞,即污點傳播狀態轉換的行為實體只包括污點添加、污點傳播和不傳播三類,未考慮污點清除的情況,會導致“過污染”情況產生,造成誤報。如表1中的示例,指令中將常量賦給變量,或是XOR、SUB、SBB等指令結果為常量時,此時原操作數中包含的污點變量將不應再進行傳播。基于此,提出了第四類污點傳播行為實體,即污點清除,對符合上述條件的指令執行污點清除操作,不再進行污點傳播。
現有的污點分析平臺,污點檢測時一旦發現污點數據違背安全規則,通常只有一種處理方式,即終止運行并記錄相關信息,當違背的安全規則僅僅只是觸發了某個危害較輕的安全風險,而非發現危害較重的某個漏洞,直接終止運行會造成檢測效率低下。
為此,將觸發的安全規則按照危險嚴重性分為三個級別,即“漏洞觸發”、“潛在危險”和“安全操作”,根據不同級別對污點數據進行不同處理。當某污點數據在污點傳播過程中觸發漏洞時,則記錄漏洞觸發相關信息并終止運行;當某污點數據僅執行的操作危害較輕,僅為“潛在危險”時,則記錄該污點數據風險操作的相關信息并繼續運行;當污點數據執行的操作為“安全操作”,未違反任何安全規則,則執行繼續。
原型系統ODDTA基于二進制分析平臺Pin[16]實現,Pin借鑒了ATOM[17]工具的兩個概念:Instrumentation Routine(簡稱IR,插樁例程)和Analysis Routine(簡稱AR,分析例程)。前者定義插樁的位置,后者定義插樁時需要執行的分析工作。Pin框架提供指令集插樁、軌跡級插樁和函數級插樁等三種插樁粒度。文中選用軌跡級插樁。
污點標記模塊算法實現中變量和函數定義包括:
INST:匯編指令類型;
voidSetTaintMark():設定污點源數據標記;
char*GetInstAddr(INST):獲取指令源地址;
intGetInstLen(INST):獲取引入污點指令長度;
char*GetInstDest(INST):獲取指令目的地址;
SetMEMLabel(char* DestAddr,intcount,TaintDataTaintLabel):設置內存單元污點標簽;
SetREGLabel(char* DestAddr,intcount,TaintDataTaintLabel):設置寄存器單元污點標簽;
bddAddList(SoueceTaintList,DestAddr,count):將污點信息加入到影子內存中。
其中bdd為影子內存中基于規約有序二元決策圖[18](roBDD)方法設計的存儲結構,該方法可實現對集合運算效率的優化,具體實現時調用開源的BuDDY庫,支持幾乎所有的BDD運算。
污點傳播模塊以執行指令為依據,通過分析指令信息獲取當前數據流和控制流的傳播。算法實現中主要變量和函數定義說明如下:
INSTINFO:指令信息流類型;
AddrInfo:包含char*格式的地址addr,和污點傳播模式mode;
AddrInfoGetInstDest(INSTINFO):獲取指令信息流傳播目的地址信息集合;
intGetAddrCount(AddrInfo):信息流目的地址個數;
char**GetRelateAddr(AddrInfo*,int):獲取信息流傳播目的地址的相關源地址集合;
GetTaintInfo(char**):通過bdd庫進行目標目的地址的污點信息計算;
voidSetDestTaintInfo(AddrInfo*,int,bdd):設置目標地址污點信息;
voidAddTaintInfo(AddrInfo*,int,bdd):將污點信息添加至目標地址;
voidClearTaintInfo(AddrInfo*,int):清除目標地址污點信息;
DestAddr[count].mode:三個取值{in,add,clear}對應污點傳播狀態的三種轉換模式:污點傳播、污點添加和污點清除。污點控制流傳播算法實現如下:
1.TaintControlPropagate(INSTINFO inst,bddCurrentCon-
trolInfo)
2.char* ControlSource=GetJCCSource(inst);
3.TaintInfo=GetControlTaintInfo(RelateSource);
4.AddControlInfo(CurrentControlInfo,TaintInfo);
char*GetJCCSource(INSTINFO):獲取條件跳轉的受控源集合;
GetControlTaintInfo(char**):通過bdd庫獲取受控源集合污點信息;
AddControlInfo(bdd,bdd):添加新控制源至當前污點控制信息。
污點檢測模塊算法實現中主要包含的函數如下:
ModeGetInstMode(INST):獲取指令模式(如MOV_REG32_REG32);
boolSusceptibleModeMatch(Mode,Mode*):匹配敏感指令模式;
InstStructGetInstStruct(INST, TaintInfo):獲取指令結構;
boolSusceptibleStructMatch(InstStruct,InstStruct*):匹配敏感指令結構;
voidSensitiveOperate():敏感點操作。
在實現污點檢測時,依據污點誤用檢測的規則,設定了幾種敏感模式,包括MOV類、JMP類以及敏感函數對應的指令,當當前指令為上述指令類型時,則進入敏感函數匹配。當系統監測到敏感指令執行時,即有可能觸發安全規則,進入危險狀態。
實驗測試環境即為原型系統的開發環境,底層硬件為曙光i840-G25和DELLR510服務器,基于VMware vSphere4.1.0實現硬件資源虛擬化,虛擬機虛擬硬件配置為Intel Core2 Duo CPU @3.00 GHz x2/4 G/SATA 20 GB,操作系統為Linux Ubuntu 12.04(內核3.8.0-32-generic)。
為驗證污點分析原型系統漏洞挖掘的有效性,采用自編譯的包含有緩沖區溢出漏洞的實例程序作為測試目標程序,該程序關鍵溢出代碼如下:
intfunc(char* str)
{
char buf[10];
strcpy(buf,str);
printf(“%s ”,buf);
}
int main(intargc,char** argv)
{
char str[50];
scanf(“%s”,& str);
if(str[0]!=‘Z’)
func(str);
return 0;
}
該程序中,執行func()中的函數strcpy時未對數組邊界進行檢查,當源數組長度大于目標數組長度時,會發生緩沖區溢出。對該程序進行編譯,對生成的可執行文件輸入不同的測試用例,分別進行漏洞檢測有效性測試、潛在漏洞測試以及危險函數檢測。
以目標程序test作為ODDTA輸入并執行,輸入字符串為“abcdefghijklmnopqrstuvwx”,共24個字符,則可覆蓋func函數調用后的返回地址,此時緩沖區漏洞被觸發,程序異常退出。系統終止污點跟蹤,輸出安全分析日志中的相關信息,如下所示:
Program:test
Trace ID: test_55
Crash location:0x004012b6
Crash instruction:RET
Crash case: themem can’t execute
Detection rule: controlled execute
Target instruction address:0x0022ff11
Target address taint:
0x0022ff11:{22}; 0x0022ff12:{23}
Taint link:
3027:004012b6: RET M@0x0022ff11[0x00007877]$4T
2208: 77c160c1: MOV [EDI],EDX M@0x0022ff0e[0x13f00022] $4 UT R@EDX[0x78777675]$4 T
……
污點傳播過程為:系統對輸入數據進行污點標記和編號,污點數據按照指令執行,進行數據傳輸,當源緩沖區大于目的緩沖區時,發生溢出,并覆蓋與緩沖區相鄰的其他地址空間數據,當函數執行完畢后,此時返回地址0x0022ff11被覆蓋,程序崩潰。
以目標程序test作為ODDTA輸入并執行,輸入字符串為“abcdefghijkl”,共12個字符,結合實例程序執行strcpy時的棧狀態可知,此時發生了緩沖區溢出,但并未覆蓋返回地址,并不會造成程序崩潰。此時,早期的動態污點分析系統并不會給出存在潛在漏洞的安全警告,在ODDTA原型系統中,由于發生了外部引入污點數據的誤用,此時在污點檢測中將對應的指令操作標記為“Latent Danger”(潛在危險),輸出如下信息:
Program:test
Detect target risklevel:Latent Danger
Misuse location:0x004017c0
Misused mode:execute tainted instruction
Detail instruction:004012b6:RET M@0x0022ff11[0x000078 77]$4 T
ODDTA原型系統記錄控制流污點信息的傳播過程,對目標程序執行進行細粒度污點分析后,可結合離線日志文件中的軌跡信息對每條指令進行細粒度分析,同時可結合控制流污點信息對分析出的漏洞可疑點進行輔助分析。以目標程序test作為原型系統輸入并執行,輸入字符串為“abcdef”,共7個字符,此時未發生緩沖區溢出,不會觸發潛在漏洞。運行結束后對安全日志文件中的軌跡信息進行離線分析,發現當前存在脆弱性可疑點的匹配項REP MOVSL ES:[EDI],DS:[ESI] M@0x003e37c0[0x61656c70]$4 UT M@0x0022fef6[0x33323130]$4 T R@ecx[0x00000002]$4 T,判定該位置存在緩沖區溢出可疑點,此時輸出如下信息:
Program:test
Trace ID: test_28
Suspicious location:184
Suspicious mode: buffer overflow
Suspicious address:0x77c1168d
Suspicious instruction: REPMOVSL ES:[EDI],DS:[ESI]
M@0x003e37c0[0x61656c70]$4 UT
M@0x0022fef6[0x33323130]$4 T
R@ecx[0x00000002]$4 T
……
通過結合分析污點指令,發現原因在于在字符轉移時,匯編程序會對其有效性進行判斷,檢測是否等于0x09,0x0d,0x20等。
程序結束時刻對應的控制流轉移指令信息如下:
……
1311:4013e8:CMP 0x5a,AL,0x5a R@AL[0x00000030]$1 T I@0x00000000[0x0000005a]$1
1312:4013ea:JE J@0x0000000[004013f8]$4 E@0x000000 00[0x0000000e]$4 T
……
該指令中包含的污點變量與char型的Z的ASCII碼90(0x5a)進行比較,只有相等情況下才執行跳轉。
針對現有動態污點分析系統存在的準確率方面的問題,提出了基于動態污點分析的二進制程序漏洞挖掘與分析技術,從動態污點分析的三個主要階段逐一對準確度問題進行改進,有效解決了“過污染”造成的誤報以及由于“欠污染”造成的漏報問題,增加了針對控制流的污點分析,并基于此方法實現了原型系統ODDTA。實驗結果表明,該方法能夠有效提升漏洞挖掘的精準度和執行效率。下一步將結合符號執行和模糊測試技術,進一步細化控制流污點分析,實現測試路徑的自動生成,提高對目標程序的分析效能。
[1] LAM M S,MARTIN M,LIVSHITS B,et al.Securing web applications with static and dynamic information flow tracking[C]//Proceedings of the 2008 ACM SIGPLAN symposium on partial evaluation and semantics-based program manipulation.New York,NY,USA:ACM,2008:3-12.
[2] 宋奕青.基于動態二進制探測框架的緩沖區溢出檢測研究[D].上海:上海交通大學,2010.
[3] SHARIF M,LANZI A,GIFFIN J,et al.Automatic reverse engineering of malware emulators[C]//30th IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2009:94-109.
[4] COMPARETTI P M,WONDRACEK G,KRUEGEL C,et al.Prospex:protocol specification extraction[C]//30th IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2009:110-125.
[5] 史大偉,袁天偉.一種粗細粒度結合的動態污點分析方法[J].計算機工程,2014,40(3):12-17.
[6] 李 根.基于動態測試用例生成的二進制軟件缺陷自動發掘技術研究[D].長沙:國防科學技術犬學,2010.
[7] WANG T,WEI T,GU G,et al.TaintScope:a checksum-aware directed fuzzing tool for automatic software vulnerability detection[C]//IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2010:497-512.
[8] 諸葛建偉,陳力波,田 繁,等.基于類型的動態污點分析技術[J].清華大學學報:自然科學版,2012,52(10):1320-1328.
[9] 陳衍鈴,趙 靜.基于虛擬化技術的動態污點分析[J].計算機應用,2011,31(9):2367-2372.
[10] 宋 錚,王永劍,金 波,等.二進制程序動態污點分析技術研究綜述[J].信息網絡安全,2016(3):77-83.
[11] KOHLI P.Coarse-grained dynamic taint analysis for defeating control and non-control data attacks[EB/OL].(2017-06-12).https://arxiv.org/abs/0906.4481.
[12] YIN H,SONG D,EGELE M,et al.Panorama:capturing system-wide information flow for malware detection and analysis[C]//Proceedings of the 14th ACM conference on computer and communications security.New York,NY,USA:ACM,2007:116-127.
[13] NETHERCOTE N,SEWARD J.How to shadow every byte of memory used by a program[C]//Proceedings of the 3rd international conference on virtual execution environments.New York,NY,USA:ACM,2007:65-74.
[14] 黃 強,曾慶凱.基于信息流策略的污點傳播分析及動態驗證[J].軟件學報,2011,22(9):2036-2048.
[15] 王 卓.基于符號執行的二進制代碼動態污點分析[D].上海:上海交通大學,2011.
[16] LUK C K,COHN R,MUTH R,et al.Pin:building customized program analysis tools with dynamic instrumentation[J].ACM SIGPLAN Notices,2005,40(6):190-200.
[17] SRIVASTAVA A,EUSTACE A.ATOM:a system for building customized program analysis tools[J].ACM SIGPLAN Notices,2004,39(4):528-539.
[18] 王鐵磊,韋 韜,鄒 維.基于roBDD的細顆粒度動態污點分析[J].北京大學學報:自然科學版,2011,47(6):1003-1008.