Инверсия набора разрешений: запуск приложения .NET 4.0 с «полным доверием - (минус) доступ на запись» - PullRequest
1 голос
/ 14 февраля 2011

У меня есть служба WCF для связи с ядром Mathematica для оценки произвольных выражений и получения результатов.(Мое единственное намерение состоит в том, чтобы использовать Mathematica как сложный механизм компоновки графов для статических графов, использующих SVG и XAML, но мой хост с математическим ядром может иметь совершенно простой интерфейс, который может оценивать произвольные выражения Mathematica: это может в случае нарушения безопасностипривести к произвольному внедрению кода.)

  • Есть ли способ запустить приложение в sandbux с «полным набором прав доступа - (минус) файл io доступ на запись»?

Использование

    var e = new Evidence();
    e.AddHostEvidence(new Zone(SecurityZone.Trusted));
    var pset = SecurityManager.GetDefaultSandbox(e);

приводит к ситуации, когда мое приложение вылетает из-за более позднего исключения безопасности, поэтому я хочу убедиться, что я просто удалил один тип разрешения.Мне не хватает подробностей о типе исключения безопасности и о том, что его вызвало, моя программа связана с коммерческой библиотекой без символов отладки.

  • Как отладитьказнь внутри коммерческой библиотеки?Может ли рефлектор или аналогичный инструмент помочь мне?

  • Как получить лучшую трассировку стека об исключении безопасности?(Полный источник текущего приложения для песочницы приведен ниже)

или

    var pset = new PermissionSet(PermissionSet.Unrestricted); // set is empty o_O!
    pset.RemovePermission(typeof(FileIOPermission)); // io permission still active

...

не помогает.

полный контекст:

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;

class Sandboxer : MarshalByRefObject
{
    const string uPath = @"..\..\..\KernelHost\bin\Debug";
    static string aPath = Path.GetFullPath(uPath);
    const string uAssembly = "KernelHost";

    static void Main(string[] args)
    {
        var e = new Evidence();
        e.AddHostEvidence(new Zone(SecurityZone.Trusted));

        var pset = new PermissionSet(PermissionState.Unrestricted);
        //pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
        //pset.AddPermission(new UIPermission(UIPermissionWindow.AllWindows, UIPermissionClipboard.AllClipboard));
        //pset.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, aPath));
        //pset.SetPermission(new UIPermission(PermissionState.None));
        pset.RemovePermission(typeof(UIPermission));
        //pset.SetPermission(new FileIOPermission(PermissionState.None));

        var ass = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

        var ads = new AppDomainSetup();
        ads.ApplicationBase = aPath;

        var sandbox = AppDomain.CreateDomain(
            "Sandbox",
            e,
            ads,
            pset,
            ass);

        Console.WriteLine(pset.Count);
        foreach (IPermission p in pset)
        {
            Console.WriteLine(p.ToXml());
        }

        sandbox.ExecuteAssemblyByName("KernelHost");
    }
}

  • Есть ли доступное коммерческое решение для песочницы с открытым исходным кодом для .NET 4.0 или, возможно, на более высоком уровне для Windows Server2008 R2 (также для нативных приложений), который может мне помочь?

1 Ответ

3 голосов
/ 14 февраля 2011

Полное доверие - это больше, чем «все»; это «отключить проверки» - так нет, вы не можете иметь «полное доверие, кроме {foo}», потому что все равно ничего не будет проверено. Вам нужно будет иметь инклюзивный, хотя и большой, сет. И я уверен, что есть некоторые довольно неприятные вещи, которые я могу сделать, которые не пишут файлы ...

...