Mat*_*zer 5 .net c# security sandbox .net-4.0
我目前正在尝试创建一个非常简单的沙箱.
某些类A有一个方法Execute,它在调用AppDomain
者之外调用.
问题是我只有执行权限,无论如何都可以反思.
这是代码示例:
[Serializable]
public class A : MarshalByRefObject
{
public void Execute()
{
typeof(A).GetConstructor(Type.EmptyTypes).Invoke(null); // Fine - Why?
typeof(B).GetConstructor(Type.EmptyTypes).Invoke(null); // Fine - Why?
}
}
public class B
{
}
class Program
{
static void Main(string[] args)
{
PermissionSet set = new PermissionSet(PermissionState.None);
SecurityPermission security = new SecurityPermission(SecurityPermissionFlag.Execution);
set.AddPermission(security);
Evidence evidence = new Evidence();
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = "C:";
AppDomain domain = AppDomain.CreateDomain
(
"hello",
evidence,
setup,
set
);
A a = (A)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(A).FullName);
a.Execute();
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
大!最后我做到了.
感谢您的建议,我修改了我的代码,我想与您分享,因为我很难理解如何不使用CAS但在新的.NET 4.x中使用相同类型的权限以上安全模型,以及使用沙盒的方式AppDomain
.而已:
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
namespace ConsoleApplication1
{
[Serializable]
public class A : MarshalByRefObject
{
public void Execute()
{
B b = new B();
// BOMB! ERROR! Security demand: reflection forbidden!
b.GetType()
.GetMethod("ExecuteInB", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(b, null);
}
}
public class B
{
private void ExecuteInB()
{
}
}
class Program
{
static void Main(string[] args)
{
PermissionSet set = new PermissionSet(PermissionState.None);
SecurityPermission security = new SecurityPermission(PermissionState.None);
security.Flags = SecurityPermissionFlag.Execution;
set.AddPermission(security);
Evidence evidence = new Evidence();
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = "C:";
AppDomain domain = AppDomain.CreateDomain
(
"hola",
evidence,
setup,
set
);
A a = (A)domain.CreateInstanceAndUnwrap("ConsoleApplication1", "ConsoleApplication1.A");
a.Execute();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 11
调用无法访问的成员时需要反射权限.A
并且B
是具有公共构造函数的公共类型,因此可以访问.您可以在没有反射的情况下调用那些构造函数,因此当您尝试使用反射时没有要求.
而且,使用反射进行发现总是合法的; 即使没有获得反射许可,您也可以查询对象并询问其私有成员列表.只有当您尝试调用私有成员时才需要该权限.