0

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

我想这样做是为了确保在 JVM 中运行的任何服务都不允许创建已在CVE中被识别为安全风险的类的实例,让我们调用该类BadClass

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

4

2 回答 2

2

一个明显的非答案:甚至不要尝试

如果具有此依赖关系的较大库想要调用该方法怎么办?那应该怎么办?

换句话说,你的封锁应该做什么?

  • 抛出一些Error实例,这会导致 JVM 崩溃?
  • 返回null,以便(可能更晚)其他代码运行到NPE?

请记住:该类不存在于虚空中。还有其他代码调用它。那个代码没有为你准备好,好吧,再做什么?!

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

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

尝试将该特定类的不同版本潜入您的类路径中。要么是官方的,没有安全问题,要么是符合所需接口并且危害较小的东西。或者,如果您敢于走这条路,请按照其他答案的建议进行操作并进入“我自己的类加载器”业务。

无论如何,您的第一个目标是:在这里明确您的要求。阻塞是什么意思?!

于 2020-10-27T13:36:36.357 回答
2

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

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

  2. 如果您有一个带有集成测试的 CICD 管道,您还可以使用-verbose:class参数启动 JVM,并查看在运行测试时加载了哪些类。看起来有点hacky,但可能适合您的用例。只需将所有内容都投入游戏中,由您来判断最合适的人选。

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

于 2020-10-27T13:48:00.637 回答