關於漏洞的基礎知識

整理自老師的筆記及書籍

漏洞的定義

官方定義:
漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權的下訪問或破壞系統。
基本理解:
漏洞是協議在生命週期的各個階段(設計、實現、運維等過程)中產生的某類問題,這些問題會對系統的安全(機密性、完整性、可用性)產生影響。
BUG與漏洞:
漏洞與Bug並不等同:大部分的Bug影響功能性,並不涉及安全性,也就不構成漏洞;大部分的漏洞來源於Bug,但並不是全部,它們之間只是有一個很大的交集。

漏洞產生原因

漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權的情況下訪問或破壞系統。即某個程序(包括操作系統).在設計時未考慮周全,當程序遇到一個看似合理,但實際無法處理的問題時,引發的不可預見的錯誤

它不是安裝的時候的結果 也不是永久後的結果而是編程人員的人爲因素,在程序編寫過程,爲實現不可告人的目的,在程序代碼的隱蔽處保留後門,或受編程人員的能力、經驗和當時安全技術所限,在程序中難免會有不足之處,輕則影響程序效率,重則導致非授權用戶的權限提升。

出現頻率最高的依次是: 設計錯誤 -> 輸入驗證錯誤-> 意外情況處理錯誤 -> 邊界條件錯誤 -> 環境錯誤 -> 訪問驗證錯誤

軟件漏洞的產生來源

1、緩衝區溢出(buffer overflows)
緩衝區溢出:代碼寫入的數據超過了緩衝區的邊界;是軟件安全漏洞的主要來源;是一種比較常見的編碼錯誤,特別是在字符串處理過程中。
緩衝區造成的危害
1)程序直接崩潰,除了用戶體驗也沒什麼大損失
2)錯誤的寫入覆蓋了其他敏感數據,造成數據的丟失
3)執行惡意代碼,因爲數據寫入越界,惡意代碼可以將原先正常的函數修改爲自己的代碼,從而獲得整個軟件的執行權。

緩衝區溢出根據溢出的內存類型分爲:
棧溢出:棧內的數據溢出。
堆溢出(heap overflow):堆內的數據溢出

根據溢出的類型可分爲overflow及underflow:
overflow:寫入的數據超過了緩衝的邊界
underflow:緩衝中有用數據的大小小於緩衝區長度,這有可能造成髒數據的問題

2、未驗證輸入(Unvalidated Input)
一款應用往往需要接收各種各樣的輸入,針對一款iOS應用,主要的輸入有讀取文件,讀取用戶輸入,讀取網絡傳輸數據,或通過URL被啓動(URL Schema)。各種類型的輸入都有可能是非法的,甚至是惡意的,所以針對所有類型的輸入,應用都要進行檢驗,確保輸入的數據是符合程序要求的,合理的,合法的數據。

非法輸入可能造成的危害主要有:
1)輸入的數據大於接收緩衝,會造成緩衝溢出
2)格式化字符串注入,對這些字符串進行處理時,如果不小心會造成程序的崩潰,或某些敏感數據被篡改
3)URLSchema中的命令爲惡意命令,執行了惡意的命令
4)代碼注入,輸入的URL或命令中帶有腳本、代碼等惡意片段

3、競爭條件(Race Condtions)
如果一個任務的完成需要幾個特定的子任務以特定的順序完成來完成,那麼這個任務就是存在競爭條件這個漏洞的。黑客可以通過修改事件完成的順序來改變應用的行爲

競爭條件類型的漏洞主要有以下兩種:
1)Time of Check Versus Time of Use (TOCTOU)
應用運行的過程中,在某個操作之前,比如寫文件,都會檢查一下文件是否存在,在檢查與真正的寫入之間的間隔就是一個可以被利用的Race Condition,惡意軟件可以將用戶檢查的文件替換成自己的文件,這樣數據就泄露了。
2)Signal Handling
處理信號的過程中,是隨時可以被另一個信號的處理打斷的,如果在處理一個信號的過程中另一個信號到來,那麼這個過程會被馬上中斷,這樣,系統就會處於一種未知的狀態。

4、進程間通信(Interprocess Communication)
進程間通信採用的方法很多,共享內存,管道,油槽等,由於通信管道兩端的應用的不同,那麼,有可能存在這鐘管道被惡意利用的肯能性,也就是說,進程間通信也是軟件漏洞的一個來源,當與另一個應用通信的時候,要默認此應用是不安全的,要對通信的內容進行安全方面的驗證。

5、不安全的文件操作(Insecure File Operation)
應用對文件進行處理時,若果沒有進行進行有效的驗證,那麼有可能處理的文件已經是被惡意軟件修改過的,是不安全的。所以,進行有效的驗證是安全處理文件的重要保證。
不安全文件操作類型有以幾種:
1)讀取或寫入一個位於其他應用也擁有讀寫權限路徑下的文件。
2)對文件信息,例如權限等信息沒有進行有效驗證便進行處理。
3)對文件操作的返回結果沒有進行有效利用
4)假定一個擁有本地文件名的文件就是真正的本地文件。

6、權限控制問題(Access Control)
很多情況下,權限控制是安全機制保證的核心,同時也是漏洞的主要來源。每個應用都有與其匹配的權限,應用申請的權限應該物盡其用,不能申請超過自身需求的權限,而很多的軟件漏洞就是因爲應用申請了超過自身需求的權限,比如root權限,然後被惡意軟件利用,也就有了對整個系統執行所有操作的權限。

很多情況下,對權限的申請進行驗證是明智的選擇,例如輸入用戶名及密碼來提升權限。注意,在採用驗證機制時,最好使用系統內置的權限驗證方法,而不是自己取實現,這裏需要額外提一下,權限控制是操作系統級別的,當硬件設備被控制時,各種權限的控制也就顯得無力,這種情況下,數據的加密保護就顯現出了其價值。

7、社會工程(Social Engineering)
用戶往往是安全保證機制中那薄弱的一環。即使提供再強大的安全保全機制,如果用戶安全意識薄弱,同樣會出現問題。很簡單的例子,比如用戶將密碼設置的非常複雜,服務器端數據庫的安全保證也很周全,黑客完全無法通過技術手段竊取用戶密碼,可黑客一個僞裝客服的電話就完全有可能將用戶的密碼從用戶的口中騙取到。這就是所謂的”社會工程”. 在界面,使用習慣上教育,引導用戶進行安全的操作,也是軟件設計的重中之重。

漏洞的基本分類

按照漏洞的形成原因,漏洞大體上可以分爲

  • 程序邏輯結構漏洞
  • 程序設計錯誤漏洞
  • 開放式協議造成的漏洞
  • 人爲因素造成的漏洞

按照漏洞被人掌握的情況

  • 已知漏洞
  • 未知漏洞
  • 0day

1、程序邏輯結構漏洞

  • 這種類型的漏洞有可能是編程人員在編寫程序時,因爲程序的邏輯設計不合理或者錯誤而造成的程序邏輯漏洞。
    如:微軟的Windows 2000用戶登錄的中文輸入法漏洞。非授權人員可以通過登錄界面的輸入法的幫助文件繞過Windows的用戶名和密碼驗證而取的計算機的最高權限。
  • 這種類型的漏洞也有可能是合法的程序用途被黑客利用去做不正當的用途。
    如:Winrar的自解壓功能,程序設計者的本意是爲了方便用戶的使用,使得沒有安裝Winrar的用戶也可以解壓經過這種方式壓縮的文件。但是這種功能被黑客用到了不正當的用途上。
    可以通俗的理解爲,在方便郵遞員投遞信件的門縫裏塞進了縮小的愛麗絲,從而找到了非法進入房子的方法

2、程序設計錯誤漏洞
編程人員在編寫程序時由於技術上的疏忽造成的漏洞。這種類型的漏洞最典型的是緩衝區溢出漏洞,它也是被黑客利用得最多的一種類型的漏洞。

3、開放式協議造成的漏洞
目前,國際互聯網的通信採用的是具有開放性的TCP/IP協議。因爲TCP/IP協議的最初設計者在設計該通信協議時,只考慮到了協議的實用性,而沒有考慮到協議的安全性,所以在TCP/IP協議中存在着很多漏洞。
如:利用TCP/IP協議的開放和透明性嗅探網絡數據包,竊取數據包裏面的用戶口令和密碼信息;TCP協議三次握手的潛在缺陷所導致的拒絕服務攻擊等。

4、人爲因素造成的漏洞
一個系統如果本身設計得很完善,安全性也很高,但管理人員安全意識淡薄,同樣的會給系統留下漏洞。譬如說,系統本身非常完備安全,但系統登錄所需要的管理 員帳戶或口令,可是因爲設置過於得簡單而被黑客猜解出來了,那麼其他的環節再安全也沒有絲毫意義;再或者雖然管理員設置了很複雜的密碼,可是他把密碼寫在 一張紙上,並隨手扔到廢紙簍裏,那麼也同樣有可能造成密碼泄露而導致系統被黑客入侵。

- 已知漏洞
已知漏洞是指已經被人們發現,並被人們廣爲傳播的公開漏洞。這種類型的特點是漏洞形成的原因和利用方法已經被衆多的安全組織、黑客和黑客組織所掌握。安全 組織或廠商按照公佈的漏洞形成原因和利用方法,在他們的安全防護產品中或安全服務項目加入針對相應類型漏洞的防護方法。黑客和黑客組織利用公佈的漏洞形成 原因,寫出專門的具有針對性的漏洞利用程序文件,並能繞過安全防護軟件。比如說針對某個IE瀏覽器版本的IE漏洞利用文件,或者他們乾脆利用一些漏洞公佈站點上提供的漏洞利用程序文件並不加任何修改地去攻擊互聯網上的計算機。

產生漏洞的軟件的開發商則會針對被公開的漏洞的信息,修補他們開發的程序以供他們的用戶修補已經存在漏洞的軟件。

  • 未知漏洞

未知的漏洞則是指那些已經存在但還沒有被人發現的漏洞,這種類型漏洞的特徵是雖然它們沒有被發現,但它們在客觀上已經存在了,它們帶給計算機網絡安全的是隱蔽的威脅。如果它們哪一天被黑客有意或無意的找出來後就會對計算機網絡安全構成巨大的威脅。

所以軟件開發商、安全組織、黑客和黑客組織都在努力的發現漏洞,可以說誰先發現了漏洞,誰就可以掌握主動權。如果是軟件開發商和安全組織先發現了漏洞,他們就可以在安全防護上取得主動權;如果是黑客或黑客組織先發現了漏洞,他們就可以在攻擊上取得主動權。

  • 0day漏洞

所謂0day漏 洞是指已經被發掘出來,但還沒有大範圍傳播開的漏洞,也就是說,這種類型的漏洞有可能掌握在極少數人的手裏。黑客有可能在這種類型的漏洞的信息還沒有大範 圍的傳播開的時候,利用這段時間差攻擊他們想要攻擊的目標機器,因爲絕大多數用戶還沒有獲取到相關的漏洞信息,也無從防禦,黑客要想得手還是很容易的

漏洞挖掘分析技術

由於種種原因,漏洞的存在不可避免,一旦某些較嚴重的漏洞被攻擊者發現,就有可能被其利用,在未授權的情況下訪問或破壞計算機系統。先於攻擊者發現並及時修補漏洞可有效減少來自網絡的威脅。因此主動發掘並分析系統安全漏洞,對網絡攻防戰具有重要的意義。
漏洞的研究主要分爲漏洞挖掘與漏洞分析兩部分。漏洞挖掘技術是指對未知漏洞的探索,綜合應用各種技術和工具,儘可能地找出軟件中的潛在漏洞;漏洞分析技術是指對已發現漏洞的細節進行深入分析,爲漏洞利用、補救等處理措施作鋪墊。

現有漏洞挖掘技術分類
根據分析對象的不同,漏洞挖掘技術可以分爲基於源碼的漏洞挖掘技術和基於目標代碼的漏洞挖掘技術兩大類。
基於源碼的漏洞挖掘的前提是必須能獲取源代碼,對於一些開源項目,通過分析其公佈的源代碼,就可能找到存在的漏洞。
如:對Linux系統的漏洞挖掘就可採用這種方法。
大多數的商業軟件其源碼很難獲得,不能從源碼的角度進行漏洞挖掘,只能採用基於目標代碼的漏洞挖掘技術。對目標碼進行分析涉及編譯器、指令系統、可執行文件格式等多方面的知識,難度較大。基於目標代碼的漏洞挖掘首先將要分析的二進制目標代碼反彙編,得到彙編代碼;然後對彙編代碼進行切片,即對某些上下文關聯密切、有意義的代碼進行匯聚,降低其複雜性;最後通過分析功能模塊,來判斷是否存在漏洞。
漏洞挖掘技術從逆向分析的軟件測試角度,又可分爲白箱分析、黑箱分析和灰箱分析三類

常見的漏洞挖掘分析技術
漏洞挖掘是一個多種漏洞挖掘分析技術相互結合、共同使用和優勢互補的過程。目前漏洞挖掘分析技術有多種,主要包括手工測試技術(manual testing)、Fuzzing技術、比對和二進制比對技術(Diff and BinDiff)、靜態分析技術(static analysis)、動態分析技術(runtime analysis)等。
1)人工分析
2)Fuzzing技術
Fuzzing技術是一種基於缺陷注入的自動軟件測試技術,它利用黑盒分析技術方法,使用大量半有效的數據作爲應用程序的輸入,以程序是否出現異常爲標誌,來發現應用程序中可能存在的安全漏洞。
3) 補丁比對技術
補丁比對技術主要用於黑客或競爭對手找出軟件發佈者已修正但未尚公開的漏洞,是黑客利用漏洞前經常使用的技術手段。
常用的補丁比對工具有Beyond Compare、IDACompare、Binary Diffing Suite(EBDS)、BinDiff、NIPC Binary Differ(NBD)。此外大量的高級文字編輯工具也有相似的功能,如Ultra Edit、HexEdit等。這些補丁比對工具軟件基於字符串比較或二進制比較技術。
4)靜態分析技術靜態分析技術
對被分析目標的源程序進行分析檢測,發現程序中存在的安全漏洞或隱患,是一種典型的白盒分析技術。
5) 動態分析技術
動態分析技術起源於軟件調試技術,是用調試器作爲動態分析工具,但不同於軟件調試技術的是它往往處理的是沒有源代碼的被分析程序,或是被逆向工程過的被分析程序。動態分析需要在調試器中運行目標程序,通過觀察執行過程中程序的運行狀態、內存使用狀況以及寄存器的值等以發現漏洞。

總結

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章