Как создать песочницу в C # для внешнего процесса? - PullRequest
15 голосов
/ 12 июня 2010

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

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

Ответы [ 2 ]

5 голосов
/ 14 июля 2010

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

        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");

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

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

2 голосов
/ 12 июня 2010

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

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

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

...