我正在开发一个库,需要实例化并返回从外部网站下载的不受信任的对象.在高级别,图书馆的工作方式如下:
这是一个主要的安全风险,因为不受信任的代码几乎可以做任何事情.为了解决这个问题,我的库有以下设计:
SecurityManager和,在实例化不受信任的对象时,我使用一个AccessController来处理没有特权的上下文中的实例化.AccessController方法将所有方法请求转发到底层对象,以确保不受信任的代码永远不会以任何权限运行.但是,我发现这可能不是最优雅的解决方案.从根本上说,我想从远程源下载的任何类型的任何对象中删除所有权限.我目前使用的AccessController只是一种通过拦截所有请求并在执行它们之前删除权限来伪造它的方法.该AccessController方法也有其自身的问题:
我的问题是:有没有办法将类加载到JVM(可能使用自定义ClassLoader),这样这些类的任何实例都执行没有权限的方法?
谢谢!
您将需要使用defineClass不受信任的ProtectionDomain.
您当前的解决方案存在许多问题。它似乎没有涵盖静态初始化程序。可以将代码安装到一些可变参数中。使用直接调用者的方法仍将享有特权(AccessController.doPrivileged例如)。但最重要的是,当与任何类型的全局发生冲突时,例如运行终结器,它就会崩溃。