В доменах приложений есть такая штука, как политики, которые позволяют ограничить домен в правах.
Например, запретить доступ к файловой системе.
Однако, работает ли это на практике?
Разве, когда делается Unwarp, то сборка из домена не загружается в основной домен?
=> если сборка вредоносная, то можно запихать в статический конструктор какую-то гадость, например format c => безопасность рушится, даже если домен был ограничен в правах.
Или не все так просто, или с доменами работают по другому?
Ответ
Да, Unwrap загрузит сборку и в основной домен тоже. Поэтому правильно делается по-другому:
создается в основной, доверенной, сборке класс-наследник MarshalByRefObject;
экземпляр этого класса загружается в новом домене, и ему (доверенному экземпляру) делается Unwrap;
все дальнейшее взаимодействие с объектами в новом домене делается через этот объект.
Для ситуации плагинов имеет смысл для каждого интерфейса, который может быть плагином реализован, подготовить свой кросс-доменный прокси для загрузки в домене плагина. В простейшем случае такой прокси будет просто делегировать все вызовы:
class FooCrossDomainProxy: MarshalByRefObject, IFoo
{
private readonly IFoo target;
public void FooCrossDomainProxy(IFoo target)
{
this.target = target;
}
public void Bar() => target.Bar();
}
В более сложном случае этому прокси можно поручить адаптацию интерфейса к кросс-доменному взаимодействию. К примеру, поскольку вызовы между доменами медленные - имеет смысл снижать их число путем объединения методов:
class FooCrossDomainProxy: MarshalByRefObject
{
private readonly IFoo target;
public void FooCrossDomainProxy(IFoo target)
{
this.target = target;
}
public bool TryBar()
{
if (!target.CanBar)
return false;
target.Bar();
return true;
}
}
Комментариев нет:
Отправить комментарий