<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
Windows Vista操作系統最新安全特性分析:改進和局限 (上)
沒有十全十美的安全系統。
——安全領域第一定律
申明。文章僅代表個人觀點,與所在公司無任何聯系。
1.
概述
微軟最新發行的Windows Vista操作系統,特別強調了對安全特性的支持。可以毫不夸張地說,安全特性的提高是Windows Vista操作系統同以往發布的Windows操作系統相比,改進最大的地方之一,也是促使用戶升級到Windows Vista操作系統的重要考慮因素。
Windows Vista操作系統提供的各類最新的安全特性,涵蓋以下四個大部分:
·
基礎平臺
。包括安全軟件開發周期(SDL),系統服務保護(Service Hardening),防止緩存溢出,64位平臺安全改進。
·
權限保護
。包括用戶帳戶控制(UAC),智能卡/登陸體系,網絡權限保護(NAP)。
·
防止有害軟件和惡意入侵
。包括安全中心,反間諜軟件(Windows Defender)和有害軟件刪除工具,防火墻,IE安全改進。
·
數據保護
。包括BitLocker,加密文件系統,版權保護,USB設備控制。
本文會逐一分析每一個安全特性的開發背景,Windows Vista中做出的改進,及應用范圍。并且特別強調了每一個安全特性的局限性。因為在安全領域中有一句話:比沒有安全更糟糕的是虛假的安全。
通過對每一個安全特性的分析,希望讀者能得到以下兩個關鍵信息:
·
Windows Vista 提供了許多非常好的安全特性
·
Windows Vista 不能解決你所有的安全問題。在某種程度上,意識這一點更為重要。
2.
安全是什么?
安全是一個整體的,系統的概念。安全的范圍包括硬件安全,軟件安全,員工培訓等等。其主要目的,就是為了保證被保護的核心數據不被損害,這意味著:
·
權限控制:合法用戶擁有權限,而非法用戶則無法訪問。
·
可靠性:合法用戶可以成功執行數據操作。
·
完整性:合法用戶所得到的數據是正確的,未經篡改的。
無論是計算機病毒,間諜軟件,或黑客等,其行為都是針對數據的正常訪問。例如:刪除數據,竊取數據,篡改數據,DDOS攻擊等等。
圖
1:Windows Vista在可用性和安全的取舍
在這個世界上,沒有十全十美的安全系統。任何一個操作系統必須在不同特性中作出取舍。以Windows 95舉例,它的可用性好,但安全性差。 而Windows Vista中,針對安全特性的提高,有時候則不得不犧牲部分可用性。例如,用戶帳戶控制這個Windows Vista中新增安全特性就是一個典型的例子。
3.
基礎平臺
3.1安全軟件開發周期
背景:沖擊波病毒。眾所周知,當年Blaster病毒給微軟及其用戶帶來了巨大的損失。安全軟件開發周期(SDL - Security Development Lifecycle)可以說是一個微軟痛定思痛后,決心加強產品安全的產物。
SDL的中心思想就是將安全特性的考慮滲透到產品生命周期的每一個階段。
·
設計
。每一個功能模塊均需要制定其相應的風險模型(threat model),來預測可能的攻擊方式,相應反制措施等等。
·
開發
。遵循嚴格的代碼規范。對禁止使用那些容易誤用的API調用。使用靜態程序分析工具查尋可疑的代碼片斷。
·
測試
。特別嚴格測試風險模型指出的高風險代碼。并廣泛采用“FUZZ”測試。“FUZZ”測試指通過模擬錯誤的,不合規范的輸入數據,來測試軟件代碼針對錯誤處理的響應。它被證明是一個有效的發現產品漏洞的測試手段。
·
審查
。產品代碼在正式發布前要經過嚴格的安全審查,
·
維護/
響應
。一旦正式發布的產品代碼中發現安全漏洞,需要有一套嚴格的安全響應程序,以迅速,正確地提供安全補丁。
我們用對筷子的設計來舉例SDL對產品安全的影響。在普通設計下,考慮的因素也許是筷子的易用,結實,好看。加入SDL安全考慮,就需要考慮:如何不讓別人搶走我的筷子?如何不讓別人的筷子伸到我的碗里?如何不讓別人偽造我的筷子等等在普通設計中忽視考慮的因素。
Windows Vista是第一個從頭至尾采用SDL進行開發的操作系統。通過SDL嚴格的開發規程,微軟期望,Windows Vista安全水準較先前Windows操作系統有顯著提高。
但是,任何開發人員都是無法完全預知未來攻擊的所有模式。換句話說,就是開發者是不可能預測到攻擊者是怎么想,會怎么用操作系統的。所以說,SDL并不能保證操作系統杜絕所有的安全漏洞。Windows Vista操作系統會有自身的安全漏洞。而我們希望的是,SDL可以減少這些安全漏洞的數目和嚴重程度。
3.2系統服務保護(Service Hardening)
背景:系統服務程序(System Service)被惡意軟件攻擊的次數日益增多。原因有以下兩點:
·
系統服務無需用戶交互,即可自動運行。
·
系統服務運行于“LocalSystem”賬號下,擁有對系統的完全控制權。一旦被成功攻擊,惡意程序就可以在系統上為所欲為。
最著名的例子就是沖擊波病毒。它就是攻擊DCOM的遠程調用(RPC)系統服務。
在Windows Vista操作系統提供了系統服務保護功能。包括:
·
許多系統服務程序運行在較低權限的用戶帳號下,如LocalService or NetworkService。
·
系統服務程序有相應的配置文件,用以指定該服務可以執行的文件,注冊表和網絡行為。例如,遠程調用(RPC)系統服務被限制為不能更改系統文件和注冊表。通過和防火墻配置的結合,可以限制系統服務的異常網絡行為。這樣,即使一個系統程序被攻擊,由于不能修改重要的系統文件和注冊信息,或者連接網絡,它所造成的危害也會得到限制。
局限性。Service Hardening是不可能限制所有的系統服務的。關鍵的系統服務還是需要在系統核心權限下運行。一旦這些服務出現安全漏洞,還是會導致嚴重的安全問題。
3.3防止緩存溢出
背景:緩存溢出是操作系統最為嚴重的安全漏洞。幾個有名的例子是:
·
Code Red: IIS緩存溢出
·
Blaster: DCOM RPC緩存溢出
·
Zotob: PnP緩存溢出
其原因在于,緩存溢出的安全漏洞往往導致惡意代碼可被遠程執行。以下是一個堆棧緩存溢出的例子:
/*以下UnSafeNetRecv代碼*/
void UnSafeNetRecv(char* payload)
{
char localBuffer[128];
… …
strcpy (localBuffer, payload);
}
在編譯過程中,堆棧空間是自高向低分配的。函數UnSafeNetRecv的堆棧分配如下:
圖
2:緩存溢出的安全漏洞
在執行到strcpy (localBuffer, payload) 時,如果從網絡傳輸的payload長度超過128個字節,函數的返回地址就被覆蓋。重新寫入的地址會指向傳入的惡意數據(代碼)。這樣,當函數返回時,IP寄存器不是指向上一層調用,而是從惡意數據(代碼)處開始執行。
3.3.1 NX保護
NX的含義是“No Execution”。在以上的緩存溢出的例子中,惡意代碼在堆棧上被執行。NX保護可以指定特定的頁面(如堆棧所在頁面)是數據頁面,不允許在上運行指令。這樣,一旦IP寄存器指向了堆棧所在頁面,會導致硬件異常,而不是執行惡意數據(代碼)。
圖
3:NX保護
Windows Vista相對Windows XP SP2,提供了更多NX保護支持。在32位平臺上,Windows Vista的缺省設置是系統代碼設置滿足NX標準(NX-compliant)。同時,還可以指定某個特定的應用程序是否滿足NX標準。這樣,在確保向前兼容性的前提下,可以最大可能的提高系統中被NX保護的比例。在64位平臺上,NX保護缺省設置為應用于所有代碼。
3.3.2尋址空間隨機分布(ASLR)
同樣從上個堆棧溢出的例子說起。如果寫入的新的返回地址不是指回堆棧頁面,而是指向了一個系統函數的入口地址,那樣NX保護就不起作用。這類攻擊有一個前提,即特定系統函數的入口地址是可以事先確定的。
尋址空間隨機分布(ASLR: Address Space Layout Randomization)就是針對此類攻擊手段。在Windows Vista啟動時,操作系統隨機從256個地址空間中選出一個載入DLL/EXE。這樣攻擊方就難以事先確定系統函數的入口地址。
尋址空間隨機分布和
NX
保護結合在一起,可以有效限制緩存溢出危害程度。
圖
4:尋址空間隨機分布
局限性。盡管緩存溢出是操作系統最為嚴重的安全漏洞,并不是所有嚴重的安全漏洞都是由緩存溢出導致的。例如,2006年Windows系統最嚴重的安全漏洞之一,MS06-001 WMF安全漏洞,就和緩存溢出沒有關系。在這種情況下,NX保護,或是尋址空間隨機分布,都是不起作用的。
3.4 64位平臺安全改進
背景:有缺陷或惡意的驅動程序導致系統崩潰,不穩定,和極為嚴重的安全問題。
這里需要簡單介紹“Rootkit”這個概念。這個術語來自于Unix系統。最早的一個版本是出現在SunOS 4。它特指那些用于修改操作系統,以改變操作系統的表現行為的工具軟件 。而這種改變,往往不是操作系統設計時所期望的。
Rootkit最典型的目的就是“隱藏”。隱藏的對象可以是文件,特定的注冊表,特定進程,打開的網絡端口等等。這個“隱藏”是通過修改操作系統本身來實現的。下面是Win32 API的調用過程:
圖
5:Win32 API的調用過程
Rootkit可以將自身代碼插入到每一個箭頭連接處,以控制函數的返回結果。舉個例子,一個應用程序(如反病毒軟件)需要查詢系統中運行的當前進程,Rootkit只需要將所想隱藏的進程從返回的進程列表中刪除,那么上層的應用程序就根本不知道有這樣一個進程正在系統中運行。
為什么說Rootkit會導致嚴重的安全問題?試想一下,如果一個惡意程序把自身文件和運行進程從系統中隱藏起來,那么如何指望反病毒軟件/反間諜軟件能成功的檢測/清除這個程序?!
在64位平臺Windows Vista,特別增加了下面兩個重要的安全特性。
·
設備驅動程序數字認證。
在64位平臺Windows Vista中,所有工作在核心模式下的設備驅動程序都必須提供數字認證,才能被系統加載。由于需要修改操作系統行為,Rootkit往往是一個工作在核心模式下的設備驅動程序。那么,數字認證首先可以指明一個驅動程序是由哪個廠商發布的。其次,數字認證可以驗證這個驅動程序的代碼完整性,也就是否被篡改過。這樣,就可以防止系統加載Rootkit驅動程序。
·
核心模式保護(Kernel Patch Protection
)。
這個技術也被稱為PatchGuard。它用來防止未經認證的代碼自由修改操作系統的核心狀態(Kernel State)。最為危險的Rootkit往往直接修改核心模式的重要數據,例如系統的進程控制表,中斷控制表等等。通過對核心狀態的保護,可以有效阻止這類攻擊。
局限性。由于向前兼容的原因,設備驅動程序的數字認證,和核心模式保護只在64位平臺上有效。也就是說,32位平臺Windows Vista上的Rootkit威脅并沒有得到有效控制。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1583601