安全管理器java停止覆盖

时间:2014-11-20 13:48:40

标签: java securitymanager

如果我设置安全管理器,例如:

private static class SecManager extends SecurityManager {
...
}

使用:

System.setSecurityManager(new SecManager());

我可以使用(或者更确切地说是阻止)哪个权限来停止使用提升的权限再次设置安全管理器的代码。

我正在寻找一种方法:

private static class SecManager extends SecurityManager {
    @Override
    public void checkSetSecurityManager(SecurityManager manager){
        throw new AccessControlException("Not allowed to set new security Manager);
    }
 }

但是,当然,checkSetSecurityManager并不存在,因此我不确定要查找的内容或如何拒绝该权限。

我想使用安全管理器允许我运行一些不受信任的代码,但我显然不希望该代码能够设置它自己的安全管理器。我确实考虑过在操作系统级别这样做(为每一段代码创建一个新用户),但这似乎有点矫枉过正。相反,我运行自己的java main,它设置一个安全管理器,然后在同一个JVM中运行不受信任的代码。我已经确保他们的代码已经无法启动新进程(因为这会绕过安全管理器),但我需要确保他们不能覆盖现有的安全管理器。

我还使用checkWrite和checkRead来确保代码只能读取/写入某个目录。

非常感谢任何帮助。

谢谢,

1 个答案:

答案 0 :(得分:2)

以下网站https://www.securecoding.cert.org/confluence/display/jg/20.+Create+a+secure+sandbox+using+a+security+manager说明了以下内容:

  

如果当前安全策略由当前安全性强制执行   经理禁止替换(通过省略   RuntimePermission("setSecurityManager")),任何调用的尝试   setSecurityManager()将抛出SecurityException。

所以看起来checkPermission()方法就是检查它的地方。

RuntimePermission的Javadoc有一个可能的值列表,用于检查是否应该捕获其他关键方法:https://docs.oracle.com/javase/7/docs/api/java/lang/RuntimePermission.html