2011-07-11 8 views
6

Pypyでサンドボックス化されたサブプロセスが、限定されたプロトコルを使用して親プロセスと通信できるようにしようとしています。サンドボックス化されたPypyのソケットモジュールの使用

Pypyに含まれているpypy/pypy/translator/sandbox/sandlib.pyのソースコードを確認したところで、os.openがソケットを開くことを許可するVirtualizedSocketProcがあるようです。コードの一部の機能を変更しました(たとえば、限られたポートでTCP接続を許可するなど)がほとんど変更されていません。しかし、実際にはPypyのsocketモジュールをインポートすることができません。なぜなら、存在しない_socketモジュールが必要なためです。これは、コードのインタプリタレベルの部分にあるようです。

私が実行しようとしていることは実現可能ですか?もしそうなら、私はどのようにソケットモジュールをインポートするのですか?そうでない場合は、他に何ができますか?

+2

「保護された」環境からソケットを開こうとする理由をより詳しく説明できますか? (私が何度も似たようなことをしたと判断したわけではありません。あなたが考えなかったかもしれないアプローチがあります)。より詳細な質問に答える方が簡単でしょう。 – synthesizerpatel

+0

私は、サンドボックスプロセスが親プロセスと通信できるようにしようとしています。ソケットを開くのは良いアイデアのようでした。私は、ポート番号、ホストなどを制限するコントロールを用意しています。ソケットは、2つのプロセスが通信するための簡単な方法のようです。 – nickname

+0

具体的には、サンドボックスの外で利用できるいくつかの機能へのアクセスを制限したいと考えています。 – nickname

答えて

4

これをさらに調査したところ、これはかなり基本的な問題であると思われます。ライブラリレベル(libディレクトリの内部)に実装されているsocketモジュールは、基本的に_socketライブラリの空のシェルです。これはpypy/moduleディレクトリに定義されているインタープリタレベルのモジュールです。 PyPyに精通していない人には、CPythonの純粋なPythonとCライブラリにほぼ相当する2種類のモジュールをインポートすることができます。ライブラリレベルで実装されたモジュールは、サンドボックスに簡単に組み込むことができ、実際には "default" pypy_interactサンドボックスに含まれています。ただし、インタプリタレベルで記述されたモジュールは、サンドボックス内では使用できません。

私のアプローチは、この重大な区別のため、資金管理に欠陥があるようです。あなたは、同じ問題に遭遇しなければならない代わりに、あなたが考えることができるいくつかの他の選択肢は、あります

  1. 使用os.openは直接tcp://で始まるファイル名で。これは実際に非常にうまく動作し、私の好むアプローチです。
  2. 独自のsocketライブラリを実装します。これは確かに好ましくありませんが、上記のようにサンドボックスコントローラと単に通信する比較的空のソケットライブラリを作成することは可能です。 は、これを達成するためにデフォルトのソケットライブラリを変更することも可能です(たとえば、_socketは含まない)。
関連する問題