web-dev-qa-db-ja.com

信頼できないコードを実行するpythonコードを安全に実行する

信頼できないユーザーが入力したコードをevalまたはexecステートメントに実行しようとする人々に関する他のいくつかの投稿を見ました。私の実装では、事前にコードをチェックしてインポート文を探し、exec文に組み込み関数がないことを確認し、すべてのグローバル変数をクリアしています。また、コードで__を使用するためのチェックを配置して、ユーザーが危険なコードをそのように入力できないことを確認します

これで問題は解決しますか、それともユーザーが危険なモジュールをインポートしてシェルから抜け出したり、悪意のある操作を行ったりする他の方法はありますか?

5
adammoyle

Pythonには、プログラム内で信頼できないコードを安全に実行できるセキュリティモデルがありません。このようなセキュリティモデルを備えた言語(Javaなど)でも、このセキュリティモデルの使用を疑わしいものにする無数のバグが存在する傾向があります。

このセキュリティ問題には2つの合理的なアプローチがあります。

  • オペレーティングシステムのセキュリティ機能を使用します。 Linuxのseccomp/capabilities/namespaces。

  • 無制限のコードを許可せず、代わりにドメイン固有の言語を解釈するか、単純なデータモデルで入力をパラメーター化します。多くの問題ドメインでは、コードの代わりに構成するのが妥当なアプローチです。サンドボックス化された仮想マシンを含めることも可能です。 JavaScript環境。

3番目のソリューションはおそらく最も現実的です。アプリケーションのセキュリティモデルを、自分が記述し​​ていないコードを実行するという現実に適合させます。例えば。ユーザーが自分でソフトウェアを実行する場合、ユーザーが作成したプラグインが問題になります。この可能性を文書化する限り、これは問題ありません。

信頼できないコードにユーザー定義のオブジェクトを提供する限り、インポートを禁止するだけでは役に立たないことに注意してください。リフレクションを使用すると、多くの場合、ビルトインの完全なセットや既にインポートされている他のモジュールなど、それが定義されているモジュールから変数にアクセスできます。

3
amon

最も近いのは、おそらくPyPyのサンドボックス機能です。 http://doc.pypy.org/en/latest/sandbox.html

ただし、これはリソースの枯渇を防止するものではなく、前述のamonツールでさらに制限することができます。

1
2080