漏洞是一個永遠的童話。實現劫富濟貧的英雄夢想,實現打破技術壟斷的自由藍圖,發現漏洞的人,利用漏洞的人,修補漏洞的人,喜歡漏洞的人,害怕漏洞的人就象這個多彩的世界一樣,他們構成了計算機網絡安全世界永遠的角色!
現在很多口必稱漏洞,把漏洞的利用當自己的絕招和寶貝,其實漏洞是什麼,我們或許存在著很多誤解。下面結合相關資料和我個人的理解,我們今天就講講什麼是漏洞,這個十分基本的問題。
1、什麼是漏洞 專業上講漏洞是在硬件、軟件、協議的具體實現或系統安全策略上(主要是人為)存在的缺陷,從而可以使攻擊者能夠在未授權的情況下訪問或破壞系統。但是,其實這是一個綱目,很多書上定義都不同,這裡算是比較全面的。怎麼理解呢,還是有例子來說吧,這幾十年來,漏洞太多了,不能一一說。
2、漏洞的狹義范圍 漏洞會影響到很大范圍的軟硬件設備,包括作系統本身及其支撐軟件,網絡客戶和服務器軟件,網絡路由器和安全防火牆等。怎麼理解呢,就是在這些不同的軟硬件設備中都可能存在不同的安全漏洞問題。
3、漏洞的廣義范圍 這裡的漏洞是指所有威脅到計算機信息安全的事物。包括人員、硬件、軟件、程序、數據。
4、漏洞的長久性 漏洞問題是與時間緊密相關的。一個系統從發布的那一天起,隨著用戶的深入使用,系統中存在的漏洞會被不斷暴露出來,這些早先被發現的漏洞也會不斷被系統供應商發布的補丁軟件修補,或在以後發布的新版系統中得以糾正。而在新版系統糾正了舊版本中具有漏洞的同時,也會引入一些新的漏洞和錯誤。因而隨著時間的推移,舊的漏洞會不斷消失,新的漏洞會不斷出現。漏洞問題也會長期存在。
5、漏洞的隱蔽性 系統安全漏洞是指可以用來對系統安全造成危害,系統本身具有的,或設置上存在的缺陷。總之,漏洞是系統在具體實現中的錯誤。比如在建立安全機制中規劃考慮上的缺陷,作系統和其他軟件編程中的錯誤,以及在使用該系統提供的安全機制時人為的配置錯誤等。
系統安全漏洞是在系統具體實現和具體使用中產生的錯誤,但並不是系統中存在的錯誤都是安全漏洞。只有能威脅到系統安全的錯誤才是漏洞。許多錯誤在通常情況下並不會對系統安全造成危害,只有被人在某些條件下故意使用時才會影響系統安全。
6、漏洞的必然被發現性 漏洞雖然可能最初就存在於系統當中,但一個漏洞並不是自己出現的,必須要有人發現。在實際使用中,用戶會發現系統中存在錯誤,而入侵者會有意利用其中的某些錯誤並使其成為威脅系統安全的工具,這時人們會認識到這個錯誤是一個系統安全漏洞。系統供應商會盡快發布針對這個漏洞的補丁程序,糾正這個錯誤。這就是系統安全漏洞從被發現到被糾正的一般過程。
系統攻擊者往往是安全漏洞的發現者和使用者,要對於一個系統進行攻擊,如果不能發現和使用系統中存在的安全漏洞是不可能成功的。對於安全級別較高的系統尤其如此。
系統安全漏洞與系統攻擊活動之間有緊密的關系。因而不該脫離系統攻擊活動來談論安全漏洞問題。廣泛的攻擊存在,才使漏洞存在必然被發現性。
7、為什麼要緊跟最新的計算機系統及其安全問題的最新發展動態 脫離具體的時間和具體的系統環境來討論漏洞問題是毫無意義的。只能針對目標系統的作系統版本、其上運行的軟件版本以及服務運行設置等實際環境來具體談論其中可能存在的漏洞及其可行的解決辦法。
同時應該看到,對漏洞問題的研究必須要跟蹤當前最新的計算機系統及其安全問題的最新發展動態。這一點如同對計算機病毒發展問題的研究相似。如果在工作中不能保持對新技術的跟蹤,就沒有談論系統安全漏洞問題的發言權,既使是以前所作的工作也會逐漸失去價值。
你喜歡漏洞,你討厭也好。它永遠存在,做到了“不以物喜,不以己悲,實現了“愛她就愛她的靈魂----自由,平等,共享,創新。同時它也證明了這個世界沒有絕對的安全,如果世界上永遠存在計算機存在軟件,那麼它又將證明什麼叫永恆。童話裡有永恆的虛假的美, 而漏洞是永恆的真實的童話。
一、不同角度看安全漏洞的分類 對一個特定程序的安全漏洞可以從多方面進行分類。
1、從用戶群體分類
大眾類軟件的漏洞。如Windows的漏洞、IE的漏洞等等。
專用軟件的漏洞。如Oracle漏洞、Apache漏洞等等。
2、從數據角度看分為
能讀按理不能讀的數據,包括內存中的數據、文件中的數據、用戶輸入的數據、數據庫中的數據、網絡上傳輸的數據等等。
能把指定的內容寫入指定的地方(這個地方包括文件、內存、數據庫等)
輸入的數據能被執行(包括按機器碼執行、按Shell代碼執行、按SQL代碼執行等等)
3、從作用范圍角度看分為
遠程漏洞,攻擊者可以利用並直接通過網絡發起攻擊的漏洞。這類漏洞危害極大,攻擊者能隨心所欲的通過此漏洞操作他人的電腦。並且此類漏洞很容易導致蠕蟲攻擊,在Windows。
本地漏洞,攻擊者必須在本機擁有訪問權限前提下才能發起攻擊的漏洞。比較典型的是本地權限提升漏洞,這類漏洞在Unix系統中廣泛存在,能讓普通用戶獲得最高管理員權限。
4、從觸發條件上看可以分為
主動觸發漏洞,攻擊者可以主動利用該漏洞進行攻擊,如直接訪問他人計算機。
被動觸發漏洞,必須要計算機的操作人員配合才能進行攻擊利用的漏洞。比如攻擊者給管理員發一封郵件,帶了一個特殊的jpg圖片文件,如果管理員打開圖片文件就會導致看圖軟件的某個漏洞被觸發,從而系統被攻擊,但如果管理員不看這個圖片則不會受攻擊。
5、從操作角度看可分為
文件操作類型,主要為操作的目標文件路徑可被控制(如通過參數、配置文件、環境變量、符號鏈接燈),這樣就可能導致下面兩個問題:
寫入內容可被控制,從而可偽造文件內容,導致權限提升或直接修改重要數據(如修改存貸數據),這類漏洞有很多,如歷史上Oracle TNS LOG文件可指定漏洞,可導致任何人可控制運行Oracle服務的計算機;
內容信息可被輸出,包含內容被打印到屏幕、記錄到可讀的日志文件、產生可被用戶讀的core文件等等,這類漏洞在歷史上Unix系統中的crontab子系統中出現過很多次,普通用戶能讀受保護的shadow文件;
內存覆蓋,主要為內存單元可指定,寫入內容可指定,這樣就能執行攻擊者想執行的代碼(緩沖區溢出、格式串漏洞、PTrace漏洞、歷史上Windows2000的硬件調試寄存器用戶可寫漏洞)或直接修改內存中的機密數據。
邏輯錯誤,這類漏洞廣泛存在,但很少有范式,所以難以查覺,可細分為:
條件競爭漏洞(通常為設計問題,典型的有Ptrace漏洞、廣泛存在的文件操作時序競爭)
策略錯誤,通常為設計問題,如歷史上FreeBSD的Smart IO漏洞。
算法問題(通常為設計問題或代碼實現問題),如歷史上微軟的Windows 95/98的共享口令可輕易獲取漏洞。
設計的不完善,如TCP/IP協議中的3步握手導致了SYN FLOOD拒絕服務攻擊。
實現中的錯誤(通常為設計沒有問題,但編碼人員出現了邏輯錯誤,如歷史上博彩系統的偽隨機算法實現問題)
外部命令執行問題,典型的有外部命令可被控制(通過PATH變量,輸入中的SHELL特殊字符等等)和SQL注入問題。
6、從時序上看可分為
已發現很久的漏洞:廠商已經發布補丁或修補方法,很多人都已經知道。這類漏洞通常很多人已經進行了修補,宏觀上看危害比較小。
剛發現的漏洞:廠商剛發補丁或修補方法,知道的人還不多。相對於上一種漏洞其危害性較大,如果此時出現了蠕蟲或傻瓜化的利用程序,那麼會導致大批系統受到攻擊。
0day:還沒有公開的漏洞,在私下交易中的。這類漏洞通常對大眾不會有什麼影響,但會導致攻擊者瞄准的目標受到精確攻擊,危害也是非常之大。
二、不同角度看待漏洞利用 如果一個缺陷不能被利用來干“原本不能干的事(安全相關的),那麼就不能被稱為安全漏洞,所以安全漏洞必然和漏洞利用緊密聯系在一起。
漏洞利用的視角有:
數據視角:訪問本來不可訪問的數據,包括讀和寫。這一條通常是攻擊者的核心目的,而且可造成非常嚴重的災難(如銀行數據可被人寫)。
權限視角:主要為權限繞過或權限提升。通常權限提升都是為了獲得期望的數據操作能力。
可用性視角:獲得對系統某些服務的控制權限,這可能導致某些重要服務被攻擊者停止而導致拒絕服務攻擊。
認證繞過:通常利用認證系統的漏洞而不用受權就能進入系統。通常認證繞過都是為權限提升或直接的數據訪問服務的。
代碼執行角度:主要是讓程序將輸入的內容作為代碼來執行,從而獲得遠程系統的訪問權限或本地系統的更高