Mengapa PL / Python tidak dipercaya?

11

Menurut dokumen:

PL / Python hanya tersedia sebagai bahasa "tidak tepercaya", artinya bahasa ini tidak menawarkan cara apa pun untuk membatasi apa yang dapat dilakukan pengguna di dalamnya dan oleh karena itu dinamai plpythonu. Varian tepercaya plpython mungkin tersedia di masa mendatang jika mekanisme eksekusi aman dikembangkan dengan Python.

Mengapa sebenarnya sulit untuk mengembangkan mekanisme eksekusi yang aman untuk Python tetapi tidak untuk bahasa lain seperti Perl?

foobar0100
sumber

Jawaban:

13

Ini berkaitan dengan model objek Python - selalu ada cara untuk mendapatkan referensi ke objek yang mungkin tidak aman. Lihat dokumentasi modul rexec dan bab eksekusi terbatas dari dokumen untuk beberapa info tentang masalah, serta:

Keterbatasan tidak ada hubungannya dengan PostgreSQL sendiri, mereka melekat pada implementasi juru bahasa CPython atau bahkan mungkin bahasa Python sendiri.

Beberapa bahasa lain telah memeriksa runtimes, seperti Perl, Java, JavaScript dan Lua. Sebagian besar dari mereka telah menghadapi serangkaian masalah keamanan karena lingkungan eksekusi terbatas seperti itu sangat sulit untuk dilindungi dari semua kemungkinan eksploitasi jailbreak.

Benar-benar tidak ada yang menghentikan PostgreSQL dari menambahkan interpreter Python semitrusted, karena rexec "cukup baik" untuk banyak tujuan. PostgreSQL tidak cenderung tertarik pada hanya-sebagian-agak-cukup-baik-mungkin saja. Mungkin hanya akan diterima jika ditandai hanya pengguna super, tetapi Anda selalu dapat memberikan akses untuk itu untuk pengguna tertentu. Itu akan lebih baik daripada Python yang tidak dipercaya.

Secara pribadi saya pikir PL / V8 atau yang serupa adalah masa depan di sini, dan ingin melihatnya bergerak ke arah yang didukung pada intinya.

Saya juga secara samar-samar mengeksplorasi ide Mono tepercaya yang dapat memuat majelis "aman" yang ditulis dalam C #, VB.NET, IronPython, atau apa pun tetapi belum bisa berbuat banyak pada topik itu.

Craig Ringer
sumber
Saya belum pernah melihat ini sebagai alasan mengapa itu dianggap tidak dipercaya. Secara default, Java, V8, TCL, R, dan lainnya dianggap tidak tepercaya. Satu-satunya alasan Perl dipercaya adalah karena mereka mengirimkan versi tepercaya khusus Perl dengan PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0
1
@ TheSteve0 Anda mungkin tidak melihatnya seperti itu, tetapi itulah mengapa begitu. PostgreSQL digunakan untuk memiliki plpythonu, dan dihapus setelah penghentian rexecmodul Python secara inheren tidak aman, seperti yang ditautkan di atas. Saya membayangkan mungkin sebuah plpython menggunakan PyPi mungkin dapat memberikan mode terbatas yang kemudian dapat digunakan Pg. Saya belum melihat apakah ada banyak pekerjaan. Anda juga tidak benar tentang "versi tepercaya dari Perl" - ini sebenarnya Perl yang biasa, penerjemah yang sama digunakan untuk plperl dan plperlu. Perbedaannya adalah konfigurasi runtime.
Craig Ringer
@ TheSteve0 plperl mengonfigurasi instance juru juru bahasa secara berbeda saat runtime. Lihat plperl.c untuk detail gorey, khususnya pp_require_safedan plperl_trusted_init. Saya tidak cukup tahu untuk memiliki banyak pendapat tentang keamanan sebenarnya dari eksekusi Perl terbatas. Saya lebih suka melihat versi tepercaya Lua atau mendapatkan mindshare dan adopsi yang lebih baik, penerjemah JavaScript tepercaya. Tetapi apa yang kita miliki sekarang cukup untuk saat ini.
Craig Ringer
@ TheSteve0 BTW, Java JVM yang menggunakan kode Java atau Groovy, atau VM Mono yang menggunakan C # atau VB.NET tampaknya masuk akal karena kedua runtime memiliki sandbox yang kuat dan fitur manajemen keamanan. SecurityManager Java misalnya. Namun sayangnya kedua runtime tersebut menggunakan model eksekusi kelas berat, startup, threaded, shared-everything-by-default yang kurang sesuai untuk proses ringan PostgreSQL, fork nothing-by-default fork () - tanpa-exec model. Mereka tidak benar-benar fork () bisa. Jadi kami tidak dapat menggunakannya dengan sangat efektif di PostgreSQL.
Craig Ringer
Pembaca di sini mungkin tertarik dengan masalah GitHub ini yang saya buat pada proyek Mono menggunakan Mono di fork () pada runtimes: github.com/mono/mono/issues/11857
Craig Ringer