ユーザーがテンプレートのソースコードを入力して実行できるようにするテンプレートシステムがあります。テンプレートのソース コードは、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.exit
ThreadLocal
パブリック クラス 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 も便利です (ただし、別のクラス ローダーが必要です)。