Я работал над личным проектом на C #, который позволяет пользователю выполнять сценарии, написанные другими пользователями, и ограничивать разрешения этого сценария.Я могу использовать механизмы .NET Code Access Security для того, чтобы изолировать пользовательские сценарии от песочницы и убедиться, что у них есть только те разрешения, которые пользователь хочет им предоставить.
В общих чертах, мои требования безопасности:
- пользователь должен иметь возможность ограничить доступ ненадежного сценария только к определенным частям файловой системы, включая запрет на доступ ко всей файловой системе
- пользователь должен иметь возможность ограничить сетевые подключения ненадежного сценария только определенными IP-адресамиили имена хостов, включая запрещение всех сетевых подключений
- все в порядке, если пользовательскому сценарию удается повесить или завершить хост-приложение, но пользовательский сценарий не должен быть в состоянии обойти ограничения разрешений (то есть отказ в обслуживании - это нормальноНарушение не)
Я собираюсь сделать что-то подобное в C ++, в качестве своего рода личного упражнения.Очевидно, что при непосредственном запуске нативного кода все становится сложнее, даже если пользовательские сценарии написаны на языке сценариев, таком как Lua.
Первый подход, который я могу придумать, - это вставить свои собственные хуки в стандартную среду сценариев.библиотечные функции.Например, если языком сценариев является Lua, вместо того, чтобы нормально показывать io.open
, я должен был бы предоставить оболочку, которая проверяла аргументы против разрешений сценария, прежде чем передавать их исходной реализации.
Моя проблема сэтот подход заключается в том, что он резко увеличивает объем моего собственного кода, отвечающего за безопасность, и, следовательно, потенциальную уязвимость безопасности, которую я написал сам.Другими словами, работая с .NET CAS, я могу доверять тому, что Microsoft хорошо выполнила свою работу в коде песочницы, в отличие от необходимости доверять моему собственному коду песочницы.
Существуют ли альтернативы, которые я не знаюиз