[C# .NET 4] Assembly rechten verminderen met AppDomainSetup

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
Een applicatie X leest assemblies in die in een plugin folder zitten. Deze assemblies bevatten een concrete implementatie van de interfaces die applicatie X uitgeeft. De assemblies kunnen dus van derden zijn en dat is ook de bedoeling.

Nu wil ik deze assemblies restricties opleggen van wat ze mogen doen. b.v. Alleen bestanden inlezen in een subfolder van waar de applicatie staat bv. c:\..\..\AppX\Plugins.

Dit doe ik uiteraard om te voorkomen dat de assembly van derden niet zomaar zonder toestemming 'Mijn Documenten' kunnen uitlezen.

Nu heb ik via msdn een uitwerking gevonden die ik aangepast heb.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public IList<string> GetPlugin(String pathToSearch)
        {
            Evidence limitedEvidence = new Evidence();
            limitedEvidence.AddHostEvidence(new Zone(SecurityZone.NoZone));
            PermissionSet clrSandbox = SecurityManager.GetStandardSandbox(limitedEvidence);
            clrSandbox.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
            clrSandbox.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, pathToSearch));

            AppDomainSetup sandboxSetup = new AppDomainSetup();
            sandboxSetup.ApplicationBase = Path.GetFullPath(pathToSearch);
            AppDomain sandbox = AppDomain.CreateDomain("My little sandbox", limitedEvidence, sandboxSetup, clrSandbox);
            
            IList<string> result = new List<string>();
            string[] assemblies = Directory.GetFiles(pathToSearch, "*.dll");

            foreach (string assembly in assemblies)
            {
                try
                {
                    Assembly asm = Assembly.LoadFrom(assembly);
                    foreach (Type type in asm.GetTypes())
                    {
                        Type[] interfaces = type.GetInterfaces();
                        foreach (Type myInterface in interfaces)
                        {
                            //If class is concrete and has the specified interface
                            if (type.IsClass && myInterface.Name.Equals(typeof(IPlugin).Name) && myInterface.Namespace.Equals(typeof(IPlugin).Namespace))
                            
                                IPlugin plugin = sandbox.CreateInstanceFromAndUnwrap(assembly, type.FullName) as IPlugin;

                                if (plugin != null)
                                {
                                    result.Add(plugin.Pluginname);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    //Hier moeten de assemblies komen die teveel rechten vragen dan is toegestaan
                    Console.WriteLine("Skipped assembly {0}", assembly);
                }
            }


En de code voor de untrusted assembly
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public class UntrustedPlugin : IPlugin
    {
        public string Pluginname
        {
            get 
            {
                //Dit zou nooit uitgevoerd mogen worden. omdat ik daar geen permissie voor wil geven
                String[] fileNames = Directory.GetFiles(@"c:\", "*.txt");
                StringBuilder sb = new StringBuilder();
                foreach (string fn in fileNames)
                {
                    sb.AppendLine(System.IO.File.ReadAllText(fn));
                }
                Console.WriteLine(sb.ToString());
                return "Test";
            }
        }
    }


Wat is mijn probleem: De code wordt netjes uitgevoerd! Het zou een exceptie moeten opleveren.
Het lijkt erop dat de restricties niet worden nageleefd. Maar als ik SecurityPermissionFlag.Execution niet zet komt hij met runtime wel met een exceptie en FileIOPermissionAccess moet ook aanstaan omdat hij anders de gedeelde plugin interface niet kan vinden.

W7 x64 VS2010 en UAC staat uit.
ps.: Ik weet het bestaan af van MEF en System.Addins

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles