代码访问安全性

当今高度连接的计算机系统经常会遇到出自各种来源(可能包括未知来源)的代码。 代码可能由电子邮件附带、包含在文档中或通过 Internet 下载。 遗憾的是,许多计算机用户都亲身体验过恶意移动代码(包括病毒和蠕虫)造成的后果,这些代码可能会损坏或毁坏数据,并会浪费时间和资金。

多数普通安全机制根据用户的登录凭据(通常为密码)赋予用户权限,并限制允许用户访问的资源(通常为目录和文件)。 但是,这种方法无法解决以下几个问题:用户从许多来源获取代码,这些来源中有一些可能不可靠;代码可能包含 Bug 或可能被恶意代码利用的漏洞;代码有时候会在用户不知情的情况下执行一些操作。 结果,当谨慎可靠的用户运行恶意软件或包含错误的软件时,计算机系统可能会受到损坏,并且可能会泄漏私有数据。 多数操作系统安全机制要求每一段代码都必须完全受信任(网页的脚本可能除外),然后才可运行。 因此,仍需要一种可广泛应用的安全机制,即使两个计算机系统之间没有信任关系,该机制也允许在一个计算机系统上生成的代码能够在另一系统上安全地执行。

.NET Framework 提供了一种称为“代码访问安全性”的安全机制,可帮助保护计算机系统免受恶意移动代码的危害,让来源不明的代码安全运行,并防止受信任的代码有意或无意地危害安全。 代码访问安全性使代码可以根据它所来自的位置以及代码标识的其他方面,获得不同等级的受信度。 代码访问安全性还实施不同级别的对代码的信任,从而最大限度地减少了必须完全信任才能运行的代码的数量。 使用代码访问安全性,可以减小恶意代码或包含错误的代码滥用您的代码的可能性。 通过代码访问安全性,您可以指定应允许您的代码执行的一组操作,因此可以减少您的责任。 代码访问安全性还有助于最大限度地减少由于代码中的安全脆弱性而造成的损害。

注意注意

在 .NET Framework 4 版中,对代码访问安全性进行了重大的更改。最显著的是安全透明方面的更改,但也存在其他影响代码访问安全性的重大更改。有关这些更改的信息,请参见 .NET Framework 4 中的安全性更改

代码访问安全性主要影响库代码和部分信任的应用程序。 库开发人员必须防止部分信任的应用程序的未经授权访问他们的代码。 部分信任的应用程序是那些从外部源(如 Internet)加载的应用程序。 安装在您的桌面计算机或本地 Intranet 上的应用程序在完全信任环境下运行。 除非完全信任的应用程序标记为安全-透明,否则它们不受代码访问安全性的影响,因为它们是完全受信任的。 对完全信任的应用程序的唯一限制是:标有 SecurityTransparentAttribute 特性的应用程序不能调用标有 SecurityCriticalAttribute 特性的代码。 部分信任的应用程序必须在沙盒中(如 Internet Explorer 中)运行,以便可以应用代码访问安全性。 如果从 Internet 下载一个应用程序并尝试从您的桌面计算机上运行它,您将收到一个 NotSupportedException,并显示消息“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理。 此发行版的 .NET Framework 默认情况下不启用 CAS 策略,因此,此加载可能会很危险。”如果您确信可以信任该应用程序,则可以通过使用 <loadFromRemoteSources> 元素将其作为完全信任的应用程序运行。 有关在沙盒中运行应用程序的信息,请参见如何:运行沙盒中部分受信任的代码

所有以公共语言运行时为目标的托管代码都会受益于代码访问安全性;即使托管代码不进行一次代码访问安全性调用,它也会受益。 有关更多信息,请参见代码访问安全性基础知识

代码访问安全性的关键功能

代码访问安全性会帮助限制代码对受保护的资源和操作的访问。 在 .NET Framework 中,代码访问安全性执行下列功能:

  • 定义权限和权限集,它们表示访问各种系统资源的权限。

  • 使代码能够要求其调用方拥有特定的权限。

  • 使代码能够要求其调用方拥有数字签名,从而只允许特定组织或特定站点的调用方来调用受保护的代码。

  • 通过将调用堆栈上每个调用方所授予的权限与调用方必须拥有的权限相比较,加强运行时对代码的限制。

审核调用堆栈

为了确定是否已授予代码访问资源或执行操作的权限,运行时的安全系统遍历调用堆栈,将每个调用方所授予的权限与目前要求的权限相比较。 如果调用堆栈中的任何调用方没有要求的权限,则会引发安全性异常,并会拒绝访问。 堆栈审核旨在防止引诱攻击;在这种攻击中,受信程度较低的代码调用高度信任的代码,并使用高度信任的代码执行未经授权的操作。 在运行时要求所有调用方都拥有权限会影响性能,但这对于帮助保护代码免遭受信程度较低的代码的引诱攻击至关重要。 若要优化性能,可以使代码执行较少的堆栈审核;但是,任何时候这样做时均必须确保不会暴露安全缺陷。

下图演示程序集 A4 中的方法要求其调用方拥有权限 P 时引起的堆栈审核。

安全堆栈审核

代码访问安全性

相关主题

标题

说明

代码访问安全性基础知识

描述代码访问安全性及其最常见用途。

安全透明的代码,级别 2

描述 .NET Framework 4 中的安全透明模型。

通过部分受信任的代码使用库

描述如何启用库以用于非托管代码以及如何通过非托管代码使用库。

编写安全类库

描述类库的安全注意事项。

创建自己的代码访问权限

描述如何创建自定义权限。

安全性的基础概念

提供对 .NET Framework 安全系统中使用的许多关键术语和概念的概述。

基于角色的安全性

描述如何集成基于角色的安全性。

加密服务

描述如何将密码系统集成到应用程序中。

安全工具 (.NET Framework)

描述用于实现和管理 .NET Framework 安全系统的工具。