如何找到 Log4j 的深层用法

Posted

技术标签:

【中文标题】如何找到 Log4j 的深层用法【英文标题】:How to find deeply layered usages of Log4j 【发布时间】:2021-12-13 18:54:15 【问题描述】:

我想查找当前版本(2.15.0)之前log4j的所有用法。

我尝试使用 maven 的“mvn dependency:tree”,使用了几个工具(dependency-check、grype(对我不起作用)、syft(对我不起作用)、log4j-detector em>) 但它们只列出在 pom.xml 中指定它们后生成的类。

但是 - 这是我关心的问题:

例如我正在使用一个名为 hibernate-validator(Hibernate Validator Engine)的库。我确信这个引擎使用 Jboss 日志记录,而后者又使用 log4j 2.11.2,但我上面的工具都没有警告我这一点。我怎样才能知道哪些库使用了 log4j?

或者外部库不是这个漏洞的威胁?

请指教。

【问题讨论】:

嗨,也许展开包并查找与版本匹配的任何 jar(或检查 log4 jar 的清单) 也许我还是误解了整个事情。例如。这个库 jboss-logging 甚至能够使用 log4j 2.11.2 还是 maven 会自动选择模块的 pom.xml 中指定的 log4j 版本? 【参考方案1】:

Hibernate Validator 在这里领导。您的依赖关系树中没有它,因为 Hibernate Validator 和 JBoss Logging 根本不使用它。

Hibernate Validator 对 Log4j 2 有一个 test 依赖项,但它只是一个测试依赖项。因此,为什么您在依赖关系树中看不到它,这是准确的。

我正在发布具有更新测试依赖项的新 HV 版本,但这对您的应用程序来说不是问题,它们不会通过 Hibernate Validator 依赖 Log4j 2。

见https://github.com/hibernate/hibernate-validator/blob/main/engine/pom.xml#L119。

更新:为了避免安全扫描器误报,我发布了 Hibernate Validator 7.0.2.Final 和 6.2.1.Final。

【讨论】:

哦,这很有意义。感谢您抽出宝贵时间回复我!【参考方案2】:

JBoss logging、Jakarta Commons Logging、SLF4J 和 Log4j 2.x API(与易受攻击的 log4j-core 不同)等日志接口不直接依赖于任何日志后端。

默认情况下,他们会根据在类路径中找到的类来选择后端:如果您的类路径中没有 log4j-core 2.14.1 或更早版本,他们将不使用它 .

您可能遇到的最坏情况:如果他们没有找到后端,他们会恢复为默认值,这可能会记录到控制台或根本不记录。

编辑:请参阅this question,了解如何强制 Maven 仅使用 Log4j 2.15.0(如果需要的话)。

【讨论】:

感谢您的回答和编辑,这让您非常放心。在那个链接的问题中,log4j 包含在 pomimport 中。在我的 pom.xml 中,它仅包含在 jar 中,并且没有 scope 参数。我是否需要切换到新语法,或者这对于“强制 Maven 仅使用 Log4j 2.15.0”是否同样有效? 该答案使用 托管依赖项(参见documentation),这与通常的依赖项不同。如果向<dependencyManagement> 添加依赖项,则必须从通常的依赖项中省略该依赖项的<version>

以上是关于如何找到 Log4j 的深层用法的主要内容,如果未能解决你的问题,请参考以下文章

如何找到一个非常深层嵌套的A HREF让我的蜘蛛找到NEXT按钮?

如何将log4j2.xml 放在classpath

升级过log4j,却还没搞懂log4j漏洞的本质?

如何从类路径中读取log4j属性文件

如何在 slf4j 中删除 log4j 依赖

如何在 Android Studio 中找到 Strings.xml 的用法?