доступ к private полям через FieldInfo
От: bobbisson Россия http://fuzzy.ru/
Дата: 07.12.04 14:10
Оценка: :))
вчера копаясь в 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 — возможность подменить метод в процессе исполнения, зарегистрировать обработчики на спрятанные события? и кто-то уже использовал эту возможность для мелкого хака?
Re: доступ к private полям через FieldInfo
От: TK Лес кывт.рф
Дата: 07.12.04 14:41
Оценка: 22 (2) +1
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
Оценка:
Чтобы защититься от перекомпиляции надо сборки подписывать.
--
Спасибо за внимание


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 07.12.04 14:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Чтобы защититься от перекомпиляции надо сборки подписывать.


И что? Я не могу декомпилировать подписанную сборку? Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?
Re[2]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 07.12.04 15:08
Оценка:
Здравствуйте, TK, Вы писали:

TK>Посмотри класс ReflectionPermission


А конкретнее? Как их здесь применить? PermitOnly?
Re[2]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 07.12.04 15:07
Оценка:
Перекомпилировать вы её сможете. Вот только нормальная система её не загрузит без соответствующей подписи.
--
Спасибо за внимание


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 07.12.04 15:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Перекомпилировать вы её сможете. Вот только нормальная система её не загрузит без соответствующей подписи.


Пример "нормальной системы", плиз!
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 у вызывающего кода (например, настройкой политики безопасности), как это сделать из вызываемого кода я не понимаю. Наверное туплю. Большая просьба намекнуть как это можно сделать.
Спасибо!
Re[3]: доступ к private полям через FieldInfo
От: bobbisson Россия http://fuzzy.ru/
Дата: 07.12.04 17:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Кроме как посредством not being granted ReflectionPermission у вызывающего кода (например, настройкой политики безопасности), как это сделать из вызываемого кода я не понимаю. Наверное туплю. Большая просьба намекнуть как это можно сделать.


вот именно, как защитить код от такого манипулирования? я, честно говоря, был очень удивлен когда у меня получилось достучаться для private-полей — я ожидал какого-то Exception'а. прописывать какие-то атрибуты для классов? на уровне приложения "злоумышленник" не будет устанавливать никаких ReflectionPermission'ов, ежу ясно!
Re[3]: доступ к private полям через FieldInfo
От: rockandroll Казахстан  
Дата: 08.12.04 03:08
Оценка:
Здравствуйте, 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


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
доступ к private полям через FieldInfo
От: Аноним  
Дата: 08.12.04 09:12
Оценка:
можно использовать ReflectionPermissionAttribute вот так:

[assembly: ReflectionPermission(SecurityAction.RequestRefuse, MemberAccess=true)]
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: доступ к private полям через FieldInfo
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.12.04 10:06
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?


Здесь можно поподробнее?
... << RSDN@Home 1.1.4 beta 3 rev. 252>>
AVK Blog
Re: доступ к private полям через FieldInfo
От: Аноним  
Дата: 08.12.04 10:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>можно использовать ReflectionPermissionAttribute вот так:


А>[assembly: ReflectionPermission(SecurityAction.RequestRefuse, MemberAccess=true)]


Ну и? Сборка содержащая MyClass будет лишена ReflectionPermission. Как это может защитить её от внешнего когда имеющего ReflectionPermission?
Re[4]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 08.12.04 10:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, <Аноним>, Вы писали:


А>>Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?


AVK>Здесь можно поподробнее?


Какой момент нужно осветить подробнее?
Re[5]: доступ к private полям через FieldInfo
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.12.04 10:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

AVK>>Здесь можно поподробнее?


А>Какой момент нужно осветить подробнее?


Ну каким образом ты сможешь использовать рефлекшен, если в политике указать запрет рефлекшена для сборок, не подписанных определенным набором ключей?
... << RSDN@Home 1.1.4 beta 3 rev. 252>>
AVK Blog
Re[6]: доступ к private полям через FieldInfo
От: Аноним  
Дата: 08.12.04 10:47
Оценка:
Здравствуйте, AndrewVK, Вы писали:

А>>>Я не смогу её после изменения переподписать тем же приватным ключом, ну и что?


AVK>>>Здесь можно поподробнее?


А>>Какой момент нужно осветить подробнее?


AVK>Ну каким образом ты сможешь использовать рефлекшен, если в политике указать запрет рефлекшена для сборок, не подписанных определенным набором ключей?


И какая связь вопросов?
Освещаю. В использованием политики все понятно, все можно сделать. Но вопрос заключается в том, как защитить сборку от внешнего решлекшена, скажем так, на этапе Construction, а на не этапе Deployment-а.
Re[5]: доступ к private полям через FieldInfo
От: TK Лес кывт.рф
Дата: 08.12.04 10:52
Оценка:
Hello,
>
> Раз зубры молчат, предлагаю прежний CAS. Некрасиво, но можно на все приватные члены подлежащие защите зааплаить StrongNameIdentityPermissionAttribute. Что-то типа:
>
>
> public class MyClass
> {
> [StrongNameIdentityPermission(SecurityAction.LinkDemand,
> PublicKey="0024000 ......... (full PK  blob) 44ad7d0b3ef4fbd",
> Name="MyClassAssembly")]
> private double _oneRubleField;
> }
>


LinkDemand как следует из названия будет проверяться только на jit компиляции. После этого — никаких проверок проводиться не будет.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.