一个Python3脚本,用于扫描文件系统以查找易受_Log4Shell_(CVE-2021-44228、CVE-2021-45046和CVE-2021-45105)影响的Log4j2。它会递归扫描磁盘和(嵌套的)Java归档文件(JAR)内部。

log4j-finder 使用特定文件(目前仅限 JndiManager.class)的 已知有害 和 已知安全 MD5 哈希列表,识别文件系统中的 log4j2 库,这些文件存在于 log4j2-core-* 包中;这是受 log4shell 影响的主要包。它会在 Java 归档文件和文件系统中搜索这些文件。然后根据该文件的 MD5 哈希识别 log4j2 版本。
为了优化扫描速度,它搜索文件系统并仅处理以下文件名:
Java ARchive 文件扩展名的所有文件(也包含在这些归档文件内嵌套的):
*.jar, *.war, *.earJndiManager.class如果文件匹配上述扩展名之一,它将检查这些归档文件内部(全部在内存中,不会解压),以搜索脚本拥有已知哈希值的文件名。它还会查找嵌套归档文件内部,例如 WAR 文件中的 JAR 文件。
该脚本不会扫描其他归档文件扩展名,如 7z、RAR、TAR、BZ2 等。例如,如果 JAR 文件位于 7z 文件内,脚本将无法找到它。理由在于 Java 只能加载 Java ARchive 格式,因此我们只扫描这些格式。
未知的 MD5 哈希值会显示为 UNKNOWN;如果非 log4j2 的 Java 包使用了本脚本搜索的文件名,可能会发生这种情况。如果识别出的文件路径不包含对 org/apache/logging/log4j 的引用,则很可能不是 log4j2。但仍建议手动验证。
您可以通过以下方式之一安装 log4j-finder:
您可以为您的操作系统下载正确的二进制文件:
如果您使用 Linux,还可以通过以下方式之一下载最新版本并运行:
curl -L https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -o log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
wget https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -O log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
对于已安装 Python 3.6+ 的发行版,以下方法也适用:
curl -L https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py -o log4j-finder.py
sudo python3 log4j-finder.py
wget https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py
sudo python3 log4j-finder.py
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
sudo python3 log4j-finder.py
仓库中有一个 GitHub Action,它会在每次提交时使用 PyInstaller 自动生成 log4j-finder.py 脚本的 Windows 和 Linux 二进制文件。这些工作流运行的构建产物会附加到 Releases 页面。
我们意识到某些防病毒厂商不认可 Windows 二进制文件,在这种情况下,我们建议您按照以下步骤自行生成可执行文件(请注意,我们现在也提供已签名的二进制文件)。
如果您尚未安装 Python 3.6 或更高版本,请先从 https://www.python.org/downloads/ 下载
Python 3.8.10:
Add Python 3.x to PATH,这会使后续步骤更简单。打开命令提示符并使用 pip 安装 pyinstaller 包:
pip install pyinstaller
# 在输出中您会看到 pyinstaller 的安装位置,例如:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# 使用 --version 验证
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
(可选)安装 colorama 包以增加颜色支持:
pip install colorama
下载最新版本的 log4j-finder.py 脚本,然后运行 PyInstaller:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
Windows 可执行文件随后位于 dist 目录:dist\log4j-finder.exe
以 Debian 11 为例:
# 使用 pip3 安装 PyInstaller
sudo apt update
sudo apt install python3-pip git
pip3 install --user pyinstaller
# Git 克隆并使用 PyInstaller 构建
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
~/.local/bin/pyinstaller --onefile log4j-finder.spec
# 验证二进制文件是否可用
./dist/log4j-finder --help
扫描路径的用法示例(默认为 /):
$ python3 log4j-finder.py /path/to/scan
或直接扫描 JAR 文件:
$ python3 log4j-finder.py /path/to/jarfile.jar
或多个目录和/或文件:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
排除文件或目录:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
请注意,在 Windows 上,如果不提供额外参数,它将仅扫描根 c:\ 驱动器。我们建议在命令行中指定需要扫描的驱动器,例如(不存在的驱动器将被跳过):
log4j-finder.exe c:\ d:\ e:\ f:\
无法访问的文件或目录(权限拒绝错误)不会显示。
如果您希望查看更多输出,可以使用 -v 标志获取详细输出,或使用 -vv 获取调试模式(仅建议用于调试目的)。
应用程序参数:
positional arguments:
PATH Directory or file(s) to scan (recursively) (default:
['/'])
optional arguments:
-h, --help show this help message and exit
-v, --verbose verbose output (-v is info, -vv is debug) (default: 0)
-n, --no-color disable color output (default: False)
-q, --quiet be more quiet, disables banner and summary (default:
False)
-b, --no-banner disable banner (default: False)
-V, --version show program's version number and exit
-e PATTERN, --exclude PATTERN
exclude files/directories by pattern (can be used
multiple times) (default: None)
文件会被递归扫描,包括磁盘上和(嵌套的)Java 归档文件中。