我正在开发一个库,该库需要实例化并返回从外部网站下载的不受信任的对象。在较高层次上,该库的工作方式如下:

  • 库的客户端从远程源请求一个类。
  • 我的库实例化该对象,然后将其返回给用户。

  • 这是主要的安全风险,因为不受信任的代码几乎可以执行任何操作。为了解决这个问题,我的图书馆设计如下:
  • 我启用SecurityManager,并且在实例化不受信任的对象时,我使用AccessController在没有特权的上下文中处理实例化。
  • 在将对象返回给客户端之前,我将对象包装在一个装饰器中,该装饰器使用AccessController将所有方法请求转发到基础对象,以确保不信任的代码永远不会以任何权限运行。

  • 但是,对我来说,这可能不是最优雅的解决方案。从根本上讲,我想剥夺所有从远程源下载的任何类型的对象的所有权限。我目前对AccessController的使用只是通过在执行请求之前拦截所有请求并删除特权来伪造此方法。 AccessController方法也有其自身的问题:
  • 如果包装的对象具有任何返回对象的方法,则这些返回的对象必须自己包装。
  • 包装器代码的长度可能为数千行,因为必须保护每个导出的方法。
  • 必须预先知道下载对象导出的所有方法,以便进行包装。

  • 我的问题是:是否可以将类加载到JVM中(可能使用自定义的ClassLoader),以使这些类的任何实例在没有权限的情况下执行其方法?

    谢谢!

    最佳答案

    您将要使用不受信任的defineClass调用ProtectionDomain

    您当前的解决方案有很多问题。它似乎没有涵盖静态初始化程序。可以将代码安装到某些可变参数中。使用直接调用方的方法仍将具有特权(例如AccessController.doPrivileged)。但最重要的是,当碰到任何类型的全局变量(例如运行终结器)时,它都会落到实处。

    07-24 09:47