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