例如,如果我设置了一个安全管理器:
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并不存在,所以我不确定要查找什么或者如何拒绝该权限。
我想使用安全管理器来允许我运行一些不受信任的代码,但我显然不希望该代码能够设置它自己的安全管理器。我确实考虑过在OS级别(为每段代码创建一个新用户)这样做,但这似乎有点过火了。相反,我运行自己的java,它设置了一个安全管理器,然后在同一个JVM中运行不受信任的代码。我已经确保了他们的代码不能启动新的进程(因为这将绕过安全管理器),但是我需要确保它们不能覆盖现有的安全管理器。
我还使用checkWrite和checkRead来确保代码只能在特定的dir中读写。
任何帮助都是非常感谢的。
谢谢,
发布于 2014-11-20 13:59:53
以下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。
https://stackoverflow.com/questions/27041182
复制相似问题