Страницы

Поиск по вопросам

понедельник, 20 мая 2019 г.

Домены приложений и безопасность

В доменах приложений есть такая штука, как политики, которые позволяют ограничить домен в правах.
Например, запретить доступ к файловой системе.
Однако, работает ли это на практике?
Разве, когда делается 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; } }

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

Отправить комментарий