
クリックして確認:
CVE-2022-42889 は、広範囲の Java ベースのアプリケーションに深刻な脅威をもたらす可能性があります。この文脈で開発者が問うべき重要な質問は次のとおりです。
commons-text は含まれていますか? どのバージョンですか?リリースしたコードに commons-text は含まれていますか? そのライブラリのどのバージョンが含まれていますか? これらの質問への回答は、2つの要因によりすぐには得られない場合があります。
推移的依存関係: commons-text がプロジェクトの直接の依存関係リストにない場合でも、他の依存関係によって間接的に使用されている可能性があります。
このライブラリのコードは、独立したファイルとして直接現れるのではなく、他のコード jar ファイルにバンドルされている場合があります。
JFrog はこの問題の解決を支援するツールを公開しています: scan_commons_text_versions。このツールは StringLookupFactory のクラスコードを探し(含まれる .jar ファイル名や pom.xml ファイルの内容に関係なく)、オブジェクトのバージョンのフィンガープリントを取得しようとし、含まれている commons-text のバージョンが脆弱かどうかを報告します。
commons-text 関数を使用していますか?この質問は、開発者がコードベース内の commons-text への呼び出しが、攻撃者によって制御される可能性のあるデータを渡すかどうかを確認したい場合に関連します。アドバイザリで議論されているように、脆弱性を修正する最も安全な方法は適切なパッチを適用することですが、パッチが適用されていない commons-text を前提とした場合の潜在的な影響を管理し、検証することは、多くの状況で価値があります。
scan_commons_text_calls_jar.py は、コンパイル済み .jar 内の脆弱性のある関数への呼び出しを特定し、各呼び出しが出現するクラス名とメソッド名として結果を報告します。
commons-text jar ファイルがあります。危険な動作をすばやく無効化するにはどうすればよいですか?更新が最善の解決策であり、このソリューションは迅速なホットパッチを目的としています。
CVE-2022-42889 の脆弱性の文脈では、commons-text 内のクラス org/apache/commons/text/lookup/ScriptStringLookup により、攻撃者が制御するソースから ${script} を通じて受け取った文字列に埋め込まれたスクリプトの実行が可能になります。したがって、ScriptStringLookup.lookup 関数の呼び出しは、その機能が有効化されていることを示します。
私たちは、この特定の呼び出しにパッチを適用して、スクリプト実行機能を利用できないようにするツール Text4ShellPatch を提供します。パッチを適用すると、ライブラリは(攻撃者によって制御される可能性のあるコードの代わりに)警告メッセージを返すスクリプトを常に実行します。
同様に、DNS および URL ルックアップは、攻撃者によって ${dns} と ${url} を通じて制御される場合、信頼できないコンテンツをロードする可能性があります。したがって、それぞれのルックアップである DnsStringLookup と UrlStringLookup は、パッチによって無効化され、警告メッセージを返すようにできます。
パッチは特定の jar ファイルに適用でき、script ルックアップのみ、またはアプリケーションでの使用が想定されていない場合のより良い保護のために script、dns、 を対象に適用できます。
commons-text jar のスキャンとパッチ適用を自動化できますか?私たちの2つのツールを組み合わせることで、脆弱性のある commons-text jar ファイルをスキャンしてパッチを適用することができます。
この Github リポジトリには、scan_and_patch.sh という名前のサンプル bash スクリプトがあります。基本的には、scan_commons_text_versions.py スクリプトを使用して、特定の root-folder の下で脆弱なバージョンの commons-text jar ファイルを見つけ、それらに対して Text4ShellPatch ツールを次のように実行します。

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
このツールは root_folder を再帰的にスキャンして .jar および .war ファイルを探します。各ファイル内で、ツールは StringLookupFactory.class を探します(各 .jar ファイル内を再帰的に)。クラスが少なくとも1つ見つかった場合、ツールはそのバージョンのフィンガープリントを取得しようとし(パッチやバックポートパッチに見られるいくつかのバリエーションを含む)、コードが脆弱かどうかを報告します。
-quiet フラグを指定すると、バージョンの結論のみが出力され、その他のメッセージ(ファイルが見つからない/アーカイブを開けなかった/パスワードで保護されたアーカイブ)は抑制されます。
-exclude(オプション)の後に指定されたフォルダはスキップされます。
scan_commons_text_calls_jar.pyこのツールには Python 3 と以下のサードパーティライブラリが必要です: jawa、tqdm、easyargs、colorama
pip install -r requirements.txt
デフォルトの使用例:
python scan_commons_text_calls_jar.py root-folder
root-folder 内のすべての .jar ファイルを再帰的にスキャンし、それぞれについて StringSubstitutor/StringLookup の lookup/replace/replaceIn メソッドへの呼び出しの場所(クラス名とメソッド名)を出力します。
ツールは、次のコマンドライン フラグを使用して追加のユースケース向けに設定できます。
text_4_shell_patchjava -jar Text4ShellPatch.jar TARGET_JAR [PATCHING_MODE]
Where TARGET_JAR is the application to patch and PATCHING_MODE is
0 (default): Patch Script lookup
1: Patch Script + DNS + URL lookups
[Note: The original Jar will be kept in the same folder with the .orig.jar extension]
このツールは、指定された commons-text jar 内の org/apache/commons/text/lookup/ScriptStringLookup クラスを探し、lookup() 関数の内容を警告メッセージに置き換えて関数から戻ります。これにより、新しい ScriptStringLookup クラスには eval が存在しなくなります。
また、PATCHING_MODE オプションを 1 に設定すると、DnsStringLookup および URLStringLookup クラスにもパッチを適用し、lookup() 関数を無効化できます。
処理中にバックアップファイルが同じパスに .orig.jar 拡張子で生成されます。
Text4ShellPatch は、Maven で次の簡単なコマンドを使用して編集およびコンパイルできます:
mvn clean assembly:single。target/ フォルダに Text4ShellPatch.jar ファイルが作成されます。
url元の jar がパッチ適用版に置き換えられる前に、同じ場所にバックアップが生成されます。バックアップファイル名は次のパターンに従います: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar。ここで YYYY、MM、DD はそれぞれ年、月、日であり、HH、mm、ss はそれぞれ時、分、秒です。
次の質問で答えられるように、脆弱性のある commons-text のバージョンを見つけて自動的にパッチを適用することも可能です。
| フラグ | デフォルト値 | 用途 |
|---|
--class_regex | (.*StringSubstitutor|.*StringLookup) | 必須クラス名の正規表現 |
--method_regex | (lookup|replace|replaceIn) | 必須メソッド名の正規表現 |
--quickmatch_string | (StringLookup|StringSubstitutor) | ファイル分析の事前条件: 指定された正規表現を含まない .jar ファイルは無視されます |
--class_existence | 未設定 | 未設定の場合、正規表現で指定された class::method への呼び出しを探します。設定すると、--method_regex は無視され、jar 内の --class_regex で指定されたクラスの存在を探します。 |
--no_quickmatch | 未設定 | 設定すると、--quickmatch_string の値は無視され、すべての jar ファイルが分析されます |
--caller_block | .*org/apache/commons/text | 呼び出し元クラスがこの正規表現に一致する場合、表示されません |