Bagikan melalui


Pertimbangan Keamanan untuk Refleksi

Refleksi menyediakan kemampuan untuk mendapatkan informasi tentang jenis dan anggota, dan untuk mengakses anggota (yaitu, memanggil metode dan konstruktor, untuk mendapatkan dan mengatur nilai properti, untuk menambahkan dan menghapus penanganan aktivitas, dan sebagainya). Penggunaan refleksi untuk mendapatkan informasi tentang jenis dan anggota tidak dibatasi. Semua kode dapat menggunakan pantulan untuk melakukan tugas-tugas berikut:

  • Hitung jenis dan anggota, dan periksa metadata mereka.
  • Menghitung dan memeriksa rakitan dan modul.

Menggunakan refleksi untuk mengakses anggota, sebaliknya, tunduk pada pembatasan. Dimulai dengan .NET Framework 4, hanya kode tepercaya yang dapat menggunakan refleksi untuk mengakses anggota penting keamanan. Selain itu, hanya kode tepercaya yang dapat menggunakan refleksi untuk mengakses anggota nonpublik yang tidak akan dapat langsung diakses oleh kode yang dikompilasi. Terakhir, kode yang menggunakan refleksi untuk mengakses anggota yang kritis aman harus memiliki izin apa pun yang diminta anggota yang kritis aman, sama seperti kode yang dikompilasi.

Tunduk pada izin yang diperlukan, kode dapat menggunakan pantulan untuk melakukan jenis akses berikut:

  • Akses anggota publik yang tidak kritis terhadap keamanan.

  • Akses anggota nonpublik yang dapat diakses oleh kode yang telah dikompilasi, jika anggota tersebut tidak bersifat kritis terhadap keamanan. Contoh anggota nonpublik tersebut meliputi:

    • Anggota yang dilindungi dari kelas dasar kode panggilan. (Dalam refleksi, ini disebut sebagai akses tingkat keluarga.)

    • internal anggota (Friend anggota di Visual Basic) dalam rakitan kode panggilan. (Dalam refleksi, ini disebut sebagai akses tingkat perakitan.)

    • Anggota privat dari instans lain dalam kelas yang berisi kode pemanggilan.

Misalnya, kode yang dijalankan di domain aplikasi terkotakpasir terbatas pada akses yang dijelaskan dalam daftar ini, kecuali domain aplikasi memberikan izin tambahan.

Dimulai dengan .NET Framework 2.0 Service Pack 1, mencoba mengakses anggota yang biasanya tidak dapat diakses menghasilkan permintaan untuk himpunan pemberian dari objek target ditambah ReflectionPermission dengan parameter bendera ReflectionPermissionFlag.MemberAccess. Kode yang berjalan dengan kepercayaan penuh (misalnya, kode dalam aplikasi yang diluncurkan dari baris perintah) selalu dapat memenuhi izin ini. (Ini tunduk pada batasan dalam mengakses anggota penting keamanan, seperti yang dijelaskan nanti dalam artikel ini.)

Secara opsional, domain aplikasi dalam kotak pasir dapat memberikan ReflectionPermission dengan flag ReflectionPermissionFlag.MemberAccess, seperti yang dijelaskan di bagian Mengakses Anggota yang Biasanya Tidak Dapat Diakses, di bagian selanjutnya dari artikel ini.

Mengakses Anggota Security-Critical

Anggota sangat penting bagi keamanan jika memiliki SecurityCriticalAttribute, jika milik jenis yang memiliki SecurityCriticalAttribute, atau jika berada dalam rakitan penting keamanan. Dimulai dengan .NET Framework 4, aturan untuk mengakses anggota penting keamanan adalah sebagai berikut:

Aturan ini sama apakah anggota kritis keamanan diakses langsung oleh kode yang dikompilasi, atau diakses dengan menggunakan pantulan.

Kode aplikasi yang dijalankan dari baris perintah berjalan dengan kepercayaan penuh. Selama tidak ditandai sebagai transparan, dapat menggunakan refleksi untuk mengakses anggota yang kritis terhadap keamanan. Ketika kode yang sama dijalankan dengan kepercayaan parsial, misalnya dalam domain aplikasi terisolasi, tingkat kepercayaan assembly menentukan apakah kode tersebut dapat mengakses kode penting keamanan. Jika assembly memiliki nama yang kuat dan diinstal di cache assembly global, itu adalah assembly tepercaya dan dapat memanggil anggota penting keamanan. Ketika tidak dipercaya, itu menjadi transparan meskipun tidak ditandai sebagai transparan, dan tidak dapat mengakses anggota yang penting bagi keamanan.

Refleksi dan Transparansi

Dimulai dengan .NET Framework 4, Common Language Runtime (CLR) menentukan tingkat transparansi suatu tipe atau anggota berdasarkan beberapa faktor, termasuk tingkat kepercayaan dari assembly dan tingkat kepercayaan dari domain aplikasi. Refleksi menyediakan properti IsSecurityCritical, IsSecuritySafeCritical, dan IsSecurityTransparent untuk memungkinkan Anda menemukan tingkat transparansi tipe. Tabel berikut ini memperlihatkan kombinasi properti ini yang valid.

Tingkat keamanan IsSecurityCritical Keamanan Aman Kritis IsSecurityTransparent
Penting true false false
Kritikal untuk Keamanan true true false
Transparan false false true

Menggunakan properti ini jauh lebih sederhana daripada memeriksa anotasi keamanan rakitan dan jenisnya, memeriksa tingkat kepercayaan saat ini, dan mencoba menduplikasi aturan runtime. Misalnya, jenis yang sama dapat menjadi kritis keamanan saat dijalankan dari baris perintah, atau aman transparan saat dijalankan di domain aplikasi sandbox.

Ada properti serupa pada kelas MethodBase, FieldInfo, TypeBuilder, MethodBuilder, dan DynamicMethod. (Untuk refleksi dan pantulan lainnya, atribut keamanan diterapkan ke metode terkait; misalnya, dalam kasus properti, atribut tersebut diterapkan ke aksesor properti.)

Mengakses Anggota yang Biasanya Tidak Dapat Diakses

Untuk menggunakan refleksi untuk memanggil anggota yang tidak dapat diakses sesuai dengan aturan aksesibilitas runtime bahasa umum, kode Anda harus diberikan salah satu dari dua izin:

  • Untuk mengizinkan kode memanggil anggota yang tidak dipublikasikan: Kode Anda harus memiliki ReflectionPermission dengan tanda ReflectionPermissionFlag.MemberAccess.

    Nota

    Secara default, kebijakan keamanan menolak izin ini untuk kode yang berasal dari Internet. Izin ini tidak boleh diberikan ke kode yang berasal dari Internet.

  • Untuk mengizinkan kode memanggil anggota nonpublik, selama set izin assembly yang berisi anggota yang dipanggil sama dengan, atau subset, set izin assembly yang berisi kode pemanggilan: Kode Anda harus memiliki ReflectionPermission dengan flag ReflectionPermissionFlag.RestrictedMemberAccess.

Misalnya, Anda memberikan izin domain aplikasi Internet serta ReflectionPermission dengan tanda ReflectionPermissionFlag.RestrictedMemberAccess, lalu menjalankan aplikasi Internet dengan dua assembly, A dan B.

  • Assembly A dapat menggunakan refleksi untuk mengakses anggota privat assembly B, karena kumpulan izin assembly B tidak menyertakan izin apa pun yang tidak diberikan kepada A.

  • Assembly A tidak dapat menggunakan refleksi untuk mengakses anggota pribadi assembly .NET Framework seperti mscorlib.dll, karena mscorlib.dll sepenuhnya tepercaya dan karenanya memiliki izin yang belum diberikan ke assembly A. MemberAccessException dilemparkan ketika keamanan akses kode melakukan pemeriksaan tumpukan saat runtime.

Serialisasi

Untuk serialisasi, SecurityPermission dengan tanda SecurityPermissionAttribute.SerializationFormatter menyediakan kemampuan untuk mendapatkan dan mengatur anggota tipe yang dapat diserialisasi, terlepas dari aksesibilitas. Izin ini memungkinkan kode untuk menemukan dan mengubah status privat instans. (Selain diberikan izin yang sesuai, jenis harus ditandai sebagai dapat diserialisasikan dalam metadata.)

Parameter Tipe MethodInfo

Hindari menulis anggota publik yang menggunakan parameter MethodInfo, terutama untuk kode tepercaya. Anggota tersebut mungkin lebih rentan terhadap kode berbahaya. Misalnya, pertimbangkan anggota publik dalam kode yang sangat tepercaya yang memiliki parameter MethodInfo. Asumsikan bahwa anggota publik secara tidak langsung memanggil metode Invoke pada parameter yang disediakan. Jika anggota publik tidak melakukan pemeriksaan izin yang diperlukan, panggilan ke Invoke metode akan selalu berhasil, karena sistem keamanan menentukan bahwa penelepon sangat tepercaya. Bahkan jika kode berbahaya tidak memiliki izin untuk langsung memanggil metode , kode tersebut masih dapat melakukannya secara tidak langsung dengan memanggil anggota publik.

Informasi Versi

  • Dimulai dengan .NET Framework 4, kode transparan tidak dapat menggunakan refleksi untuk mengakses anggota penting keamanan.

  • Bendera ReflectionPermissionFlag.RestrictedMemberAccess diperkenalkan dalam Paket Layanan .NET Framework 2.0 1. Versi .NET Framework yang lebih lama memerlukan flag ReflectionPermissionFlag.MemberAccess untuk kode yang menggunakan reflection untuk mengakses anggota nonpublik. Ini adalah izin yang tidak boleh diberikan kepada kode yang tepercaya sebagian.

  • Dimulai dengan .NET Framework 2.0, menggunakan refleksi untuk mendapatkan informasi tentang tipe dan anggota nonpublik tidak memerlukan izin. Di versi sebelumnya, ReflectionPermission dengan penanda ReflectionPermissionFlag.TypeInformation penting.

Lihat juga