2

プロジェクトでlibsandboxを使用しようとしていました。このサンドボックスで C/C++ プログラムを完全に実行できます。c/c++ プログラムを実行するには、まずコードを次のようにコンパイルする必要があります。

g++  -lm  --static  <filename>  2> err.txt

次に、上記のコンパイル済みコードを使用してサンプル サンドボックス プログラムを実行する必要があります。

上記で使用したフラグ--staticは非常に重要であることに注意してください。 --static の重要性は、次の 2 つのスタックオーバーフロー回答Link1Link2に反映されています。

今度は、このサンドボックスを Python だけでなく Java にも使用したいと考えています。 しかし、Python と Java に相当するgcc/g++ --staticを知りません。

以下は動作しますか?

  javac --static    <filename>  2> err.txt 

  python  --static  <filename>  2>err.txt

繰り返しますが、Java または Python の --static に相当するものがわからないため、混乱しています。

ありがとうございました!

4

3 に答える 3

3

あなたは2つのことを混同していると思います。あなたの Python プログラムは、libsandbox話している意味での実行可能ファイルではありません。実行可能ファイルは Python インタープリターです。

そのため、Python スクリプトを でサンドボックス化することはできませんlibsandbox

ただし、Python インタープリターをサンドボックス化することはできます。これは、他の実行可能ファイルをサンドボックス化するのと同じ方法で行います。また:

  • Python インタープリターの静的ビルド (コンパイルが必要な C 拡張モジュールを含む) を作成し、それをサンドボックスで実行します。これは簡単ではありませんが、実行可能です。Python のソース ツリーやその他の場所に役立つ情報があります。
  • 標準インタープリターが必要なすべてのことを実行できる (必要に応じて拡張モジュールを動的にロードすることを含む) より寛大なサンドボックスを使用しますが、それ以上は実行できません。

いずれにせよ、許可できないものと許可できないもの、および Python コードのさまざまなビットをシステムコールにマップする方法などを把握するには、試行錯誤が必要です。また、Python コードに実行させたくない同じ syscall がインタープリター自体に必要なため、スクリプトが実行するのを防ぐことができないことがいくつかあります。

事実上、Java でも同じことが言えます。JVM は実行可能ファイルであり、プログラムではありません。また、実際には JVM を静的にリンクすることはできないため、2 番目のオプションしかありません。

もちろん、gcjJava コードを JVM コードではなくネイティブ コードにコンパイルするために使用している場合を除きます。その場合、実際には and と同じバックエンドを使用してgccおり、確認するためg++に使用するだけで、他のすべては静的にリンクされます。はより多くのことを内部で行っているため、まだ問題が発生する可能性がありますが、概念は C コードの場合と同じです。--staticlibgcjlibgcjlibc

(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か? 実際のユースケースを知らなければ、これらの質問に対する答えを推測することさえできません. しかし、それらすべてに対する答えがすぐに見つからなければ、何の役にも立たないでしょう。

于 2013-02-01T19:47:19.320 に答える
3

で Python インタープリターをサンドボックス化することができlibsandboxます。たとえば、共有ライブラリをロードしたり、デフォルトの Python モジュールをインポートしたりするために、いくつかのシステム コールを処理する必要があります。以上の Python3 インタープリターの実例は、Richard Lobb のプロジェクトでpysandbox見つけることができます。CodeRunner

https://github.com/trampgeek/CodeRunner

Java には独自のセキュリティ メカニズムがあります。そのため、Java VM をサンドボックス内にラップする必要はありません。

免責事項: 私は の作成者ですlibsandbox

于 2013-02-28T19:08:02.280 に答える
-2

Javaの場合、静的にバインドされたJNIラッパーを使用することが唯一のオプションのようです。すでにそのようなラッパーがあるかもしれませんが、それを書くことができれば。

于 2013-02-01T19:46:44.140 に答える