我如何知道我正在使用的是哪个版本的Log4J?

2022-08-31 17:32:51

众所周知,至少有四到五个Log4j JAR文件最终出现在类路径中。如何判断我使用的是哪个版本?


答案 1

在得知我的服务器可能容易受到新的Log4j漏洞攻击(CVE-2021-44228)之后,我来到这里。所以我需要知道我是否安装了Log4j版本2的过时/易受攻击的版本。

这里以前的答案对检测旧版本没有帮助,因为它们是为了让已经运行的Java代码找出代码使用的Log4j版本,而我需要知道是否有任何Java应用程序可能使用易受攻击的版本。

以下是我所做的:

sudo find / -name 'log4j*'

这将列出我的(Linux)服务器上所有与Log4j相关的文件。这向我展示了一些1.x版本,它们不容易受到此特定CVE的攻击,以及一个2.15.0文件,该文件已经包含CVE的修复程序。

如果您运行此命令并找到具有2.x的文件或文件夹名称,其中x<15,那么您可能容易受到攻击,并且需要弄清楚如何尽快更新文件。

谨慎

我被警告说,对于我的目的来说,这还不够测试,因为Log4j文件可能隐藏在.jar文件中,命令不会发现。find

更新

这是一个公共项目,它试图扫描所有.jar文件,以便在档案中查找Log4j代码:Log4-detector


答案 2

它依赖于 ClassLoader,但请看一下示例

import org.apache.log4j.Layout;

public class X {
    public static void main(String[] a) {
        Package p = Layout.class.getPackage();
        System.out.println(p);
        System.out.println("Implementation title:   " + p.getImplementationTitle());
        System.out.println("Implementation vendor:  " + p.getImplementationVendor());
        System.out.println("Implementation version: " + p.getImplementationVersion());
    }
}

您可以在 log4j 的类上调用该方法:getImplementationVersionLayout

org.apache.log4j.Layout.class.getPackage().getImplementationVersion()

推荐