9

如果没有非法访问 ( --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,沙箱可以逃脱吗?

4

0 回答 0