权限设置反转:使用“完全信任 - (减号)写访问权限”运行.NET 4.0应用程序

时间:2011-02-13 21:11:20

标签: .net security .net-4.0 sandbox

我有一个WCF服务与Mathematica内核通信,以评估任意表达式并获得结果。 (我的唯一目的是利用Mathematica作为使用SVG和XAML的静态图形的复杂图形布局引擎,但我的数学内核主机可以有一个非常简单的界面,可以评估任意Mathematica表达式:如果出现安全漏洞,可以导致任意代码注入。)

  • 有没有办法在具有“完全信任权限集 - (减号)文件写入访问权限”的sandbux中运行应用程序?

使用

    var e = new Evidence();
    e.AddHostEvidence(new Zone(SecurityZone.Trusted));
    var pset = SecurityManager.GetDefaultSandbox(e);

导致我的应用程序由于后来的安全性异常而崩溃,因此我想确保删除单个权限类型。我没有详细了解安全异常的类型及其原因,我的程序链接到没有调试符号的商业库。

  • 如何在商业库中调试执行?反射器或类似的工具可以帮助我吗?

  • 如何获得有关安全例外的更好的堆栈跟踪? (当前沙盒应用程序的完整来源如下)

    var pset = new PermissionSet(PermissionSet.Unrestricted); // set is empty o_O!
    pset.RemovePermission(typeof(FileIOPermission)); // io permission still active

...

无济于事。

完整背景:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.Remoting;

class Sandboxer : MarshalByRefObject
{
    const string uPath = @"..\..\..\KernelHost\bin\Debug";
    static string aPath = Path.GetFullPath(uPath);
    const string uAssembly = "KernelHost";

    static void Main(string[] args)
    {
        var e = new Evidence();
        e.AddHostEvidence(new Zone(SecurityZone.Trusted));

        var pset = new PermissionSet(PermissionState.Unrestricted);
        //pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
        //pset.AddPermission(new UIPermission(UIPermissionWindow.AllWindows, UIPermissionClipboard.AllClipboard));
        //pset.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, aPath));
        //pset.SetPermission(new UIPermission(PermissionState.None));
        pset.RemovePermission(typeof(UIPermission));
        //pset.SetPermission(new FileIOPermission(PermissionState.None));

        var ass = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

        var ads = new AppDomainSetup();
        ads.ApplicationBase = aPath;

        var sandbox = AppDomain.CreateDomain(
            "Sandbox",
            e,
            ads,
            pset,
            ass);

        Console.WriteLine(pset.Count);
        foreach (IPermission p in pset)
        {
            Console.WriteLine(p.ToXml());
        }

        sandbox.ExecuteAssemblyByName("KernelHost");
    }
}

  • 是否有适用于.NET 4.0的可用开源/商业沙盒解决方案,或者可能更高级别的Windows Server 2008 R2(也适用于本机应用程序)可以帮助我解决?

1 个答案:

答案 0 :(得分:3)

完全信任不仅仅是“一切”;它是“禁用检查” - 所以不,你不能拥有“完全信任,除了{foo}”,因为仍然没有检查。你将不得不拥有一个包容性的,尽管很大的套装。而且我确信我可以做一些非常讨厌的事情,而不是写文件......