0

我知道 CAS的价值有限,但我还是想了解一下。

我不明白我看到的行为:基本默认 CAS 在我相当正常的环境中似乎根本不起作用。

采取这个示例类:

using System;
using System.Security;
using System.Security.Permissions;

namespace CASNotWorkingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted);

            if (SecurityManager.IsGranted(perm))
                Console.WriteLine("granted");
            else
                Console.WriteLine("denied");

            Console.ReadKey();
        }
    }

}

我构建了这个并将 exeCASNotWorkingExample.exe放在另一台机器(IP 为 192.168.1.101)上的文件共享“不受信任”上。然后我使用 非管理命令提示符运行它\\192.168.1.101\untrusted\CASNotWorkingExample.exe,期望它返回“拒绝”。它不是; 它返回“授予”。

Windows 知道它正在处理一个安全性有问题的远程 EXE。当我从开始菜单运行...对话框运行相同的命令时,我收到通常的安全警告“无法验证发布者。你确定等等等等”。因此,不会以某种方式错误地认为 exe 正在本地计算机上运行并错误分配了区域。

此外,当我使用 .NET 2.0 配置工具查看相同的 exe 时(右键单击“运行时安全策略”,选择“评估程序集...”),我看到 .NET 仅将 Internet_Zone 权限分配给程序集. 这些权限不包括 FileIOPermission(独立存储是它自己的权限)。

替代文字 http://img5.imageshack.us/img5/2256/casperms.jpg

可能对其他人有用但到目前为止还没有对我有用的数据:

  • 我在阅读MCTS 70-536 考试的MS Press 书籍时遇到了这个问题。第 11 章是关于 CAS 的;第 1 课 / 示例 1 对我来说失败了,就像上面描述的那样。你在这里看到的是一个精简的变体。
  • 我已经验证了像这样的 EXE 实际上可以写入磁盘,即 IsGranted 检查可能是正确的。
  • 两台机器运行 Vista SP1 和 WinXP。无论哪个是客户端,哪个是文件服务器,行为都是相同的,所以这不是 Vista 的事情。
  • 当作为标准非特权用户和作为管理员运行时,行为是相同的。
  • 不在 AD 域中运行。
  • 客户端和文件服务器上的用户名和密码相同,因此我可以访问文件而无需使用net use提供凭据。

我敢肯定这将是那些“arrrgh”时刻之一......我错过了什么?

4

2 回答 2

1

我不是 CAS 专家,但我怀疑这可能是由于.NET 3.5 SP1中的更改允许来自网络共享的代码作为完全信任运行。

编辑:Brad Abrams 声明不需要重新编译/目标来利用这一点。我假设它反过来也一样——如果你的机器上有 3.5 SP1,那么以 2.0 为目标不会给你带来旧的行为。

无需以任何方式重新编译或更改现有应用程序即可利用这一点。您当前的 2.0 应用程序将正常工作,您不必针对 3.5 中的任何新内容。

我想只有 2.0 FX 的全新 (VM) 安装可能能够根除此问题。

于 2009-05-30T00:56:55.490 回答
0

更改的工作方式是在启动托管 exe 时有一个新的证据。当直接从 win32 CreateProcess API 启动 exe 时,托管 exe 将获得完全信任。

当然,.net 配置工具不会启动 exe,只是检查它。这意味着证据不同并影响分配给它的代码组。这反过来会影响权限。

相当混乱。

更多信息可以在这里找到:

msdn 社交

布拉德艾布拉姆斯博客

于 2010-01-18T20:42:40.550 回答