
ネストされたバイナリ内の CVE-2021-44228 の検出
このリポジトリには、CVE-2021-44228、CVE-2021-45046、または CVE-2021-45105 に対して脆弱な log4j のバージョンを検出するための YARA ルール一式が含まれています。影響を受けるバージョンに現れるいくつかの特徴を探すことで検出を行います。
このツールは、Docker イメージ、システムパッケージ、ファイルシステムイメージ、さらにはインストールメディアなどのバイナリファイルに対して再帰的に動作します。対応しているファイル形式の完全なリストについては、「どのように動作するのか?」のセクションを参照してください。
JndiManager コンストラクタのシグネチャを探します(< 2.15.0)。JndiManager をインポートしていない Interpolator クラスを探します(< 2.16.0)。ConfigurationStrSubstitutor をインポートしていない AbstractConfiguration クラスを探します(< 2.17.0)。CodeQL や Semgrep を使用して log4j の安全でない使用法を検出するためのリソースは多数ありますが、バイナリアーティファクト内の潜在的に脆弱な log4j バージョンを検出するためのリソースはこれまで提供されていませんでした。
これは、社内で開発されていないエンタープライズアプリケーションを運用している組織や、初期トリアージを実施するチームがソースコードをすぐに入手できない状況において、課題となっています。
この脆弱性はさまざまな「予期しない」場所に現れる可能性が高いため、このツールはコンパイル済みアーティファクト内の脆弱な log4j バージョンの検出を支援することを目的としています。検出後は手動でレビューし、悪用可能性を判断できます。
難読化されたコードでは、難読化の使用により潜在的に脆弱なウィジェットを検出できない場合があり、偽陰性が発生します。
このツールを実行するには、このリポジトリをクローンし、次の手順に従ってください。Docker と jq がインストールされていることを前提としています。
artifacts/ フォルダに追加します./quickstart.sh)または、次のコマンドを使用して実行をカスタマイズすることもできます:
docker run \
--rm \
--mount type=bind,source=$(pwd)/artifacts,target=/mnt/stacs/input \
--mount type=bind,source=$(pwd)/rules,target=/mnt/stacs/rules \
stacscan/stacs:latest \
--rule-pack "/mnt/stacs/rules/vulnerability.json" \
"/mnt/stacs/input"
CVE-2021-44228 のみを検索したい場合は、次のコマンドを使用できます:
docker run \
--rm \
--mount type=bind,source=$(pwd)/artifacts,target=/mnt/stacs/input \
--mount type=bind,source=$(pwd)/rules,target=/mnt/stacs/rules \
stacscan/stacs:latest \
--rule-pack "/mnt/stacs/rules/CVE-2021-44228.json" \
"/mnt/stacs/input"
CVE-2021-45046 のみを検索したい場合は、次のコマンドを使用できます:
docker run \
--rm \
--mount type=bind,source=$(pwd)/artifacts,target=/mnt/stacs/input \
--mount type=bind,source=$(pwd)/rules,target=/mnt/stacs/rules \
stacscan/stacs:latest \
--rule-pack "/mnt/stacs/rules/CVE-2021-45046.json" \
"/mnt/stacs/input"
CVE-2021-45105 のみを検索したい場合は、次のコマンドを使用できます:
docker run \
--rm \
--mount type=bind,source=$(pwd)/artifacts,target=/mnt/stacs/input \
--mount type=bind,source=$(pwd)/rules,target=/mnt/stacs/rules \
stacscan/stacs:latest \
--rule-pack "/mnt/stacs/rules/CVE-2021-45105.json" \
"/mnt/stacs/input"
このツールは Docker なしでも実行できます。Docker なしで STACS をインストールする方法については、STACS のインストール手順を参照してください。
Docker イメージをスキャンするには、まずスキャン用に artifacts ディレクトリへエクスポートする必要があります。これは次のコマンドで実行できます:
IMAGE="alpine:latest"
NAME="alpine_latest"
docker export $(docker create ${IMAGE}) -o artifacts/${NAME}.tar
あるいは、実行中のコンテナを次のようにエクスポートすることもできます:
# CONTAINER_ID を正しいコンテナ識別子に置き換えてください。
CONTAINER_ID="c29209118f9a"
NAME="widget_example"
docker export ${CONTAINER_ID} -o artifacts/${NAME}.tar
アプリケーションでの log4j の使用状況を調査し、製品が脆弱かどうかを理解する必要があります。ソースコードにアクセスできないなどの理由でこれが不可能な場合は、ベンダーがこの問題に関するアドバイザリを公開しているかどうかを確認してください。
脆弱なバージョンの log4j が含まれているからといって、その製品が必ずしも脆弱であるとは限りません!
アドバイザリが見つからない場合は、ベンダーに連絡して、この脆弱性が製品に与える影響について問い合わせてください。
また、log4j プロジェクトが公開している緩和策 も参照してください。あるいは、できれば影響を受けないバージョンの log4j にアップグレードしてください。
このツールはこの目的のために設計されたわけではありませんが、STACS エンジンをバルクバイナリの分解と分析に使用しています。
STACS は YARA を利用した静的クレデンシャルスキャナであり、バイナリファイル形式、ネストされたアーカイブの分析、構成可能なルールセットと無視リスト、および SARIF レポートをサポートしています。
例として、このツールは、エクスポートされた Docker イメージを含む tarball を分析できます。そのファイルシステム上のどこかに、この脆弱性の影響を受ける JAR が含まれている場合です。
また、ネストされた tar、jar、war、ear、zip、apk、bz2、tgz、xz、rpm、iso なども分析できます。
問題を説明し、可能であれば影響を受けるバイナリアーティファクトへのリンクを添付して、Github の issue を開いてください。
ルールセットを調整するプルリクエストも大歓迎です!
このルールセットの検証からのログファイル一式については、validation/ ディレクトリを参照してください。