通过扫描 jar、war 和 ear 文件来搜索 JndiLookup.class 的存在,可能可以检测出受 log4j CVE-2021-44228 问题影响的应用程序。
根据您正在调查的平台,运行 PowerShell 或 Python3 脚本可能更合适。在这两种情况下,可选参数是您希望开始搜索的顶级目录。
任何发现的文件都值得调查,以确定使用它的应用程序是否易受攻击。对于存在的任何 JndiLookup.class,log4j 通常会在 jar 文件名中包含版本号。例如,命中 log4j-core-2.14.1.jar 表明应用程序易受攻击。另外,log4j-core-2.16.jar 也可能会产生命中,因为 log4j 2.16 版本中仍然存在 JndiLookup 代码,但默认情况下已禁用。更多详情请参见 VU#930724。
例如,以下是 PowerShell 版本扫描器的调用:

同样,以下是 Python3 版本的调用:

最后,以下是 Bash 版本的调用:

请注意,此脚本的 Bash 和 Python 版本默认会将扫描限制为单个文件系统。
使用 PowerShell 版本,可以将要扫描的位置通过管道传递给脚本,从而控制检查的内容。例如,要扫描文件 paths.txt 中包含的路径列表:
get-content .\paths.txt | .\checkjndi.ps1
让我们看看 Windows 扫描执行中的第一个命中结果:
WARNING: C:\tmp\2.15\log4j-core-2.15.0.jar contains org/apache/logging/log4j/core/lookup/JndiLookup.class
根据 jar 文件名,这是来自 log4j 2.15 的库。虽然此 log4j 版本修复了 CVE-2021-44228,但它仍然存在一个缺陷,即 CVE-2021-45046。CVE-2021-45046 的影响仅对某些使用 log4j 2.15 的 Java 应用程序造成拒绝服务。对于使用 log4j 版本低于 2.15 且同时满足 CVE-2021-45046 先决条件的 Java 应用程序,影响是远程代码执行(RCE)。
让我们看看第二个命中结果:
C:\tmp\2.16\log4j-core-2.16.0.jar contains org/apache/logging/log4j/core/lookup/JndiLookup.class ** BUT APPEARS TO BE PATCHED **
此 jar 文件包含 log4j 2.16 版本,该版本不易受 CVE-2021-44228 攻击。此结果仅供参考,表明供应商已修补其产品。
让我们看看第三个命中结果:
WARNING: C:\tmp\ghidra_10.0_PUBLIC\Ghidra\Framework\Generic\lib\log4j-core-2.12.1.jar contains org/apache/logging/log4j/core/lookup/JndiLookup.class
这里我们可以看到 Ghidra 使用 log4j 版本 2.12.1,因此我们应该认为它易受攻击。确实,Ghidra 10.1 之前的版本易受 CVE-2021-44228 攻击。
您应该调查这些脚本报告的任何命中结果,并确认 log4j 版本确实是修复后的 2.16 版本,或者联系软件供应商获取修复后的软件版本。另外,VU#930724 提供了有关如何从易受攻击的 jar 文件中移除 JndiLookup.class 的信息。
PowerShell 版本的扫描器在无法调查文件或目录时会提供额外的错误报告。特别是,任何报告 UnauthorizedAccessException 的 Unable to scan 错误表明访问目录和/或文件时存在权限问题。任何报告 InvalidDataException 的 Unable to scan 错误通常是由于归档文件损坏导致的。