Безопасная изоляция пользовательских скриптов в программе на C

#c #sandbox

#c #изолированная среда

Вопрос:

Я работал над личным проектом на C #, который позволяет пользователю выполнять скрипты, написанные другими пользователями, и ограничивать разрешения этого скрипта. Я могу использовать .NET Code Обеспечивает доступ к механизмам безопасности к пользовательским скриптам в изолированной среде и гарантирует, что у них есть только те разрешения, которые пользователь хочет им предоставить.

Вообще говоря, мои требования к безопасности таковы:

  • пользователь должен иметь возможность ограничить доступ ненадежного скрипта только к определенным частям файловой системы, включая запрет на весь доступ к файловой системе
  • пользователь должен иметь возможность ограничить сетевые подключения ненадежного скрипта только определенными IP-адресами или именами хостов, включая запрет всех сетевых подключений
  • это нормально, если пользовательскому скрипту удается зависнуть или завершить работу хост-приложения, но пользовательский скрипт не должен иметь возможности обойти ограничения разрешений (т. Е. Отказ в обслуживании — это нормально, нарушение — нет)

Я подумываю о том, чтобы попытаться сделать что-то подобное на C , в качестве своего рода личного упражнения. Очевидно, что при непосредственном запуске собственного кода все сложнее, даже если пользовательские скрипты написаны на языке сценариев, таком как Lua.

Первый подход, который я могу придумать, это вставить мои собственные хуки в стандартные библиотечные функции среды сценариев. Например, если языком сценариев является Lua, вместо того, чтобы предоставлять доступ io.open обычным образом, мне пришлось бы предоставить оболочку, которая проверяла аргументы на соответствие разрешениям скрипта, прежде чем передавать их в исходную реализацию.

Меня беспокоит этот подход в том, что он резко увеличивает объем моего собственного кода, отвечающего за безопасность, и, следовательно, потенциальную уязвимость в системе безопасности, которую я написал сам. Другими словами, при работе с .NET CAS я могу быть уверен, что Microsoft хорошо выполнила свою работу в коде изолированной среды, в отличие от необходимости доверять моему собственному коду изолированной среды.

Есть ли какие-либо альтернативы, о которых я не знаю?

Комментарии:

1. Запустите скрипт в отдельном процессе, чтобы он выполнялся в своем собственном изолированном адресном пространстве.

2. Я не совсем уверен, но такой вопрос, вероятно, лучше задать в SE Software Engineering . Слишком широкий, чтобы отвечать здесь кратко.

3. Используйте контейнеры.

4. Приношу свои извинения, я не был осведомлен о разработке программного обеспечения SE. Я не слишком часто использую Stack Exchange или Stack Overflow, поэтому, боюсь, я был немного не в курсе. Спасибо, что указали мне правильное направление. Я оставлю этот вопрос открытым на всякий случай — сообщество имеет право закрыть его, если сочтет это неуместным.

5. @VojislavStojkovic СПАСИБО, что заметил. «Я оставлю этот вопрос открытым на всякий случай» Перекрестная публикация вопросов на сайтах SE не очень хорошо воспринимается. Лучше определенно решить, куда обращаться, и удалять сообщения с неподходящих сайтов.