11
votes

Restreindre l'accès du plug-in au système de fichiers et au réseau via AppDomain

J'ai demandé il y a longtemps comment restreindre l'accès aux plugins (je veux les empêcher d'écrire sur le disque ou le réseau) et on m'a dit d'utiliser AppDomain . J'ai cherché et essayé et a échoué sur la façon d'obtenir ce travail.

Quelqu'un peut-il fournir des informations pour que je puisse commencer, il suffit de mettre une appdomaine qui ne permet pas d'écrire au fichier ou au réseau.


0 commentaires

3 Réponses :


0
votes

Si vous utilisez des plugins, vous pourriez peut-être savoir sur les proxies.

Lors du chargement de votre assemblage via un proxy, vous pouvez spécifier le niveau de stratégie de sécurité pour cet ensemble particulier via la méthode Loadassembly () ou donc, si je me souviens bien. En d'autres termes, cela se fait par réflexion.

Je sais que ma réponse n'est pas si détaillée, mais j'espère que cela vous donnera une idée de la recherche de votre solution. Je vais prendre un œil sur le point de trouver des détails supplémentaires sur le sujet afin que je puisse être d'une meilleure aide. =)

J'espère que vous partagerez vos résultats lorsque vous l'avez fait.


0 commentaires

7
votes

Je suppose que c'est ce dont vous avez besoin, si je comprends bien votre point de vue correctement.

System.Security.PermissionSet ps = 
    new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None);
ps.AddPermission(new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.NoAccess, "C:\\"));
System.Security.Policy.PolicyLevel pl = System.Security.Policy.PolicyLevel.CreateAppDomainLevel();
pl.RootCodeGroup.PolicyStatement = new System.Security.Policy.PolicyStatement(ps);
AppDomain.CurrentDomain.SetAppDomainPolicy(pl);
System.Reflection.Assembly myPluginAssembly = AppDomain.CurrentDomain.Load("MyPluginAssembly");


3 commentaires

Cela semble être exactionnellement ce que je suis après, je reçois le nom de montage donné ou la base de codes était invalide. (Exception de HRESULT: 0x80131047) Maintenant, mais je n'ai pas encore eu le temps de regarder davantage (im probablement faire quelque chose de mal). Il a plus de temps demain et il vous le faire savoir


Alors, enfin, était-ce ce que vous cherchiez? Je suppose que depuis que vous semblez avoir vérifié. :-)


@EKS Vous devez charger dans le même dossier ou l'un des enfants du dossier.



17
votes

pour .NET Framewrad 4.0, veuillez suivre le code suivant de Ceci a > Article MSDN.

L'exemple suivant implémente la procédure dans la section précédente. Dans l'exemple, un projet nommé Sandboxer dans une solution Visual Studio contient également un projet nommé non fredustedcode, qui implémente la classe non fredustedClass. Ce scénario suppose que vous avez téléchargé un ensemble bibliothèque contenant une méthode qui devrait renvoyer true ou false pour indiquer si le numéro que vous avez fourni est un numéro de Fibonacci. Au lieu de cela, la méthode tente de lire un fichier de votre ordinateur. L'exemple suivant montre le code non approuvé. P>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.Remoting;

//The Sandboxer class needs to derive from MarshalByRefObject so that we can create it in another 
// AppDomain and refer to it from the default AppDomain.
class Sandboxer : MarshalByRefObject
{
    const string pathToUntrusted = @"..\..\..\UntrustedCode\bin\Debug";
    const string untrustedAssembly = "UntrustedCode";
    const string untrustedClass = "UntrustedCode.UntrustedClass";
    const string entryPoint = "IsFibonacci";
    private static Object[] parameters = { 45 };
    static void Main()
    {
        //Setting the AppDomainSetup. It is very important to set the ApplicationBase to a folder 
        //other than the one in which the sandboxer resides.
        AppDomainSetup adSetup = new AppDomainSetup();
        adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);

        //Setting the permissions for the AppDomain. We give the permission to execute and to 
        //read/discover the location where the untrusted code is loaded.
        PermissionSet permSet = new PermissionSet(PermissionState.None);
        permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

        //We want the sandboxer assembly's strong name, so that we can add it to the full trust list.
        StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

        //Now we have everything we need to create the AppDomain, so let's create it.
        AppDomain newDomain = AppDomain.CreateDomain("Sandbox", null, adSetup, permSet, fullTrustAssembly);

        //Use CreateInstanceFrom to load an instance of the Sandboxer class into the
        //new AppDomain. 
        ObjectHandle handle = Activator.CreateInstanceFrom(
            newDomain, typeof(Sandboxer).Assembly.ManifestModule.FullyQualifiedName,
            typeof(Sandboxer).FullName
            );
        //Unwrap the new domain instance into a reference in this domain and use it to execute the 
        //untrusted code.
        Sandboxer newDomainInstance = (Sandboxer) handle.Unwrap();
        newDomainInstance.ExecuteUntrustedCode(untrustedAssembly, untrustedClass, entryPoint, parameters);
    }
    public void ExecuteUntrustedCode(string assemblyName, string typeName, string entryPoint, Object[] parameters)
    {
        //Load the MethodInfo for a method in the new Assembly. This might be a method you know, or 
        //you can use Assembly.EntryPoint to get to the main function in an executable.
        MethodInfo target = Assembly.Load(assemblyName).GetType(typeName).GetMethod(entryPoint);
        try
        {
            //Now invoke the method.
            bool retVal = (bool)target.Invoke(null, parameters);
        }
        catch (Exception ex)
        {
            // When we print informations from a SecurityException extra information can be printed if we are 
            //calling it with a full-trust stack.
            (new PermissionSet(PermissionState.Unrestricted)).Assert();
            Console.WriteLine("SecurityException caught:\n{0}", ex.ToString());
            CodeAccessPermission.RevertAssert();
            Console.ReadLine();
        }
    }
}


1 commentaires

C'est fantastique - mais que faire dans .net fond?