Песочница
или, как не разрушить песочный замок вашего друга.
Поскольку нам нужно иметь возможность загружать код с серверов, но мы не хотим, чтобы это позволяло серверам стать полноценным вредоносным ПО, SS14 применяет методы песочницы, чтобы контент не мог, ну, стать полноценным вредоносным ПО.
Текущая реализация
Песочница в настоящее время реализована с помощью анализа сборок контента до их загрузки. Сначала сборки проверяются на верифицируемость IL, чтобы убедиться, что они не делают забавных штук с указателями. Затем все ссылки на члены (методы и поля) сборки проверяются по белому списку. Все API, которые потенциально можно использовать для обхода песочницы, конечно же, запрещены.
«Помогите, я получаю нарушение песочницы»
Теперь я перечислю различные советы по исправлению нарушений песочницы, если они всплывут.
Ссылка на System.Activator из ниоткуда.
Внутри C# использует Activator.CreateInstance(), если вы создаёте экземпляр generic-параметра вот так:
public static T Foo<T>() where T : new()
{
return new T();
}
Это на самом деле компилируется в:
public static T Foo<T>() where T : new()
{
return (T)Activator.CreateInstance(typeof(T));
}
Как видите, теперь есть ссылка на System.Activator. Мы не можем разрешить прямое использование этого класса, так как его очень легко использовать для побега из песочницы через, например, конструкторы StreamReader.
Чтобы исправить это, используйте IDynamicTypeFactory.CreateInstance или ISandboxHelper.CreateInstance вместо этого. Они проверяют, что создаваемый тип определён в контенте, и, следовательно, разрешён.
Неверифицируемая инструкция
stackalloc в C# является неверифицируемым IL во всех случаях (да, даже при выделении в Span<T>, что не является unsafe), поскольку используемая им инструкция localloc всегда неверифицируема. К сожалению, здесь можно сделать не так уж много, кроме «не используйте stackalloc».
Всё остальное
Конечно же, количество API, не входящих в белый список, слишком велико, чтобы его сосчитать, поэтому по всем ним я отошлю к «спросите в Discord, если не можете сами придумать альтернативу».