如何找到包含 log4j 库的所有 *嵌套* jar 文件

如何找到包含 log4j 库的所有 *嵌套* jar 文件

我读过了这里log4j 库可以“嵌套”在与应用程序一起部署的其他文件中。

我可以找到文件名中带有“log4j”的文件,但不知道如何在这些“嵌套 jar”中找到 log4j。是否有可以从命令行使用的实用程序来检查嵌套 jar 的内容?

更新

我将尝试使用'西夫特' 在我的 Windows 机器上运行的 WSL2 Ubuntu Linux 上的开源工具。我预计从 WSL2 开始的文件扫描会更慢(跨越伪网络边界到文件系统的 Windows 端),但它仍然应该有效。我将在这里更新结果。

答案1

更新:2021-12-18...

请记住始终从下面列出的资源中查看最新信息

CVE-2021-45105... 2.16.0 和 2.12.2 不再是有效的补救措施!当前修复版本是 2.17.0 (Java 8) 和 2.12.3 (Java 7)。所有其他 Java 版本都必须采取权宜之计(从 log4j-core JAR 中移除/删除 JndiLookup.class 文件)。
我已相应地更新了下面的消息。


直接回答问题:

https://www.reddit.com/r/blueteamsec/comments/rd38z9/log4j_0day_being_exploited/cntl+f.class and .jar recursive hunter


补救措施:
CVE-2021-45046...CVE-2021-44228...CVE-2021-45105
虽然大多数需要知道的人可能已经知道足够多的信息来做他们需要做的事情,但我认为我还是会把它放在一边以防万一......

  • 遵循这些资源中的指导...它可能会改变,但

截至 2021-12-18

这基本上

  • 如果可能的话删除 log4j-core JAR 文件
    • 从两台跑步机上立即修复并且
    • 在您的源代码/源代码管理文件中,以防止将来的构建/发布/部署覆盖更改
  • 如果无法实现(由于依赖性),请升级它们
    • 如果您正在运行 Java8,那么您可以升级到 log4j 2.17.0+
    • 如果您正在运行早期版本的 Java,则可以升级到 log4j 2.12.3
    • 如果您正在运行旧版本的 Java,则需要升级到最新版本的 Java,然后使用最新版本的 Log4J
    • 再次强调,这些变化必须同时在运行的机器和代码中发生
  • 如果由于某种原因这两种情况都不可能实现......那么就只能采取非补救措施,即从 log4j-core JAR 中删除 JndiLookup.class 文件。
    • zip在 Linux 上,使用大多数 Linux 发行版默认附带的命令, 有一个用于临时解决方案的单行命令。
      • zip -q -d "$LOG4J_JAR_PATH" org/apache/logging/log4j/core/lookup/JndiLookup.class
    • 在撰写本文时,大多数关于 Windows 权宜之计选项的在线指南都建议执行以下操作(再次...假设您无法执行上述删除 JAR 或升级选项之一):
      • 安装类似 7-zip 的程序
      • 找到所有 log4j-core JAR 文件并对每个文件执行以下操作...
      • 重命名 JAR 以将扩展名更改为.zip
      • 使用 7-zip 解压 JAR(现在有.zip扩展名)
      • 从解压的文件夹中找到并删除 JndiLookup.class 文件
        • 路径是\\path\\to\\unzippedFolder\\org\\apache\\logging\\log4j\\core\\lookup\\JndiLookup.class
      • 删除旧的 JAR 文件(现在扩展名为 .zip)
      • 使用 7-zip 重新压缩该文件夹
      • 重命名新的 .zip 文件夹,将扩展名更改为.jar
    • 还有一些使用 Power Shell 的选项

如果您只需要处理 1 或 2 个 JAR 文件,并且您不介意安装 7-zip,或者可以使用 PowerShell 来执行此操作,那么这种方法就没问题。但是,如果您有大量 JAR 文件,或者您不想安装 7-zip 并且无法访问 Power Shell,我创建了一个开源 VBS 脚本,它可以为您完成此操作,而无需安装任何其他软件。https://github.com/CrazyKidJack/Windowslog4jClassRemover

阅读 README 和发行说明https://github.com/CrazyKidJack/Windowslog4jClassRemover/releases/latest

答案2

可能有点晚了,因为我看到你正在使用 Syft,但可以使用 PowerShell 中的 System.IO.Compression.FileSystem 库,并调用 OpenRead() 来查看内存中的内容。我编写了一个 PowerShell 脚本来检查我们的每台机器,重要的代码片段如下:

[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" ) #loads the required library
...
$openedJarFile = [System.IO.Compression.ZipFile]::OpenRead($jarFile)

一旦在 opensJarFile 变量中有了数据,您就可以编写一个循环来遍历每个条目,搜索 Log4J。

如果您需要参考,请参阅我的脚本这里

祝您狩猎愉快!

相关内容