如果没有非法访问 ( --illegal-access=deny
) 和拒绝访问jdk.unsupported
(使用accessClassInPackage
检查完成),看起来ReflectPermission "suppressAccessChecks"
不会再导致完整的沙箱逃逸。
真的吗?当将此权限授予不受信任的代码时,还有其他方法可以损害 JVM 的安全性吗?
这是设置:
- java.policy 文件授予所有代码
ReflectPermission "suppressAccessChecks"
。 - 使用默认的 java 安全管理器。这是通过添加
-Djava.security.manager
到 VM 选项来完成的。 - 通过添加
--illegal-access=deny
到 VM 选项来禁止非法访问。
要清楚:
- 安装了 SecurityManger。(为什么我什至必须说明这一点?)
- 要加载您需要的本机库
RuntimePermission("loadLibrary.*")
- 这是不被授予的 - 要访问
sun.misc.Unsafe
,您需要访问RuntimePermission("accessClassInPackage.sun.misc")
未授予的 - ClassLoader.defineClass
要通过反射和访问例如setAccessible(true)
,java.base
必须打开java.lang
您的模块 - 它没有。
所以要么:
ReflectPermission "suppressAccessChecks"
如果被授予,还有其他方法可以绕过/逃避 java 沙箱吗?- 或者模块边界是否被视为安全边界,这样的沙箱绕过将被视为安全漏洞?
简而言之:
如果我有以下策略文件my.policy
:
grant {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
和一个正常的Main.java
:
public class Main {
public static void main(String[] args) {
// Your code here
}
}
并运行它java --illegal-access=deny -Djava.security.manager -Djava.security.policy=my.policy Main
,沙箱可以逃脱吗?