11

System.exit(int);一部のjarファイルでの呼び出しを禁止しようとしています。

これらのjarは外部チームによって開発され、「コンテナ」アプリケーションによってロードされます。

私の最初の反射神経は、Javaセキュリティマネージャーを使用することです。

-Djava.security.manager-Djava.security.debug=all

最も単純な${user.home}/.java.policyファイルで:

grant {};

System.getProperties()などを呼び出すことはできなくなりましたが(java.util.PropertyPermissionがないため)、System.exit(0)を実行できます。

このオプションjava.security.debug=allは、次のコンソールを提供します。

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>)
sun.misc.Launcher $ AppClassLoader @ 10385c1
<no principals>
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM)
(java.io.FilePermission \my-bin-path\- read)
)

my-bin-pathのすべてのクラスが許可されているのはなぜですかjava.lang.RuntimePermission exitVM?????

ありがとう

4

3 に答える 3

3

バグ レポートhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238によると、ポリシー ファイルは System.exit() 呼び出しを禁止していませんでした。Java 1.6 でアプリケーションを実行していますが、「解決済み」であるにも関わらず、まだこのバグが見られます。OP と同様に、exitVM のアクセス許可を含まないシステム全体のポリシー ファイルがあります。ただし、例外がスローされることなくアプリケーションを終了できます。

カスタム ポリシー ファイルを含めることについての私の理解では、ポリシー ファイルに含まれているものを除いて、すべてのアクセス許可がブラックリストに登録されています。exitVM は含まれていないため、許可しないでください (MicSim で言及されているデフォルトのアクセス許可をオーバーライドします)。しかし、そうではありません。

于 2013-01-11T18:41:34.453 に答える
2

RuntimePermissionの Javadoc から:

注: 「exitVM.*」パーミッションは、アプリケーション クラス パスからロードされたすべてのコードに自動的に付与されるため、アプリケーションが自分自身を終了できるようになります。

これを読むと、独自の SecurityManager を作成して、この許可を明示的に拒否する必要があるようです。(例については、この回答を参照してください: System.exit が実際に JVM を終了しないようにする)

于 2011-11-25T16:24:39.117 に答える
1

または、AOPを実行してSystem.exitをインターセプトすることもできます。これを自分で行うには、独自のクラスローダーを作成し、BPELを使用してSystem.exitをトレースし、それらの呼び出しにパッチを適用します。本当に大きな努力ではありません。

于 2011-11-25T17:28:31.337 に答える