在 JVM 级别阻止 class 的实例?

Block instances of a class at the JVM level?

有没有办法配置 JVM 以阻止正在创建 class 的实例?

我想这样做是为了确保 JVM 中的服务 运行 不允许创建 class 的实例,该实例已被确定为 [=13= 中的安全风险], 我们称之为 class BadClass.

注意:我正在寻找通用解决方案,因此以下内容纯粹是附加信息。我通常会通过切换库或将其升级到没有漏洞利用的版本来解决这个问题,但它是一个更大的库的一部分,一段时间内不会解决这个问题。所以我什至没有在任何地方使用 BadClass,而是想完全阻止它。

独特的non-answer:不要甚至尝试!

如果具有此依赖关系的大型库想要调用该方法怎么办?那会发生什么?

换句话说,您的阻止 应该做什么?

  • 抛出一些 Error 实例,这会导致 JVM 的拆卸?
  • Return null,以便(可能很久以后)其他代码会遇到 NPE?

记住:class 不存在于虚空之中。有 other 代码调用它。该代码不是为您准备的,好吧,又要做什么?!

我认为这些问题没有个好的答案。

所以,如果你真的想“操纵”事物:

尝试将特定 class 的不同版本偷偷放入您的 class 路径。要么是官方的,没有安全问题,要么是符合要求的接口并且危害较小的东西。或者,如果您敢于走那条路,请按照其他答案的建议去做,并进入“我自己的 classloader”业务。

无论如何,你的第一个 objective:在这里清楚你的要求。 阻塞 是什么意思?!

我不知道 JVM 参数,但这里有一些替代方法可能会让您满足您的要求:

  1. 您可以编写一个 CustomClassLoader,让您可以很好地控制要做什么。正常用例是插件加载等。在您的情况下,这是 devops 级别的更多安全治理。

  2. 如果您有带有集成测试的 CICD 管道,您还可以使用 -verbose:class 参数启动 JVM,并查看在 运行 您的测试时加载了哪个 类 .看起来有点老套,但也许适合您的用例。把所有的东西都扔进游戏里,由你来判断最合适。

  3. 根据您的构建系统(Maven?),您可以限制仅在私有缓存库上构建应用程序。所以你应该完全控制它并在两者之间放置一个图书馆 - 审阅层。这也将在开发人员和存储库管理员之间分担责任。

您是否考虑过使用 Java Agent

它可以在任何 class 加载程序中拦截 class 加载,并在实际加载 class 之前操纵它的内容。然后,您可以将 class 修改为 remove/fix 这是错误,或者 return 虚拟 class 会在静态初始化程序中引发错误。