Как создать песочницу в C# для внешнего процесса?

Как создать песочницу в C# для внешнего процесса? Как играют в песочнице, я понимаю среду для процесса, который я запускаю с C#, которые мешают тому процессу вмешаться во что-либо еще - ядро, системные переменные, конфигурация системы, память, реестр, диск, аппаратные средства, местоположение кроме стартового места и так далее.

Я хочу исполняемый файл места в одном месте и быть уверенным, что это место является только местом, которое может быть изменено этим процессом. Кроме того, исполняемый файл может быть записан в C, C++, C# и и т.д.

15
задан Phoenix 30 August 2014 в 21:04
поделиться

2 ответа

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

Если вы хотите иметь возможность ограничивать действия и эффект приложения, независимо от того, является ли оно управляемым, собственным или даже Java-приложением. Подразумевается, что вам нужно будет отслеживать каждое действие, предпринимаемое приложением, и предпринимать соответствующие действия, чтобы гарантировать, что оно не повлияет на вашу систему. Соответствующее действие может означать, что вы перенаправляете запись приложения в другое место на диске, записываете виртуализированный реестр, чтобы не повлиять на реальный реестр и т. Д. И т. Д. предоставить сегодня.

Заметьте, я сказал, что чистый управляемый код, вы, конечно, можете использовать Interop Services и т. Д., Чтобы воспользоваться преимуществами неуправляемой реализации определенных областей кода, или вы можете использовать управляемый C ++. Однако в зависимости от точных деталей того, что вы хотите, чтобы ваша песочница выполняла, вам, вероятно, потребуется реализовать драйвер режима ядра, чтобы гарантировать, что вы можете в достаточной степени виртуализировать среду для приложений изолированного в песочнице режима пользователя.

2
ответ дан 1 December 2019 в 05:11
поделиться

Если вы хотите запускать только управляемый код, относительно легко создать среду песочницы, используя AppDomain с ограниченным набором разрешений:

        PermissionSet ps = new PermissionSet(PermissionState.None);
        // ps.AddPermission(new System.Security.Permissions.*); // Add Whatever Permissions you want to grant here

        AppDomainSetup setup = new AppDomainSetup();
        Evidence ev = new Evidence();

        AppDomain sandbox = AppDomain.CreateDomain("Sandbox",
            ev,
            setup,
            ps);

        sandbox.ExecuteAssembly("ManagedAssembly.exe");

Но как только вы открываете дверь для неуправляемого/небезопасного кода, все ставки сделаны, и становится очень трудно обеспечить безопасность кода сторонних разработчиков. Как уже говорилось, вам придется создать промежуточное звено между исполняемым кодом и ОС, чтобы ограничить то, что он может делать, если только не достаточно запускать его как ограниченного пользователя и полагаться только на ACLs/UAC для защиты.

ПРИМЕЧАНИЕ: этот пример кода не является рабочим примером, это просто идея того, как будет выглядеть код. Вероятно, потребуется некоторая доработка Evidence и AppDomainSetup, и вы, конечно, должны исследовать/тестировать все, что можно, учитывая последствия для безопасности. Вот хорошая статья на эту тему: http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

5
ответ дан 1 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: