实际使用中的“代码访问安全性”吗?


68

警告:

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

原始问题:

我正在研究70-536 .NET Framework-应用程序开发基础考试,因为我对.net进行编程已有多年,所以这并不难!

但是,我必须学习“代码访问安全性”(CAS),因为我从未需要使用或配置它,所以我想知道是否有人找到了它的真实用法?

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

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


相关问题:


到目前为止的结果。

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

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

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

  • CAS似乎对获得JITDC认证很有用,就像美国国防部一样,但是我不知道CAS是否具有真正的价值,还是只是在框上打勾。

(如果您需要绕过使用CAS的主机并且对它们具有管理权限,则可以将程序集放入GAC。)

展望未来,.net 4中的CAS不太复杂


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


2
我参加这项考试时有同样的反应。我的意见是,这是.NET框架内部的关键部分,Microsoft使用它来弥补许多安全漏洞,并且他们公开了该漏洞,以便其他人也可以使用它。但是我也从未亲自使用过它,也从未认识过在商业应用程序中使用过它的人。
盖伊·星巴克

CAS具有巨大的表面积。它可能包含许多安全错误。例如,JIT错误可能会绕开CAS。请参阅GitHub CoreClr以查看有多少个JIT错误。CAS是尽力而为的安全屏障。一个有足够动力的攻击者可以克服它。使用CAS运行不受信任的代码非常危险。
usr

Answers:


35

在“现实世界”中,我经常遇到代码访问安全性,而我最不期望的是。从某种意义上说,如果不是SilverLight最终选择完全不使用CAS,SilverLight将是它的出色的实际应用。

托管服务商

在实际应用中需要安全的环境:当然是ASP.NET本身,但是ASP.NET托管提供程序使用经过修改的安全模型来防止入侵其宝贵的系统。我知道Webhost4Life使用了这个事实(他们的网站上没有关于它的信息,但是我已经与他们合作,确实存在)。进一步看,其他ASP.NET托管提供程序也做同样的事情,但是它们也不是很清楚:godaddy.com上的线程不想更改CAS(并且不清楚要支持什么,什么不支持)或1&1上的相关讨论。。某些云托管站点(rackspacecloud)进行了进一步扩展,无论可能与“与Microsoft一起工作以修改后的完全信任级别”

简而言之:如果找到ASP.NET主机,则很可能是他们使用CAS来阻止您执行他们不希望您做的事情。他们甚至可以使用它在“基本”(很多限制)托管和“企业”(很少限制)托管之间产生区别,这给CAS带来了另外的含义。

CAS的其他应用

在现实世界中,我遇到了很多这样的情况。我最近做的一个项目有一个类似的东西:允许用户上传一个库,并对其性能进行测试(“谁创造了最好的算法”)。不用说,我们在那里非常需要CAS。其他示例或有趣的资源:

  • NAR Loader(一个代码项目应用程序)使用它自己的CAS
  • LR评估器(也是codeproject应用)使用CAS
  • ClickOnce(请参见下文)使用CAS
  • CAS设计模式:流行程度“假定”正在使用CAS
  • 了解CAS:更加普及,并且有些注释暗示了应用程序
  • Microsoft SharePoint一直都在使用CAS(对不起,我不是SP专家)

对于只需要完全控制自己的任何情况,您都可以构建自己的应用程序和代码(或已构建代码),并且可以完全控制系统,我认为您并不需要经常使用CAS。从不那么受信任的来源(基本上是不受您完全控制的所有内容)运行代码的那一刻起,您将更多地使用它。

CAS vs ClickOnce

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

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

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

微软对CAS的调查

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

CAS在另一个世界

然而,那篇文章的确指向了一个有趣的利基市场:CAS应用于另一个世界:Unix / Linux。他们不称其为CAS,而是BitFrost。对于实际应用程序,情况如何:“每个孩子一个笔记本电脑”项目,该项目依靠BitFrost替代传统的Unix安全模型。

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


10

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

在实际使用中,它几乎没有任何意义。我认为它太复杂了,可用的开发工具所支持的太少了,而且大多数用户还是不在乎。

当然也有例外(政府和客户确实了解.net / CAS),我想说CAS是绝对有用和强制性的,但现实却讲一种清晰的语言。


因此,另一个没有通过“现实生活”测试的理想,很遗憾,我们所有人都必须学习它才能通过考试……
Ian Ringrose

可悲的是。我看到的主要问题是根本没有工具。我根本不知道我需要哪些权限(至少不需要它们的内部名称),而且内容非常复杂。理想情况下,我想在“沙箱”中执行我的应用程序,然后获取“您的应用程序需要这些权限”报告,以便我可以查看它们并从中创建CAS策略,但是这种沙箱(AFAIK)确实不存在。
Michael Stum

这是一个很棒的解释,我可以看到其中的价值,这可能值得额外的头痛。
dellyjm 2014年

5

读者注意:请参见下面的两个注释;听起来我不小心将CAS的定义夸大了(不正确)包括RBS。我将在这里留下答案供参考,但请注意区别。


CAS有两个方面:在该考试中,您最会看到的是代码调用其他代码的所有细微差别,这可能对部分信任很有用,但在大多数情况下,这简直是痛苦的-更糟的是:如果您的代码具有完全信任(大部分/太多的操作)实际上没有执行(完全跳过了)。

CAS RBS的有用部分是主体许可,该主体许可使用;当然,您的UI应该验证对功能的访问权限,但是您可以(在您的下拉逻辑中)放入:

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

即使完全信任也将强制执行;您可以通过实现IPrincipal(参见IsInRole())来定义自己的主体(与用户绑定)。并且由于在大多数环境(winforms,webforms,mvc,wcf等)中都支持委托人,因此这可以提供一种非常灵活的方式来在业务层进行双重检查安全性,而不必引用特定的安全模型。请注意,以上检查将在任何环境下都有效。

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


2
AFAIK,PrincipalPermission不属于CAS,而是属于基于角色的安全性。CAS将信任确定交给站点管理员。RBS将信任确定交给开发人员。根本的区别。
G-Wiz

1
我不认为CAS包括基于主体或用户身份的安全代码。实际上,根据Microsoft的CAS定义(msdn.microsoft.com/en-us/library/930b76w0.aspx),它被明确地描述为超越基于用户身份的权限,这被认为是有用的,但还远远不够。
Cheeso

@ gWiz,@ Cheeso-好;感谢您的澄清。因此,它们仅仅是相关的概念。在这种情况下,我想我的答案可能会短很多:“ IMO,不是那么多” ;-p
Marc Gravell

2

关于代码访问安全性,要了解的一点是,它对应用程序开发人员几乎没有用,只是不了解它的使用方式以及您可能要调用的API的权限级别。我真正发现有用的唯一例外是一个称为PrincipalPermission的CAS,如果没有为当前Principal定义正确的Role,则基本上不允许执行某些代码。看到这篇文章:

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

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

Microsoft并没有真正做好解释在日常应用程序中应如何使用CAS的工作,这无济于事。因此,这确实是缺乏使用的原因。但是,CAS是.NET这样一种安全的语言并且比其竞争对手遭受更少的麻烦的众多原因之一。


2
PrincipalPermission从技术上讲不是代码访问安全性,而是基于角色的安全性。区别在于基于角色的安全性依赖于CurrentPrincipal作为证据,而代码访问安全性则依赖于计算机的安全策略和程序集强命名。CurrentPrincipal可以由调用者修改,因此信任关系在开发人员的手中。安全策略由本地管理员设置,因此信任关系掌握在操作员的手中。
G-Wiz

2

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

像大多数其他认证要求一样,代码只能使用工作所需的特权,不能再使用。

如果您打算获得安全认证,CAS绝对重要。


1

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

CAS防篡改被打破:软件许可的后果

...

不再依赖代码访问安全性来防止在出厂产品中使用篡改的程序集。这意味着,如果您的应用程序依赖于Code Access Security来执行许可检查,那么对于攻击者来说,将您的许可程序集替换为另一个许可集很简单,从而可以免费访问您的应用程序。

...


1
这更多是关于删除对数字签名的“子代”程序集而不是CAS的要求。您始终能够拆解主机,删除签名检查,然后重新组装。只需单击几下即可完成操作... +1指出CAS仅与对主机的保护一样好。
伊恩·林格罗斯

1

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

但是,缓存代码可能需要访问数据访问程序集中的某些敏感类或方法,而整个程序包的使用者不应该访问这些敏感类或方法。因此,这些数据访问类和方法不能简单地是public。在某些情况下,数据访问程序集中受保护的方法在缓存程序集中具有子类,但是在某些情况下,这是对继承的滥用。将它们留public在调用者上的LinkDemands留给DataPackagePermisson管理员以获得自定义权限(例如,管理员只授予缓存程序集的权限)可能会更简单。


0

我们对应用程序使用CAS并不是很困难,因为我们只是试图停止未经授权的代码执行。使用本地网络共享中的软件后,问题就出现了,但是通过cas策略可以解决问题。

  1. 我们使用强名来确保所有程序集的安全。
  2. 我们使用强名称为所有程序集创建了cas策略,并允许使用强名称签名的代码从局域网和本地放置的代码开始。
  3. 从局域网加载的需要本地文件访问的程序集(用于刻录数据cd的组件)需要获得所有公共类上的link-demand属性。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.