
アーカイブとDockerイメージ内のLog4j CVEを再帰的にスキャンする脆弱性スキャナです。JndiLookup.classとSHA256ハッシュによる脆弱性バージョンを検出し、エクスプロイトクラスを除去するオプションのパッチ適用にも対応しています。
このスキャナーは、アーカイブを含むパスを再帰的にスキャンし、脆弱なlog4jバージョンと org/apache/logging/log4j/core/lookup/JndiLookup.class ファイルを検出します。
現在、許可リストでは悪用不可能なバージョン(この場合は log4j-core 2.17.0 と 2.12.3)が定義されています。

| CVE | 参考文献 |
|---|
| CVE-2021-44228 | https://www.cve.org/CVERecord?id=CVE-2021-44228 |
| CVE-2021-45046 | https://www.cve.org/CVERecord?id=CVE-2021-45046 |
| CVE-2021-45105 | https://www.cve.org/CVERecord?id=CVE-2021-45105 |
| CVE-2021-44832 | https://www.cve.org/CVERecord?id=CVE-2021-44832 |
$ divd-2021-00038--log4j-scanner.exe {target-path}
$ divd-2021-00038--log4j-scanner {target-path}
このツールを使用してコンテナのスキャンも可能です:
$ ./divd-2021-00038--log4j-scanner scan-image logstash:7.16.1
またはローカルイメージ:
$ ./divd-2021-00038--log4j-scanner scan-image --local {sha256|pattern}
$ ./divd-2021-00038--log4j-scanner scan-image --local log4shell:latest
$ ./divd-2021-00038--log4j-scanner scan-image --local 4949add9e671
# すべてのローカルイメージをスキャン
$ ./divd-2021-00038--log4j-scanner scan-image --local
イメージにパッチを適用することもできます:
$ docker save log4shell > ./log4shell-image.tar
$ ./divd-2021-00038--log4j-scanner ./log4shell-image.tar
$ ./divd-2021-00038--log4j-scanner patch ./log4shell-image.tar
$ cat ./log4shell-image.tar.patch | docker load
両方のtarファイルを比較すると、次の差分が得られます:
Binary files ../2/BOOT-INF/lib/log4j-core-2.14.1.jar and ./BOOT-INF/lib/log4j-core-2.14.1.jar differ
Binary files ../2/app/spring-boot-application.jar and ./app/spring-boot-application.jar differ
Binary files ../2/b0d66ac73d47865118cfb9a1244f1508d94ea938da1eb78c2db20bd2e1a6629a/layer.tar and ./b0d66ac73d47865118cfb9a1244f1508d94ea938da1eb78c2db20bd2e1a6629a/layer.tar differ
Only in ./org/apache/logging/log4j/core/lookup: JndiLookup.class
ファイルへの再帰的なパッチ適用の予備サポートを追加しました。これは非常に実験的な機能であり、注意して使用してください。現在、パッチ適用はアーカイブ(jar/tar)ファイルに対してのみ機能します。パッチは新しい .patch ファイルを作成し、元のファイルと置き換える必要があります。これは意図的に手動プロセスとなっており、サービスの再起動とタイミングを合わせる必要があります。置き換える前に元のファイルのバックアップを必ず作成してください。パッチ適用後、再度スキャンしてファイルを見逃していないことを確認してください。現在、フォルダ内のプレーンな .class ファイルはパッチ適用されません(安全に手動で削除できます)。
.patch ファイルは元のファイルとまったく同じですが、JndiLookup.class が含まれていません。これにより、アップグレードを待つ間、この問題を軽減するのに十分なはずです。必ずバックアップを作成し、徹底的にテストしてください。
パッチは予防措置としてフォルダでは実行されません。脆弱なアーカイブを直接指定してください。
$ divd-2021-00038--log4j-scanner.exe patch {target-path}
divd-2021-00038--log4j-scanner patch {target-path}
前提条件:
$ git clone "https://github.com/dtact/divd-2021-00038--log4j-scanner.git"
$ go build -o ./.builds/divd-2021-00038--log4j-scanner ./main.go
コードとドキュメントの著作権は2021年 Remco Verhoef (DTACT) に帰属します。
コードはMITライセンスの下で公開されています。