Как создать песочницу в C# для внешнего процесса? Как играют в песочнице, я понимаю среду для процесса, который я запускаю с C#, которые мешают тому процессу вмешаться во что-либо еще - ядро, системные переменные, конфигурация системы, память, реестр, диск, аппаратные средства, местоположение кроме стартового места и так далее.
Я хочу исполняемый файл места в одном месте и быть уверенным, что это место является только местом, которое может быть изменено этим процессом. Кроме того, исполняемый файл может быть записан в C, C++, C# и и т.д.
Использование Sandboxie в качестве примера того, чего, я думаю, вы хотите достичь в какой-то степени. IMHO, вы не сможете сделать это в чистом управляемом коде .
Если вы хотите иметь возможность ограничивать действия и эффект приложения, независимо от того, является ли оно управляемым, собственным или даже Java-приложением. Подразумевается, что вам нужно будет отслеживать каждое действие, предпринимаемое приложением, и предпринимать соответствующие действия, чтобы гарантировать, что оно не повлияет на вашу систему. Соответствующее действие может означать, что вы перенаправляете запись приложения в другое место на диске, записываете виртуализированный реестр, чтобы не повлиять на реальный реестр и т. Д. И т. Д. предоставить сегодня.
Заметьте, я сказал, что чистый управляемый код, вы, конечно, можете использовать Interop Services и т. Д., Чтобы воспользоваться преимуществами неуправляемой реализации определенных областей кода, или вы можете использовать управляемый C ++. Однако в зависимости от точных деталей того, что вы хотите, чтобы ваша песочница выполняла, вам, вероятно, потребуется реализовать драйвер режима ядра, чтобы гарантировать, что вы можете в достаточной степени виртуализировать среду для приложений изолированного в песочнице режима пользователя.
Если вы хотите запускать только управляемый код, относительно легко создать среду песочницы, используя 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