PL / Pythonが信頼できないのはなぜですか?


11

ドキュメントによると:

PL / Pythonは「信頼されていない」言語としてのみ利用可能です。つまり、ユーザーが実行できることを制限する方法が提供されていないため、plpythonuという名前が付けられます。セキュアな実行メカニズムがPythonで開発された場合、信頼できるバリアントplpythonが将来的に利用可能になる可能性があります。

Python用の安全な実行メカニズムを開発するのが難しいのに、Perlなどの他の言語用ではないのはなぜですか?

回答:


13

これは、Pythonのオブジェクトモデルに関連しています。安全ではない可能性があるオブジェクトへの参照を取得する方法は常にあります。問題に関するいくつかの情報については、rexecモジュールのドキュメントドキュメント制限付き実行の章を参照してください。

制限はPostgreSQL自体とは何の関係もありません。CPythonインタープリター実装に固有であり、Python言語自体にも固有のものです。

他のいくつかの言語は、Perl、Java、JavaScript、Luaなどのランタイムをチェックしています。それらのほとんどは一連のセキュリティ問題に直面しています。そのような制限された実行環境は、起こり得るすべての脱獄攻撃から保護することが非常に難しいためです。

rexecは多くの目的で「十分」であるので、PostgreSQLが半信頼できるPythonインタープリターを追加するのを妨げるものは何もありません。ただし、PostgreSQLは、ほとんどの場合に限っては十分ではないかもしれません。おそらく、スーパーユーザーのみとマークされている場合にのみ受け入れられますが、特定のユーザーに常にアクセスを許可することができます。信頼されていないPythonよりも優れています。

個人的には、ここではPL / V8などが未来だと思います。コアでサポートされるようになるのを期待しています。

また、C#、VB.NET、IronPythonなどで記述された「安全な」アセンブリをロードできる信頼できるMonoのアイデアを漠然と調査しましたが、そのトピックについてはあまり実行できませんでした。


これが信頼できないと見なされる理由として、これを見たことはありません。デフォルトでは、Java、V8、TCL、R、およびその他は信頼されていないと見なされます。Perlが信頼されている唯一の理由は、PostgreSQL postgresql.org/docs/11/plperl-trusted.htmlを
出荷

1
@ TheSteve0あなたはそのようにそれを見ていないかもしれませんが、それがそうである理由です。PostgreSQLには以前plpythonuがありましたがrexec、上記のリンクのように、本質的に安全ではないため、Python モジュールが非推奨になった後に削除されました。PyPiを使用するplpythonが、Pgが使用できる制限付きモードを提供できる可能性があると思います。仕事がたくさんあるかどうか見たことがありません。あなたは「Perlの特別な信頼できるバージョン」についても正しくありません-それは実際には完全に普通のPerlであり、同じインタプリタがplperlとplperluに使用されています。違いはランタイム構成です。
クレイグリンガー

@ TheSteve0 plperlは、実行時にPerlインタープリターインスタンスを異なる方法で構成します。参照plperl.cを具体的には、ゴーリーの詳細については、pp_require_safeplperl_trusted_init。制限されたPerl実行の本当の安全性について、私が十分に意見を述べるには十分な知識がありません。Luaの信頼できるバージョンを確認するか、信頼性の高いJavaScriptインタープリターであるマインドシェアと採用を改善したいと思います。しかし、今のところplperlです。
クレイグリンガー

@ TheSteve0 BTW、JavaまたはGroovyコードを使用するJava JVM、またはC#またはVB.NETを使用するMono VMは、どちらのランタイムにも堅牢なサンドボックスとセキュリティ管理機能があるため、非常に理にかなっているようです。たとえば、JavaのSecurityManager。ただし、残念ながら、どちらのランタイムもPostgreSQLの軽量プロセスのデフォルトで共有されていないfork()-without-execモデルに適さない、ヘビーウェイトスタートアップ、スレッド、デフォルトですべて共有の実行モデルを使用しています。それらは本当にfork()可能ではありません。そのため、PostgreSQLではこれらをあまり効果的に使用できません。
クレイグリンガー

ここの読者は、Monkを
Craig Ringer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.