Search code examples
c#.netazureazure-functionsappdomain

AppDomain in Azure Function


I have tried to create an AppDomain within Azure Functions to run untrusted code. Creating the domain seems to work fine, but when I try to load in assemblies, it seems like they get loaded in incorrectly.

First I tried a simple AppDomain:

public class Sandboxer
{
    public void Run()
    {
        AppDomain newDomain = AppDomain.CreateDomain("name");
        var obj = newDomain.CreateInstance(typeof(OtherProgram).Assembly.FullName, typeof(OtherProgram).FullName).Unwrap();
    }
}

public class OtherProgram : MarshalByRefObject
{
    public void Main(string[] args)
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        foreach (var item in args)
            Console.WriteLine(item);
    }
}

I got an error

"System.IO.FileNotFoundException : Could not load file or assembly 'Sandboxer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cd9cb1d6fdb50b4' or one of its dependencies. The system cannot find the file specified."

I then tried to set the appliactionBase to the folder with my dll in it.

public class Sandboxer
{
    public void Run()
    {
        var location = typeof(OtherProgram).Assembly.Location;
        AppDomainSetup ads = new AppDomainSetup();
        ads.ApplicationBase = Path.GetDirectoryName(location);
        AppDomain newDomain = AppDomain.CreateDomain("name", null, ads);
        var obj = newDomain.CreateInstance(typeof(OtherProgram).Assembly.FullName, typeof(OtherProgram).FullName).Unwrap();
        var other = obj as OtherProgram;
        var other2 = obj as MarshalByRefObject;
    }
}

public class OtherProgram : MarshalByRefObject
{
    public void Main(string[] args)
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        foreach (var item in args)
            Console.WriteLine(item);
    }
}

In this case, "other" is null at the end of the Run() method, but "other2" is a __TransparentProxy. It seems like it is finding and loading the dll, but doesn't understand the type.

How can I fix this problem? Thanks!

Cross posted here: https://social.msdn.microsoft.com/Forums/azure/en-US/59b119d8-1e51-4460-bf86-01b96ed55b12/how-can-i-create-an-appdomain-in-azure-functions?forum=AzureFunctions&prof=required


Solution

  • AppDomains are not usable with Azure Functions. In order to properly sandbox code in Azure Functions, you would have to create a new Azure Functions App and run the code there.

    If you are allowing users to write scripts, you can use another language like Lua that allows easy sandboxing.