如果我设置安全管理器,例如:
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来确保代码只能读取/写入某个目录。
非常感谢任何帮助。
谢谢,
答案 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