【问题标题】:prohibit the call to System.exit禁止调用 System.exit
【发布时间】:2012-01-06 09:45:42
【问题描述】:

我正在尝试禁止在某些 jar 中调用 System.exit(int);

这些 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 ?????

谢谢

【问题讨论】:

  • 显然java.lang.RuntimePermission exitVM是默认授予的,也许你必须明确拒绝。
  • 我希望 exitVM 权限默认开启。如果一段 Java 代码到达其执行的末尾,那么它可能需要隐式调用 System.exit(0) 来告诉 VM 它已完成。
  • 我假设您想知道如何将其关闭,但建议您编辑问题以明确提出该问题。
  • 系统范围的策略文件是什么样的? ${java.home}/lib/security/java.security
  • 据我了解,java.policy 文件仅授予权限。所以我认为“不打开它让它关闭”因为 jre/lib/security/java.policy 没有授予 java.lang.RuntimePermission exitVM ...

标签: java securitymanager


【解决方案1】:

根据错误报告http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238,策略文件没有禁止 System.exit() 调用。我正在使用 Java 1.6 运行一个应用程序,尽管它已被“解决”,但我仍然看到这个错误。与 OP 类似,我有一个系统范围的策略文件,其中不包含 exitVM 的权限。但是,我能够退出应用程序而不会引发任何异常。

我对包含自定义策略文件的理解是,除了策略文件中包含的权限之外,所有权限都被列入黑名单。由于 exitVM 不包括在内,它应该被禁止(覆盖 MicSim 提到的默认权限)。但这种情况并非如此。

【讨论】:

    【解决方案2】:

    来自RuntimePermission的Javadoc:

    注意:“exitVM.*”权限会自动授予从应用程序类路径加载的所有代码,从而使应用程序能够自行终止。

    阅读本文,您似乎必须通过编写自己的 SecurityManager 来明确拒绝此权限。 (例如,请参阅此答案:Prevent System.exit to actually exit the JVM

    【讨论】:

      【解决方案3】:

      或者,您可以执行 AOP 并拦截 System.exit。自己这样做是:创建自己的类加载器并使用 BPEL 来跟踪 System.exit,并修补这些调用。真的不是很大的努力。

      【讨论】:

        猜你喜欢
        • 2011-07-29
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多