(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf_第1頁
(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf_第2頁
(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf_第3頁
(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf_第4頁
(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf_第5頁
已閱讀5頁,還剩67頁未讀 繼續(xù)免費閱讀

(計算機應用技術專業(yè)論文)基于靜態(tài)分析的棧緩沖溢出漏洞自動發(fā)掘模型研究.pdf.pdf 免費下載

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

摘要 緩沖區(qū)溢出漏洞一直是安全漏洞的最常見的一種形式。近年來,在c e r ! i c c ( c o m p u t c re m c r g e n c yr e s p o n s et e a m c 0 0 r d i i i a t i o nc e n t e r ) 發(fā)布的公告中,關于 緩沖區(qū)溢出漏洞的占5 0 以上。緩沖區(qū)溢出問題主要出現(xiàn)在( y c + + 這類老牌的編 程語言中,而在新一代的編程語言,例如j a v a 、c 艫中不存在。一個最重要的原因 就是c 犯+ + 允許通過指針進行間接內存訪問但沒有緩沖區(qū)邊界檢查和提供了大量 對緩沖區(qū)可能存在不安全操作的庫函數(shù),在w m d o w s 操作系統(tǒng)中也存在類似的函 數(shù)。因此,如果能采用有效的手段對緩沖區(qū)溢出漏洞進行檢測,將能極大地提高 軟件系統(tǒng)的安全性。 從一個程序中檢測出可能的安全漏洞是一件非常困難和耗時的事情。目前針 對緩沖區(qū)溢出漏洞的檢測主要分為兩類:靜態(tài)檢測的方法和動態(tài)檢測的方法。通 過使用靜態(tài)和動態(tài)分析工具,可以從一定程度上減輕漏洞檢測的困難。 本文研究分析了與緩沖區(qū)溢出相關的基本原理并分析了國內外緩沖區(qū)溢出檢 測的典型技術和工具。通過分析目前幾個開源的源代碼掃描工具,以及參與的一 個源代碼靜態(tài)掃描工具的開發(fā),本文提出一種對二進制代碼的靜態(tài)檢測方法:對 二進制代碼的反匯編代碼進行操作語義的分析,提取與緩沖區(qū)溢出相關的語法成 分,然后以c 庫和w 如d o w s 操作系統(tǒng)中不安全函數(shù)為出發(fā)點進行緩沖區(qū)溢出的分 析,并基于此方法實現(xiàn)了一個原型系統(tǒng)。實驗證明,該原型系統(tǒng)能夠檢測出一些 棧緩沖溢出的情況。但由于完全實現(xiàn)的工作量太大,因此沒有考慮復雜的數(shù)據(jù)結 構和控制流等情況。 本文提出的靜態(tài)檢測方法是基于對二進制代碼反匯編后的代碼,實質上也可 以認為是一種基于源代碼的靜態(tài)檢測技術。這方面的研究是對主流技術的一種重 要補充,在得不到源代碼的情況下,可以作為一種備用手段使用。 關鍵詞:緩沖區(qū)溢出,棧溢出,靜態(tài)分析,二進制代碼 a b s t 珀c t a b s t r a c t b u 彘fo v e 棚o wh a sb e c nt h em o s c o m m o nf o n no fs e c l l r i y i n e r a b m 夠碭e 肌m b c ro fb u f c ro v e m o w sa c c o u mf o ra b o u t5 0 a b o v eo fa 1 1t h ev u l i l e r a b i l i t i e s a o c o r d i n gt ot h e ( = e r r c c ( c o m p u t e re m e r g e n c yr e s p o n s et c a m c o o r d i n a t i o nc e n t e r ) s t a t i s t i ca tr e c e n ty c a r s n eb u 靦ro v e m o wp r o b l e mi st y p i c a lo fo l dp r o 伊a m m i n g i a n g u a g c s ,s u c ha sc a n dc p + ,w l l i l s ti tc a i l n o ta r i s ei nt h en e wg e n e r 撕o no fl a n g i l a g e s , e 舀j a v aa n dc 氘a(chǎn)m o s ti m p o n a n tr c a s o ni st h a tt h eca i l dc + + l a n g i l a g e sa n o w i n d i 聆c ta c c c s sm 珊o r yl o c a t i o nb yp o i n 泐w i m o u tb o u n d a r yc h e 6 ka n dt h e r ea 聆加a n y u n s a f cf i l n c t i o n si n l i b r a i yw h i c hm a yc a u s eb u 肋ro v e m o w a n dt h ew 缸d d w s o p e r a t i i l gs y s t e ma l s oh a ss o m es j m i l a ru n s a f cf i l n c t i o n s n od o u b t ,i f 啪a d o p t e 艦c t i v em e a n st od e t e c tt h i sk i n do fs e c i l r i t yv u l n e i a b i l i t i e s ,“w i l l 蓼e a t i ye l l h a l l c et h e s c c i l i i t yo ft h es o f 研a r cs y s t e m s d e t e d i n gp o s s i b l eb u 臟ro v e r f l o w si i iap r o 孕鋤i sad i 丘c i l na n dt i n l ec o n s u m i n g t a s k m e t b o d sn l a td e e c b u 由晴o v e 川0 w sa g 如e r a l l yd j v j d c di n f o 柳ok j 】1 d sa p r c s e n t :d y n a m i ca n ds t a t i cm e m o d 1 1 l ed i m c l l l to fd c t e c t i n gc a nb ea l i e v i a t e dac e n a i n e x i e n tb yu s i n gs t a t i c 卸dd y n a m i cs o f 吶a r ea n a i y s i st o o l s t h i st h c s i sp r c s e n t sr c s e a f c hf o c u s e do nt l l ef i l n d a m e m a li s s u e ss u r r o u n d i n gt l l e b u 疵ro v e m o wv u l i l e r a b m t ya n ds o m et y p i c a lm e t h o d sa n dt o o i su s e do nb u 船r o v e m o wd e t e c t i n 昏o nt h eb 弱i so f 吼a l y 婦1 9af e wo fo p e ns o l l r c et o o l so fs o u r c ec o d e b a s e da n d a k i n gp a ni i las o u r c ec o d eb a s e ds c a 肋i n gf o o l ,sd e v c l o p i n 島a 丑e wb u 骯r 0 v e i n o ws t a t i cd e t e c c i i l gm e t h o di sp r o p o s e d t h a ti s ,a n a l y z et h eo p e r a t es e m a m i c s0 f d i s a s s e m b l e db i n a r yc o d e ,p i c ku pt h ei n f d 肌a t i o nt h a tb u :日e e ro v e i 丑o wc o c e m e db y s y l l t a c t j ca n a l y s i s ,a n dt h e np r o c c e do l l ra n a l y s i s 丘o mt h es e to fs o c a l l e d “d 扎g c i o u s f i l n d l o n s ”0 nb 雛i so ft h 政w ei i l l p l e m e n tap r o t o 咖es y s t c mt h a tc a ni o c a t ec e r t a i n t y p e s0 f b u 虢ro v e m o wv l i l n e r a b i l m e sb ye x p e 血e n t s c 0 n s i d e r i n gt h eh e a v yw o r k l o a do f m p j e t ei m p l 伽e 丑t a t i o n ,w et a k en oa c ( d u 丑to f m p l j c a t e dd a t as t n | a l l r e c o n t r 0 1 丑o we t c t h es t a t i cd e t e d i n gm e t h o dp r o p o s e db y l i st h e s i si sb a s eo nt h ed i s a s s e m b l e d b i n a r yc o d e ,s 0i ta l s oc a nb ec o l l s i d e r e dt ob eas o u r c ec o d eb a s e ds t a t i cd e t e c t j n g i i a b s t r a c t m e t h o di nf a c t b u tt h em e t h o dp r o p o s e db yt h i sm e s i si sp e r f o m e do nar e l e a s e d p r o g r a 】m ,ad i 鼢e ma p p r o a c hc o m p a r e dt 0t h em a n yp r e v i o u ss t u d i e s 也a tf b c l l so n s t a t i cs o u r c cc o d ea n a l y s i s ,t h a ti tc a nb eam e a n sj ns u p p o no ft l l em a i nd e t e c t i n g m e t h o d s k e y w o r d s :b u f f e io v e r n o w ,s t a c ko v e m o w ,s t a t i ca n a l y s i s ,b i n a r yc o d e i 圖目錄 圖目錄 圖3 1d a 識別函數(shù)的例子。1 3 圖3 2 a 識別參數(shù)的例子 圖3 3 在堆棧分配局部變量的機制1 7 圖3 4 對局部變量進行尋址1 8 圖3 5 結構體的例子2 0 圖3 m a i l l 的棧幀結構2 2 圖3 7n 欣的工作過程3 1 圖3 8 虻c 的工作過程。3 3 圖4 1 系統(tǒng)總體結構3 5 圖4 2 一個例子程序 3 9 圖4 3 示例程序段4 7 圖4 4 函數(shù)調用圖 圖4 - 5 靜態(tài)分析算法流程 。5 0 圖4 6s t r c p y r e c i l r s i o n h 鋤d l e r 函數(shù)流程5 2 圖5 1 測試源代碼 圖5 2 測試反匯編代碼 圖5 - 3 測試結果:函數(shù)調用關系 圖5 - 4 測試掃描結果。 - 跖卵卯 表目錄 表目錄 表3 1 符號串a(chǎn) b b c d e 的分析2 6 表3 2 常用l e x 模式定義 v - 獨創(chuàng)性聲明 本人聲明所呈交的學位論文是本人在導師指導下進行的研究工作 及取得的研究成果。據(jù)我所知,除了文中特別加以標注和致謝的地方 外,論文中不包含其他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為 獲得電子科技大學或其它教育機構的學位或證書而使用過的材料。與 我一同工作的同志對本研究所做的任何貢獻均已在論文中作了明確的 說明并表示謝意。 簽名: 日期:葛一年厶月必日 關于論文使用授權的說明 本學位論文作者完全了解電子科技大學有關保留、使用學位論文 的規(guī)定,有權保留并向國家有關部門或機構送交論文的復印件和磁盤, 允許論文被查閱和借閱。本人授權電子科技大學可以將學位論文的全 部或部分內容編入有關數(shù)據(jù)庫進行檢索,可以采用影印、縮印或掃描 等復制手段保存、匯編學位論文。 ,( 保密的學位論文在解密后應遵守此規(guī)定) 日期:岬年車月中日 第一章引言 1 1 研究背景 第一章引言 利用漏洞發(fā)起攻擊是互聯(lián)網(wǎng)最大的安全隱患。根據(jù)美國c e r t ,c c ( c o m p u t e f e m e r g e n c yr e s p o n s et e a n l ,g 0 0 r d i i l a t i o nc e n 蛔) 統(tǒng)計,自1 9 9 5 年到2 0 0 6 年漏洞累 計達到3 0 7 8 0 個,2 0 0 6 年共報告漏洞8 0 6 4 個,平均每天超過2 2 個。在過去的十 年中,以緩沖區(qū)溢出為類型的安全漏洞是最為常見的一種形式【1 1 。更為嚴重的是, 緩沖區(qū)溢出漏洞占了遠程網(wǎng)絡攻擊的絕大多數(shù),這種攻擊可以使得一個匿名的 i n t e m e t 用戶有機會獲得一臺主機的部分或全部的控制權1 由于這類攻擊使任何人 都有可能取得主機的控制權,所以它代表了一類極其嚴重的安全威脅。緩沖區(qū)溢 出攻擊之所以成為一種常見安全攻擊手段,其原因在于緩沖區(qū)溢出漏洞太普通了, 并且易于實現(xiàn)。而且,緩沖區(qū)溢出成為遠程攻擊的主要手段,其原因在于緩沖區(qū) 溢出漏洞給予了攻擊者他所想要的一切:植入并且執(zhí)行攻擊代碼。被植入的攻擊 代碼以一定的權限運行有緩沖區(qū)溢出漏洞的程序,從而得到被攻擊主機的控制權。 在1 9 9 8 年i 血謝n 實驗室用來評估入侵檢測的5 種遠程攻擊中,有3 種是基 于社會工程學的信任關系,2 種是緩沖區(qū)溢出。而在1 9 9 8 年c e r t 的1 3 份建議中, 有9 份是與緩沖區(qū)溢出有關的,在1 9 9 9 年,至少有半數(shù)的建議是和緩沖區(qū)溢出有 關的,在2 0 0 3 年,2 8 份建議中和緩沖區(qū)溢出有關的有1 2 份【2 】。國內綠盟科技記 錄的1 8 9 5 條有關漏洞中,緩沖區(qū)溢出漏洞占4 1 0 條,幾乎涉及到所有的操作系統(tǒng) 和應用程序。在b u g t r a q 的調查中,有2 3 的被調查者認為緩沖區(qū)溢出漏洞是一個 很嚴重的安全問題。 綠盟科技1 3 】根據(jù)安全漏洞的嚴重程度、影響范圍等因素綜合評出2 6 年度的 十大安全漏洞,緩沖區(qū)溢出漏洞占4 個,分別包括:m i c r o s o f tw m d o w ss e n r e f 服 務遠程緩沖區(qū)溢出漏洞( m s 0 6 0 4 0 ) ,m i c s o f tw i n d o w sm s d t c 堆溢出漏洞 ( m s 0 6 0 1 8 ) ,m i c r o s o f t w 抽d o w s w j d 【s l a t i o n 服務 k t p m a n a g c l o c c 0 衄耐遠程棧 溢出漏洞( m s 0 6 0 7 0 ) 和a p a c h cm o d j e w r i t c 模塊單字節(jié)緩沖區(qū)溢出漏洞。綠盟 科技在2 0 0 6 年共發(fā)布c 、礓漏洞8 個,而緩沖區(qū)溢出漏洞就占了5 個。其中, m i c r o s o f tm 6u r l l o n d n 長u r l 緩沖區(qū)溢出漏洞,源于一個l s t m c p y a 函數(shù)的錯誤 調用,可能造成一個堆數(shù)據(jù)結構盼破壞,通過精心構造數(shù)據(jù)可能導致執(zhí)行任意代 電子科技大學碩士學位論文 碼。w i n 鋤pm 3 u 列表文件處理緩沖區(qū)溢出漏洞,w i n a m p 可以通過加載血3 u 列表 文件來播放其中的文件,當某個文件播放停止時,w i n a m p 會重新設置程序標題。 這時w 協(xié)a m p 錯誤的使用了s t m c p y 函數(shù),導致一個靜態(tài)緩沖區(qū)溢出。 因此,如果能采用有效的手段對緩沖區(qū)溢出漏洞進行檢測,對提高軟件本身 的健壯性和安全性具有十分重要的意義。 1 2 本文主要工作 本文主要工作為:在研究利用緩沖區(qū)溢出進行的主要攻擊手段,分析已有緩 沖區(qū)溢出檢測工具,以及參加和四川省安全廳合作的針對源代碼的棧緩沖區(qū)溢出 檢測工具的開發(fā)的基礎上,給出了一種針對二進制代碼的棧緩沖溢出靜態(tài)檢測的 方法并用語法分析和操作語義的方法加以嚴格描述,并最終實現(xiàn)一個針對二進制 代碼的棧緩沖溢出自動檢測原型系統(tǒng)。具體包括; 1 二進制代碼靜態(tài)掃描的特征研究 基于二進蒂g 代碼的靜態(tài)掃描,相對較a c + + 的源代碼掃描復雜。二迸制代碼 文件的精確格式分析、匯編級的指令還原、匯編指令級的漏洞語法研究都是基于 二進制代碼的靜態(tài)掃描所特有的。研究以下二進制代碼相關特征是開發(fā)的基礎: 二進制代碼文件的格式特征及利用; 編譯器版本特征研究及利用; 敏感數(shù)據(jù)的編譯器優(yōu)化特征研究及利用。 2 緩沖區(qū)溢出漏洞二進制代碼級模式研究 結合二進蒂4 代碼靜態(tài)掃描的特征,發(fā)現(xiàn)漏洞特征碼和漏洞的語法模式,并將 基于c c + + 源碼的靜態(tài)分析技術向匯編級的靜態(tài)分析進行移植和擴展是整個問題 的關鍵。具體內容包括: 特狂碼研究; 控制流提取及數(shù)據(jù)流跟蹤研究; 語法級模式。 3 漏洞發(fā)現(xiàn)的詞法、語法分析器生成 通過漏洞模式的構建和特征碼的整理,設計一個結構合理、性能良好的語法 分析引擎。具體內容包括: 詞法、語法單元的粒度設計; 控制流的再現(xiàn); 2 第一章引言 漏洞模式的匹配和后繼語義分析。 通過實例測試證明,該原型系統(tǒng)能有效的檢測出二進制代碼中的一些棧緩沖 溢出的情況。 1 3 論文結構 本文第一章為引言,主要介紹課題的一些背景情況和研究內容。 第二章介紹緩沖區(qū)溢出的原理,并比較了目前流行的緩沖區(qū)溢出檢測方法和 工具,提出了本文的棧緩沖區(qū)溢出檢測方法。 第三章介紹本文的基礎研究,包括靜態(tài)分析基礎和詞法、語法分析的相關理 論基礎。靜態(tài)分析基礎將介紹如何從反匯編代碼中識別與緩沖區(qū)溢出檢測相關的 語法元素;詞法、語法分析是本文的棧溢出檢測方法的核心,因此該章將詳細介 紹與本文相關的詞法、語法分析理論,并介紹了本課題使用的兩個開發(fā)工具:詞 法分析程序和語法分析程序的自動生成器。 第四章詳細介紹對二進制代碼的靜態(tài)掃描原型系統(tǒng)的設計與實現(xiàn)。 第五章介紹對實現(xiàn)的二迸制掃描原型系統(tǒng)進行的測試和分析。 最后是對本文工作的總結。 3 電子科技大學碩士學位論文 第二章緩沖區(qū)溢出原理及檢測技術 緩沖區(qū)溢出是個眾所周知的安全問題。緩沖區(qū)溢出攻擊仍然是現(xiàn)在最有效 的軟件攻擊方法之一,并且在接下來的許多年里,情況仍然會是這樣的。緩沖區(qū) 溢出攻擊可導致程序運行失敗、系統(tǒng)當機、重新啟動等后果。更為嚴重的是可以 利用它執(zhí)行非授權的指令,獲得被攻擊主機的部分或者全部特權,進而進行各種 非法操作。因此,針對緩沖區(qū)溢出漏洞檢測方法的研究具有十分重要的意義。本 章簡單介紹了緩沖區(qū)溢出的原理,并比較了目前流行的緩沖區(qū)溢出檢測方法和工 具,然后提出了本文的棧緩沖區(qū)溢出檢測方法。 2 1 緩沖區(qū)溢出原理簡介 所謂緩沖區(qū),簡單說來就是程序運行時內存中的一塊連續(xù)的區(qū)域。例如c 語 言中經(jīng)常要用到的數(shù)組,其中最常見的是字符數(shù)組。在一個程序中,會聲明各種 變量。靜態(tài)全局變量是位于數(shù)據(jù)段并且在程序開始運行的時候被加載。而程序的 動態(tài)的局部變量則分配在堆棧里面。如果向一個緩沖區(qū)復制數(shù)據(jù),但是復制的數(shù) 據(jù)量又比緩沖區(qū)大的時候,就會發(fā)生緩沖區(qū)溢出例。 緩沖區(qū)溢出主要出現(xiàn)在c 和c + + 語言中,因為這些語言不執(zhí)行數(shù)組邊界檢查 和類型安全檢查。c c + + 開發(fā)人員創(chuàng)建非常接近硬件環(huán)境運行的程序,允許直接訪 問內存和寄存器。這樣的程序可以獲得優(yōu)異的性能,但也帶來了嚴重的安全問題。 標準c 庫中還存在了像s c p y 、s t r c a t 、s p r i n t f 等不安全的字符串操作函數(shù)。 w i i l d o w s 操作系統(tǒng)中也存在l s t r c p y 、l s t r c a t 等類似的函數(shù)。不正確的使用這些函數(shù) 也是導致緩沖區(qū)溢出的重要原因。 緩沖區(qū)溢出問題又常常被歸結為通道交錯問題。編譯器將數(shù)據(jù)和控制管理信 息混合存放。例如,函數(shù)的緩沖區(qū)位于堆棧中,同時該函數(shù)的返回地址就在緩沖 區(qū)后。又如,動態(tài)內存分配的塊管理信息和數(shù)據(jù)連續(xù)存放。類似的管理信息還包 括異常處理程序地址、函數(shù)指針等等。典型的格式化字符串漏洞也屬于這種情況。 數(shù)據(jù)通道,只被復制而不被解釋??刂仆ǖ?,具有控制功能,需要系統(tǒng)解釋。如 果程序正常執(zhí)行,這兩種通道可以工作的很好,不會出現(xiàn)問題。但是,如果這兩 個不同的通道交錯在一起時,漏洞就會暴露出來。攻擊者利用對數(shù)據(jù)通道的寫權 4 第二章緩沖區(qū)溢出原理及檢測技術 限改寫了控制通道的內容,那么系統(tǒng)就有可能出現(xiàn)控制上的紊亂,而導致攻擊。 因此,可以歸納出緩沖區(qū)溢出的必要條件有: 1 使用非類型安全的語言,如c 尼+ + ; 2 ,以不安全的方式訪問或復制緩沖區(qū); 3 編譯器將緩沖區(qū)放在內存中關鍵數(shù)據(jù)結構相鄰的位置。 緩沖區(qū)溢出攻擊技術的種類很多。從攻擊原理分,緩沖區(qū)溢出攻擊可以分為 棧溢出、普通堆溢出、高級堆溢出和格式化字符串溢出等;從攻擊方式分,又可 以分為本地溢出和遠程溢出。一個標準的緩沖區(qū)溢出攻擊大致可以分為三個步驟: 1 在目標系統(tǒng)中注入攻擊代碼; 2 發(fā)現(xiàn)目標系統(tǒng)運行過程中可以控制的緩沖區(qū)漏洞及其觸發(fā)條件: 3 精心構造滿足溢出條件的超長字符串,使得溢出發(fā)生時可以截獲目標系統(tǒng) 的控制權,指向攻擊代碼、或者指向更高級別的系統(tǒng)進程配合攻擊代碼完 成惡意的攻擊。 2 2 緩沖區(qū)溢出檢測技術 當前對于緩沖區(qū)溢出的檢測方法總體上分為兩類:靜態(tài)檢測和動態(tài)檢測的方 法。 靜態(tài)檢測又可分為基于源代碼的靜態(tài)檢測和基于二進制代碼的靜態(tài)檢測?;?于源代碼的靜態(tài)檢測技術是目前研究相對較多的一個分支,其特征是通過對源代 碼的掃描和分析,對緩沖區(qū)溢出發(fā)生的模式進行識別,從而完成溢出漏洞的檢測。 基于二迸制代碼的靜態(tài)檢測技術的研究仍然比較少見,目前典型的研究是通過一 些反匯編工具對目標代碼進行處理,然后再依賴一些源代碼靜態(tài)檢測技術進行處 理。這也正是本文所采用的方法。 動態(tài)檢測技術也可分為基于源代碼的動態(tài)檢測和基于二迸制代碼的動態(tài)檢 測。基于源代碼的動態(tài)檢測通過在執(zhí)行時對程序內存中的訪問情形加以控制來完 成溢出漏洞的檢測。比如通過對在源碼中插入一些約束和判斷的模塊,然后在編 譯后的程序運行期間對有關變量和堆棧區(qū)域的監(jiān)控來檢測漏洞。這種檢測技術改 變了棧的結構,需要重新編譯源代碼?;诙M制代碼的動態(tài)檢測通過自動化工 具生成測試數(shù)據(jù),通過仿真攻擊狀態(tài)下應用程序的執(zhí)行狀態(tài)來判斷緩沖區(qū)溢出漏 洞位置,又被稱為黑箱分析。這種通過運行發(fā)現(xiàn)緩沖區(qū)溢出的動態(tài)檢測方法非常 準確,而且不需要源代碼,但是分析的代價大,效率不高。 5 電子科技大學碩士學位論文 2 2 1 靜態(tài)檢測技術 最簡單的靜態(tài)檢測技術是使用與u n 平臺下的擘e p 類似的工具,搜索源代 碼中可能存在的一些不安全的庫函數(shù)的調用。 n 忑4 、r t s 和f 】刪f i n d e r 是目前發(fā)展比較成熟的源碼掃描工具,其基本原理 是對源程序進行詞法分析,得到t o k e n 序列,然后與其維護的漏洞數(shù)據(jù)庫中的信息 比較,發(fā)現(xiàn)可能的缺陷,給出提示。這類檢測技術實現(xiàn)簡單,算法效率高,能夠 較全面的覆蓋系統(tǒng)代碼,但是由于沒有考慮到語法和語義層次的信息,所以這些 檢測工具能夠檢測出系統(tǒng)的大量漏洞,但很多是誤報。而且產(chǎn)生的結果集很大, 人工審計仍然很困難【5 】【1 4 】f 1 5 】【垌。 f l a w 矗n d c r i ”l 工具是一個p v t h o n 程序,可以用來檢查c 和c + + 程序。f l 齲勘d c i 的速度非???,在一般的臺式機上處理幾千行的c 程序只需要幾秒鐘。在掃描漏 洞的過程中,h a w f i l l d e r 也具有一定的智能性。例如在對于一個特別編寫的不安全 的c 程序進行掃描的過程中,f 1 a w f i n d e r 可以區(qū)分出s t r 印y o 對于固定長度的字符 處理和變長的字符處理,從而區(qū)分出真正的漏洞和錯誤的報警。更進一步, f 1 a w f m d e r 還能夠識別字符串在國際化中的使用。 r a 弼( t h er 0 u g h a u d i 幽g t o o lf o rs e c l l r i t y ) 【1 5 】也是一個影響比較大的源代碼 掃描工具,目前正處于比較活躍的開發(fā)過程中,可以檢查使用c ,c + + ,p e d ,p h p 和p y t h o n 等語言編寫的源程穿。r 舡s 可以輸出x m l 格式的錯誤信息,因此在使 用r a t s 之前,還需要安裝x m l 處理工具e x p a t 【1 7 l 。在r 姐_ s 的運行過程中,用 戶可以通過配置來改變其輸出的錯誤信息級別,缺省是中級??蛇x的漏洞知識庫 和一致的輸出函數(shù)可以接受用戶的自定義輸入,因此更方便用戶使用自己的專門 數(shù)據(jù)來發(fā)現(xiàn)特定的錯誤。目前r 蛆s 中已知的缺點包括它所使用的貪婪匹配算法, 使用這種算法,p 血l t f 能夠匹配p r i m ,v s n p r i n t f 以及其它許多類似的函數(shù),這就使 得過濾錯誤的命中變得比較困難。 1 1 葛4 ( t h es o f t w a r es t u p i ds o u r c es c a n i l e r ) 【1 6 j 是基于“n u x 和u n i x 的掃描工 具,可以掃描c 和c + + 語言所編寫的程序,用于發(fā)現(xiàn)一些最普遍的安全性相關的 漏洞。由于許多s 4 的開發(fā)人員轉向開發(fā)r a r s 和f 1 a w f i n d e r ,因此它的開發(fā)趨 于平和。但某些吸引人的特點在r a t s 或者f 1 a w f i l l d c r 中得到了發(fā)展,例如行忽略 技術、跟蹤用戶輸入以及可選的漏洞知識庫等。r r s 4 可與u n 下的編輯工具 e m a c s 結合起來運行,在程序員編碼的過程中同步完成檢查,可以隨時的提示程序 員。這也是n s 4 與其它源碼掃描工具相比所獨有的一個特點。 6 第二章緩沖區(qū)溢出原理及檢測技術 d a v i dw j 鱸e i 【n 】將緩沖區(qū)溢出的檢測問題轉化為整數(shù)區(qū)間分析的形式迸行處 理。在該方法中,他們提出了兩個新觀點:將c 字符串看作抽象數(shù)據(jù)類型;將緩 沖區(qū)視為整數(shù)范圍對,包括分配范圍和使用范圍。將分配給字符串變量的緩沖區(qū) 長度定義為a l l o c ( s ) ,字符串變量當前使用的緩沖區(qū)長度定義為i e n ( s ) ,s 為系統(tǒng)中 定義的字符串常量。如果程序當前使用的緩沖區(qū)長度1 e n ( s ) 大于系統(tǒng)為其分配的緩 沖區(qū)長度a l l 0 0 ( s ) ,那么就有可能存在緩沖區(qū)溢出漏洞。在考慮緩沖區(qū)長度的同時, 也必須注意到緩沖區(qū)的位置,也就是與變量相關的緩沖區(qū)范圍的長度與位置。這 樣,對緩沖區(qū)溢出漏洞的發(fā)掘也就成為了對整數(shù)范圍的追蹤問題。整個工作分為 兩部分,其一是對字符串操作產(chǎn)生相應的整數(shù)范圍限制;其二是對產(chǎn)生的限制進 行快速而準確的分析,得到最后的漏洞報告信息。為此,他們使用圖論技術構建 了一個有效的解決整數(shù)范圍限制的算法。由于不精確的范圍分析,該方法最大的 局限性就是過多的誤報。 n o dg 弛a p a t h y 【1 8 】等人基于線性規(guī)劃和靜態(tài)分析理論提出了一種輕量級別的 檢測算法。該算法首先利用工具軟件生成一些指針相關的信息和抽象語法樹,然 后基于此生成一些線性約束,然后利用線性規(guī)劃的思想來完成區(qū)間分析,檢狽4 可 能出現(xiàn)的溢出漏洞。 l i n t 是由a n d vk s t e r 發(fā)布的一個開源工具,能夠檢查可能的空指針、在釋放 內存之后使用了該指針、賦值次序闖題以及拼寫錯誤等。一個c 妃+ + 編譯器通常 假設程序是正確的,而“n t 恰恰相反,因此,它優(yōu)于編譯器執(zhí)行的一般性檢查。 l 知t 還可以貫穿多個文件來執(zhí)行它的錯誤檢查和代碼分析。目前有兩個流行的u n t 工具:p g l i n t 和s p l i n t ( 原l c i j n t ) 。p c l i n t 是一個由g i m p e ls o 脅a r e 提供的支 持c 肥+ + 的商用程序,其中的內容非常廣泛,只是選項就有3 0 0 多個,涉及到程 序編譯及語法使用中的方方面面。s p l i n t 是在u n t 工具的基礎上改造而成的,專門 針對程序的安全問題。它要求手工加入注釋,然后根據(jù)這些注釋進行語法分析, 利用了語法樹幽嘲。 靜態(tài)檢測主要是通過對源代碼掃描來判斷是否存在緩沖區(qū)溢出的漏洞,其優(yōu) 點是在軟件發(fā)布之前就修正所發(fā)現(xiàn)的弱點,并且不會造成程序執(zhí)行的負擔。國內 也有許多學者和研究機構進行了這方面的研究,如參考文獻【4 3 】【4 4 】【4 5 】【4 6 】【4 7 】。 2 2 2 動態(tài)檢測技術 目前,動態(tài)檢測研究的主要方面是數(shù)組邊界檢查和如何保證返回指針的完整 性。典型的方法包括基于編譯器運行時的邊界檢查和基于庫運行時的邊界檢查。 一7 - 電子科技大學碩士學位論文 s t a c k g u a r d 【1 9 】是一種通過程序指針完整性檢測來防范堆棧溢出問題的編譯器 技術。其原理是基于棧的緩沖溢出攻擊時,棧中溢出的緩沖區(qū)和返回地址之間的 值也都被修改。于是在棧緩沖區(qū)和返回地址之間放一個“c a n a r y ”值,當函數(shù)返回 時,若發(fā)現(xiàn)這個值被修改,那么就檢測到了溢出攻擊。s t a c k g u a r d 作為邸c 的一個 補丁,修改了函數(shù)建立和銷毀部分的代碼,由這些代碼來完成“c a l l a r y ”值的插入 和檢查工作。為了使這種保護機制有效,就不能給攻擊者在攻擊字符串中夾雜偽 造“啪a r ) ,”值的機會,所以這個值可以在程序執(zhí)行時隨機產(chǎn)生,攻擊者就不能通 過搜索程序的二迸制文件得到“c a n a r y ”值。這種方法的主要缺陷是存在拒絕服務 攻擊,因為當檢測到攻擊時,終止了程序的執(zhí)行。另外,該方法只保護返回地址, 沒有保護基指針,函數(shù)指針。 s t a c k s h i e l d 【冽也是g c c 編譯器的一個補丁,提供三種保護方式,其中兩種保護 返回地址,一種保護函數(shù)指針。返回地址保護所采用的方法有:其一是創(chuàng)建另一 個堆棧用來存儲函數(shù)返回地址的一份拷貝。在受保護的函數(shù)的開頭和結尾分別增 加一段代碼,當函數(shù)返回地址壓棧時,同時把它壓入新創(chuàng)建的棧中,當函數(shù)返回 時,用這個棧的棧頂值作為返回地址。這樣,即使函數(shù)返回地址被修改,也能保 證程序能夠繼續(xù)的正確執(zhí)行下去。二是設一個全局變量,當函數(shù)調用時,把返回 地址存入這個值中,當函數(shù)返回時,比較這個值和棧中返回地址的值,如果不同 就檢測到了攻擊。函數(shù)指針的保護方法是限制可執(zhí)行代碼只能出現(xiàn)在代碼段中。 堆、棧和b s s 段都不能有函數(shù)指針所指向的可執(zhí)行的代碼。當函數(shù)調用時,進行 邊界檢查,如果所指向的區(qū)域地址不在代碼段之內,終止程序的執(zhí)行。這種方法 的主要缺陷是拒絕服務攻擊仍然可能存在,而且代碼都要保存在代碼段。 l t a d ( r e t i l ma d d r e s sd e f c n d e r ) f 8 】與s t a c k s l l i e l d 非常類似,也用一個額外的 棧,每當函數(shù)調用時壓棧,當函數(shù)返回時,比較返回地址和這個額外的棧的棧頂 所記錄的值是否相同,如果相同,繼續(xù)執(zhí)行,否則,終止執(zhí)行,給出警告。主要 缺陷是拒絕服務攻擊仍然可能,而且這個額外的棧本身也要被保護,增加了開銷。 m m 的s t a c k s m a s h i n g 保護程序s s p ( 又名p r o p 0 1 i c e ) 瞄】是s t a c k g u a r d 的方 法的一種變化形式。像s t a c k g u a r d 一樣,s s p 使用一個修改過的編譯器在棧緩沖 區(qū)和返回地址之間插入一個“c a n a r y ”值以檢測堆棧溢出。但是,它給這種基本的 思路添加了一些變化:改變棧的分配結構,不管源程序中各個變量的聲明順序, 把它們都放在低端地址,把返回地址和基指針放在高端地址,這樣即使溢出也不 會修改到高端地址處存放的返回地址。默認情況下,它不會檢測所有的函數(shù),而 只是檢測確實需要保護的函數(shù)。從理論上將,這樣會稍微削弱保護能力,但這種 8 第二章緩沖區(qū)溢出原理及檢測技術 默認行為改進了性能,同時仍然能夠防止大多數(shù)問題。 i o y i l n g - s u k 址e e 凹嚕人提出了一種針對c 的庫函數(shù)調用產(chǎn)生的溢出問題的動 態(tài)檢測技術。他們對g n uc 的編譯器進行了擴展,使得編譯后的程序在內存中維 持有局部變量、函數(shù)參數(shù),全局變量等類型的緩沖區(qū)的類型信息,并對內存堆中 分配的緩沖區(qū)大小進行了記錄。依賴這些信息,程序在運行期間可以對某些溢出 情形作出判斷。 此外,還有一些動態(tài)檢測方法,如h b s a f c 、n b v c r i f y 陋l 等對c 庫中的不安全函 數(shù)做了重新實現(xiàn)。這些動態(tài)檢測方法都仔細研究了編譯中對變量聲明,函數(shù)調用 的棧、堆的分配,著眼于保護已分配的返回地址和函數(shù)指針不被修改。 2 3 本文的棧溢出檢測方法 目前比較成型的靜態(tài)分析工具所采用的方法有很多缺點:都只做到了詞法分 析,然后根據(jù)構造的數(shù)據(jù)庫,通過匹配的方法判斷是否符合溢出模式;不夠準確, 很多錯誤檢測不到,或者檢測到的并非錯誤;唯一做了語法分析的工具是手工在 源代碼中加入注釋,并不是一個全自動的檢測工具。 與動態(tài)分析技術相比,靜態(tài)分析技術無需龐大的測試數(shù)據(jù),無需精心設計測 試用例,無需過多的程序運行負擔是它相對于動態(tài)分析的最大優(yōu)點;對漏洞很少 有漏報的情況,而且設計相對簡單,運行開銷也相對較小。通過結合高級或低級 語言自身的語法特征進行較高程度的漏洞語法模式定義,做進一步較精確的語法 分析,誤報率將會大大減小。 對二進制代碼的漏洞發(fā)現(xiàn),同樣可以通過靜態(tài)分析實現(xiàn);經(jīng)一定的結構分析 和提取后,轉化為匯編級源碼,然后對匯編指令流進行靜態(tài)分析。目前,針對匯 編一級的靜態(tài)掃描研究還很少。匯編級的程序流相對a c + + 源程序而言,其語法 分析較困難,特別是對緩沖溢出相關的數(shù)組操作,經(jīng)不同的編譯器產(chǎn)生的代碼區(qū) 別很大;另外,匯編指令一級的語法分析需考慮的問題范疇更加廣泛、復雜。但 是,由于匯編指令流中存在和漏洞相對應的模式,而且相對c 肥+ + 源碼的分析, 匯編指令一級的靜態(tài)分析也有其優(yōu)點:避免了d c + + 中多線程等導致的程序控制 流程煩雜不易分析的特點,從而分析工作較直觀、簡單。所以,基于靜態(tài)分析的 匯編級漏洞發(fā)現(xiàn)是可行的。 通過分析目前幾個開源的源代碼掃描工具,以及參與的一個源代碼靜態(tài)掃描工 具的開發(fā),本文提出一種對二進制代碼的棧緩沖溢出靜態(tài)檢測方法。該方法借鑒 9 電子科技大學碩士學位論文 了參與開發(fā)的源代碼靜態(tài)掃描工具中的相關技術,其技術路線可描述如下: 1 反匯編二進制文件,分析與棧緩沖溢出漏洞相關的特征和語法模式; 2 將基于甜c + + 源碼的靜態(tài)分析技術向匯編級的靜態(tài)分析進行移植和擴展; 3 設計一個結構合理、性能良好的語法分析引擎進行與棧緩沖溢出相關語法成分 的分析; 4 以可能導致棧緩沖溢出的c 庫函數(shù)和w i n d o w s 操作系統(tǒng)中類似的函數(shù)為出發(fā) 點,進行是否可能導致棧緩沖溢出的分析。 我們的分析是基于反匯編后的代碼,實質上也可以認為是一種基于源代碼的 靜態(tài)檢測技術。這方面的研究也是對主流技術的一種重要補充,在得不到源代碼 的情況下,可以作為一種備用手段使用。 2 4 有緩沖區(qū)溢出問題的a p i 本文所實現(xiàn)的棧緩沖溢出檢測工具的基本出發(fā)點是針對可能導致緩沖區(qū)溢出 的庫函數(shù)進行檢查的方式來確定程序中是否存在安全隱患。因此,該小節(jié)列舉出c 運行庫和w i n d o w s 操作系統(tǒng)中可能導致緩沖區(qū)溢出的不安全函數(shù)。 1 s t r c p y 、w c s c p y l s t r 印y 、j c s c p y 和m b s 印y 2 s t r c a t 、w c s c a t 、l s t r c a t 、j c s c a t 和j n b s c a t 這些函數(shù)不檢查目標緩沖區(qū)的長度,也不檢查n u l l 或其它無效的指針。如果 源緩沖區(qū)不是以n u u 結尾的,那么結果是無法判斷的。 3 s t i n c p y w c s n c p y 、l s t r ( :p y n 、j c s n c p y 和腳b s n b c p y 不能保證這些函數(shù)會用n u i i 來結束目標緩沖區(qū),它們也不檢查n u i l 或其它無 效的指針。 4 s 仃n c a t 、w c s c a t 、- t c s n c a t 和m b s n b c a t 這些函數(shù)檢查被拷貝的字符數(shù)是否與緩沖區(qū)中的字符數(shù)是相同的,而不是檢 查緩沖區(qū)的大小。這些函數(shù)依賴于源緩沖區(qū)和目標緩沖區(qū)是否以n u l l 結尾。 5 m e m c p y 和c o p y m e m o r ) r 目標緩沖區(qū)必須足夠大,以便能夠存儲在長度參數(shù)中指定的字節(jié)數(shù),否則會 發(fā)生緩沖區(qū)溢出。 6 s p r i n t f 和s w p r i n t f 不能保證這些函數(shù)會用n u u 結束目標緩沖區(qū)。除非嚴格的定義了字段的寬度, 否則這些函數(shù)很難安全的使用。 1 0 第二章緩沖區(qū)溢出原理及檢測技術 7 g e t s g c t s 函數(shù)是有害的,用這個函數(shù)就不可能寫出安全的應用程序,因為它不檢查 被拷貝的緩沖區(qū)大小。 8 s c a 】l f ,j s c a n f ,w s c a n f 像g c t s 一樣,s c a n f ,j s c a i l f 和w s c a n f 在使用s 格式化字符的時候,由于s 是沒有邊界的,因此都很難正確使用。 9 m u l 皿y t e t o w i d e c h a r 這個函數(shù)的最后一個參數(shù)是字符串中寬字符的數(shù)目,而不是字節(jié)數(shù)。如果傳 遞的是字節(jié)數(shù),那么給出的緩沖區(qū)長度是實際長度的兩倍。 2 5 小結 本章簡單介紹了緩沖區(qū)溢出的原理,通過比較目前主流的緩沖區(qū)溢出檢測技 術,提出了一種對二進制代碼的棧緩沖溢出檢測方法。該方法通過對二進制代碼 的反匯編代碼進行語法分析,識別出與棧緩沖溢出相關的語法成分并進行一定程 度的語義分析,在此基礎上實現(xiàn)一個棧緩沖溢出漏洞的檢測工具。下一章將具體 介紹如何從反匯編代碼中識別與緩沖區(qū)溢出相關的語法成分,并結合相關的詞法、 語法分析理論,詳細介紹了兩個詞法、語法分析器的自動生成工具:u x ( k x i c a l a n a l y z e fg e n e r a t o r ) 和y a c c ( y c ta n o t h c fc o m p n e r - c o m p i l e r ) ,這也是本課題主 要使用到的開發(fā)工具。 電子科技大學碩士學位論文 第三章二進制代碼的靜態(tài)分析研究 識別二進制代碼中與棧緩沖溢出相關的語法成分是本文所要實現(xiàn)的原型系統(tǒng) 的關鍵。本章將通過比較源代碼和相應二進制代碼的反匯編代碼,研究如何從二 進制代碼中識別高級語言的關鍵結構和與識別這些結構相關的詞法、語法分析的 理論基礎。 3 1 靜態(tài)分析基礎 本文采用的棧緩沖溢出檢測方法,首先就是對二進制代碼進行反匯編。i d a ( k t c r a d i v ed i s a s s e m b l e r ) 是一個強大的靜態(tài)反匯編工具,本文其余的工作,都是 基于i d a 的反匯編結果進行的。因此,如何從二進制代碼和反匯編代碼中發(fā)現(xiàn)我 們感興趣的東西,是本節(jié)將要詳細介紹的。 3 1 1 識別函數(shù)和庫函數(shù) i d a 反匯編器能夠分析c a l l 指令的操作數(shù),這使它可以自動將函數(shù)分解成一 系列的函數(shù)。除此之外,i d a 還能夠非常成功地應付絕大多數(shù)間接調用。不過, 它尚不能處理復雜調用以及那些使用j m p 指令的手工函數(shù)調用。 絕大多數(shù)非優(yōu)化編譯器會在函數(shù)的開頭放入稱為起始標志( p r o l o g ) 的下列代 碼: p u s he b p m o v e b p ,e s p s u b e s p ,x x 一般而言,可以將起始標志的用途歸結為:如果e b p 寄存器用于對局部變量 進行尋址( 通常情況就是這樣) ,那么在使用變量之前必須將它保存到堆棧中,否 則,被調用函數(shù)將使父函數(shù)“崩潰”。接著,堆棧指針寄存器e s p 的當前值要復制 到e b p 之中這個操作稱為打開堆棧頁面,并且e s p 的值會隨著為局部變量分 配的內存塊大小而不斷減少。 p u s he b p m o ve b p ,e s p s u be s p x x 序列可用于找到分析文件中所有函數(shù),包括 那些沒有對它們進行直接引用的函數(shù),特別是,i d a 采用了這種技術。不過,優(yōu) 1 2 第三章二進制代碼的靜態(tài)分析研究 化編譯器知道如何像使用任何其它通用寄存器一樣,通過e s p 寄存器對局部變量 進行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論