【问题标题】:Code Access Security is a joke?代码访问安全是个笑话?
【发布时间】:2010-10-18 16:09:36
【问题描述】:

我刚刚阅读了关于代码访问安全的article。里面有这样一个例子:

using System.Security.Permissions;
public class MyFileAccessor 
{
  public MyFileAccessor(String path, bool readOnly)
  {
    path = MakeFullPath(path); // helper fcn
    FileIOPermissionAccess desiredAccess = readOnly
      ? FileIOPermissionAccess.Read
      : FileIOPermissionAccess.AllAccess;
    FileIOPermission p = new FileIOPermission(desiredAccess, path);
    p.Demand();
    // 
    ••• 
    open the file
   }
   // •••
}

如果我没有使用 FileIOPermissionAccess 类型 并且根本没有在我的代码中包含像 p.Demand() 这样的代码会怎样?换句话说,如果我想做坏事,我何必费心去请求许可呢?这不是开玩笑吗?还是我弄错了?

【问题讨论】:

    标签: .net security clr code-access-security


    【解决方案1】:

    嗯,是的,这个例子有点开玩笑,你自己永远不会写这样的东西。缺少的是真正重要的部分, // 打开文件的代码。例如,它的现实版本是 pinvoke CreateFile()。

    关键是 Windows 对 CAS 一无所知。因此,如果您提供这样的实用程序函数并且您想强制执行 CAS 规则,那么您必须验证您的 调用代码 是否具有所需的权限。当然,这种代码真的只属于.NET框架。查看FileStream.Init() 并注意在 CreateFile 调用之前需要 FileIOPermission。

    【讨论】:

    • 感谢您的明确回复。所以重点是——为了防止我的代码被滥用,我应该在我的组件/函数中包含某些 CAS 代码来执行 CAS 规则。
    • 大概。不太确定“滥用”这个词是否合适,如果您提供一种方法让代码绕过内置于框架中的正常 CAS 检查,那么,是的,您必须自己承担执行的责任。
    【解决方案2】:

    文件访问(例如使用FileStream)将自动要求FileIOPermission。对于所有标准类都是如此,当他们执行一些需要许可的操作时,他们会自动请求许可。查看 .NET Framework 安全性here。所以示例代码是没有用的,没有人会明确要求文件权限。如果你开发一些 API 并且你的代码是经过签名的,这样任何人都无法更改它是合理的。

    进一步阅读,这里是那篇文章的引述:

    现在在现实世界中,您不会编写像 MyFileAccessor 这样的类来访问文件。相反,您将使用系统提供的类,例如 System.IO.FileStream,它们已经被设计为为您执行适当的安全检查。它们通常在构造函数中完成,具有我之前讨论的所有性能和安全隐患。

    【讨论】:

    • 感谢您的回复。如果我正在创建一个新课程怎么办?这是否意味着为了使 CAS 工作,诚实的开发人员和 CAS 基础设施之间必须有一些协作/协议?就安全性而言,我认为它完全是徒劳的
    • 还是应该一直使用诚实开发者编写的软件组件?
    • @smwikipedia 否:“所有执行受限操作和访问受限资源(如文件系统)的 .NET Framework 类都需要您的权限。因此,当您使用 .NET Framework 类时,您不得重复许可要求。” support.microsoft.com/kb/315529 明确要求权限的情况对我来说是模糊的。我不知道有什么用。
    • @smwikipedia 以下是同一篇文章中的一些示例:“为了减少您的代码被其他恶意代码滥用的机会,您可以要求所有调用者都被授予指定的权限。如果任何上游调用者在当前调用堆栈中没有要求的权限,抛出一个安全异常。”
    【解决方案3】:

    在 java.io API 中,您可以向自己保证正在进行检查。如果您想控制访问(在崩溃发生之前绕过崩溃),您必须在 API 调用进行的内部检查之前进行适当的检查。

    Java 代码通常在您控制的计算机上运行,​​但也经常在您无法控制的计算机上运行。想想 Java 小程序。他们应该请求访问文件系统的权限,因为不应允许程序的作者未经检查地访问其他人的文件系统。

    如果您需要阻止一组人做一些恶意的事情,那么您需要阻止每个人可能做一些恶意的事情,以确保安全性成为现实。否则,作恶者只会说他们是受信任的不受限制的群体的一部分。

    默认情况下,Java 命令行可执行文件具有允许您访问自己的文件系统的权限。假设是,如果您在本地启动该程序,您可能已经弄乱了您可以访问的文件系统部分。小程序启动时删除了所有这些默认权限。这样,浏览小程序所在网页的人必须手动授予远程程序(小程序)访问其文件系统的权限。

    您看到这证明不存在绕过某些用户(或在某些情况下)安全的特殊后门。

    【讨论】:

    • 抱歉,为 Java 回答了这个问题,但 .Net 非常相似,所以答案仍然成立。
    • 没有。问题是如果我不打电话给Demand 会怎样,所以它非常具体,你告诉众所周知的理论
    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多