有没有一种方法可以配置JVM来阻止正在创建的类的实例?
我想这样做是为了确保JVM中运行的任何服务都不允许创建CVE中被识别为安全风险的类的实例,让我们调用该类BadClass
。
注意:我正在寻找一个通用的解决方案,因此以下内容纯粹是附加信息。我通常会通过切换库或将其升级到没有漏洞的版本来解决这个问题,但它是一个更大的库的一部分,在一段时间内不会解决这个问题。所以我甚至没有在任何地方使用BadClass
,而是想完全阻止它
我不知道JVM参数,但这里有一些替代方案可能会让你处于解决需求的位置:
-
您可以编写一个CustomClassLoader,让您可以很好地控制要做什么。正常的用例是插件加载等。在您的情况下,这是在devops级别上进行更多的安全治理。
-
如果您有一个带有集成测试的CICD管道,那么您也可以使用
-verbose:class
参数启动JVM,并查看在运行测试时加载了哪些类。看起来有点古怪,但可能适合您的用例。只要把一切都投入到比赛中,就可以由你来判断最合适的人选。 -
根据您的构建系统(Maven?(,您可以仅在您的私有缓存库上限制构建应用程序。所以你应该完全控制它,并在两者之间设置一个库评审层。这也将在开发人员和存储库管理员之间分担责任。
一个明显的否定答案:不要甚至尝试!
如果具有此依赖关系的较大库想要调用该方法,该怎么办?那该怎么办?
换句话说,您的阻塞应该做什么?
- 抛出一些
Error
实例,导致JVM崩溃 - 返回null,这样(可能很久以后(其他代码就会运行到NPE中
请记住:该类不存在于void中。还有其他代码在调用它。该代码没有为你的到来做好准备,好吧,再做什么?!
我认为这些问题有很好的答案。
所以,如果你真的想"操纵";事物:
尝试将该特定类的不同版本偷偷放入类路径中。要么是一个没有安全问题的官方接口,要么是符合所需接口并危害较小的接口。或者,如果你敢走这条路,按照另一个答案的建议去做,进入";我自己的类加载器";商业
无论如何,你的第一个目标是:在这里明确你的要求。阻止意味着什么?!
您是否考虑过使用Java Agent?
它可以在任何类加载器中拦截类加载,并在实际加载类之前处理其内容。然后,您可以修改类以删除/修复它的错误,或者返回会在静态初始值设定项中引发错误的伪类。