
(使用 Go 编写,因为,你知道的,“一次编写,到处运行”。)
这是一个简单的工具,可用于在 Java 软件(如 Web 应用程序)的安装中查找存在漏洞的 log4j 1.x 和 2.x 实例。它会检查 JAR 和 WAR 归档文件,并标记已知存在漏洞的类文件。扫描以递归方式进行:包含 WAR 文件的 WAR 文件,其中再包含 JAR 文件,而 JAR 文件中又包含存在漏洞的类文件——这些都应该能被正确标记。
目前可识别的漏洞包括:
该扫描工具目前会检查通过 Maven 获取的已知构建产物。Linux 发行版中常见的从源码重新构建的版本可能无法被识别。
此外,还附带一个简单的补丁工具,可通过重写 ZIP 归档结构来从 JAR 文件中修补掉有问题的类。
针对已标记版本的 x86_64 Windows、Linux、MacOSX 二进制文件可通过 Releases 页面获取。
$ ./local-log4j-vuln-scanner [--verbose] [--quiet] \
[--ignore-v1] [--ignore-vulns=...] \
[--exclude /path/to/exclude …] \
[--scan-network] \
[--log /path/to/file.log] \
/path/to/app1 /path/to/app2 …
--verbose 标志会显示每个被检查的 .jar 和 .war 文件,即使未发现问题也会显示。
--quiet 标志会抑制输出,仅显示已知漏洞的指示信息。
--ignore-v1 标志将_排除_对 log4j 1.x 漏洞的检查。
--ignore-vulns 标志允许_排除_对特定漏洞的检查。例如:-ignore-vulns=CVE-2021-45046,CVE-2021-44832。要检查所有已知漏洞,请传入空列表,如下所示:-ignore-vulns=
--log 标志允许将所有内容写入日志文件,而不是输出到 stdout/stderr。
使用 --exclude 标志可排除子目录不被扫描。可多次使用。
--scan-network 标志指示扫描器搜索网络文件系统(默认禁用)。此功能尚未在 Windows 上实现。
如果找到指示某个漏洞的类文件,则会向标准输出打印类似以下的消息:
./local-log4j-vuln-scanner - a simple local log4j vulnerability scanner
Checking for vulnerabilities: CVE-2019-17571, CVE-2021-44228, CVE-2021-45105
examining /path/to/vuln/log4shell-vulnerable-app-0.0.1-SNAPSHOT.war
indicator for vulnerable component found in /path/to/vuln/Downloads/log4shell-vulnerable-app-0.0.1-SNAPSHOT.war::WEB-INF/lib/log4j-core-2.14.1.jar (org/apache/logging/log4j/core/net/JndiManager.class): JndiManager.class log4j 2.14.0-2.14.1 CVE-2021-44228, CVE-2021-45105
Scan finished
注意: 请自行承担使用风险,并保留原始 JAR 文件。
$ ./local-log4j-vuln-patcher log4j-core-2.14.1.jar log4j-core-2.14.1-patched.jar
Filtering out org/apache/logging/log4j/core/pattern/MessagePatternConverter.class (log4j 2.14)
Filtering out org/apache/logging/log4j/core/net/JndiManager.class (log4j 2.14.0-2.14.1)
Writing to log4j-core-2.14.1-patched.jar done
安装 Go 编译器。
在已检出的仓库中运行以下命令:
go build -o local-log4j-vuln-scanner ./scanner
go build -o local-log4j-vuln-patcher ./patcher
(在 Windows 系统上,当然要添加相应的 .exe 扩展名。)
GNU 通用公共许可证,第 3 版
Hilko Bengen <[email protected]>