999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于應用視角的緩沖區溢出檢測技術與工具*

2019-07-08 08:54:58司徒凌云王林章李宣東
軟件學報 2019年6期
關鍵詞:分析檢測

司徒凌云, 王林章, 李宣東, 劉 楊

1(南京大學 計算機科學與技術系,江蘇 南京 210023)

2(計算機軟件新技術國家重點實驗室(南京大學),江蘇 南京 210023)

3(School of Computer Science and Engineering, Nanyang Technological University, Singapore 210023, Singapore)

軟件緩沖區溢出漏洞在CWE/SANS排名的25個最危險軟件漏洞中位列第三[1],是當今危害最為廣泛和嚴重的安全漏洞之一.緩沖區溢出是指輸入數據超過緩沖區可容納的最大數據量,進而超出部分溢出到臨近存儲區域的軟件漏洞.其產生的根本原因是使用非安全類型編程語言如 C/C++,強調效率優先,而對內存操作不做邊界檢查.緩沖區溢出可被惡意利用進而控制主機,獲得系統權限,執行任意代碼,對安全攸關系統造成重大危害.典型的例子最早可追溯到1988年爆發的MORRIS蠕蟲[2],其利用BSD操作系統后臺程序的緩沖區溢出漏洞進行攻擊,數天之內控制了近6 000臺網絡主機,幾乎導致互聯網完全癱瘓,造成了近一千萬美元的經濟損失;再例如2001年7月爆發的Code Red蠕蟲[3]攻擊了近36萬臺服務器,造成超過26億美元的損失.速度最快的屬隨后于2003年1月爆發的Slammer蠕蟲[4],其基于微軟SQL Server的緩沖區溢出漏洞進行攻擊,在10分鐘之內感染了7.5萬臺主機,最終感染主機60多萬臺,造成經濟損失達50億美元之巨.

為了抵御緩沖區溢出漏洞的威脅,一方面,編程人員的安全編程技能不斷提升;另一方面,各種緩沖區溢出漏洞的檢測、防護技術也相繼提出,典型的可分為靜態方法和動態方法.靜態方法[5-8]不需執行程序,基于源碼分析,能夠有效發現常見的緩沖區溢出漏洞.其優勢在于速度快,可處理規模大,并且在一定假設前提下可以證明程序徹底擺脫某種特定類型的緩沖區溢出漏洞;其不足在于誤報率和漏報率較高;相對而言,動態方法[5]可獲得較高的精度,代價是巨大的額外開銷和性能損失;進一步地,部分動、靜態結合的技術也相繼提出[9,10].

上述方法在一定程度上提高了緩沖區溢出攻擊的門檻,緩解了緩沖區溢出漏洞造成的危害.但是面對當今信息社會軟件規模不斷擴大,軟件數量不斷增多(包括眾多現有的 C/C++編寫的系統以及以往的 C/C++遺留代碼)的現實,緩沖區溢出漏洞的數目不減反增.圖1所示為1989年~2017年,CVE公布的歷年緩沖區溢出漏洞數目,由此可知,緩沖區溢出漏洞依舊是威脅軟件安全的重大安全漏洞之一.

值得一提的是,緩沖區溢出不僅僅局限于非安全類型編程語言 C/C++,安全類型的編程語言代碼 Java,Perl,其底層基礎同樣面臨的緩沖區溢出攻擊的威脅[9].

書寫安全的代碼可能是唯一能夠使軟件徹底擺脫各種安全漏洞的終極辦法,軟件工程領域的研究一直致力于幫助編程人員書寫安全的代碼.遺憾的是,依靠目前的編程范式以及各種緩沖區溢出漏洞的防護措施,要徹底地消除緩沖區溢出漏洞幾乎是不可能的.因此,緩沖區溢出漏洞檢測技術與工具顯得至關重要,它們是檢測與修復、預防與保護、度量與評估等多方面工作的基礎與核心.

迄今為止,學術界和工業界提出了各種緩沖區溢出漏洞的檢測技術與工具.然而面對眾多的檢測技術與工具,使用者如何有效地進行選擇,進而應用到緩沖區溢出漏洞的檢測與修復、預防與保護、度量與評估等多個方面,是一個具體而實際的問題.

有必要對現有的軟件緩沖區溢出檢測技術與工具進行梳理,然而目前對于緩沖區溢出漏洞檢測技術與工具的梳理大多基于研究者的研究視角,而非使用者的應用視角.基于研究視角,其重點關注緩沖區溢出檢測方法的技術細節,以靜態方法、動態方法和混合方法進行分類闡述.這樣的梳理對于研究者而言清晰明了,有利于研究者深入了解各種檢測技術細節進而進行技術改進.但是對于使用者而言不夠直觀實用,因為使用者不關心技術與工具的進一步改進,其關心的更多的是如何在有限成本的制約下,有效地選擇或者組合出能夠最大限度滿足自身需求的檢測工具進行應用,并達到盡可能好的效果.

該命題的回答可以歸結為用戶需求的細分與相應檢測技術工具的匹配,這需要同時深入了解用戶需求和緩沖區溢出檢測技術與工具.然而,一方面,用戶需求并不單一,是紛繁各異的,不同的行業、不同的場景下,用戶需求更是千差萬別,同時,用戶需求并不獨立,多個需求之間可能相互制約、需要進行多需求的平衡;另一方面,緩沖區溢出檢測工具也是門類繁多,各有特色,要完成用戶需求的細分與相應檢測工具的匹配,在繁雜各異的用戶需求與多種多樣的緩沖區溢出檢測技術與工具之間建立一張全面、條理清晰、而又便于用戶理解、使用的映射圖譜是非常困難的,同時也是非常有價值的.

本文站在使用者的立場,從技術與工具實際應用的視角出發,在概述緩沖區溢出漏洞類型與特征的基礎上,從軟件生命周期階段的檢測與修復、緩沖區溢出攻擊階段的預防與保護、基于認識與理解途徑的度量評估這3個應用視角,對緩沖區溢出缺陷檢測技術與工具進行梳理,一定程度上在用戶需求與檢測技術與工具之間建立了一張映射圖譜,為用戶實際中有效選擇緩沖區溢出檢測技術與工具提供了指導,也為進一步的研究工作奠定了基礎.

1 緩沖區溢出類型與特征

緩沖區溢出[11,12]是一種軟件漏洞,對于強調效率優先的非安全類型編程語言 C/C++而言,當試圖將超過緩沖區所能容納的數據輸入到緩沖區時,因其不做邊界檢查,就會發生溢出.其中,緩沖區是指計算機中存儲數據的一段連續內存區域,包括數據段、堆段、棧段.

當發生緩沖區溢出時,溢出的數據流入到緩沖區臨近的內存區域,進而會覆蓋、修改臨近內存區域中的值.緩沖區溢出攻擊就是利用這一特點進行的.攻擊者精心構造輸入內容,造成緩沖區溢出,進而使溢出部分修改附近內存中諸如返回地址、函數指針、棧幀基址、指針變量等關鍵類型的值,使其指向攻擊者希望程序后續執行的位置,從而改變程序控制流,最終執行攻擊代碼(攻擊代碼可能位于構造的輸入內容之中,也可能是系統庫中的函數),實現其攻擊目的.

基于上述的理解,給出緩沖區溢出漏洞的定義,并對典型緩沖區溢出攻擊進行說明.

定義 1(緩沖區溢出漏洞).緩沖區溢出漏洞是一種軟件缺陷,指輸入數據的長度超過了緩沖區能夠容納的長度,超出的部分數據溢出到臨近的內存區域的一種異常.

典型的緩沖區溢出攻擊是攻擊者基于緩沖區溢出漏洞,通過構造輸入,造成緩沖區溢出,使溢出數據修改了臨近內存區域的關鍵值(如 Return Address,Heap Metadata等),進而劫持控制流,執行注入的或者重用已有代碼(如系統庫函數等)構成的攻擊代碼的一種軟件安全攻擊.

1.1 緩沖區溢出漏洞類型

緩沖區溢出漏洞按照不同的標準有不同的分類:按照緩沖區所在內存區域的位置可分為棧溢出、堆溢出和數據段溢出;按照導致溢出的內存操作函數分為字符串操作(如strcpy函數等)導致的溢出和格式化輸出(如sprintf函數等)導致的溢出等;按照溢出數據修改的關鍵值類型分為修改返回地址的溢出、修改函數指針的溢出、修改指針變量的溢出等.

下面簡要介紹幾種典型緩沖區溢出漏洞類型,主要包括棧溢出、Return-into-Libc溢出、off-by-one溢出、堆溢出、數據段溢出、格式化字符串溢出和整數溢出.

1.1.1 棧溢出

棧溢出是被利用最廣泛的溢出漏洞.每一次函數調用,棧中會存放該函數對應的棧幀,幀中包含函數參數、函數返回地址、棧幀基址等信息.例如,函數func的棧幀如圖2所示.

Stack Smashing是基于棧溢出的典型攻擊,1996年,AlephOne在文獻[13,14]中進行了詳細的論述,其基本過程如圖3所示.首先,攻擊者通過精心構造包含惡意代碼的輸入內容傳入函數(如Pointer指向的數組);然后,函數內部內存操作函數(例如strcpy等)將輸入內容拷貝到緩沖區,進而造成溢出,溢出部分數據會修改臨近緩沖區的關鍵值,即函數的返回地址;最后,當函數執行結束返回時,程序執行跳轉到被修改過的返回地址所指向的地址,即緩沖區中惡意攻擊代碼所在的位置,進而執行攻擊代碼.

此外,如果攻擊者不是將攻擊代碼注入到緩沖區中,而是重用已有代碼,系統庫函數(如system(·),exec(·)等)作為攻擊代碼,那么這樣的溢出攻擊叫做Return-into-Libc溢出攻擊.ROP(return oriented programming)[15,16]通過RET地址重用Gadgets代碼(即已在內存中的指令序列).JOP(jump oriented programming)[17,18]通過Call/Jmp指令重用 Gadgets代碼構成攻擊代碼.函數返回地址是最重要的攻擊目標之一,除此之外,指針變量、函數指針、棧幀基址等都是重要的攻擊目標,即,可以通過覆蓋修改指針變量(如上例中的 Pointer)的值和函數指針(func pointer)指向攻擊代碼[19].Off-by-one溢出則指的是輸入內容恰好超出緩沖區一位數據的溢出,其通常產生于試圖將一個數組中的所有元素逐個復制到緩沖區中的循環中,如圖4所示.

該程序意在將 input中的數據逐個復制到長度為 128的 buffer數組中,但由于 for循環中i<128寫成了i<=128,所以該程序會復制129個數值到buffer中,進而造成off-by-one溢出.

1.1.2 堆溢出

堆是由程序運行時運用malloc(·)和free(·)等函數動態分配、釋放的內存塊組成,每一個內存塊都包含自身內存大小和指向下一個內存塊的指針等信息.雖然堆中沒有函數返回地址,但是攻擊者可以通過修改堆中的函數指針或者指針變量,進而達到修改程序控制流,執行攻擊代碼的目的.典型的,如圖5所示[20].

圖 5(a)展示的是一個典型的在堆中動態分配和釋放的內存塊情況,chunk1是一個已分配的內存塊,包含其之前存儲的塊的大小和它本身的大小信息,User data部分即提供程序寫入數據的buffer區域.chunk3是一個臨近 chunk1且已被釋放的內存塊,chunk2和 chunk4是位于堆中其他任意位置的已被釋放的內存塊.chunk2,chunk3,chunk4在一個雙向鏈表結構中,chunk2是鏈中的第1個內存塊,其前向指針指向 chunk3,后向指針指向了鏈中前一個內存塊.chunk3的前向指針指向chunk4,后向指針指向了chunk2.chunk4是鏈中最后一個內存塊,其前向指針指向了鏈中下一個內存塊,后向指針指向chunk3.圖5(b)則展示了一個攻擊,當chunk1中的User data部分溢出,攻擊者將覆蓋重寫chunk3的管理信息,chunk3的前向指針被修改指向棧中函數f0返回地址的前12個字節位置,后向指針被修改指向可以跳轉到后幾個字節然后執行攻擊代碼的代碼位置(code to jump over dummy).當chunk1后續被釋放,就會和chunk3合并成了一個大的空閑內存塊.由于Chunk3不再是一個獨立的空閑內存塊,必須首先從空閑結點鏈表中移除 chunk3.其過程如下:chunk3→fd→bk=chunk3→bk,chunk3→bk→fd=chunk3→fd.即fd指向位置12個字節之后的內存位置的值(即Returnaddressf0的地址)會被bk指向位置的值(即Codeto jump over dummy地址)重寫,bk指向位置8字節之后的內存位置的值(dummy內的地址)會被fd指向位置的值(即 Localvariablef0的地址)重寫.因此,在圖 5(b)中的返回地址會被一個指向跳轉代碼的指針重寫,進而越過存儲fd的地址區域,進而執行注入的攻擊代碼(InjectedCode).

1.1.3 數據段溢出

數據段溢出[21]與堆段溢出類似,數據段中存儲的是初始化和未初始化的全局/靜態變量.如圖6所示.

上述程序中,如果str的長度超過buffer容量就會造成溢出,覆蓋函數指針fptr,這樣就可以改變程序的執行流程,使其跳轉并執行攻擊代碼.

1.1.4 格式化字符串溢出

格式化字符串溢出[11,22,23]主要由格式化字符函數如fprintf,sprintf,snprintf,syslog等引起.對于格式化字符串系函數,如果不按照規定給定正確的輸入、輸出格式以及相應變量,就可能發生溢出.典型的如函數sprintf(char*str,constchar*format,...)是將格式化的數據寫入str所指的數組中,并添加‘

主站蜘蛛池模板: 国产精品久久久久久久久久久久| 国产视频 第一页| 亚洲成人黄色网址| 国产亚洲精| 青青青视频蜜桃一区二区| 久久伊人操| 国产欧美日韩免费| 欧美劲爆第一页| 99r在线精品视频在线播放| 热99re99首页精品亚洲五月天| 国产导航在线| 18禁高潮出水呻吟娇喘蜜芽| 看看一级毛片| 国产 在线视频无码| 成人毛片免费观看| 天天综合网亚洲网站| 精品综合久久久久久97| jizz亚洲高清在线观看| 在线欧美日韩国产| 国产成人资源| 香蕉伊思人视频| 制服丝袜一区| 国产大片喷水在线在线视频| 日韩av无码DVD| 免费啪啪网址| 精品成人一区二区| 男女性色大片免费网站| 精品一区二区三区波多野结衣| 午夜天堂视频| 亚洲第一极品精品无码| 国产无遮挡裸体免费视频| 国产在线日本| 中文成人在线| 在线视频亚洲色图| 九九视频在线免费观看| 国产日韩AV高潮在线| 夜精品a一区二区三区| 国产欧美日韩综合一区在线播放| 成年人免费国产视频| 精品视频一区二区观看| 国产区精品高清在线观看| 日本人又色又爽的视频| 日韩免费成人| 国产精品一线天| 亚洲一级无毛片无码在线免费视频| 成年人视频一区二区| 国产成人1024精品| 美女高潮全身流白浆福利区| 国产亚洲精品自在久久不卡 | 欧美一区二区三区香蕉视| 欧美一级视频免费| 久久青草精品一区二区三区| 1024国产在线| 亚洲性一区| 国产在线观看人成激情视频| 一级香蕉人体视频| 国产区人妖精品人妖精品视频| 久青草网站| 狠狠色丁香婷婷| 日韩亚洲综合在线| 亚洲精品无码在线播放网站| 欧美高清三区| 2019国产在线| 亚洲av综合网| 伊在人亚洲香蕉精品播放| 中国一级毛片免费观看| 丝袜久久剧情精品国产| 2019年国产精品自拍不卡| 亚洲天堂首页| 91久久夜色精品国产网站| 欧美中文字幕在线二区| 国产一二视频| 亚洲中文在线看视频一区| 91探花国产综合在线精品| 久久一本日韩精品中文字幕屁孩| 99re在线视频观看| 91福利免费视频| 精品国产自在在线在线观看| 毛片网站在线看| 国产网站免费观看| 久久久久人妻精品一区三寸蜜桃| 免费一看一级毛片|