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

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

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


person SuitUp    schedule 12.06.2010    source источник


Ответы (2)


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

person Paul Wheeler    schedule 13.07.2010
comment
Честно говоря, я бы не знал, с чего начать с неуправляемого/небезопасного кода, и его выяснение заняло бы несколько месяцев, требующих глубокого понимания ОС Windows, вызовов ядра/системы, распределения памяти и доступа. Люди, работающие в Microsoft, не могут даже правильно понять это. - person Paul Wheeler; 18.07.2010
comment
Мой совет: измените свои требования, либо принимайте только управляемый код, либо дайте понять своим пользователям, что они должны использовать только сторонние исполняемые файлы, которым они доверяют. Если вы просто не имеете в виду запуск процесса от имени другого пользователя, в этом случае проверьте свойства Domain/UserName/Password класса ProcessStartInfo. - person Paul Wheeler; 18.07.2010
comment
Дело в том, что я не могу принять только управляемый код (производительность, большую часть времени мне нужен чистый c), и вся идея состоит в том, чтобы использовать сторонние исполняемые файлы. Это основное назначение всей системы. Что мне теперь делать? Создать новый вопрос или как? - person SuitUp; 20.07.2010

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

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

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

person Chris Taylor    schedule 12.06.2010
comment
Вы сказали о перенаправлении в другой реестр или место на диске. Как насчет полной блокировки использования реестра и не заморачиваться с перенаправлением? Будет проще? Потому что этим приложениям не нужны никакие из этих функций. Я просто хочу их заблокировать. - person SuitUp; 15.06.2010
comment
@SuitUp, хотя это может быть проще, тот же или аналогичный механизм по-прежнему требуется для перехвата вызовов и их сбоя. Значительное упрощение заключается в том, что вам не нужно виртуализировать реестр и т. д., но сложность перехвата остается. Вы можете использовать такую ​​библиотеку, как Detours, для перехвата, но, честно говоря, я сомневаюсь, что это даст вам надежное и надежное решение для песочницы, конечно, я предполагаю, что вам требуется полное надежное и безопасное решение, которое потребует больше, чем базовый перехват вызовов. . - person Chris Taylor; 15.06.2010
comment
Ваше предположение верно. Можете ли вы дать мне некоторые технические подробности? - person SuitUp; 14.07.2010