Hi,
I'm having trouble running untrusted code inside a sandboxed AppDomain, and
I was hoping that someone could help me!
The code is user-supplied, and so I want my Winform application to run the
code in a seperate AppDomain without any more permissions than given in the
Internet permission set.
This seems to work okay, except for when the code contains Winform code -
such as MessageBox.Show. The following exception is thrown when
UntrustedMethod is called in my sandboxed appdomain:
System.Security.Policy.PolicyException: Required permissions cannot be
acquired.
I've tried adding UIPermissionWindow.AllWindows, but that doesn't seem to
help.
Thanks in advance for your help,
Kirk
using System;
using System.Collections;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
namespace Sandbox
{
interface ISandbox {
void UntrustedMethod();
}
[Serializable]
class Sandbox : MarshalByRefObject, ISandbox
{
[STAThread]
static void Main(string[] args) {
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = "Sandbox secure appdomain";
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain sandboxAppDomain = AppDomain.CreateDomain("Sandbox secure
appdomain", null, setup);
// Load the internet permission set, and add UIPermission.AllWindows
NamedPermissionSet permSet = FindNamedPermissionSet("Internet");
permSet.AddPermission(new UIPermission(UIPermissionWindow.AllWindows));
PolicyStatement polState = new PolicyStatement(permSet);
PolicyLevel domainPolicy = PolicyLevel.CreateAppDomainLevel();
AllMembershipCondition allCodeMC = new AllMembershipCondition();
CodeGroup allCodeCG = new UnionCodeGroup(allCodeMC,polState);
domainPolicy.RootCodeGroup = allCodeCG;
sandboxAppDomain.SetAppDomainPolicy(domainPolicy);
// Try running MessageBox.Show in the appdomain
try {
Sandbox sandboxObject =
(Sandbox)sandboxAppDomain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
"Sandbox.Sandbox");
sandboxObject.UntrustedMethod();
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
private static NamedPermissionSet FindNamedPermissionSet(string name) {
IEnumerator policyEnumerator = SecurityManager.PolicyHierarchy();
while (policyEnumerator.MoveNext()) {
PolicyLevel currentLevel = (PolicyLevel)policyEnumerator.Current;
if (currentLevel.Label == "Machine") {
IList namedPermissions = currentLevel.NamedPermissionSets;
IEnumerator namedPermission = namedPermissions.GetEnumerator();
while (namedPermission.MoveNext()) {
if (((NamedPermissionSet)namedPermission.Current).Name == name) {
return ((NamedPermissionSet)namedPermission.Current);
}
}
}
}
return null;
}
/// This is an untrusted method executed seperately from the rest of the
application
public void UntrustedMethod() {
System.Windows.Forms.MessageBox.Show(AppDomain.CurrentDomain.FriendlyName);
}
}
}