王建宇
(黑龍江省計算機軟件研究中心,黑龍江 哈爾濱 150028)
格式化串讀寫攻擊的利用及動態(tài)防御技術的研究
王建宇
(黑龍江省計算機軟件研究中心,黑龍江哈爾濱150028)
本文基于對格式化串讀寫越界的定義較深入地探討了格式化串攻擊的利用,并基于此提出對格式化串攻擊進行動態(tài)防御的技術,對于提高格式化串的安全性具有一定的借鑒意義。
格式化串;動態(tài)防御技術;信息安全
格式化串讀寫越界攻擊主要是利用產(chǎn)生格式化串讀寫越界對進程堆棧布局進行窺視,對程序執(zhí)行進而惡意控制的行為。主要采用因設計的格式化函數(shù)程序中存在的錯誤而導致安全漏洞,利用對精心編制的含有格式化指令的文本字符串進行傳遞,使任意命令由目標程序進行執(zhí)行的過程被稱為格式化串攻擊。格式化字符串漏洞與很多安全漏洞相同,都是因程序員不細心而引起。如程序中printf("%s",str),為提高效率并使執(zhí)行時間得到一定程度的節(jié)約,在源碼中就有時編寫為printf(str),少編寫6字節(jié)字符。這樣編寫的程序盡管沒有錯誤,但容易產(chǎn)生格式化串攻擊。
2.1導致進程發(fā)生崩潰
攻擊者若對格式化串進行構造,就可利用其存在的讀寫越界漏洞引起進程的崩潰。編制如printf("%s%s%s%s%s%s%s %s%s%s%s")的程序代碼就容易形成無效指針,由于“%s”將根據(jù)堆棧地址對相應內容進行顯示,應用較多的“%s”就將引起遇到無效地址的可能性,進而使進程因無效地址而發(fā)生崩潰。
2.2任意讀
"%x"等格式符在格式串函數(shù)中可以對應變量值進行顯示,但格式化函數(shù)不存在對其對應變量存在性的檢查機制,也不論對應變量地址是何種類型。攻擊者若對格式串進行構造,對該格式化串讀寫越界漏洞進行利用,就可對內存任意地址進行讀取。比如printf ("%08x%08x%08x%08x "),能夠從當前進程棧底向棧頂顯示內容,在輸入%x較多時,攻擊者甚至可實現(xiàn)對進程棧內容的全部獲取。程序流、局部函數(shù)變量等重要信息存放于棧中,攻擊者通過這些信息非法得到的攻擊代碼偏移值都是正確的。若將讀取地址置于棧中的合適位置,就可實現(xiàn)對任意地址內容的讀取。如自0x07504612開始要顯示相應內容,可將x12x46x50x07作為開始的格式化串,再采取對進程棧中內容查看方法確定顯示地址和%s間存在%x的數(shù)量,利用構造字符串通過%s將0x07504612開始的內容進行顯示。
2.3任意寫
"%n"等向內存寫入的格式符都位于格式化串中,而格式化函數(shù)不存在確保寫入地址為當前進程的合法地址的而有效機制。攻擊者對格式化串讀寫越界漏洞進行利益,若可對格式化串進行構造,就可以向內存任意地址進行寫入。如格式符"%n"在遇到該格式符前將格式串函數(shù)的字符打印個數(shù)向對應整數(shù)指針地址中寫入。以下程序將16向printf("1a2a3a4a5a6a7a8a%n",&x)寫入,利用這種方法對程序printf ("x12x46x50x07%07x%07x%07x%07x%n")進 行 構造,%07x格式移動格式化串指針,當移至根據(jù)低位字節(jié)在前的順序,即0x07504612。0x0750 4612被最后的%n格式視為整數(shù)指針,由于x12x46x50x07是4個字符,4個%07x為32字符,因此寫入到0x07504612地址中的內容就是36。利用對字符串的構造,還能構造數(shù)字。但數(shù)字較大時,就要構造很長的字符串,導致難以實現(xiàn)。改進方法主要是在每次寫入時確保低位字節(jié)的數(shù)值就是想要的內容,每次寫入數(shù)值都不能大于255,再向前移動指針一字節(jié),利用連續(xù)4次寫入操作實現(xiàn)這個效果。為提高定位的精確性,格式符還能利用%u。
2.4受到高級攻擊
攻擊者對格式化串讀寫越界漏洞的利用,可導致進程崩潰并對任意地址進行讀寫,利用以上的基本技術還能增加攻擊的復雜性。如對返回當前執(zhí)行函數(shù)的地址進行覆蓋,在執(zhí)行完函數(shù)返回時,可根據(jù)攻擊者意愿對程序流程進行改變。該技術應了解堆棧中返回存儲函數(shù)地址的存儲單元地址及shellcode首地址,格式化串讀寫越界對覆蓋函數(shù)返回地址進行攻擊,一般會采取兩種方法:一是對調用該函數(shù)的函數(shù)返回地址進行覆蓋,這類似于攻擊普通緩沖區(qū)溢出。二是對格式化函數(shù)返回地址進行覆蓋,該方法精確度更高,即便是在比較苛刻的條件下也能進行應用。
動態(tài)防御技術是以進程格式化串讀寫越界為基礎,其主要思想是在運行進程過程中,執(zhí)行程序防御格式化串讀寫越界,在運行過程中防御系統(tǒng)各部分內容。利用執(zhí)行處理機過程中對寫入格式化函數(shù)指令加強邊界檢查,實現(xiàn)對格式化串寫越界的動態(tài)防御。在布局程序內存方面,利用將另外一段內存的開辟對起始終止地址中的內容進行保存,確定寫入當前內存的內容是否產(chǎn)生格式化串讀寫越界。利用對緊鄰最后格式參數(shù)后的保存內容對寫入是否產(chǎn)生格式化串讀寫越界進行比較,根據(jù)對輸入?yún)?shù)邊界后的緊鄰格式化函數(shù)保存數(shù)據(jù),當發(fā)生格式化串讀寫越界時可將被破壞數(shù)據(jù)進行恢復。
綜上所述,本文利用分析格式化串攻擊的原因及不利后果,提出動態(tài)防御技術,使其在運行程序過程中對產(chǎn)生的格式化串讀寫越界攻擊進行動態(tài)防御,以提高程序運行的安全性。
[1] 葉焰峰.數(shù)組越界的故障模型及其檢測方法研究[J],微計算機信息,2013.15
[2] 高傳平.數(shù)組越界的靜態(tài)測試分析[J],計算機工程,2014.10
[3] 潘勇慧.淺談計算機病毒的特點及防御技術[J],硅谷,2014.8
[4] 閔銳,楊楚華.防火墻協(xié)同防御技術研究[J],計算機安全,2013.11
TP393.08
A
1003-5168(2015)11-006-01
王建宇(1977—),男,助理研究員,主要從事應用技術研究工作。