沙箱。代码访问安全性。 System.Security.Permissions.FileIOPermission

时间:2013-12-14 18:50:54

标签: c# .net security .net-assembly appdomain

我正在尝试构建一个简单的模型。托管控制台应用;可信API组件和低信任客户端插件程序集。为此,我创建了一个控制台应用程序,它构建了具有最小权限的最小appdomain,我构建了一个可信API并签名,将“API”程序集加载到新域并称为“文件写入”方法。我希望这个调用能够通过,因为据我所知,如果强名称程序集(signed)默认加载到任何域,它的行为就像SecurityCritical一样。 但令我惊讶的是,汇编方法引发了异常System.Security.Permissions.FileIOPermission。

由于某种原因,调用crFile()方法会导致安全性异常。令人惊讶的是,FileReaderThing类的构造函数中的相同调用顺利进行,没有例外。

请帮忙

以下是Main的代码

class Program
{
    const string APIDLLPath = @"C:\prototypes\sandboxes\trustedlib.dll";

    static void Main(string[] args)
    {
        PermissionSet restrictedPerms = new PermissionSet(PermissionState.None);
        restrictedPerms.AddPermission( new SecurityPermission(SecurityPermissionFlag.Execution));

        AppDomainSetup appDomainSetup = new AppDomainSetup
        {
            ApplicationBase = @"C:\prototypes\sandboxes",
        };
        Assembly a = Assembly.LoadFile(APIDLLPath);
        StrongName apiStrongName = a.Evidence.GetHostEvidence<StrongName>();
        AppDomain sandbox = AppDomain.CreateDomain(
            "Sandbox", null, appDomainSetup, restrictedPerms, apiStrongName);

        try
        {
            //object o = sandbox.CreateInstanceFromAndUnwrap(APIDLLPath,
            //                                          "TrustedLib.FileReaderThing");
            ObjectHandle o = Activator.CreateInstanceFrom(sandbox, APIDLLPath,
                                                      "TrustedLib.FileReaderThing");
            IFileReaderThing ifl = (IFileReaderThing)o.Unwrap();
            ifl.crFile();
        }
        catch (Exception exc)
        {
            Console.WriteLine( "exception: a= {0}\nb = {1}", exc.Message, exc.InnerException);
        }

    }
}

这是我的简单装配:

**[assembly: AllowPartiallyTrustedCallers]**
namespace TrustedLib
{
    public interface IFileReaderThing
    {
        void crFile();
    }
    public class FileReaderThing : MarshalByRefObject, IFileReaderThing
    {
        **[SecuritySafeCritical]**
        public FileReaderThing()
        {
            Console.WriteLine("FileReaderThing ctor");
            crFile();
        }
        public void crFile()
        {
            try
            {
                **(new PermissionSet(PermissionState.Unrestricted)).Assert();**
                var file = new System.IO.StreamWriter(@"c:\katia\troha.txt", true);
                file.WriteLine("troha");
                file.Close();
            }
            catch (Exception exc)
            {
                Console.WriteLine("exception {0}", exc.Message);
            }
        }
    }
}

我在安全挑战函数crFile中添加了一个声明(下面),添加了程序集范围属性AllowPartiallyTrustedCallers]并使用SecuritySafeCritical属性修饰了crFile函数,一切都开始工作。我仍然不明白为什么需要“断言”调用,但它有效

                 (new PermissionSet(PermissionState.Unrestricted)).Assert();

0 个答案:

没有答案