


ASP.NET虛擬主機(jī)的重大安全隱患
添加時間:2010-11-7
添加:
admin
將FSO組件和刪除或改名的方式我們不再過多的加以說明了,這一類的解決方法網(wǎng)絡(luò)上已經(jīng)有很多文章介紹了。
另外還有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個站點的匿名訪問所使用的帳號,默認(rèn)為IUSR_ HostName,這一方法的原理就是針對每一個共享主機(jī)用戶分別設(shè)置一個Windows帳號,如IUSR_HostName1,IUSR_ HostName 2等,然后將每一個用戶限制在各自的Web目錄下。
我們仔細(xì)的研究一下這種方案,可以發(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)限。這樣的方法無法真正的將每個共享主機(jī)用戶的文件系統(tǒng)訪問權(quán)限限制在各自的虛擬站點中,每個用戶仍然可以訪問別人的代碼。所以這種方法在ASP.NET中無法真正實現(xiàn)用戶之間的安全性。
在ASP.NET中相應(yīng)的運行ASP.NET程序的帳號為ASPNET,和上面所說的ASP中的解決方案類似,我們只能限制此用戶不能訪問系統(tǒng)目錄等其他目錄,但是無法防止用戶訪問其他共享主機(jī)用戶的程序代碼,無法從根本上杜絕這種問題。
那么,有沒有真正的解決方案了呢?
有!這就是.NET Framework 的新特性――代碼訪問安全性
為了更好的理解這一問題的解決方法,我們需要先介紹一下.NET Framework的安全機(jī)制。然后再結(jié)合我們的實際問題來討論解決方案。
為了解決安全問題,.NET Framework提供了一種稱為代碼訪問安全性的安全機(jī)制。代碼訪問安全性允許根據(jù)代碼的來源和代碼的標(biāo)識等屬性將代碼設(shè)置為不同級別的信任代碼,同時還詳細(xì)定義了不同級別的對代碼的信任,從而可以詳細(xì)的對代碼設(shè)置各自的權(quán)限而不是將最大權(quán)限賦給所有的代碼。使用代碼訪問安全性,可以減小惡意代碼或各種錯誤的代碼帶來的嚴(yán)重的系統(tǒng)安全性問題的可能性。您可以設(shè)置允許代碼執(zhí)行的一組操作,同樣可以設(shè)置永遠(yuǎn)不允許代碼執(zhí)行的一組操作。
實現(xiàn)代碼訪問安全性的基礎(chǔ)就是JIT(運行時編譯)和IL(中間代碼)。所以所有以公共語言運行庫為目標(biāo)的托管代碼都會受益于代碼訪問安全性。非托管代碼則無法完全使用代碼訪問安全性。
下面我們將介紹一下代碼訪問安全性實現(xiàn)的各種功能:
代碼訪問安全性是控制代碼對受保護(hù)資源和操作的訪問權(quán)限的一種機(jī)制。在 .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)用受保護(hù)的代碼。
· 通過將調(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 站點直接下載到客戶端,這種方式的代碼安全性也是可以在客戶端進(jìn)行設(shè)置的,根據(jù)簽名等數(shù)據(jù)權(quán)限證書來確定是不是可以允許下載的控件運行。這種方法類似于ActiveX的安全性設(shè)置,但是比之在設(shè)置權(quán)限更加詳細(xì)和強大。同JAVA APPLET的沙箱安全機(jī)制相比,.NET 的客戶端控件可以在本地簡單設(shè)置后訪問客戶端的各種資源。由于這一方面的用途不是我們的重點,所以我們在這里就不再更詳細(xì)的討論其用途及其實現(xiàn)原理了。
下面我們就談?wù)勅绾螒?yīng)用這一安全特性來解決ASP.NET中存在的系統(tǒng)安全漏洞。由于我們介紹的系統(tǒng)是共享主機(jī),所以有其特殊性,即系統(tǒng)管理員無法事先給所有的代碼賦予相應(yīng)的權(quán)限,因為每個用戶都可能有各種權(quán)限要求,并且這些要求特殊權(quán)力的代碼在使用中都可能出現(xiàn)的,所以在權(quán)限管理上隨時都有各種要求。
因此在權(quán)限設(shè)置方面,不僅僅是管理員設(shè)置,也包括了各個共享主<
另外還有一種關(guān)于ASP的FSO組件漏洞的相應(yīng)解決方案,即根據(jù)用戶設(shè)置權(quán)限。在IIS里,可以設(shè)置每個站點的匿名訪問所使用的帳號,默認(rèn)為IUSR_ HostName,這一方法的原理就是針對每一個共享主機(jī)用戶分別設(shè)置一個Windows帳號,如IUSR_HostName1,IUSR_ HostName 2等,然后將每一個用戶限制在各自的Web目錄下。
我們仔細(xì)的研究一下這種方案,可以發(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)限。這樣的方法無法真正的將每個共享主機(jī)用戶的文件系統(tǒng)訪問權(quán)限限制在各自的虛擬站點中,每個用戶仍然可以訪問別人的代碼。所以這種方法在ASP.NET中無法真正實現(xiàn)用戶之間的安全性。
在ASP.NET中相應(yīng)的運行ASP.NET程序的帳號為ASPNET,和上面所說的ASP中的解決方案類似,我們只能限制此用戶不能訪問系統(tǒng)目錄等其他目錄,但是無法防止用戶訪問其他共享主機(jī)用戶的程序代碼,無法從根本上杜絕這種問題。
那么,有沒有真正的解決方案了呢?
有!這就是.NET Framework 的新特性――代碼訪問安全性
為了更好的理解這一問題的解決方法,我們需要先介紹一下.NET Framework的安全機(jī)制。然后再結(jié)合我們的實際問題來討論解決方案。
為了解決安全問題,.NET Framework提供了一種稱為代碼訪問安全性的安全機(jī)制。代碼訪問安全性允許根據(jù)代碼的來源和代碼的標(biāo)識等屬性將代碼設(shè)置為不同級別的信任代碼,同時還詳細(xì)定義了不同級別的對代碼的信任,從而可以詳細(xì)的對代碼設(shè)置各自的權(quán)限而不是將最大權(quán)限賦給所有的代碼。使用代碼訪問安全性,可以減小惡意代碼或各種錯誤的代碼帶來的嚴(yán)重的系統(tǒng)安全性問題的可能性。您可以設(shè)置允許代碼執(zhí)行的一組操作,同樣可以設(shè)置永遠(yuǎn)不允許代碼執(zhí)行的一組操作。
實現(xiàn)代碼訪問安全性的基礎(chǔ)就是JIT(運行時編譯)和IL(中間代碼)。所以所有以公共語言運行庫為目標(biāo)的托管代碼都會受益于代碼訪問安全性。非托管代碼則無法完全使用代碼訪問安全性。
下面我們將介紹一下代碼訪問安全性實現(xiàn)的各種功能:
代碼訪問安全性是控制代碼對受保護(hù)資源和操作的訪問權(quán)限的一種機(jī)制。在 .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)用受保護(hù)的代碼。
· 通過將調(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 站點直接下載到客戶端,這種方式的代碼安全性也是可以在客戶端進(jìn)行設(shè)置的,根據(jù)簽名等數(shù)據(jù)權(quán)限證書來確定是不是可以允許下載的控件運行。這種方法類似于ActiveX的安全性設(shè)置,但是比之在設(shè)置權(quán)限更加詳細(xì)和強大。同JAVA APPLET的沙箱安全機(jī)制相比,.NET 的客戶端控件可以在本地簡單設(shè)置后訪問客戶端的各種資源。由于這一方面的用途不是我們的重點,所以我們在這里就不再更詳細(xì)的討論其用途及其實現(xiàn)原理了。
下面我們就談?wù)勅绾螒?yīng)用這一安全特性來解決ASP.NET中存在的系統(tǒng)安全漏洞。由于我們介紹的系統(tǒng)是共享主機(jī),所以有其特殊性,即系統(tǒng)管理員無法事先給所有的代碼賦予相應(yīng)的權(quán)限,因為每個用戶都可能有各種權(quán)限要求,并且這些要求特殊權(quán)力的代碼在使用中都可能出現(xiàn)的,所以在權(quán)限管理上隨時都有各種要求。
因此在權(quán)限設(shè)置方面,不僅僅是管理員設(shè)置,也包括了各個共享主<
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解