10

現在、信頼できないJavaコードを実行するためのサンドボックスを作成しようとしています。アイデアは、Javaアプリケーションをファイルシステムまたはネットワークソケットへのアクセスから分離することです。私が現在持っている解決策は、IOまたはネットワークへのアクセスを禁止するSecurityManagerを書き直したものです。

ここで、禁止するのではなく、ファイルシステムへの呼び出しをリダイレクトします。つまり、アプリケーションが「/home/user/application.txt」に書き込みたい場合は、ファイルへのパスを「/ temp /trusted_folder/」のように置き換える必要があります。 application.txt"。したがって、基本的には、アプリケーションが特定のフォルダー内のファイルシステムにのみアクセスできるようにし、他のすべての呼び出しをこのフォルダーにリダイレクトできるようにします。

したがって、これがクラスFileOutputStreamのメソッドであり、SMは、指定されたパスに書き込むためのアクセス許可があるかどうかを尋ねられます。

 public FileOutputStream(File file, boolean append)
    throws FileNotFoundException
{
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    fd = new FileDescriptor();
    fd.incrementAndGetUseCount();
    this.append = append;
    if (append) {
        openAppend(name);
    } else {
        open(name);
    }
}

明らかに、SMはFileOutputStreamにアクセスできず、SecurityExceptionをスローすることを除いて、メソッドの内部変数(namefileなど)を変更したり、実行順序に何らかの影響を与えたりすることはできません。内部フィールドへのアクセスはオブジェクト指向の原則に違反していることを理解しています。ローカル変数は表示され、宣言されたメソッド内にのみ存在することを理解しています。

だから私の質問は:Security Managerがファイルシステムへの呼び出しを置き換えることを可能にする方法はありますか?そうでない場合、これを行うために使用できる他のアプローチはありますか?

私は十分に明確だったと思います。

4

4 に答える 4

6

SecurityManagerはそれを行うことができず、「はい」または「いいえ」としか言えません。

私は2つのオプションを考えることができます:

  1. ファイルシステムを使用してOSレベルで何かを実行します。chroot刑務所のようなものがあります。これはアプリケーションにとって透過的ですが、Javaの外部での作業が必要です。

  2. それらのFileOutputStreamを開くアプリケーションにAPIを提供します。APIレイヤーは、ファイルの送信元を決定し、(セキュリティマネージャーの用語で)どこからでもファイルを開くことができます。もちろん、これには、サンドボックス化されたアプリケーションがjava.io.File直接ではなくAPIを使用する必要があります。ただし、柔軟性もはるかに高く、たとえばJava WebStartの場合と同様に、アプリケーションがサンドボックスを認識してサンドボックスAPIを使用する必要がある場合があります。

于 2010-12-01T09:12:17.767 に答える
6

Javaがオープンソースになったので、ソースコードをダウンロードし、ソースコードをFileOutputStream変更して必要な制約を適用し、再コンパイルしてjarに追加し、そのJARをJVMのブートローダークラスパスの前に追加できます。

java -Xbootclasspath/p:myModifiedJavaClasses.jar sandbox.Main -run untrusted.Main

JVMはjava.io.FileOutputStream、通常の実装の代わりにの実装を使用するようになります。特別なサンドボックスリダイレクトロジックを必要とするすべてのJSEクラスについて、すすぎ、繰り返します。

これは、パラメーターを起動するために「VMの外部」での変更が必要なため、最も移植性が高く、簡単に展開できるソリューションではありませんが、特定の状況では、このソリューションが受け入れられ、効果的である場合があります。

于 2010-12-01T09:27:39.010 に答える
0

できないと思います。セキュリティマネージャは、IOをリダイレクトしたり、そのようなことをしたりするのではなく、特定の操作へのアクセスを拒否するように設計されています。

深刻なリフレクションハッカリーによって可能になったとしても、異なるjvmベンダー間、および同じjvmを実行している異なるオペレーティングシステム間でさえ移植できない可能性があります。(これは、OS固有のクラスを操作する必要があるためです)。

やりたいことは、より低いレベルで試行する必要があります。Linuxのchrootおよびその他のより重い仮想化手法を参照してください。

于 2010-12-01T09:15:10.377 に答える
0

あなたがやろうとしていることは、すでにウェルスフロントのエンジニアによって実装されていると思います。
これについての彼らのブログエントリは次のとおりです:http://eng.wealthfront.com/2010/11/less-io-for-your-java-unit-tests.html

于 2010-12-01T09:27:00.223 に答える