68

警告:

自从提出此问题以来,较新版本的 .Net 和 .Net 核心已删除和/或更改了“代码访问安全性”(CAS)。

原始问题:

我正在准备70-536 .NET Framework - 应用程序开发基础考试,因为我已经编程 .net 很多年了,这应该不难!

但是我必须了解“代码访问安全性”(CAS),因为我从来没有需要使用或配置它,我想知道是否有其他人找到了它的实际用途?

请提供您何时使用 CAS 的示例,并且它已成为解决方案的一部分,而不是问题的一部分。

(到目前为止,其他所有事情都与我多年 .NET 编程中必须完成的任务有关)


相关问题:


到目前为止的结果。

  • 当您托管第 3 方代码时,CAS 很有用。例如,网络托管公司可以使用它来阻止客户的 Asp.net 代码对服务器造成损害。(当 .NET 被用作 VBA 的替代品时,Office 也会使用它)

  • 到目前为止,它在 Microsoft 应用程序之外使用的唯一详细示例是:

    我最近做的一个项目有类似的东西:允许用户上传一个库,并测试它的性能(“谁创造了最好的算法”)。不用说,我们非常需要 CAS。

  • CAS 似乎对获得 JITDC 认证很有用,就像美国国防部一样,但是我不知道 CAS 是否有任何实际价值,或者它是否只是打勾。

(如果您需要绕过使用 CAS 的主机并且您在它们的机器上拥有管理员权限,您可以将您的程序集放在 GAC 中。)

展望未来,CAS 在 .net 4 中稍微不那么复杂


至少看起来新的微软考试不会有包含 CAS 的“基础”考试。我不知道它是否会进入新的 Winforms/WPF 考试。

4

8 回答 8

35

我经常在“现实世界”中遇到代码访问安全问题,通常是在我最不期待的时候。在某种程度上,SilverLight 将是它的一个出色的现实应用程序,如果 SilverLight最终选择不使用 CAS的话。

托管服务提供商

您在实际中看到它的地方是需要安全环境的地方:当然是 ASP.NET 本身,但是 ASP.NET 托管服务提供商使用经过修改的安全模型来防止对其宝贵系统的入侵。我知道 Webhost4Life 使用它的事实(在他们的网站上没有关于它的信息,但我与他们合作过,它就在那里,真的)。进一步看,其他 ASP.NET 托管服务提供商也这样做,但他们也不是很清楚:godaddy.com 上的线程不想更改 CAS(不清楚支持什么,不支持什么)或关于 1&1 的相关讨论. 一些云托管站点 (rackspacecloud) 更进一步,并“与 Microsoft 合作修改了完全信任级别”,无论如何。

简而言之:如果您找到一个 ASP.NET 主机,他们很可能使用 CAS 来阻止您做他们不希望您做的事情。他们甚至可以使用它来区分“基本”(许多限制)托管和“企业”(很少限制)托管,这为 CAS 赋予了完全不同的含义。

CAS的其他应用

对于我自己遇到的一些真实情况来说,就这么多。我最近做的一个项目有类似的东西:允许用户上传一个库,并测试它的性能(“谁创造了最好的算法”)。不用说,我们非常需要 CAS。其他示例或有趣的资源:

对于您完全控制自己的任何情况,您构建自己的应用程序和代码(或构建它)并且完全控制您的系统,我认为您不会经常需要 CAS。当您从不太受信任的来源运行代码时(这基本上是您无法完全控制的所有内容),您将更多地使用它。

CAS 与 ClickOnce

默认 CAS 设置限制从网络共享或其他非本地源运行的代码的功能。这是有道理的,但是严格的限制使得很难有一个分布式应用程序的中央存储库。.NET 2.0 引入了 ClickOnce,它应该提高安全性(在此处讨论)。

ClickOnce 本身使用 CAS来防止安装程序调用系统函数。因此,我相信它可以说是最知名的依赖于 CAS 的应用程序

要点是:您需要了解 CAS 才能创建可以直接从共享运行的东西,或者您完全忽略它并使用 ClickOnce。

微软对 CAS 的调查

2005 年,微软召集了一项调查,找出 CAS 为何如此不受欢迎,希望对其进行改进,使其更好地适用。不幸的是,我找不到实际的调查结果,除了这篇文章详细说明了为什么 CAS 未得到充分利用。

另一个世界的CAS

然而,那篇文章确实指出了一个有趣的领域:CAS 应用于另一个世界:Unix / Linux。他们不叫它 CAS,而是叫它BitFrost。对于现实世界的应用程序来说,情况如何:“每个孩子一台笔记本电脑”项目,它依赖 BitFrost 作为传统 Unix 安全模型的替代品。

更新:作为 BitFrost 的 Unix/Linux 中的 CAS 部分和调查部分。
更新:添加了 CAS 与 ClickOnce 部分
更新:添加了使用 CAS 的资源列表(并对所有这些更新表示歉意!)

于 2009-10-14T16:22:13.633 回答
10

从技术上讲,它非常有用,因为它允许非常细粒度的权限规范。这对您(因为理论上它使利用安全漏洞变得更加困难 - 即使攻击者完全控制了您的应用程序,他仍然被锁定在 CAS 沙箱中)和您的客户(因为他们可以确切地看到您的应用程序可以执行和运行自己的安全审计)。

在实际使用中,它大多是没有意义的。我认为它太复杂了,可用的开发工具支持的太少,大多数用户都不关心。

当然也有例外(真正了解 .net/CAS 的政府和客户),我很想说 CAS 绝对有用且强制性,但现实说的很清楚。

于 2009-10-14T16:37:27.557 回答
5

读者注意:见下面的两条评论;听起来我不小心将 CAS 的定义夸大为(错误地)包括 RBS。我将在此处留下答案以供参考,但请注意区别。


CAS 有两个方面;你在那次考试中看到最多的是代码调用其他代码的所有细微差别,这可能对部分信任有用,但大多数时候这只是一种痛苦——更糟糕的是:如果你的代码完全信任(大多数/太多做)它实际上都没有执行(它被完全跳过)。

CAS RBS的有用部分是principal permission,它使用;当然,您的 UI 应该验证对功能的访问,但您可以(在您的底层逻辑中):

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }

即使在完全信任的情况下也会执行此操作;IPrincipal您可以通过实施(查看)来定义自己的主体(与用户相关联IsInRole())。而且由于大多数环境(winforms、webforms、mvc、wcf 等)都支持主体,这可以提供一种非常灵活的方式来在业务层仔细检查安全性,而无需参考特定的安全模型。请注意,上述检查适用于任何环境。

您也可以使用它来驱动您的 UI。我确实有一个 usenet 帖子,它基于主体启用/禁用了 winforms 控件(使用运行时属性来指定每个控件的角色,有点像ToolTip等等) - 不过我现在找不到它(编辑:也许这个)。

于 2009-10-18T08:49:44.040 回答
2

要了解代码访问安全性的一点是,除了了解它是如何使用的以及您可能调用的 API 的权限级别之外,它对应用程序开发人员几乎没有用处。唯一的例外,我真正发现有用的是一个名为 PrincipalPermission 的 CAS,如果没有为当前的 Principal 定义正确的角色,它基本上不允许执行某些代码。看到这个帖子:

http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/

真正需要关注 CAS 以及如何在他们的应用程序中实现它的开发人员是框架和代码库开发人员。因为您需要一定程度的信任才能使您的应用程序正常工作,尤其是在处理非托管资源(例如文件、网络流、串行端口等)时。或者如果您正在为非托管资源创建代码,例如一些专门的服务器,或对程序集的任何类型的低级别访问,您将希望围绕它创建一些代码访问安全性,以便不允许人们执行严格拒绝他们的事情。

微软在解释应该如何在日常应用程序中使用 CAS 方面并没有真正做得很好,这并没有帮助。所以这确实是缺乏使用的原因。然而,CAS 是 .NET 是一种如此安全的语言并且比其竞争对手遇到的问题要少得多的众多原因之一。

于 2009-10-14T16:06:23.057 回答
2

我是一个项目的开发负责人,该项目为基于 .NET 的解决方案获得JITC 认证(美国国防部),并且在认证测试期间对 CAS 设置进行了非常严格的审查。

与大多数其他认证要求一样,该代码只能使用其工作所需的权限,而不能使用更多权限。

如果您打算获得安全认证,CAS 肯定很重要。

于 2009-10-14T16:31:22.897 回答
1

您应该知道的一件事是,代码访问安全性作为一种防篡改方法几乎被破坏了。看:

CAS 防篡改功能被破坏:软件许可的后果

...

不再依赖代码访问安全性来防止在发货产品中使用被篡改的组件。这意味着,如果您的应用程序依赖于代码访问安全来执行许可检查,那么攻击者很容易用另一个替换您的许可程序集,从而获得对您的应用程序的免费访问。

...

于 2009-10-21T23:14:42.283 回答
1

虽然我从未使用过它,但我对 CAS 的理解是它也可以用来扩展面向对象的设计机制。例如,假设您正在为必须实现数据库访问和缓存的银行开发海量数据访问包。即使它们是同一个部署包的一部分,考虑到项目的假设规模,逻辑也应该在单独的程序集中实现,因为它们是完全不同的问题集,取决于不同的外力(数据库基础设施与消费者使用)。

但是,缓存代码可能需要访问数据访问程序集中的某些敏感类或方法,而这些敏感类或方法是整个包的使用者不应访问的。因此,这些数据访问类和方法不能简单地是public. 数据访问程序集中的受保护方法以及缓存程序集中的子类可以绕过某些情况,但通常这是对继承的滥用。public将LinkDemand 放置在调用者上以获取DataPackagePermisson管理员只会授予缓存程序集的自定义权限(例如 )可能更优雅。

于 2009-10-22T23:38:48.550 回答
0

我们将 CAS 用于我们的应用程序并不难,因为我们只是试图阻止未经授权的代码执行。从本地网络共享使用我们的软件时出现问题,但 cas-policy 解决了问题。

  1. 我们使用强名称保护所有程序集。
  2. 我们使用我们的强名称为所有程序集创建了一个 cas-policy,并允许使用我们的强名称签名的代码从局域网和本地放置的代码开始。
  3. 从需要本地文件访问的局域网加载的程序集(用于刻录数据 cd 的组件)需要获取所有公共类的链接需求属性。

自 .NET3.5 更新以来,我们的问题不再存在,因为局域网上的代码现在像本地代码一样处理。

于 2009-10-18T09:04:50.557 回答