#c# #.net #sandbox #code-access-security
#c# #.net #песочница #код-доступ-безопасность
Вопрос:
Я хотел использовать отражение от моего «изолированного» рабочего класса и поймал поведение, которое я не могу правильно объяснить.
- Если я не добавлю текущую сборку в FullTrustList при создании appdomain, то код выполняется нормально.
- Если я добавлю текущую сборку в FullTrustList, то PropertyInfo.GetValue вызовет исключение SecurityException. Для этого требуется полное доверие, но в пределах appdomain у меня ограниченные наборы разрешений.
Проблема может быть решена с помощью PermissionSet.Assert(), но для меня это выглядит как грязный взлом.
Кто-нибудь знает, почему оценка разрешений кода отличается в обоих случаях?
public static class Security
{
public static void Fail()
{
var name = Guid.NewGuid().ToString();
var appSetup = new AppDomainSetup
{
ApplicationName = name,
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
};
// add permissions
var permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.MemberAccess));
permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
var type = typeof(Worker);
// get strong name to add assembly in full-trusted
var sn1 = type.Assembly.Evidence.GetHostEvidence<StrongName>();
var domain = AppDomain.CreateDomain(name, null, appSetup, permissions, sn1);
var worker = (Worker) Activator.CreateInstanceFrom(domain,
type.Assembly.ManifestModule
.FullyQualifiedName,
type.FullName).Unwrap();
try
{
worker.TryReflect();
}
catch (SecurityException ex)
{
Console.WriteLine(ex.ToString());
}
}
private class Worker : MarshalByRefObject
{
public static int Prop1 { get; private set; }
public void TryReflect()
{
var prop = typeof (Worker).GetProperty("Prop1");
// exception is thrown here:
var val = prop.GetValue(null);
}
}
}
Пример здесь https://www.sendspace.com/file/svdzhk