
コンパイル済みJavaクラス(ネストされたアーカイブを含む)を分析することにより、脆弱なLog4Jバージョン(CVE-2021-44228、CVE-2021-45046)を検出するファイルシステムスキャナ。Linux、Windows、Macで動作します。

脆弱なLog4Jバージョンを検出するスキャナーで、チームが CVE-2021-44228(CRITICAL)、CVE-2021-45046、CVE-2021-45105、CVE-2021-44832 への曝露を評価するのに役立ちます。インストールされているすべてのアプリケーションを含む完全なファイルシステムを注意深く調べて、Log4Jインスタンスを検索できます。何層も深く隠されたLog4Jインスタンスも見つけられます。Linux、Windows、Mac、そしてJavaが動作するその他の環境でも動作します!
現在、log4j-core のバージョン 2.3.2、2.12.4、2.17.1 を _SAFE_、2.3.1、2.12.2、2.12.3、2.15.0、2.16.0、2.17.0 を _OKAY_、その他すべてのバージョンを _VULNERABLE_ として報告します(ただし、2.0-beta9 より前のバージョンは _POTENTIALLY_SAFE_ として報告します)。古い log4j-1.x のバージョンは _OLD_ として報告します。
実行可能な spring-boot jar/war 内の log4j、uber jar にブレンドされた依存関係、shaded jar、さらにはファイルシステム上で解凍されたままの jar ファイル(*.class)でも正しく検出できます。
現在、テスト用の log4j-samples コレクションを管理しています。
java -jar log4j-detector-2021.12.29.jar ./samples
-- github.com/mergebase/log4j-detector v2021.12.29 (by mergebase.com) analyzing paths (could take a while).
-- Note: specify the '--verbose' flag to have every file examined printed to STDERR.
false-hits/log4j-core-2.12.2.jar contains Log4J-2.x == 2.12.2 _OKAY_
false-hits/log4j-core-2.12.3.jar contains Log4J-2.x == 2.12.3 _OKAY_
false-hits/log4j-core-2.12.4.jar contains Log4J-2.x == 2.12.4 _SAFE_
false-hits/log4j-core-2.15.0.jar contains Log4J-2.x == 2.15.0 _OKAY_
false-hits/log4j-core-2.16.0.jar contains Log4J-2.x == 2.16.0 _OKAY_
false-hits/log4j-core-2.17.0.jar contains Log4J-2.x == 2.17.0 _OKAY_
false-hits/log4j-core-2.17.1.jar contains Log4J-2.x >= 2.17.1 _SAFE_
false-hits/log4j-core-2.3.1.jar contains Log4J-2.x == 2.3.1 _OKAY_
false-hits/log4j-core-2.3.2.jar contains Log4J-2.x == 2.3.2 _SAFE_
true-hits/log4j-core-2.0-beta9.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.10.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.10.0.zip contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.2.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.12.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.12.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.14.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.14.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.2.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.3.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.4.1.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.4.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.9.1.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
old-hits/log4j-1.1.3.jar contains Log4J-1.x <= 1.2.17 _OLD_
old-hits/log4j-1.2.17.jar contains Log4J-1.x <= 1.2.17 _OLD_
old-hits/log4j-core-2.0-beta2.jar contains Log4J-2.x <= 2.0-beta8 _POTENTIALLY_SAFE_ (Did you remove JndiLookup.class?)
_VULNERABLE_ → このファイルをアップグレードまたは削除する必要があります。
_OKAY_ → Log4J バージョン 2.3.1、2.12.2、2.12.3、2.15.0、2.16.0、2.17.0 に対してこれを報告します。2.17.1 へのアップグレードをお勧めします。
_SAFE_ → 現在、Log4J バージョン 2.3.2、2.12.4、2.17.1(およびそれ以上)に対してのみこれを報告します。
_OLD_ → CVE-2021-44228 からは安全ですが、Log4J 1.2.x は7年間EOLであり、いくつかの既知の脆弱性があるため、アップグレードを計画すべきです。
_POTENTIALLY_SAFE_ → "JndiLookup.class" ファイルが存在しません。Log4Jのバージョンが非常に古い(2.0-beta9より前)か、誰かが既にこのファイルを削除したかのいずれかです。その場合、チームまたは会社の誰かが "JndiLookup.class" を削除したことを確認してください。攻撃者は、追加の競合する攻撃者が侵害されたシステムへのアクセスを得るのを防ぐために、このファイルを自ら削除することが知られているからです。
java -jar log4j-detector-2021.12.29.jar
Usage: java -jar log4j-detector-2021.12.29.jar [--verbose] [--json] [--stdin] [--exclude=X] [paths to scan...]
--json - STDOUT結果をJSONで出力します。(エラー/警告はSTDERRに送出)
--stdin - 探索するパスをSTDINから読み取ります(1行に1パス)
--exclude=X - Xは除外する完全パスを含むJSONリスト。有効なJSONである必要があります。
例: --exclude='["/dev", "/media", "Z:\TEMP"]'
終了コード: 0 = 脆弱なLog4Jバージョンが見つかりませんでした。
1 = 少なくとも1つのレガシーLog4J 1.xバージョンが見つかりました。
2 = 少なくとも1つの脆弱なLog4Jバージョンが見つかりました。
情報 - MergeBase log4j detector (バージョン 2021.12.29)
ドキュメント - https://github.com/mergebase/log4j-detector
(C) Copyright 2021 Mergebase Software Inc. GPLv3の下でライセンスされています。
git clone https://github.com/mergebase/log4j-detector.git
cd log4j-detector/
mvn install
java -jar target/log4j-detector-latest.jar
log4jサンプルのコレクションはこちらで管理しています: https://github.com/mergebase/log4j-samples
GPLバージョン3.0
Javaコンパイラは文字列リテラルをコンパイルされた *.class ファイルに直接保存します。log4j-detectorがファイルシステム上で "JndiManager.class" という名前のファイルを検出すると、そのファイル内で "Invalid JNDI URI - {}" という文字列を調べます。この特定の文字列リテラルは、修正されたバージョンのLog4J(バージョン2.15.0)にのみ存在することがわかります。その文字列がないLog4Jのバージョンは脆弱です。
*.class ファイルの文字列リテラルを調べるこの同じ手法は、安全なバージョン2.3.2、2.12.4、2.17.1を正確に検出するためにさらに拡張されています。
log4j-core ライブラリのみを報告します。log4j-api はどうですか? 多くのスキャナー(GitHub独自の Dependabot を含む)は現在、"log4j-core" と "log4j-api" の両方のライブラリを脆弱として報告しています。これらのスキャナーは誤っています。現在の "log4j-api" ライブラリのどのバージョンも、これらの脆弱性のいずれかによって悪用されることはありません。
MergeBase では、スキャンの正確性に誇りを持っています。皆さんはシステムのパッチ適用と防御にすでに十分忙しいでしょう。誤検出で時間を無駄にさせたくありません。そのため、log4j-api に対するヒットは一切報告しません。
バージョン2.10.0は、Log4Jの脆弱な「メッセージルックアップ機能」がLog4J設定によって無効にできる最初のバージョンであるため重要です。
バージョン2.12.2は、CVE-2021-44228に対して脆弱ではないJava 7互換のLog4Jバージョンであるため重要です。
バージョン2.15.0と2.16.0は、Log4Jのデフォルトのアウトオブボックス設定がCVE-2021-44228に対して脆弱ではない最初のバージョンであるため重要です。
そして、バージョン2.3.2、2.12.4、2.17.1は、最近発見されたCVE-2021-45046やCVE-2021-45105などのCVEに対して脆弱ではないため重要です。これらははるかに深刻度の低い脆弱性ですが、誰もが2.3.2、2.12.4、または2.17.1のいずれかにパッチを適用したいと考えるでしょう。
"!" は、log4j-detectorがzipアーカイブ(例:.zip、.ear、.war、.aar、*.jar)に入ったことを意味します。zipファイルはzipファイルを含むことができるため、単一の結果に複数の "!" インジケーターが含まれる場合があります。
注:log4j-detectorはzipアーカイブのみを再帰的に調べます。tar、gz、bz2などは調べません。主な理由は、Javaシステムはjarの中のjarを実行するように設定されることが多いですが、他のファイル形式を実行するように設定されることは(私の知る限り)決してないからです。したがって、*.tar.gzの中にあるlog4jのコピーは、実行中のJavaシステムから到達可能ではない可能性が高く、報告する価値のある脆弱性ではありません。
2つ目の注:zipの中のzipの場合、スキャナーは内部のzipを完全にメモリにロード(ByteArrayInputStreamを使用)してからスキャンします。システムに非常に大きな内部zip(例:1GB以上)がある場合、Javaに追加のメモリを割り当てる必要があるかもしれません。