I'm currently trying to create a very simple sandbox.
In some class A, there is an Execute method, which is called in AppDomainsomething other than the caller.
The problem is that I have permission to execute, and reflection is possible in any case.
This is a sample code:
[Serializable]
public class A : MarshalByRefObject
{
public void Execute()
{
typeof(A).GetConstructor(Type.EmptyTypes).Invoke(null);
typeof(B).GetConstructor(Type.EmptyTypes).Invoke(null);
}
}
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();
}
}
UPDATE
Fine! Finally, I did it.
Thanks to your advice, I revised my code, and I would like to share it with you, since it was difficult for me to understand how not to use CAS, but to use the same permissions in the new .NET 4.x and higher, as well as the sandbox method using AppDomain. What is it:
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();
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();
}
}
}
source
share