ユーザーがテンプレートのソースコードを入力して実行できるようにするテンプレートシステムがあります。テンプレートのソース コードは、System、Runtime、および IO クラスを含む任意の Java オブジェクトにアクセスできます。
問題は、実行中のスレッドがなどの特定のメソッドを呼び出さないようにする方法System.exitです。new FileOutputStream
ユーザーがテンプレートのソースコードを入力して実行できるようにするテンプレートシステムがあります。テンプレートのソース コードは、System、Runtime、および IO クラスを含む任意の Java オブジェクトにアクセスできます。
問題は、実行中のスレッドがなどの特定のメソッドを呼び出さないようにする方法System.exitです。new FileOutputStream
それを行う1つの(非常に重いが実行可能な)方法は次のとおりです。
System.exit呼び出しMySystem.exitます。もちろんMySystem変形させてはいけません。MySystem.exit条件付きで呼び出すことができます。System.exitThreadLocal パブリック クラス MySystem {
private static final ThreadLocal callOriginal = new ThreadLocal ();
static public final void exit (int コード) {
if (Boolean.TRUE.equals (callOriginal.get ())) {
System.exit (コード);
}
}
}
ThreadLocalをtrueに設定し、他のスレッドについては に設定しnoます。同様の解決策については、タイムマシンライブラリのソース コードを参照してください。
生成されたコードではなく、インタープリターについて話していると仮定します。をSecurityManagerインストールすると、インタープリター コードのアクセス許可を減らすポリシーを設定することで、特権を減らすことができます。
の 2 引数形式を使用する場合java.security.AccessController.doPrivileged、直接の呼び出し元をチェックし、渡されたもの (たとえば、AccessController.doPrivileged) を無視するメソッドの呼び出しに問題があります。
明らかに、信頼されていないコードをホスティングすると、巨大な攻撃面が露呈します。クラスローダー階層で相互にピアであるクラスローダーを使用して、独自のコードの一部を隠すことができます。セキュリティ プロパティ package.access も便利です (ただし、別のクラス ローダーが必要です)。