Masalah Keamanan dalam Pancaran Refleksi

.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.

Catatan

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

Rakitan Dinamis

Rakitan dinamis dibuat dengan menggunakan kelebihan beban 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 dieksekusi 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 perakitan, dengan menerapkan atribut SecurityRulesAttribute saat Anda membuatnya, model transparansi diwarisi dari perakitan pemancaran.

Catatan

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

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

Catatan

Rakitan dinamis tidak menggunakan bendera ReflectionPermissionFlag.MemberAccess dan ReflectionPermissionFlag.RestrictedMemberAccess yang memungkinkan metode dinamis untuk mengakses jenis 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 bendera yang sesuai.

Menghasilkan Rakitan Dinamis dari Kode Tepercaya Sebagian

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

  • Rakitan dinamis hanya menggunakan jenis publik dan anggota rakitan lain.

  • Izin yang diminta oleh jenis dan anggota tersebut disertakan dalam kumpulan pemberian perakitan yang dipercaya sebagian.

  • Rakitan tidak disimpan ke disk.

  • Simbol debug tidak dihasilkan. (Rangkaian izin Internet dan LocalIntranet tidak menyertakan izin yang diperlukan.)

Metode Dinamis yang di-Hosting secara Anonim

Metode dinamis yang di-hosting secara anonim dibuat dengan menggunakan dua konstruktor DynamicMethod 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 disediakan sistem, sepenuhnya tepercaya, dan transparan terhadap keamanan. Tidak ada izin yang diperlukan untuk menggunakan konstruktor ini atau untuk memancarkan kode untuk metode dinamis.

Sebaliknya, ketika metode dinamis yang di-hosting secara anonim dibuat, tumpukan panggilan diambil. Ketika metode dibangun, tuntutan keamanan dibuat terhadap tumpukan panggilan yang diambil.

Catatan

Secara konseptual, tuntutan dilakukan selama pembangunan metode. Artinya, tuntutan dapat dibuat karena setiap instruksi CIL dipancarkan. Dalam implementasi saat ini, semua tuntutan dibuat ketika metode DynamicMethod.CreateDelegate dipanggil atau ketika pengompilasi just-in-time (JIT) dipanggil, jika metode dipanggil tanpa memanggil CreateDelegate.

Jika domain aplikasi mengizinkannya, metode dinamis yang di-hosting secara anonim dapat melompati pemeriksaan visibilitas JIT, tunduk pada pembatasan berikut: Jenis dan anggota nonpublik yang diakses oleh metode dinamis yang di-hosting secara anonim harus dalam rakitan yang set pemberiannya sama dengan, atau subset, set pemberian tumpukan panggilan yang memancarkan. Kemampuan terbatas ini untuk melompati pemeriksaan visibilitas JIT diaktifkan jika domain aplikasi diberikan ReflectionPermission dengan bendera ReflectionPermissionFlag.RestrictedMemberAccess.

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

  • Jika Anda menentukan bahwa pemeriksaan visibilitas JIT harus dilewati, permintaan yang dibuat saat metode dibuat disertai ReflectionPermission dengan bendera ReflectionPermissionFlag.RestrictedMemberAccess dan set perakitan pemberian yang berisi anggota nonpublik yang sedang diakses.

Karena seperangkat pemberian anggota nonpublik dipertimbangkan, sebagian kode tepercaya yang telah diberikan ReflectionPermissionFlag.RestrictedMemberAccess tidak dapat meningkatkan hak istimewanya dengan mengeksekusi anggota rakitan tepercaya yang nonpublik.

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

Rakitan sistem yang meng-hosting metode dinamis yang di-hosting secara anonim menggunakan model transparansi SecurityRuleSet.Level1, yang merupakan model transparansi yang digunakan dalam .NET Framework sebelum .NET Framework 4.

Untuk informasi selengkapnya, lihat DynamicMethod kelas.

Menghasilkan Metode Dinamis yang Di-hosting Secara Anonim dari Kode Terpercaya Sebagian

Mempertimbangkan kondisi di mana rakitan dengan izin Internet dapat menghasilkan metode dinamis yang di-hosting dan menjalankan kodenya:

  • Metode dinamis hanya menggunakan jenis publik dan anggota. Jika set pemberiannya mencakup ReflectionPermissionFlag.RestrictedMemberAccess, set hibah dapat menggunakan jenis nonpublik dan anggota assembly mana pun yang set pemberiannya sama dengan, atau subset, set pemberian rakitan yang memancar.

  • Izin yang diperlukan oleh semua jenis dan anggota yang digunakan oleh metode dinamis disertakan dalam set pemberian perakitan yang dipercaya sebagian.

Catatan

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 apapun konstruktor DynamicMethod 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 untuk semua jenis internal dan anggota dalam perakitan yang berisi jenis terkait.

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

Selain itu, Anda dapat menggunakan konstruktor yang menentukan kemampuan untuk melompati pemeriksaan visibilitas pengompilasi JIT. Melakukannya memberi metode dinamis Anda akses ke semua jenis dan anggota di semua rakitan, terlepas dari 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 hal sekumpulan pemberian perakitan pemancar, ingatlah bahwa tuntutan dibuat terhadap tumpukan panggilan penuh, termasuk batas domain aplikasi.

Untuk informasi selengkapnya, lihat DynamicMethod kelas.

Menghasilkan Rakitan Dinamis dari Kode Tepercaya Sebagian

Catatan

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

Mempertimbangkan kondisi di mana rakitan dengan izin Internet dapat menghasilkan metode dinamis yang di-hosting dan menjalankan kodenya:

  • Baik metode dinamis dikaitkan dengan modul atau jenis yang memancarkannya, atau set pemberiannya mencakup ReflectionPermissionFlag.RestrictedMemberAccess dan dikaitkan dengan modul dalam perakitan yang set pemberiannya sama dengan, atau subset, set pemberian perakitan memancarkan.

  • Metode dinamis hanya menggunakan jenis publik dan anggota. Jika set pemberiannya mencakup ReflectionPermissionFlag.RestrictedMemberAccess dan dikaitkan dengan modul dalam rakitan yang set pemberiannya sama dengan, atau subset, set pemberian rakitan pemancar, ia dapat menggunakan jenis dan anggota yang ditandai internal (Friend dalam Visual Basic, assembly dalam metadata runtime bahasa umum) dalam modul terkait.

  • Izin yang diperlukan oleh semua jenis dan anggota yang digunakan oleh metode dinamis disertakan dalam set pemberian perakitan yang dipercaya sebagian.

  • Metode dinamis tidak melompati pemeriksaan visibilitas JIT.

Catatan

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 Paket Layanan 1, ReflectionPermissiondengan bendera ReflectionPermissionFlag.ReflectionEmit tidak lagi diperlukan saat memancarkan rakitan dinamis dan metode dinamis. Bendera ini diperlukan di semua versi .NET Framework sebelumnya.

Catatan

ReflectionPermission dengan bendera ReflectionPermissionFlag.ReflectionEmit disertakan secara default dalam FullTrust dan set izin bernama LocalIntranet, tetapi tidak dalam kumpulan izin Internet. Oleh karena itu, dalam versi .NET Framework sebelumnya, pustaka dapat digunakan dengan izin Internet hanya 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 untuk dipancarkan dalam skenario kepercayaan parsial tanpa mengeluarkan permintaan keamanan apa pun, karena menghasilkan kode secara inheren bukan operasi hak istimewa. Artinya, kode yang dihasilkan tidak memiliki izin lebih dari perakitan yang memancarkannya. Ini memungkinkan pustaka yang memancarkan kode menjadi transparan keamanan dan menghapus kebutuhan untuk menegaskan ReflectionEmit, yang menyederhanakan tugas menulis pustaka yang aman.

Selain itu, .NET Framework 2.0 SP1 memperkenalkan bendera ReflectionPermissionFlag.RestrictedMemberAccess untuk mengakses jenis nonpublik dan anggota dari metode dinamis yang sebagian tepercaya. Versi .NET Framework sebelumnya memerlukan bendera ReflectionPermissionFlag.MemberAccess untuk metode dinamis yang mengakses jenis dan anggota nonpublik; ini adalah izin yang tidak boleh diberikan ke kode yang dipercaya sebagian.

Terakhir, .NET Framework 2.0 SP1 memperkenalkan metode yang di-hosting secara anonim.

Memperoleh Informasi tentang Jenis dan Anggota

Memulai 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, objek MethodInfo digunakan untuk memancarkan panggilan metode. Versi .NET Framework yang lebih lama memerlukan ReflectionPermission dengan bendera ReflectionPermissionFlag.TypeInformation. Untuk informasi selengkapnya, lihat Pertimbangan Keamanan untuk Refleksi.

Lihat juga