Bagikan melalui


Masalah Keamanan dalam Reflection Emit

.NET Framework menyediakan tiga cara untuk memancarkan bahasa perantara umum (CIL), masing-masing dengan masalah keamanannya sendiri:

Terlepas dari cara Anda menghasilkan kode dinamis, menjalankan kode yang dihasilkan memerlukan semua izin yang diperlukan oleh jenis dan metode yang digunakan kode yang dihasilkan.

Nota

Izin yang diperlukan untuk mencerminkan kode dan memancarkan kode telah berubah seiring dengan rilis .NET Framework berikutnya. Lihat Informasi Versi, nanti di artikel ini.

Rakitan Dinamis

Rakitan dinamis dibuat dengan menggunakan overload dari metode AppDomain.DefineDynamicAssembly. Sebagian besar kelebihan metode ini tidak digunakan lagi di .NET Framework 4, karena penghapusan kebijakan keamanan di seluruh komputer. Kelebihan beban yang tersisa dapat dijalankan oleh kode apa pun, terlepas dari tingkat kepercayaan. Kelebihan beban ini termasuk dalam dua grup: yang menentukan daftar atribut untuk diterapkan ke rakitan dinamis saat dibuat, dan yang tidak. Jika Anda tidak menentukan model transparansi untuk assembly, dengan menerapkan atribut SecurityRulesAttribute saat Anda membuatnya, model transparansi diadopsi dari assembly pemancar.

Nota

Atribut-atribut yang Anda terapkan ke rakitan dinamis setelah dibuat, dengan menggunakan metode SetCustomAttribute, tidak berlaku sampai rakitan disimpan ke disk dan dimuat ke dalam memori lagi.

Kode dalam rakitan dinamis dapat mengakses jenis dan anggota yang terlihat di rakitan lain.

Nota

Rakitan dinamis tidak menggunakan flag ReflectionPermissionFlag.MemberAccess dan ReflectionPermissionFlag.RestrictedMemberAccess yang memungkinkan metode dinamis untuk mengakses tipe dan anggota nonpublik.

Rakitan dinamis sementara dibuat dalam memori dan tidak pernah disimpan ke disk, sehingga tidak memerlukan izin akses file. Menyimpan rakitan dinamis ke disk memerlukan FileIOPermission dengan parameter yang sesuai.

Menghasilkan Rakitan Dinamis dari Kode Tepercaya Sebagian

Pertimbangkan kondisi di mana perakitan dengan izin Internet dapat menghasilkan rakitan dinamis sementara dan menjalankan kodenya:

  • Rakitan dinamis hanya menggunakan tipe dan anggota publik dari perakitan lain.

  • Izin yang diminta oleh jenis dan anggota tersebut disertakan dalam sekumpulan izin assembly yang sebagian dipercaya.

  • Rakitan tidak disimpan ke disk.

  • Simbol debug tidak dihasilkan. (Internet dan LocalIntranet setel izin tidak termasuk izin yang diperlukan.)

Metode Dinamis yang Dihosting Secara Anonim

Metode dinamis yang dihosting secara anonim dibuat dengan menggunakan dua DynamicMethod konstruktor yang tidak menentukan jenis atau modul terkait, DynamicMethod(String, Type, Type[]) dan DynamicMethod(String, Type, Type[], Boolean). Konstruktor ini menempatkan metode dinamis dalam rakitan yang sepenuhnya tepercaya dan transparan keamanan, yang disediakan oleh sistem. Tidak ada izin yang diperlukan untuk menggunakan konstruktor ini atau untuk memancarkan kode untuk metode dinamis.

Sebagai gantinya, ketika metode dinamis yang dihosting secara anonim dibuat, tumpukan panggilan tersebut direkam. Ketika metode dibentuk, tuntutan keamanan diajukan terhadap tumpukan panggilan yang ditangkap.

Nota

Secara konseptual, tuntutan diajukan selama pengembangan metode. Artinya, tuntutan dapat dibuat saat setiap instruksi CIL dihasilkan. Dalam implementasi saat ini, semua permintaan dilakukan ketika metode DynamicMethod.CreateDelegate dipanggil atau ketika kompilator just-in-time (JIT) dijalankan, jika metode dipanggil tanpa memanggil CreateDelegate.

Jika domain aplikasi mengizinkannya, metode dinamis anonim yang dihosting dapat melewati pemeriksaan visibilitas JIT, dengan syarat sebagai berikut: Jenis dan anggota nonpublik yang diakses oleh metode dinamis anonim yang dihosting harus berada dalam rakitan yang set izinnya sama atau merupakan subset dari set izin tumpukan panggilan pemancar. Kemampuan terbatas untuk melewati pemeriksaan visibilitas JIT ini diaktifkan jika domain aplikasi diberikan ReflectionPermission dengan flag ReflectionPermissionFlag.RestrictedMemberAccess.

  • Jika metode Anda hanya menggunakan tipe dan anggota publik, tidak ada izin yang diperlukan selama pembuatan.

  • Jika Anda menentukan bahwa pemeriksaan visibilitas JIT harus dilewati, permintaan yang dibuat saat metode dibangun mencakup ReflectionPermission dengan tanda ReflectionPermissionFlag.RestrictedMemberAccess dan set izin dari rakitan yang berisi anggota nonpublik yang sedang diakses.

Karena pemberian akses kepada anggota nonpublik dipertimbangkan, sebagian kode tepercaya yang telah diberikan ReflectionPermissionFlag.RestrictedMemberAccess tidak dapat meningkatkan hak istimewanya dengan mengeksekusi anggota nonpublik dari assemblies tepercaya.

Seperti halnya kode yang dipancarkan lainnya, menjalankan metode dinamis memerlukan izin apa pun yang diminta oleh metode yang digunakan metode dinamis.

Rakitan sistem yang menghosting metode dinamis yang dihosting secara anonim menggunakan SecurityRuleSet.Level1 model transparansi, yang merupakan model transparansi yang digunakan dalam .NET Framework sebelum .NET Framework 4.

Untuk informasi selengkapnya, lihat kelas DynamicMethod.

Menghasilkan Metode Dinamis yang Dihosting Secara Anonim dari Kode Tepercaya Sebagian

Pertimbangkan kondisi di mana rakitan dengan izin Internet dapat menghasilkan metode dinamis yang dihosting secara anonim dan menjalankannya:

  • Metode dinamis hanya menggunakan tipe dan anggota publik. Jika set hibahnya mencakup ReflectionPermissionFlag.RestrictedMemberAccess, ia dapat menggunakan tipe nonpublik dan anggota assembly apa pun yang set hibahnya sama dengan, atau subset, dari set hibah assembly pemancar.

  • Izin yang diperlukan oleh semua jenis dan anggota yang digunakan oleh metode dinamis disertakan dalam set izin majemuk dengan kepercayaan parsial.

Nota

Metode dinamis tidak mendukung simbol debug.

Metode Dinamis Yang Terkait dengan Rakitan yang Ada

Untuk mengaitkan metode dinamis dengan jenis atau modul dalam rakitan yang ada, gunakan salah DynamicMethod satu konstruktor yang menentukan jenis atau modul terkait. Izin yang diperlukan untuk memanggil konstruktor ini bervariasi, karena mengaitkan metode dinamis dengan jenis atau modul yang ada memberikan akses metode dinamis ke jenis dan anggota nonpublik:

  • Metode dinamis yang terkait dengan jenis memiliki akses ke semua anggota jenis tersebut, bahkan anggota privat, dan ke semua jenis internal dan anggota dalam rakitan yang berisi jenis terkait.

  • Metode dinamis yang terkait dengan modul memiliki akses ke semua internal tipe dan anggota (Friend di Visual Basic, assembly dalam metadata runtime bahasa umum) dalam modul.

Selain itu, Anda dapat menggunakan konstruktor yang menentukan kemampuan untuk melewati pemeriksaan visibilitas oleh JIT compiler. Dengan melakukan hal tersebut, metode dinamis Anda mendapatkan akses ke semua jenis dan anggota di semua rakitan, tanpa memandang tingkat akses.

Izin yang diminta oleh konstruktor bergantung pada berapa banyak akses yang Anda putuskan untuk memberikan metode dinamis Anda:

Meskipun item dalam daftar ini dijelaskan dalam konteks hak akses dari himpunan assembly yang memancarkan, ingatlah bahwa tuntutan diterapkan terhadap seluruh tumpukan panggilan, termasuk batas domain aplikasi.

Untuk informasi selengkapnya, lihat kelas DynamicMethod.

Menghasilkan Metode Dinamis dari Kode Tepercaya Sebagian

Nota

Cara yang disarankan untuk menghasilkan metode dinamis dari kode yang dipercaya sebagian adalah dengan menggunakan Metode Dinamis yang Dihosting Secara Anonim.

Pertimbangkan kondisi di mana perakitan dengan izin Internet dapat menghasilkan metode dinamis dan menjalankannya:

  • Metode dinamis harus dikaitkan dengan modul atau tipe yang menerbitkannya, atau set izin termasuk ReflectionPermissionFlag.RestrictedMemberAccess dan dikaitkan dengan modul dalam asmember yang set izinnya sama dengan, atau subset dari, set izin asmember penerbit.

  • Metode dinamis hanya menggunakan tipe dan anggota publik. Jika set hibahnya mencakup ReflectionPermissionFlag.RestrictedMemberAccess dan dikaitkan dengan modul dalam rakitan yang set hibahnya sama dengan atau merupakan subset dari set hibah rakitan pemancar, ia dapat menggunakan tipe dan anggota yang ditandai internal (Friend di Visual Basic, assembly dalam metadata runtime bahasa umum) dalam modul tersebut.

  • Izin yang diminta oleh semua jenis dan anggota yang digunakan oleh metode dinamis disertakan dalam kumpulan izin rakitan dengan kepercayaan parsial.

  • Metode dinamis tidak melewati pengecekan visibilitas JIT.

Nota

Metode dinamis tidak mendukung simbol debug.

Informasi Versi

Dimulai dengan .NET Framework 4, kebijakan keamanan di seluruh komputer dihilangkan dan transparansi keamanan menjadi mekanisme penegakan default.

Dimulai dengan .NET Framework 2.0 Service Pack 1, ReflectionPermission dengan ReflectionPermissionFlag.ReflectionEmit flag tidak lagi diperlukan saat menghasilkan rakitan dinamis dan metode dinamis. Bendera ini diperlukan di semua versi .NET Framework yang lebih lama.

Nota

ReflectionPermission dengan ReflectionPermissionFlag.ReflectionEmit bendera disertakan secara default dalam FullTrust dan LocalIntranet yang dinamai dalam set izin, tetapi tidak dalam set izin Internet. Oleh karena itu, pada versi .NET Framework sebelumnya, perpustakaan hanya dapat digunakan dengan izin Internet jika menjalankan Assert untuk ReflectionEmit. Pustaka tersebut memerlukan tinjauan keamanan yang cermat karena kesalahan pengodean dapat mengakibatkan lubang keamanan. .NET Framework 2.0 SP1 memungkinkan kode dipancarkan dalam skenario kepercayaan parsial tanpa mengeluarkan tuntutan keamanan apa pun, karena menghasilkan kode secara inheren bukan operasi istimewa. Artinya, kode yang dihasilkan tidak memiliki lebih banyak izin daripada perakitan yang menerbitkannya. Ini memungkinkan pustaka yang menghasilkan kode untuk menjadi transparan terhadap keamanan dan menghilangkan kebutuhan untuk menggunakan ReflectionEmit, yang menyederhanakan tugas penulisan pustaka yang aman.

Selain itu, .NET Framework 2.0 SP1 memperkenalkan flag ReflectionPermissionFlag.RestrictedMemberAccess untuk mengakses tipe dan anggota nonpublik dari metode dinamis yang tepercaya sebagian. Versi-versi .NET Framework terdahulu harus menggunakan flag ReflectionPermissionFlag.MemberAccess untuk metode dinamis yang mengakses jenis dan anggota nonpublik; ini adalah izin yang tidak boleh diberikan kepada kode yang hanya sebagian dapat dipercaya.

Terakhir, .NET Framework 2.0 SP1 memperkenalkan metode yang dihosting secara anonim.

Mendapatkan Informasi tentang Jenis dan Anggota

Dimulai dengan .NET Framework 2.0, tidak ada izin yang diperlukan untuk mendapatkan informasi tentang jenis dan anggota nonpublik. Refleksi digunakan untuk mendapatkan informasi yang diperlukan untuk memancarkan metode dinamis. Misalnya, MethodInfo objek digunakan untuk melakukan panggilan metode. Versi .NET Framework yang lebih lama membutuhkan ReflectionPermission dengan flag ReflectionPermissionFlag.TypeInformation. Untuk informasi selengkapnya, lihat Pertimbangan Keamanan untuk Refleksi.

Lihat juga