如何找到 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 包含在<dependencyManagement>
添加依赖项,则必须从通常的依赖项中省略该依赖项的<version>
。以上是关于如何找到 Log4j 的深层用法的主要内容,如果未能解决你的问题,请参考以下文章