ユーザーがPythonスクリプトを入力して、サンドボックスで実行できるアプリケーションを作成しています。実行されたコードが特定のモジュールをインポートしないようにする方法が必要なので、悪意のあるコードはそれほど問題にはなりません。Pythonでこれを行う方法はありますか?
7 に答える
SandboxedPythonに関するpython.orgの記事とリンクされた記事を確認しましたか?
これらのページには両方とも、他のリソースへのリンクがあります。
具体的には、PyPiのRestrictedPythonを使用すると、使用可能なものを正確に定義でき、いくつかの「安全な」デフォルトから選択できます。
Google App Engine のオープン ソースSDKには、不要なモジュールのインポートを停止するメカニズムの詳細かつ確実な実装があります (App Engine の本番インスタンスで利用できないモジュールをインポートしようとするコードを検出するのに役立ちます)。ユーザーコードが単に間違っているのではなく悪である場合は破壊されます (実稼働インスタンスには明らかに、これらのモジュールがまったくないなど、より多くの防御層があります;-)。
したがって、それはすべて、防御をどの程度深くする必要があるかにかかっています。極端な場合、ビルトインを別の場所に隠して__import__
、に委譲する前に必要なすべてのチェックを行う関数に置き換えるだけです__builtin__
。それはおそらく 20 行のコードで、実装と徹底的なテストに 30 分かかります... しかし、誰かがあなたのシステムに侵入するために私に 100 万ドルを信頼できると申し出た場合、それはあなたを長く保護できないかもしれません (そして、仮説として、私は良い人ではありませんでした-もちろん、私は実際には二足歩行の男です;-)。他の極端な例では、数千行の行と数週間の実装とテスト作業を必要とする一連の詳細な防御レイヤーを展開します。(もちろん、誰か ELSE が私よりも賢く、Python に精通しているというリスクは常にあります)。
さて、どこまで行きたいか、というか、どこまで行けるか…?
残念ながら、あなたがやろうとしていることは根本的に不可能だと思います。ユーザーがアプリケーションで任意のコードを実行できる場合、ユーザーは好きなことを実行できます。特定のモジュールをインポートできないようにできたとしても、同等の機能を(最初から、または使用可能なモジュールの一部を使用して)作成することを妨げるものは何もありません。
Pythonでサンドボックスを実装する方法の詳細はよくわかりませんが、インタープリターレベルで実行する必要があり、簡単なことではないと思います。
インポートメカニズムをオーバーロードできます。これを使用してプラグインのライセンスシステムを作成しました。モジュール名のホワイトリスト/ブラックリストを簡単に作成できます。