ASP.NET虛擬主機的重大安全隱患(3)
發(fā)表時間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]解決方案 將FSO組件和刪除或改名的方式我們不再過多的加以說明了,這一類的解決方法網(wǎng)絡(luò)上已經(jīng)有很多文章介紹了! ×硗膺有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個站點的匿名訪問所使用的帳號,默認為IUSR_ HostName,這一方法的原理就是針...
解決方案
將FSO組件和刪除或改名的方式我們不再過多的加以說明了,這一類的解決方法網(wǎng)絡(luò)上已經(jīng)有很多文章介紹了。
另外還有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個站點的匿名訪問所使用的帳號,默認為IUSR_ HostName,這一方法的原理就是針對每一個共享主機用戶分別設(shè)置一個Windows帳號,如IUSR_HostName1,IUSR_ HostName 2等,然后將每一個用戶限制在各自的Web目錄下。
我們仔細的研究一下這種方案,可以發(fā)現(xiàn)這個方案無法真正實現(xiàn)安全。因為系統(tǒng)運行ASP時并不是使用的IUSR_ HostName帳號,而是IWAM_ HostName帳號,就象在ASP.NET中使用的用戶ASPNET一樣。也就是說每個ASP程序所擁有的權(quán)限并不是IUSR_ HostName的權(quán)限,而是IWAM_HostName用戶的權(quán)限。這樣的方法無法真正的將每個共享主機用戶的文件系統(tǒng)訪問權(quán)限限制在各自的虛擬站點中,每個用戶仍然可以訪問別人的代碼。所以這種方法在ASP.NET中無法真正實現(xiàn)用戶之間的安全性。
在ASP.NET中相應(yīng)的運行ASP.NET程序的帳號為ASPNET,和上面所說的ASP中的解決方案類似,我們只能限制此用戶不能訪問系統(tǒng)目錄等其他目錄,但是無法防止用戶訪問其他共享主機用戶的程序代碼,無法從根本上杜絕這種問題。
那么,有沒有真正的解決方案了呢?
有!這就是.NET Framework 的新特性――代碼訪問安全性
為了更好的理解這一問題的解決方法,我們需要先介紹一下.NET Framework的安全機制。然后再結(jié)合我們的實際問題來討論解決方案。
為了解決安全問題,.NET Framework提供了一種稱為代碼訪問安全性的安全機制。代碼訪問安全性允許根據(jù)代碼的來源和代碼的標識等屬性將代碼設(shè)置為不同級別的信任代碼,同時還詳細定義了不同級別的對代碼的信任,從而可以詳細的對代碼設(shè)置各自的權(quán)限而不是將最大權(quán)限賦給所有的代碼。使用代碼訪問安全性,可以減小惡意代碼或各種錯誤的代碼帶來的嚴重的系統(tǒng)安全性問題的可能性。您可以設(shè)置允許代碼執(zhí)行的一組操作,同樣可以設(shè)置永遠不允許代碼執(zhí)行的一組操作。
實現(xiàn)代碼訪問安全性的基礎(chǔ)就是JIT(運行時編譯)和IL(中間代碼)。所以所有以公共語言運行庫為目標的托管代碼都會受益于代碼訪問安全性。非托管代碼則無法完全使用代碼訪問安全性。
下面我們將介紹一下代碼訪問安全性實現(xiàn)的各種功能:
代碼訪問安全性是控制代碼對受保護資源和操作的訪問權(quán)限的一種機制。在 .NET Framework中,代碼訪問安全性執(zhí)行下列功能:
· 定義權(quán)限和權(quán)限集,它們表示訪問各種系統(tǒng)資源的權(quán)限。
· 使管理員能夠通過將權(quán)限集與代碼組關(guān)聯(lián)來配置安全策略。
· 使代碼能夠請求運行所需權(quán)限以及其他一些有用的權(quán)限,以及指定代碼絕對不能擁有哪些權(quán)限。
· 根據(jù)代碼請求的權(quán)限和安全策略允許的操作,向加載的每個程序集授予權(quán)限。
· 使代碼能夠要求其調(diào)用方擁有特定的權(quán)限。
· 使代碼能夠要求其調(diào)用方擁有數(shù)字簽名,從而只允許特定組織或特定站點的調(diào)用方來調(diào)用受保護的代碼。
· 通過將調(diào)用堆棧上每個調(diào)用方所授予的權(quán)限與調(diào)用方必須擁有的權(quán)限相比較,加強運行時對代碼的限制。
為了確定是否已授予代碼相應(yīng)的權(quán)限,.NET運行庫的安全系統(tǒng)將遍歷整個調(diào)用堆棧,將每個調(diào)用方所授予的權(quán)限與目前要求的權(quán)限相比較。如果調(diào)用堆棧中的任何調(diào)用方?jīng)]有要求的權(quán)限,則會引發(fā)安全性異常,并會拒絕訪問和相應(yīng)的操作。堆棧步旨在防止引誘攻擊;在這種攻擊中,受信程度較低的代碼調(diào)用高度信任的代碼,并使用高度信任的代碼執(zhí)行未經(jīng)授權(quán)的操作。在運行時要求所有調(diào)用方都擁有權(quán)限將影響性能,但對防止代碼遭受攻擊至關(guān)重要。若要優(yōu)化性能,可以使代碼執(zhí)行較少的堆棧步;但是,任何時候這樣做時均必須確保不會暴露安全缺陷。
還存在另外一種代碼訪問安全性的常見用途,即應(yīng)用程序?qū)⒖丶䦶木W(wǎng)絡(luò) Web 站點直接下載到客戶端,這種方式的代碼安全性也是可以在客戶端進行設(shè)置的,根據(jù)簽名等數(shù)據(jù)權(quán)限證書來確定是不是可以允許下載的控件運行。這種方法類似于ActiveX的安全性設(shè)置,但是比之在設(shè)置權(quán)限更加詳細和強大。同JAVA APPLET的沙箱安全機制相比,.NET 的客戶端控件可以在本地簡單設(shè)置后訪問客戶端的各種資源。由于這一方面的用途不是我們的重點,所以我們在這里就不再更詳細的討論其用途及其實現(xiàn)原理了。
下面我們就談?wù)勅绾螒?yīng)用這一安全特性來解決ASP.NET中存在的系統(tǒng)安全漏洞。由于我們介紹的系統(tǒng)是共享主機,所以有其特殊性,即系統(tǒng)管理員無法事先給所有的代碼賦予相應(yīng)的權(quán)限,因為每個用戶都可能有各種權(quán)限要求,并且這些要求特殊權(quán)力的代碼在使用中都可能出現(xiàn)的,所以在權(quán)限管理上隨時都有各種要求。
因此在權(quán)限設(shè)置方面,不僅僅是管理員設(shè)置,也包括了各個共享主機用戶的權(quán)限請求,這也正是安全代碼機制的一個重要部分。
請求權(quán)限是您讓運行庫知道代碼執(zhí)行有哪些操作權(quán)限的方法。通過將屬性(聲明式語法)放到代碼的程序級范圍來為程序集請求權(quán)限。
請求內(nèi)置權(quán)限的代碼示例:
//The attribute is placed on the assembly level.
using System.Security.Permissions;
[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
將此段代碼放在程序的開始部分(namespace聲明之前),在編譯時就會將請求的權(quán)限存儲在程序集清單中。加載時,運行庫檢查權(quán)限請求,并應(yīng)用安全策略規(guī)則來確定授予程序集哪些權(quán)限。
雖然我們編寫的大部分代碼都沒有請求權(quán)限,其實不管是共享主機形式還是獨立服務(wù)器形式都應(yīng)該請求權(quán)限,這是因為請求權(quán)限有助于確保只將代碼需要的權(quán)限授予代碼。如果沒有授予代碼額外權(quán)限,即使某些惡意代碼想利用您的代碼來進行安全性破壞,它也無法操作沒有賦給您自己代碼相應(yīng)權(quán)限的額外系統(tǒng)資源。您只應(yīng)該請求代碼需要的那些權(quán)限,而不應(yīng)請求更多權(quán)限。
代碼請求權(quán)限之后,系統(tǒng)管理員可以使用"權(quán)限查看"工具 (Permview.exe,位于您的.NET Framework的目錄的bin目錄下) 來檢查您的程序集并根據(jù)其他條件來設(shè)置安全策略以決定是否給您的代碼所請求的相應(yīng)權(quán)限。如果您不顯式地在代碼中請求應(yīng)用程序需要的權(quán)限,那么管理員將很難管理您的應(yīng)用程序。在權(quán)限管理嚴格的主機上,將無法實現(xiàn)您的代碼所要求的功能。
請求權(quán)限會通知運行庫應(yīng)用程序正常運行需要哪些權(quán)限,或具體不需要哪些權(quán)限。在.NET Framework安裝后的默認狀態(tài)下,所有代碼都是FullTrust(完全信任)的。這時是不需要申請任何權(quán)限的,但是管理員一旦修改了代碼安全,我們使用的磁盤訪問就要受到限制了,這是就需要申請相應(yīng)的權(quán)限了。我們上邊介紹的文件管理代碼就需要具有本地硬盤讀寫操作的能力,則應(yīng)用程序必須擁有 FileIOPermission。如果代碼不請求 FileIOPermission,在本地安全設(shè)置不允許應(yīng)用程序擁有此權(quán)限的主機上,在應(yīng)用程序嘗試磁盤操作時就會引發(fā)安全性異常。即使應(yīng)用程序能夠處理此異常,也不會允許它操作磁盤。當然,如果您的代碼不訪問受保護的資源或執(zhí)行受保護的操作,則不必請求任何權(quán)限。例如,如果代碼只根據(jù)向它傳遞的輸入來計算結(jié)果而不使用任何資源,則不必請求權(quán)限。如果您的代碼訪問受保護的資源但未請求必要的權(quán)限,則仍可能允許它執(zhí)行,但如果它嘗試訪問某種資源而它又沒有必要的權(quán)限,則可能在執(zhí)行過程中失敗。