程式碼存取安全性

今日高度網路化的電腦系統經常暴露於各種不同來源的程式碼下,其中也可能包括不明的來源。 程式碼可以附加在電子郵件上、包含於文件中或由網際網路下載。 很遺憾地,許多電腦使用者仍然直接受到惡意行動程式碼攻擊,包含病毒和電腦蠕蟲,這些都可以危害或損毀資料並浪費時間和金錢。

大部分的一般安全機制都是依據使用者的登入認證 (一般為密碼) 來授與權限,並限制使用者允許存取的來源 (通常為目錄和檔案)。 但是,這個方法無法解決幾個問題:使用者取得程式碼的來源非常多,有些來源可能不可靠;程式碼可能內含錯誤 (Bug) 或弱點,可能會被惡意程式所使用;使用者不知道程式碼會執行什麼動作。 因此,電腦系統可能因此損壞,且當謹慎和可靠的使用者執行惡意或含有錯誤的軟體時,即可能危害到電腦系統並洩露私人資料。 大多數作業系統的安全機制都會要求程式碼的每一部分必須完全受到信任才可以執行,Web 網頁上的指令碼可能不需要。 因此,我們仍然需要一項更有效的應用安全性機制,以允許某一個電腦系統上的程式碼可以在受到保護的情況下,於另一個系統上執行,即使這兩個系統間並沒有信任關係存在。

.NET Framework 提供了一項稱為程式碼存取安全性的安全機制,以協助保護電腦系統不受惡意行動程式碼攻擊,讓來源不明的程式碼在執行時受到保護,並協助防止受信任的程式碼有意或無意間危害到安全性。 程式碼存取安全性依程式碼的來源和程式碼本身的其他部分,分別給與程式碼不同程度的信任等級。 程式碼存取安全性也可以提高程式碼的各種信任層級,使必須完全受信任才可執行的程式碼數量減少。 使用程式碼存取安全性可以減少您的程式碼被惡意或充滿錯誤的程式碼不當使用的機會。 它可以減輕您的責任,因為您可以指定允許程式碼執行的作業集。 程式碼存取安全性也可以協助降低由安全性不足的程式碼所產生的危害。

注意事項注意事項

在 .NET Framework 4 版中,程式碼存取安全性已有重大變更。最值得注意的變更為安全性透明,但也有其他重要變更會影響程式碼存取安全。如需這些變更的詳細資訊,請參閱 .NET Framework 4 中的安全性變更

程式碼存取安全性主要會影響程式庫程式碼,以及部分受信任應用程式。 程式庫開發人員必須保護程式碼,防止部分受信任應用程式未經授權對其進行存取。 部分信任的應用程式是從外部來源 (例如網際網路) 載入的應用程序。 在桌面上或本機內部網路上安裝的應用程式,都會以完全信任來執行。 完全信任的應用程序不會受程式碼存取安全性影響,除非將它們標記為安全性透明,因為它們都是完全受信任的。 完全信任應用程式的唯一限制就是以 SecurityTransparentAttribute 屬性標記的應用程式無法呼叫以 SecurityCriticalAttribute 屬性標記的程式碼。 部分信任應用程式必須在沙箱中執行 (例如,在 Internet Explorer 中),以便可以套用程式碼存取安全性。 如果從網際網路下載應用程式,並且嘗試從桌面執行該應用程式,則您會取得 NotSupportedException,且伴有訊息「嘗試從在舊版 .NET Framework 中會導致以沙箱處理組件的網路位置載入組件。 這個版本的 .NET Framework 預設為不啟用 CAS 原則,所以這種載入可能會有危險。」如果確定可以信任應用程式,您可以使用 <loadFromRemoteSources> 項目對其進行啟用,做為完全信任應用程式來執行。 如需在沙箱中執行應用程式的詳細資訊,請參閱 HOW TO:在沙箱中執行部分信任的程式碼

定位於一般語言執行階段的所有 Managed 程式碼也可以從程式碼存取安全性獲得益處,即使該程式碼並沒有執行單一的程式碼存取安全性呼叫。 如需詳細資訊,請參閱程式碼存取安全性的基本概念

程式碼存取安全性的關鍵功能

程式碼存取安全性會協助將程式碼存取限制為受保護的資源和作業。 在 .NET Framework 中,程式碼存取安全性會執行以下的功能:

  • 定義使用權限和使用權限集合以表示存取各種系統資源的權限。

  • 使程式碼可以要求它的呼叫端具有特定使用權限。

  • 使程式碼要求它的呼叫端處理數位簽章,而只允許特定組織或站台的呼叫端可以呼叫受保護的程式碼。

  • 比較呼叫堆疊上每一個呼叫端授與的使用權限和呼叫端必須擁有的使用權限,來加強執行階段時的程式碼限制。

核查呼叫堆疊

為決定程式碼是否已取得授權可存取資源或執行作業,執行階段的安全性系統查核會呼叫堆疊,來比較每一個呼叫端授與的使用權限和要求的使用權限。 如果呼叫堆疊中的任一呼叫端並不擁有要求的使用權限,則會擲回一個安全性例外狀況並拒絕存取。 堆疊查核行程 (Stack Walk) 的設計用意在於協助防止偽裝攻擊,而使低度受信任的程式碼呼叫高度受信任的程式碼,並使用它來執行未經授權的動作。 在執行階段時要求所有呼叫端具有使用權限的確會影響執行的效能,但對協助保護程式碼使其不受信任程度較低程式碼的偽裝攻擊而言則是相當重要。 若要使執行效能最佳化,您可以讓您的程式碼執行較少的堆疊查核行程,然而,您必須確定並沒有洩露任何安全漏洞。

下圖說明組件 A4 中的方法需要它的呼叫端必須擁有使用權限 P 時的堆疊查核行程。

安全性堆疊查核行程

程式碼存取安全性

相關主題

標題

說明

程式碼存取安全性的基本概念

說明程式碼存取安全性及其最常使用的用途。

安全性透明的程式碼,層級 2

說明 .NET Framework 4中的安全性透明模型。

從部分受信任程式碼使用程式庫

說明如何啟用程式庫以便和 Unmanaged 程式碼搭配使用,以及如何從 Unmanaged 程式碼使用程式庫。

撰寫安全類別庫

說明類別庫的安全性考量。

建立您自己的程式碼存取使用權限

說明如何建立自訂使用權限。

重要的安全性概念

提供 .NET Framework 安全性系統所使用的許多重要關鍵字和概念。

以角色為基礎的安全性

說明如何依據不同角色結合安全性。

密碼編譯服務

說明如何讓您的應用程式擁有密碼編譯服務。

安全性工具 (.NET Framework)

說明實作和管理 .NET Framework 安全性系統所使用的工具。