在.NET appdomain中隔离/沙箱化不受信任的代码

时间:2012-03-27 13:38:53

标签: .net security appdomain sandbox

我正在尝试使用低权限集隔离Appdomain中的代码。 但是,我想公开一些通过接口提供的特定功能(在我信任的程序集中实现)。

创建appdomain时,我将TrustedAssembly的StrongName作为第5个参数传递(params StrongName [] fulltrustAssemblies)。

但是,当UntrustedAssembly调用TrustedAssembly时,我仍然在访问互联网时遇到安全异常。

TrustedAssembly允许使用PartiallyTrustedCallers。

下面是我用来创建沙箱和两个程序集的代码。 不知道我在这里失踪了什么。我不是安全专家,我知道.NET 4.0中有很多变化。

提前感谢!

奥拉夫

创建AppDomain

//set up permisssion set for 'internet' zone.
Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

//get SN for 'TrustedAssembly'.
var trustedAssemblySN = typeof(IAgent).Assembly.Evidence.GetHostEvidence<StrongName>();

//create appdomain
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = @"C:\path\to\UntrustedAssembly\bin\Debug\" };
var appdomain = AppDomain.CreateDomain("sandbox", null, setup, internetPS, trustedAssemblySN);

var agent = (IAgent)appdomain.CreateInstanceAndUnwrap("UntrustedAssembly", "UntrustedAssembly.Agent");
var context = (IContext)appdomain.CreateInstanceAndUnwrap("TrustedAssembly", "TrustedAssembly.Context");
agent.Run(context);

受信任的程序集

[assembly: AllowPartiallyTrustedCallers]

namespace TrustedAssembly
{
    public interface IAgent
    {
        void Run(IContext context);
    }

    public interface IContext
    {
        Stream DownloadStream(Uri resource);
    }

    public class Context : MarshalByRefObject, IContext
    {
        public Stream DownloadStream(Uri resource)
        {
            WebRequest req = WebRequest.Create(resource);
            //i would have expected this to succeed.

            WebResponse resp = req.GetResponse();
            return resp.GetResponseStream();
        }
    }
}

不受信任的程序集

namespace UntrustedAssembly
{
    public class Agent : MarshalByRefObject, TrustedAssembly.IAgent
    {
        public void Run(TrustedAssembly.IContext context)
        {
            var stream = context.DownloadStream(new Uri("http://google.com"));
        }
    }
}

0 个答案:

没有答案