1

ユーザーがテンプレートのソースコードを入力して実行できるようにするテンプレートシステムがあります。テンプレートのソース コードは、System、Runtime、および IO クラスを含む任意の Java オブジェクトにアクセスできます。

問題は、実行中のスレッドがなどの特定のメソッドを呼び出さないようにする方法System.exitです。new FileOutputStream

4

3 に答える 3

2

それを行う1つの(非常に重いが実行可能な)方法は次のとおりです。

  1. Java エージェントを使用して、(過去および将来に) ロードされたすべてのクラスを変換し、ブラックリストに登録されたメソッドの呼び出しが実際に別のメソッドにリダイレクトされるようにします。これにはClassFileTransformerASMを使用できます。たとえば、 への呼び出しは をSystem.exit呼び出しMySystem.exitます。もちろんMySystem変形させてはいけません。
  2. のコードは、変数などに基づいて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 (コード);
            }
        }
    }
  1. 元の呼び出しを呼び出したいスレッドについては、これThreadLocaltrueに設定し、他のスレッドについては に設定しnoます。

同様の解決策については、タイムマシンライブラリのソース コードを参照してください。

于 2012-11-21T23:45:30.863 に答える
1

生成されたコードではなく、インタープリターについて話していると仮定します。をSecurityManagerインストールすると、インタープリター コードのアクセス許可を減らすポリシーを設定することで、特権を減らすことができます。

の 2 引数形式を使用する場合java.security.AccessController.doPrivileged、直接の呼び出し元をチェックし、渡されたもの (たとえば、AccessController.doPrivileged) を無視するメソッドの呼び出しに問題があります。

明らかに、信頼されていないコードをホスティングすると、巨大な攻撃面が露呈します。クラスローダー階層で相互にピアであるクラスローダーを使用して、独自のコードの一部を隠すことができます。セキュリティ プロパティ package.access も便利です (ただし、別のクラス ローダーが必要です)。

于 2012-11-23T10:31:04.687 に答える
1

〇方法はいくつかあります。しかし、最もまともな方法は、セキュリティ マネージャーを使用して独自のクラス ローダーを作成することです (Google 検索で多くの例が得られるので、それほど時間はかかりません :))。クラス (実行時にコンパイルおよびロードされた) をクラス・ローダーにロードするときは、セキュリティー・マネージャーを指定する必要があります。そのコードでは、制限を提供できます。

合法的なリンクかどうかはわかりませんが、これは役立つはずです。

これも役立ちます。

于 2012-11-22T08:03:35.003 に答える