
ディスク上およびJavaアーカイブ(JAR)ファイル内にある脆弱なLog4j2バージョンを検出します(Log4Shell CVE-2021-44228、CVE-2021-45046、CVE-2021-45105)
Log4Shell(CVE-2021-44228、CVE-2021-45046、CVE-2021-45105)に対して脆弱なLog4j2を検出するためにファイルシステムをスキャンするPython3スクリプトです。ディスク上と(ネストされた)Java Archiveファイル(JAR)内の両方を再帰的にスキャンします。

log4j-finderは、log4j2-core-* パッケージ(log4shell の影響を受ける主要パッケージ)に含まれる特定ファイル(現在は JndiManager.class のみ)の 既知の悪性 と 既知の良性 MD5ハッシュのリストを使用して、ファイルシステム上の log4j2 ライブラリを特定します。これらのファイルをJava Archiveファイル内とファイルシステム上で検索します。そして、このファイルのMD5ハッシュに基づいて log4j2 のバージョンを特定します。
スキャン速度を最適化するため、ファイルシステムを検索し、次のファイル名のみを処理します:
Java ARchive ファイル拡張子を持つすべてのファイル(これらのアーカイブ内にネストされているものも含む):
*.jar, *.war, *.earJndiManager.classファイルが上記の拡張子のいずれかに一致する場合、スクリプトが 既知の ハッシュを持つファイル名を検索するために、これらのアーカイブ内部を(すべてメモリ上で、展開は一切行わずに)チェックします。また、ネストされたアーカイブの内部も調べます。例えば、WAR ファイル内の JAR ファイルなどです。
このスクリプトは、7z、RAR、TAR、BZ2 などの他のアーカイブファイル拡張子はスキャンしません。したがって、例えば 7z ファイル内に JAR ファイルがある場合、スクリプトはそれを見つけられません。その理由は、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
このリポジトリには、コミットのたびに PyInstaller を使用して log4j-finder.py スクリプトのWindowsおよびLinuxバイナリを自動生成する GitHub Action があります。これらのワークフロー実行のビルド成果物は、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
# In the output you will see where pyinstaller is installed, for example:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# Verify using --version
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
必要に応じて、色のサポートを追加するために colorama パッケージをインストールします:
pip install colorama
最新版の log4j-finder.py スクリプトをダウンロードし、PyInstallerを実行します:
Windows実行可能ファイルは、dist ディレクトリに生成されます:dist\log4j-finder.exe
Debian 11 での例:
# Install PyInstaller using pip3
sudo apt update
sudo apt install python3-pip git
pip3 install --user pyinstaller
# Git clone and build using PyInstaller
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
~/.local/bin/pyinstaller --onefile log4j-finder.spec
# Verify that the binary works
./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 Archiveファイル内の両方が再帰的にスキャンされます。
pyinstaller --onefile --hidden-import colorama log4j-finder.py