2017-06-01 8 views
2

現在、ユーザーが外部から提供されたコードを実行するプログラムを作成中です(この場合は正当なものと仮定します)。多くの研究の後で、私はこれに関係するセキュリティの大半がSecurityManagerによって処理できることを発見しました。しかし、私はそれが長すぎると悪意を持っていると思われる場合、外部コードを殺す方法を見つけるのに苦労しています。例えば、外部のコードは次のように見えた場合:長すぎると信頼できないコードを停止する

while (true) { 
    try { 
     Thread.sleep(50); 
    } catch (InterruptedException e) { 
     // Oh well, keep running 
    } 
} 

これは永遠に実行し続けるだろう、とThread.interrupt()は、スレッドを停止するために何もしないだろう。問題を引き起こさない不正なスレッドを停止する別の方法はありますか?私が遭遇したのはThread.stop()ですが、それに付随するすべての問題のオプションではないようです。そうでない場合は、このコードを実行してプログラムが引き続き直接インターフェイスと通信できるようにするための他のオプションがありますか?

+0

この質問は意味をなさない。ユーザーが悪意のあるコードを実行する可能性がある場合、そのコードを試して殺すのに安全な間隔はありません。アプレットは理由のために死んだ。ここで本当に何をしたいですか? –

+1

それを監視するはずのあなたの信頼できるコードと同じJVMで信頼できないコードを実行するのは危険な考えです。これが理由の1つですが、VMがOOMEでクラッシュするまでメモリを割り当てただけではどうなるか考えてみてください。 – biziclop

答えて

0

コードを実行しているJavaプロセスを強制終了します。

Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","cmd 1 goes here"}); 

編集:

あなたも持っているだろうことを考えると、実行時にアクセスすることによって

ps -ax | grep java # identify the correct process 
kill $pid   # kill it 

あなたはJavaでこれを行うことができます:GNU/LinuxまたはMacOSのシステムを想定し

ユーザー提供のコードをコンパイルするには、それをコンパイルしてそれ自身のjvmで起動するのが理にかなっています。

さらに完全な仮想マシンでコードを実行することは理想的です。コードはサンドボックス化されており、ホストマシンにアクセスできないためです。

+0

悪意のあるコードのプロセスは私のオリジナルと同じではないでしょうか?本質的にプログラムが自分自身を殺すことを強要しますか? – StaticShadow

+0

はい、しかし、そのプロセスをjvmの別のインスタンスで起動することもできます – redxef

0

私は、あなたが記述しているようにスレッドを殺すだけの方法はないと信じています。スレッドが実行されている場合は、フラグを設定してスレッドに気付くか、スリープモードを実行します InterruptedException

唯一の方法は、スレッドが実行されているプロセスを強制終了することです。

call System.exit(int) 
関連する問題