明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP.NET虛擬主機(jī)的重大安全隱患(3)

[摘要]解決方案  將FSO組件和刪除或改名的方式我們不再過(guò)多的加以說(shuō)明了,這一類的解決方法網(wǎng)絡(luò)上已經(jīng)有很多文章介紹了! ×硗膺有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個(gè)站點(diǎn)的匿名訪問(wèn)所使用的帳號(hào),默認(rèn)為IUSR_ HostName,這一方法的原理就是針...
解決方案

  將FSO組件和刪除或改名的方式我們不再過(guò)多的加以說(shuō)明了,這一類的解決方法網(wǎng)絡(luò)上已經(jīng)有很多文章介紹了。

  另外還有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個(gè)站點(diǎn)的匿名訪問(wèn)所使用的帳號(hào),默認(rèn)為IUSR_ HostName,這一方法的原理就是針對(duì)每一個(gè)共享主機(jī)用戶分別設(shè)置一個(gè)Windows帳號(hào),如IUSR_HostName1,IUSR_ HostName 2等,然后將每一個(gè)用戶限制在各自的Web目錄下。


  我們仔細(xì)的研究一下這種方案,可以發(fā)現(xiàn)這個(gè)方案無(wú)法真正實(shí)現(xiàn)安全。因?yàn)橄到y(tǒng)運(yùn)行ASP時(shí)并不是使用的IUSR_ HostName帳號(hào),而是IWAM_ HostName帳號(hào),就象在ASP.NET中使用的用戶ASPNET一樣。也就是說(shuō)每個(gè)ASP程序所擁有的權(quán)限并不是IUSR_ HostName的權(quán)限,而是IWAM_HostName用戶的權(quán)限。這樣的方法無(wú)法真正的將每個(gè)共享主機(jī)用戶的文件系統(tǒng)訪問(wèn)權(quán)限限制在各自的虛擬站點(diǎn)中,每個(gè)用戶仍然可以訪問(wèn)別人的代碼。所以這種方法在ASP.NET中無(wú)法真正實(shí)現(xiàn)用戶之間的安全性。

  在ASP.NET中相應(yīng)的運(yùn)行ASP.NET程序的帳號(hào)為ASPNET,和上面所說(shuō)的ASP中的解決方案類似,我們只能限制此用戶不能訪問(wèn)系統(tǒng)目錄等其他目錄,但是無(wú)法防止用戶訪問(wèn)其他共享主機(jī)用戶的程序代碼,無(wú)法從根本上杜絕這種問(wèn)題。

  那么,有沒(méi)有真正的解決方案了呢?

  有!這就是.NET Framework 的新特性――代碼訪問(wèn)安全性

  為了更好的理解這一問(wèn)題的解決方法,我們需要先介紹一下.NET Framework的安全機(jī)制。然后再結(jié)合我們的實(shí)際問(wèn)題來(lái)討論解決方案。

  為了解決安全問(wèn)題,.NET Framework提供了一種稱為代碼訪問(wèn)安全性的安全機(jī)制。代碼訪問(wèn)安全性允許根據(jù)代碼的來(lái)源和代碼的標(biāo)識(shí)等屬性將代碼設(shè)置為不同級(jí)別的信任代碼,同時(shí)還詳細(xì)定義了不同級(jí)別的對(duì)代碼的信任,從而可以詳細(xì)的對(duì)代碼設(shè)置各自的權(quán)限而不是將最大權(quán)限賦給所有的代碼。使用代碼訪問(wèn)安全性,可以減小惡意代碼或各種錯(cuò)誤的代碼帶來(lái)的嚴(yán)重的系統(tǒng)安全性問(wèn)題的可能性。您可以設(shè)置允許代碼執(zhí)行的一組操作,同樣可以設(shè)置永遠(yuǎn)不允許代碼執(zhí)行的一組操作。

  實(shí)現(xiàn)代碼訪問(wèn)安全性的基礎(chǔ)就是JIT(運(yùn)行時(shí)編譯)和IL(中間代碼)。所以所有以公共語(yǔ)言運(yùn)行庫(kù)為目標(biāo)的托管代碼都會(huì)受益于代碼訪問(wèn)安全性。非托管代碼則無(wú)法完全使用代碼訪問(wèn)安全性。


下面我們將介紹一下代碼訪問(wèn)安全性實(shí)現(xiàn)的各種功能:

  代碼訪問(wèn)安全性是控制代碼對(duì)受保護(hù)資源和操作的訪問(wèn)權(quán)限的一種機(jī)制。在 .NET Framework中,代碼訪問(wèn)安全性執(zhí)行下列功能:

  · 定義權(quán)限和權(quán)限集,它們表示訪問(wèn)各種系統(tǒng)資源的權(quán)限。

  · 使管理員能夠通過(guò)將權(quán)限集與代碼組關(guān)聯(lián)來(lái)配置安全策略。

  · 使代碼能夠請(qǐng)求運(yùn)行所需權(quán)限以及其他一些有用的權(quán)限,以及指定代碼絕對(duì)不能擁有哪些權(quán)限。

  · 根據(jù)代碼請(qǐng)求的權(quán)限和安全策略允許的操作,向加載的每個(gè)程序集授予權(quán)限。

  · 使代碼能夠要求其調(diào)用方擁有特定的權(quán)限。

  · 使代碼能夠要求其調(diào)用方擁有數(shù)字簽名,從而只允許特定組織或特定站點(diǎn)的調(diào)用方來(lái)調(diào)用受保護(hù)的代碼。

  · 通過(guò)將調(diào)用堆棧上每個(gè)調(diào)用方所授予的權(quán)限與調(diào)用方必須擁有的權(quán)限相比較,加強(qiáng)運(yùn)行時(shí)對(duì)代碼的限制。

  為了確定是否已授予代碼相應(yīng)的權(quán)限,.NET運(yùn)行庫(kù)的安全系統(tǒng)將遍歷整個(gè)調(diào)用堆棧,將每個(gè)調(diào)用方所授予的權(quán)限與目前要求的權(quán)限相比較。如果調(diào)用堆棧中的任何調(diào)用方?jīng)]有要求的權(quán)限,則會(huì)引發(fā)安全性異常,并會(huì)拒絕訪問(wèn)和相應(yīng)的操作。堆棧步旨在防止引誘攻擊;在這種攻擊中,受信程度較低的代碼調(diào)用高度信任的代碼,并使用高度信任的代碼執(zhí)行未經(jīng)授權(quán)的操作。在運(yùn)行時(shí)要求所有調(diào)用方都擁有權(quán)限將影響性能,但對(duì)防止代碼遭受攻擊至關(guān)重要。若要優(yōu)化性能,可以使代碼執(zhí)行較少的堆棧步;但是,任何時(shí)候這樣做時(shí)均必須確保不會(huì)暴露安全缺陷。

  還存在另外一種代碼訪問(wèn)安全性的常見用途,即應(yīng)用程序?qū)⒖丶䦶木W(wǎng)絡(luò) Web 站點(diǎn)直接下載到客戶端,這種方式的代碼安全性也是可以在客戶端進(jìn)行設(shè)置的,根據(jù)簽名等數(shù)據(jù)權(quán)限證書來(lái)確定是不是可以允許下載的控件運(yùn)行。這種方法類似于ActiveX的安全性設(shè)置,但是比之在設(shè)置權(quán)限更加詳細(xì)和強(qiáng)大。同JAVA APPLET的沙箱安全機(jī)制相比,.NET 的客戶端控件可以在本地簡(jiǎn)單設(shè)置后訪問(wèn)客戶端的各種資源。由于這一方面的用途不是我們的重點(diǎn),所以我們?cè)谶@里就不再更詳細(xì)的討論其用途及其實(shí)現(xiàn)原理了。

  下面我們就談?wù)勅绾螒?yīng)用這一安全特性來(lái)解決ASP.NET中存在的系統(tǒng)安全漏洞。由于我們介紹的系統(tǒng)是共享主機(jī),所以有其特殊性,即系統(tǒng)管理員無(wú)法事先給所有的代碼賦予相應(yīng)的權(quán)限,因?yàn)槊總(gè)用戶都可能有各種權(quán)限要求,并且這些要求特殊權(quán)力的代碼在使用中都可能出現(xiàn)的,所以在權(quán)限管理上隨時(shí)都有各種要求。
因此在權(quán)限設(shè)置方面,不僅僅是管理員設(shè)置,也包括了各個(gè)共享主機(jī)用戶的權(quán)限請(qǐng)求,這也正是安全代碼機(jī)制的一個(gè)重要部分。

  請(qǐng)求權(quán)限是您讓運(yùn)行庫(kù)知道代碼執(zhí)行有哪些操作權(quán)限的方法。通過(guò)將屬性(聲明式語(yǔ)法)放到代碼的程序級(jí)范圍來(lái)為程序集請(qǐng)求權(quán)限。

  請(qǐng)求內(nèi)置權(quán)限的代碼示例:


//The attribute is placed on the assembly level.
using System.Security.Permissions;
[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]

  將此段代碼放在程序的開始部分(namespace聲明之前),在編譯時(shí)就會(huì)將請(qǐng)求的權(quán)限存儲(chǔ)在程序集清單中。加載時(shí),運(yùn)行庫(kù)檢查權(quán)限請(qǐng)求,并應(yīng)用安全策略規(guī)則來(lái)確定授予程序集哪些權(quán)限。

  雖然我們編寫的大部分代碼都沒(méi)有請(qǐng)求權(quán)限,其實(shí)不管是共享主機(jī)形式還是獨(dú)立服務(wù)器形式都應(yīng)該請(qǐng)求權(quán)限,這是因?yàn)檎?qǐng)求權(quán)限有助于確保只將代碼需要的權(quán)限授予代碼。如果沒(méi)有授予代碼額外權(quán)限,即使某些惡意代碼想利用您的代碼來(lái)進(jìn)行安全性破壞,它也無(wú)法操作沒(méi)有賦給您自己代碼相應(yīng)權(quán)限的額外系統(tǒng)資源。您只應(yīng)該請(qǐng)求代碼需要的那些權(quán)限,而不應(yīng)請(qǐng)求更多權(quán)限。

  代碼請(qǐng)求權(quán)限之后,系統(tǒng)管理員可以使用"權(quán)限查看"工具 (Permview.exe,位于您的.NET Framework的目錄的bin目錄下) 來(lái)檢查您的程序集并根據(jù)其他條件來(lái)設(shè)置安全策略以決定是否給您的代碼所請(qǐng)求的相應(yīng)權(quán)限。如果您不顯式地在代碼中請(qǐng)求應(yīng)用程序需要的權(quán)限,那么管理員將很難管理您的應(yīng)用程序。在權(quán)限管理嚴(yán)格的主機(jī)上,將無(wú)法實(shí)現(xiàn)您的代碼所要求的功能。

  請(qǐng)求權(quán)限會(huì)通知運(yùn)行庫(kù)應(yīng)用程序正常運(yùn)行需要哪些權(quán)限,或具體不需要哪些權(quán)限。在.NET Framework安裝后的默認(rèn)狀態(tài)下,所有代碼都是FullTrust(完全信任)的。這時(shí)是不需要申請(qǐng)任何權(quán)限的,但是管理員一旦修改了代碼安全,我們使用的磁盤訪問(wèn)就要受到限制了,這是就需要申請(qǐng)相應(yīng)的權(quán)限了。我們上邊介紹的文件管理代碼就需要具有本地硬盤讀寫操作的能力,則應(yīng)用程序必須擁有 FileIOPermission。如果代碼不請(qǐng)求 FileIOPermission,在本地安全設(shè)置不允許應(yīng)用程序擁有此權(quán)限的主機(jī)上,在應(yīng)用程序嘗試磁盤操作時(shí)就會(huì)引發(fā)安全性異常。即使應(yīng)用程序能夠處理此異常,也不會(huì)允許它操作磁盤。當(dāng)然,如果您的代碼不訪問(wèn)受保護(hù)的資源或執(zhí)行受保護(hù)的操作,則不必請(qǐng)求任何權(quán)限。例如,如果代碼只根據(jù)向它傳遞的輸入來(lái)計(jì)算結(jié)果而不使用任何資源,則不必請(qǐng)求權(quán)限。如果您的代碼訪問(wèn)受保護(hù)的資源但未請(qǐng)求必要的權(quán)限,則仍可能允許它執(zhí)行,但如果它嘗試訪問(wèn)某種資源而它又沒(méi)有必要的權(quán)限,則可能在執(zhí)行過(guò)程中失敗。