あなたは2つのことを混同していると思います。あなたの Python プログラムは、libsandbox
話している意味での実行可能ファイルではありません。実行可能ファイルは Python インタープリターです。
そのため、Python スクリプトを でサンドボックス化することはできませんlibsandbox
。
ただし、Python インタープリターをサンドボックス化することはできます。これは、他の実行可能ファイルをサンドボックス化するのと同じ方法で行います。また:
- Python インタープリターの静的ビルド (コンパイルが必要な C 拡張モジュールを含む) を作成し、それをサンドボックスで実行します。これは簡単ではありませんが、実行可能です。Python のソース ツリーやその他の場所に役立つ情報があります。
- 標準インタープリターが必要なすべてのことを実行できる (必要に応じて拡張モジュールを動的にロードすることを含む) より寛大なサンドボックスを使用しますが、それ以上は実行できません。
いずれにせよ、許可できないものと許可できないもの、および Python コードのさまざまなビットをシステムコールにマップする方法などを把握するには、試行錯誤が必要です。また、Python コードに実行させたくない同じ syscall がインタープリター自体に必要なため、スクリプトが実行するのを防ぐことができないことがいくつかあります。
事実上、Java でも同じことが言えます。JVM は実行可能ファイルであり、プログラムではありません。また、実際には JVM を静的にリンクすることはできないため、2 番目のオプションしかありません。
もちろん、gcj
Java コードを JVM コードではなくネイティブ コードにコンパイルするために使用している場合を除きます。その場合、実際には and と同じバックエンドを使用してgcc
おり、確認するためg++
に使用するだけで、他のすべては静的にリンクされます。はより多くのことを内部で行っているため、まだ問題が発生する可能性がありますが、概念は C コードの場合と同じです。--static
libgcj
libgcj
libc
(JVM 自体には独自のアクセス モデルがあり、Linux syscall API の代わりに Java API のレベルで Java プログラムをサンドボックス化するために、おそらくクラスローダーでリフレクションを使用して何かを構築できます。そのようなものが既に存在するかどうかはわかりません。 .)
「--static」なしでプログラム(サンドボックスで実行したい)をコンパイルしようとすると、サンドボックスが機能しませんでした。
ほとんどの場合、実際のコードではファイルが開かれないため、ファイルを開くことを禁止する既定のサンドボックス設定を使用しています。しかし、プログラムを動的にリンクする場合、リンクするためにファイルを開く必要が.so
あります。サンドボックスが禁止するように構成されているため、これは機能しません。
.so
同じプログラムを静的にリンクすると、実行するために s を開く必要がなくなるため、問題はなくなります。一言で言えば、それがサンドボックスの静的リンクのポイントです。SYS_open
あなたは質問へのコメントでこれを説明したので、なぜ禁止したいのか、それが何を意味するのかさえ理解していない限り、あなたがそれを理解できなかったとは想像できません.
(a) Java と Python の場合、「--static」なしでコンパイルするとサンドボックスは機能しますか?
はい、サンドボックスは問題なく動作します。つまり、デフォルトの構成を使用している場合、ファイルを開くことが禁止されます。これは、Java または Python プログラムが失敗することを意味します。これは、VM/インタープリターが (とりわけ) プログラムを開いて実行する必要があるためです。
インタープリターまたは JVM を静的にリンクしても、それは役に立ちません。実行可能ファイルに静的にリンクされたプログラムの実際のバイトコードを取得する必要があります。不可能ではありませんが、おそらく現時点で検討したいことをはるかに超えています。
正しいことは、禁止しようとしているシステムコールとその理由を正確に把握し、サンドボックスを適切に構成することです。デフォルトの構成は機能しません。
(b)同じ開発者による pysandbox というサンドボックスがあります openjudge.net/~liuyu/Project/LibSandbox
pysandbox
サンドボックスを構成して開始する簡単な方法です。サンドボックス化されたコード内からは使用しません。( Python レベルでコードをサンドボックス化する別 pysandbox
の開発者によるものがあります。これは役に立つかもしれませんが、syscall サンドボックスと同じではありません。)
この時点では、自分が何をしようとしているのかさえわからないでしょう。そもそも、なぜコードをサンドボックス化する必要があるのでしょうか? コードが必要なことを実行するために、どのような種類のアクセスが必要か知っていますか? 何をしようとしているのかわかっている場合、システムコールレベルのサンドボックスは、のようなものとは対照的に、それを強制するのに適切なレベルであると確信していますRestrictedPython
か? 実際のユースケースを知らなければ、これらの質問に対する答えを推測することさえできません. しかし、それらすべてに対する答えがすぐに見つからなければ、何の役にも立たないでしょう。