我如何知道我正在使用的是哪个版本的Log4J?
众所周知,至少有四到五个Log4j JAR文件最终出现在类路径中。如何判断我使用的是哪个版本?
众所周知,至少有四到五个Log4j JAR文件最终出现在类路径中。如何判断我使用的是哪个版本?
在得知我的服务器可能容易受到新的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
它依赖于 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 的类上调用该方法:getImplementationVersion
Layout
org.apache.log4j.Layout.class.getPackage().getImplementationVersion()