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

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

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

Ответ 1

Если вы только хотели запустить управляемый код, относительно легко создать среду Sandbox с помощью 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");

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

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

Ответ 2

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

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

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