Aracılığıyla paylaş


Yansıma Yaymada Güvenlik Sorunları

.NET Framework, her biri kendi güvenlik sorunlarıyla birlikte ortak ara dil (CIL) yaymak için üç yol sağlar:

Dinamik kod oluşturma yönteminize bakılmaksızın, oluşturulan kodun yürütülmesi, oluşturulan kodun kullandığı tür ve yöntemlerin gerektirdiği tüm izinleri gerektirir.

Uyarı

Koda yansıtmak ve kod üretmek için gereken izinler, .NET Framework'ün sonraki sürümleriyle değişti. Bu makalenin devamında yer alan Sürüm Bilgileri'ne bakın.

Dinamik Montajlar

Dinamik derlemeler, AppDomain.DefineDynamicAssembly yönteminin aşırı yükleme kullanılarak oluşturulur. Makine genelinde güvenlik ilkesinin ortadan kaldırılması nedeniyle bu yöntemin çoğu aşırı yüklemesi .NET Framework 4'te kullanım dışı bırakılmıştır. Kalan aşırı yüklemeler, güven düzeyinden bağımsız olarak herhangi bir kod tarafından yürütülebilir. Bu aşırı yüklemeler iki gruba ayrılır: dinamik derleme oluşturulduğunda uygulanacak özniteliklerin listesini belirtenler ve olmayanlar. Derleme için saydamlık modelini belirtmezseniz, özniteliği oluşturduğunuzda uygulayarak SecurityRulesAttribute saydamlık modeli yayan derlemeden devralınır.

Uyarı

Oluşturulduktan sonra dinamik derlemeye uyguladığınız öznitelikler, yöntemini kullanarak SetCustomAttribute derleme diske kaydedilene ve belleğe yeniden yüklenene kadar etkili olmaz.

Dinamik derlemedeki kod, diğer derlemelerdeki görünür türlere ve üyelere erişebilir.

Uyarı

Dinamik derlemeler, dinamik yöntemlerin özel türlere ve üyelere erişebilmesi için kullanılan ReflectionPermissionFlag.MemberAccess ve ReflectionPermissionFlag.RestrictedMemberAccess bayraklarını kullanmaz.

Geçici dinamik derlemeler bellekte oluşturulur ve diske hiçbir zaman kaydedilmez, bu nedenle dosya erişim izinleri gerekmez. Dinamik derlemenin diske kaydedilmesi için uygun bayraklar gerekir FileIOPermission .

Kısmen Güvenilen Koddan Dinamik Derlemeler Oluşturma

İnternet izinlerine sahip bir derlemenin geçici bir dinamik derleme oluşturabileceği ve kodunu yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik derleme yalnızca genel türleri ve diğer derlemelerin üyelerini kullanır.

  • Bu türler ve üyeler tarafından istenen izinler, kısmen güvenilir bir derlemenin izin setine dahil edilir.

  • Derleme diske kaydedilmez.

  • Hata ayıklama simgeleri oluşturulmaz. (Internet ve LocalIntranet izin kümeleri gerekli izinleri içermez.)

Anonim Olarak Barındırılan Dinamik Yöntemler

Anonim barındırılan dinamik yöntemler, ilişkili bir tür veya modül belirtmeyen iki DynamicMethod ve DynamicMethod(String, Type, Type[])DynamicMethod(String, Type, Type[], Boolean) oluşturucu kullanılarak oluşturulur. Bu oluşturucular, dinamik yöntemleri sistem tarafından sağlanan, tam olarak güvenilen, güvenlik saydam bir derlemeye yerleştirir. Bu oluşturucuları kullanmak veya dinamik yöntemler için kod yaymak için izin gerekmez.

Bunun yerine, anonim olarak barındırılan bir dinamik yöntem oluşturulduğunda çağrı yığını yakalanır. Yöntemi oluşturulduğunda, yakalanan çağrı yığınına karşı güvenlik talepleri yapılır.

Uyarı

Kavramsal olarak, yöntemin yapımı sırasında talepler yapılır. Yani, her CIL yönergesi yayıldıkça talepler ortaya çıkabilir. Geçerli uygulamada, DynamicMethod.CreateDelegate yöntemi çağrıldığında ya da CreateDelegate çağrılmadan önce yöntem çağrılırsa tam zamanında (JIT) derleyici devreye girdiğinde, tüm talepler yapılır.

Uygulama etki alanı izin verirse, anonim olarak barındırılan dinamik yöntemler şu kısıtlamaya tabi olarak JIT görünürlük denetimlerini atlayabilir: Anonim olarak barındırılan bir dinamik yöntem tarafından erişilen nonpublic türleri ve üyeleri, veren çağrı yığınının izin kümesine eşit veya alt kümeleri olan derlemelerde olmalıdır. Uygulama etki alanı, ReflectionPermission bayrağı ile ReflectionPermissionFlag.RestrictedMemberAccess verildiğinde, JIT görünürlük denetimlerini atlamayı kısıtlayan bu özellik etkinleştirilir.

  • Yönteminiz yalnızca genel türleri ve üyeleri kullanıyorsa, oluşturma sırasında izin gerekmez.

  • Eğer JIT görünürlük denetimlerinin atlanması gerektiğini belirtirseniz, yöntem oluşturulduğunda yapılan talep ReflectionPermission bayrağıyla ve erişilmekte olan özel olmayan üyesini içeren derlemenin izin kümesiyle birlikte ReflectionPermissionFlag.RestrictedMemberAccess içerir.

Abonelik dışı üyenin izin kümesi dikkate alındığından, verilmiş ReflectionPermissionFlag.RestrictedMemberAccess olan kısmen güvenilen kod, güvenilen derlemelerin abonelik dışı üyelerini yürüterek ayrıcalıklarını yükseltemez.

Diğer tüm kodlarda olduğu gibi, dinamik yöntemin yürütülmesi için de dinamik yöntemin kullandığı yöntemler tarafından istenen izinler gerekir.

Anonim olarak barındırılan dinamik yöntemleri barındıran sistem derlemesi, .NET Framework 4'ün öncesinde .NET Framework'te kullanılan saydamlık modeli olan saydamlık modelini kullanır SecurityRuleSet.Level1 .

Daha fazla bilgi için sınıfına DynamicMethod bakın.

Kısmen Güvenilen Koddan Anonim Olarak Barındırılan Dinamik Yöntemler Oluşturma

İnternet izinlerine sahip bir derlemenin anonim olarak barındırılan bir dinamik yöntem oluşturabileceği ve yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik yöntem yalnızca genel türleri ve üyeleri kullanır. Eğer izin kümesine ReflectionPermissionFlag.RestrictedMemberAccess dahildir, oluşturan derlemenin yetki kümesine eşit veya onun bir alt kümesi olan herhangi bir derlemenin özel türlerini ve üyelerini kullanabilir.

  • Dinamik yöntem tarafından kullanılan tüm türlerin ve üyelerin gerektirdiği izinler, kısmen güvenilen derlemenin izin kümesine eklenir.

Uyarı

Dinamik yöntemler hata ayıklama simgelerini desteklemez.

Mevcut Derlemelerle İlişkili Dinamik Yöntemler

Dinamik bir yöntemi mevcut bir derlemedeki bir tür veya modülle ilişkilendirmek için, ilişkili türü veya modülü belirten oluşturuculardan herhangi birini DynamicMethod kullanın. Bu oluşturucuları çağırmak için gereken izinler farklılık gösterir, çünkü dinamik bir yöntemi mevcut bir tür veya modülle ilişkilendirmek, dinamik yönteme abonelik dışı türlere ve üyelere erişim verir:

  • Bir türle ilişkilendirilmiş dinamik bir yöntem, bu türün tüm üyelerine, hatta özel üyelere ve ilişkili türü içeren derlemedeki tüm iç türlere ve üyelere erişebilir.

  • Bir modülle ilişkili dinamik yöntem, modüldeki internal tüm tür ve üyelere (Friend Visual Basic'te, assembly ortak dil çalışma zamanı meta verilerinde) erişebilir.

Ayrıca, JIT derleyicisinin görünürlük denetimlerini atlamayı belirten bir oluşturucu kullanabilirsiniz. Bunu yaptığınızda, erişim düzeyinden bağımsız olarak dinamik yönteminiz tüm derlemelerdeki tüm türlere ve üyelere erişim sağlar.

Oluşturucu tarafından istenen izinler, dinamik yönteminize ne kadar erişim vermeye karar verdiğinize bağlıdır:

Bu listedeki öğeler, yayan derlemenin izin kümesi açısından açıklanmış olsa da, uygulama etki alanı sınırı da dahil olmak üzere taleplerin tam çağrı yığınına karşı yapıldığını unutmayın.

Daha fazla bilgi için sınıfına DynamicMethod bakın.

Kısmen Güvenilen Koddan Dinamik Yöntemler Oluşturma

Uyarı

Kısmen güvenilen koddan dinamik yöntemler oluşturmanın önerilen yolu Anonim Olarak Barındırılan Dinamik Yöntemleri kullanmaktır.

İnternet izinlerine sahip bir derlemenin dinamik bir yöntem oluşturabileceği ve yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik yöntem ya onu yayan modül veya türle ilişkilendirilir ya da izin kümesi ReflectionPermissionFlag.RestrictedMemberAccess içerir ve bir derlemede, yayan derlemenin izin kümesine eşit veya onun bir alt kümesi olan bir modülle ilişkilidir.

  • Dinamik yöntem yalnızca genel türleri ve üyeleri kullanır. ** Verme kümesi ReflectionPermissionFlag.RestrictedMemberAccess içeriyorsa ve bir derlemedeki bir modüle ilişkilendirilmişse, bu modülün verme kümesi yayınlayan derlemenin verme kümesine eşit veya bir alt kümesi olan, ilişkili modülde internal türleri ve üyeleri kullanabilir (Friend Visual Basic'te, assembly ortak dil çalışma zamanı meta verilerinde işaretlenmiş).

  • Dinamik yöntem tarafından kullanılan tüm türler ve üyelerin talep ettiği izinler, kısmen güvenilen derlemenin izin verme kümesine dahildir.

  • Dinamik yöntem JIT görünürlük denetimlerini atlamıyor.

Uyarı

Dinamik yöntemler hata ayıklama simgelerini desteklemez.

Sürüm Bilgileri

.NET Framework 4'den başlayarak makine genelinde güvenlik ilkesi ortadan kalkar ve güvenlik şeffaflığı varsayılan zorlama mekanizması haline gelir.

.NET Framework 2.0 Service Pack 1'den itibaren dinamik derlemeler ve dinamik yöntemler oluştururken ReflectionPermission kullanırken ReflectionPermissionFlag.ReflectionEmit bayrağı artık gerekli değildir. Bu bayrak, .NET Framework'ün önceki tüm sürümlerinde gereklidir.

Uyarı

ReflectionPermission bayrağı, varsayılan olarak ReflectionPermissionFlag.ReflectionEmit ve FullTrust adlandırılmış izin kümelerine dahil edilir, ancak LocalIntranet izin kümesine dahil edilmez. Bu nedenle, .NET Framework'ün önceki sürümlerinde, bir kitaplık yalnızca Assert için ReflectionEmit yürütürse İnternet izinleri ile kullanılabilir. Kodlama hataları güvenlik açıklarına neden olabileceği için bu tür kitaplıklar dikkatli bir güvenlik incelemesi gerektirir. .NET Framework 2.0 SP1, kod oluşturma işlemi doğası gereği ayrıcalıklı bir işlem olmadığından, kısmi güven senaryolarında herhangi bir güvenlik talebi göndermeden kodun dağıtılmasına olanak tanır. Başka bir ifadeyle, oluşturulan kodun onu yayan derlemeden daha fazla izni yoktur. Bu, kod üreten kitaplıkların güvenlik açısından şeffaf olmasını sağlar ve güvenli bir kitaplık yazmayı basitleştiren onaylama gereksinimini ortadan kaldırır ReflectionEmit.

Buna ek olarak, .NET Framework 2.0 SP1, kısmen güvenilen dinamik yöntemlerden genel olmayan türlere ve üyelere erişim için ReflectionPermissionFlag.RestrictedMemberAccess bayrağını tanıtır. .NET Framework'ün daha eski sürümleri, gizli türlere ve üyelere erişen dinamik metotlar için ReflectionPermissionFlag.MemberAccess bayrağını gerektirir; bu, kısmen güvenilen koda hiçbir zaman verilmemesi gereken bir izindir.

Son olarak, .NET Framework 2.0 SP1 anonim olarak barındırılan yöntemleri tanıtır.

Türler ve Üyeler Hakkında Bilgi Alma

.NET Framework 2.0'dan başlayarak, abonelik dışı türler ve üyeler hakkında bilgi almak için hiçbir izin gerekmez. Yansıma, dinamik yöntemler yaymak için gereken bilgileri almak için kullanılır. Örneğin, MethodInfo nesneler yöntem çağrılarını yaymak için kullanılır. .NET Framework'ün önceki sürümleri için, ReflectionPermission öğesinin, ReflectionPermissionFlag.TypeInformation bayrağı ile birlikte gerekli olduğunu belirtir. Daha fazla bilgi için bkz. Yansıma için GüvenlikLe İlgili Önemli Noktalar.

Ayrıca bakınız