Pertanyaan Kapan AccessController.doPrivileged () digunakan?


Jika saya mengerti AccessController.doPrivileged benar, itu mengatakan bahwa kode yang tidak dipercaya harus dapat memanggil metode yang membutuhkan izin (seperti System.getProperty()) melalui metode antara itu tidak memiliki izin.

Itu menimbulkan pertanyaan: kapan seharusnya AccessController.doPrivileged() digunakan? Kapan kode tidak tepercaya diizinkan untuk mengaktifkan kode privileged melalui metode intermediate? Kapan seharusnya gagal?

Mengikuti alasan Anda, tolong jelaskan mengapa pembuatan ClassLoader harus selalu diizinkan: http://findbugs.sourceforge.net/bugDescriptions.html#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED


32
2018-02-10 01:15


asal


Jawaban:


Setuju dengan Jawaban Suraj, tetapi saya pikir saya akan menambahkan contoh spesifik di mana saya telah meminta penggunaan blok istimewa.

Bayangkan Anda telah membangun sebuah aplikasi yang menyediakan sejumlah layanan ke modul yang bisa di-pluggable. Jadi aplikasi Anda dan layanannya adalah kode tepercaya. Modul yang dapat dicolok, bagaimanapun, tidak selalu dipercaya dan dimuat dalam kelas loader mereka sendiri (dan memiliki domain perlindungan mereka sendiri).

Ketika modul yang dapat di-pluggable memanggil sebuah layanan, Anda menerapkan pemeriksaan keamanan kustom ("modul X yang dapat pluggable memiliki izin untuk menggunakan layanan ini"). Tapi layanan itu sendiri mungkin memerlukan beberapa izin inti Java (baca properti sistem, menulis ke file, dll). Kode yang membutuhkan izin ini dibungkus dalam doPrivileged() sehingga perizinan yang tidak memadai dari modul pluggable yang tidak tepercaya diabaikan secara efektif - hanya hak istimewa dari modul layanan tepercaya Anda yang berlaku.


18
2018-02-11 08:57



  1. ..melalui metode perantara yang memang memiliki izin . Tidak, izin efektif terakhir adalah persimpangan semua izin dalam tumpukan domain. Jadi misalkan sebuah operasi memerlukan izin B untuk mengeksekusi, dan mengatakan beberapa LIB menengah memiliki dua izin B dan A. Sekarang ketika beberapa kode tidak terpercaya dengan hanya izin A panggilan melalui LIB, set izin yang efektif adalah (A intersect (A+B)) = A. Oleh karena itu kode yang tidak dipercaya tidak dapat mengeksploitasi LIB menengah untuk mendapatkan izin ekstra.

  2. Kapan sebaiknya menggunakanPriveleged?-> Ada banyak operasi di Jawa yang memerlukan domain pemanggil untuk memiliki izin tertentu untuk keberhasilan pelaksanaan operasi tersebut. System.getProperty adalah salah satu dari operasi tersebut. Semua operasi terkait file juga membutuhkan izin khusus. Ketika Anda menggunakan AccessController.doPrivileged untuk menjalankan operasi tersebut, operasi dijalankan dengan semua hak (izin) dari domain perlindungan Anda. Oleh karena itu jika kode Anda memiliki hak yang cukup hanya maka ia dapat menjalankan operasi tersebut.


14
2018-02-10 02:44



Pada dasarnya, AccessController.doPriviledged () setara dengan file set-user-id. Ini mengatakan "Saya dengan ini meminta metode ini dilakukan dengan hak istimewa saya, bahkan jika saya dipanggil dengan metode yang tidak memilikinya."


7
2017-11-19 17:56



Periksa tautan ini dan gulir ke bawah untuk menggunakan API doPrivileged.

Java 6: http://docs.oracle.com/javase/6/docs/technotes/guides/security/doprivileged.html

Java 7: http://docs.oracle.com/javase/7/docs/technotes/guides/security/doprivileged.html

Ketika metode pemeriksa akses AccessController dipanggil oleh penelepon terbaru, algoritma dasar untuk memutuskan apakah membolehkan atau menolak akses yang diminta adalah sebagai berikut:

Jika kode untuk penelepon apa pun dalam rantai panggilan tidak memiliki izin yang diminta, AccessControlException dilemparkan, kecuali hal berikut ini benar - penelepon yang kodenya diberi izin tersebut telah ditandai sebagai "istimewa" (lihat di bawah) dan semua pihak kemudian dipanggil oleh penelepon ini (langsung atau tidak langsung) semua memiliki izin kata


4
2017-12-28 15:26