вчера копаясь в Reflection, наткнулся на любопытную фишку. оказывается, можно не только читать значения private-полей объекта, но и записывать их!
пишется просто
MyClass obj = new MyClass();
FieldInfo field = typeof(obj).GetField(fieldname, // fieldname - имя private-поля класса MyClass
BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine("Field " + fieldname + " value: " + field.GetValue(data).ToString();
field.SetValue(obj,newvalue);
Console.WriteLine("Field " + fieldname + " new value: " + field.GetValue(data).ToString();
это что же получается??? можно не только читать private-поля, но и изменять их значения? то есть если у меня на счету есть 1 рубль, я могу через Reflection поменять это значение на миллион?
может, я чего не понял. наверняка должен быть механизм блокирования этой возможности. если кто знает, поделитесь? и еще, кстати, какие похожие "глюки" есть в .NET — возможность подменить метод в процессе исполнения, зарегистрировать обработчики на спрятанные события? и кто-то уже использовал эту возможность для мелкого хака?
Hello, "bobbisson" > это что же получается??? можно не только читать private-поля, но и изменять их значения? то есть если у меня на счету есть 1 рубль, я могу через Reflection поменять это значение на миллион? >
Посмотри класс ReflectionPermission
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: доступ к private полям через FieldInfo
От:
Аноним
Дата:
07.12.04 14:42
Оценка:
Здравствуйте, bobbisson, Вы писали:
B>может, я чего не понял. наверняка должен быть механизм блокирования этой возможности.
CAS-ом можно запретить. Но CAS можно хакнуть путем декомпиляции и изменения сборки. В общем, спасенья нет
Re: доступ к private полям через FieldInfo
От:
Аноним
Дата:
07.12.04 14:52
Оценка:
Чтобы защититься от перекомпиляции надо сборки подписывать.
Здравствуйте, Аноним, Вы писали:
А>Перекомпилировать вы её сможете. Вот только нормальная система её не загрузит без соответствующей подписи.
Пример "нормальной системы", плиз!
Re[2]: доступ к private полям через FieldInfo
От:
Аноним
Дата:
07.12.04 16:00
Оценка:
Все-таки интересно было бы узнать, как в приведенном bobbisson коде можно из класса MyClass (сборки) запретить внешнему коду изменять private members. Может быть глубокоуважаемые зубры секьюрити расшифруют свои намеки, как именно приложить ReflectionPermission в данном контексте.
"One caveat with visibility is that even properly designed visibility of types in an application cannot protect against code that is granted the ReflectionPermission with the MemberAccess flag or the SecurityPermission with the SerializationFormatter flag. Any applications granted the ReflectionPermission with the MemberAccess flag can read and write to private fields, call private methods, and create instances of private classes. Applications that were granted the SecurityPermission with the SerializationFormatter permission can read or write private fields of classes if they can serialize them to a data blob, change that data blob, and deserialize it back to the class. These are considered powerful permissions, so they aren't granted to any Internet or intranet code by default." (с) .NET Framework Security by Brian A. LaMacchia, Sebastian Lange, Matthew Lyons, Rudi Martin, Kevin T. Price
Кроме как посредством not being granted ReflectionPermission у вызывающего кода (например, настройкой политики безопасности), как это сделать из вызываемого кода я не понимаю. Наверное туплю. Большая просьба намекнуть как это можно сделать.
Спасибо!
Здравствуйте, Аноним, Вы писали:
А>Кроме как посредством not being granted ReflectionPermission у вызывающего кода (например, настройкой политики безопасности), как это сделать из вызываемого кода я не понимаю. Наверное туплю. Большая просьба намекнуть как это можно сделать.
вот именно, как защитить код от такого манипулирования? я, честно говоря, был очень удивлен когда у меня получилось достучаться для private-полей — я ожидал какого-то Exception'а. прописывать какие-то атрибуты для классов? на уровне приложения "злоумышленник" не будет устанавливать никаких ReflectionPermission'ов, ежу ясно!
Здравствуйте, ASTeC, Вы писали:
AST>Перекомпилировать вы её сможете. Вот только нормальная система её не загрузит без соответствующей подписи.
Ну раз взялись за дело, то можно и "нормальную систему" перекомпилировать
... << RSDN@Home 1.1.4 >>
Re[4]: доступ к private полям через FieldInfo
От:
Аноним
Дата:
08.12.04 09:33
Оценка:
Здравствуйте, bobbisson, Вы писали:
B>вот именно, как защитить код от такого манипулирования? я, честно говоря, был очень удивлен когда у меня получилось достучаться для private-полей — я ожидал какого-то Exception'а. прописывать какие-то атрибуты для классов? на уровне приложения "злоумышленник" не будет устанавливать никаких ReflectionPermission'ов, ежу ясно!
Раз зубры молчат, предлагаю прежний CAS. Некрасиво, но можно на все приватные члены подлежащие защите зааплаить StrongNameIdentityPermissionAttribute. Что-то типа:
public class MyClass
{
[StrongNameIdentityPermission(SecurityAction.LinkDemand,
PublicKey="0024000 ......... (full PK blob) 44ad7d0b3ef4fbd",
Name="MyClassAssembly")]
private double _oneRubleField;
}
Re[2]: доступ к private полям через FieldInfo
От:
Аноним
Дата:
08.12.04 08:20
Оценка:
>Чтобы защититься от перекомпиляции надо сборки подписывать.
От перекомпиляции это никак не защитит. Strong name не дает такой защиты. Пример можно посмотреть на codeproject'е, там есть ряд статей про подписывание сборок и как эту подпись убрать.
Strong name (по сути обычная цифровая подпись) нужен лишь для того, чтобы программист использующий библиотеку, был уверен, что она была получена именно от производителя этой билиотеки, что ее никто не подменил/изменил.
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group
Здравствуйте, Аноним, Вы писали:
А>можно использовать ReflectionPermissionAttribute вот так:
А>[assembly: ReflectionPermission(SecurityAction.RequestRefuse, MemberAccess=true)]
Ну и? Сборка содержащая MyClass будет лишена ReflectionPermission. Как это может защитить её от внешнего когда имеющего ReflectionPermission?
Re[4]: доступ к private полям через FieldInfo
От:
Аноним
Дата:
08.12.04 10:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, <Аноним>, Вы писали:
А>>Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?
AVK>Здесь можно поподробнее?
Здравствуйте, AndrewVK, Вы писали:
А>>>Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?
AVK>>>Здесь можно поподробнее?
А>>Какой момент нужно осветить подробнее?
AVK>Ну каким образом ты сможешь использовать рефлекшен, если в политике указать запрет рефлекшена для сборок, не подписанных определенным набором ключей?
И какая связь вопросов?
Освещаю. В использованием политики все понятно, все можно сделать. Но вопрос заключается в том, как защитить сборку от внешнего решлекшена, скажем так, на этапе Construction, а на не этапе Deployment-а.
Hello, > > Раз зубры молчат, предлагаю прежний CAS. Некрасиво, но можно на все приватные члены подлежащие защите зааплаить StrongNameIdentityPermissionAttribute. Что-то типа: > >