Pythonのサンドボックス化は困難です。Pythonは複数のレベルで本質的に内観的です。
これは、特定の型のファクトリメソッドをそれらの型自体から見つけて、構築できることも意味します 、インタープリターによって制限なしで直接実行される新しい低レベルオブジェクト。
Pythonのサンドボックスから抜け出すための創造的な方法を見つける例を次に示します。
基本的な考え方は、基本的なPython型を作成する方法を常に見つけることです。Pythonインタプリタに任意の(チェックされていない!)バイトコードを実行させることにより、関数とクラスを作成し、シェルから抜け出します。
同じことがexec
ステートメント(exec()
Python 3の関数)にも当てはまります。
だから、あなたがしたい:
Pythonコードのバイトコンパイルを厳密に制御するか、少なくともバイトコードを後処理して、アンダースコアで始まる名前へのアクセスを削除します。
これには、Pythonインタープリターの動作とPythonバイトコードの構造に関する詳細な知識が必要です。コードオブジェクトはネストされています。モジュールのバイトコードはステートメントの最上位レベルのみを対象とし、各関数とクラスは、独自のバイトコードシーケンスとメタデータで構成され、たとえば、ネストされた関数とクラスの他のバイトコードオブジェクトを含みます。
ホワイトリストに登録する必要があります使用できるモジュールます。慎重に。
pythonモジュールには、他のモジュールへの参照が含まれています。をインポートする場合、モジュールを参照os
するローカル名os
がモジュールのネームスペースにありos
ます。これにより、断固とした攻撃者は、サンドボックスからの脱出に役立つモジュールに誘導される可能性があります。pickle
モジュールは、例えば、あなたがそうならば、例えば、任意のコードオブジェクトをロードすることができます任意のに対してホワイトリストモジュールのリード線を通るパスpickle
モジュール、あなたはまだ問題を抱えています。
時間の割り当てを厳密に制限する必要があります。最も去勢されたコードでさえ、あなたのリソースを拘束して、永久に実行を試みることができます。
厳密なバイトコード制御を提供しようとするRestrictedPythonを見てください。RestrictedPython
Pythonコードを、Python 2.3から2.7で許可される名前、モジュール、オブジェクトを制御できるものに変換します。
場合はRestrictedPython
、あなたの目的のために十分安全であるあなたが実装するポリシーに依存しません。アンダースコアで始まる名前へのアクセスを許可せず、モジュールを厳密にホワイトリストに登録することから始めます。
私の意見では、本当に堅牢なオプションは、実行後に毎回破棄する外部世界へのネットワークアクセスがない別の仮想マシンを使用することだけです。新しいスクリプトには、代わりに新しいVMが割り当てられます。そのようにコードがPythonのサンドボックスから抜け出したとしても(これはありそうもないことですが)、攻撃者がアクセスできるのは短命で、価値がありません。