2021年12月9日に、Apache Log4j ライブラリにて、リモートコードが実行される脆弱性が検出されました。
対象となるApache Log4jのバージョンは以下の通りです。
Apache Log4j V2.0 ~ V2.15.0
Apache Log4j 2.x には ログに出力するメッセージ内部の変数などを展開するMessage Lookupという機能があります。
今回の脆弱性ではこの機能を悪用されています。
なお、本脆弱性は Apache Log4j V1.xでは該当しません。
本脆弱性に関する詳細は、下記をご参照ください。
* JVNVU#96768815
Apache Log4jにおける任意のコードが実行可能な脆弱性
https://jvn.jp/vu/JVNVU96768815/
WebOTXでは上記のApache Log4jライブラリをWebOTX Application Server V10.1~V10.4において使用しています。
また、WebOTX Application Server V9を含む以前の環境はApache Log4j V1.xを利用しているため、本脆弱性には該当しません。
(2021/12/16 追記)
2021年12月10日に新たなリモートコード実行の脆弱性 CVE-2021-45046 を修正した Log4j 2.16.0 がリリースされています。
この脆弱性は Log4j 2.x のスレッドローカルな変数をログメッセージに展開する Thread Context(MDC) という機能を悪用しており、次の2点を満たす場合に、Message Lookup を無効化した状態でも任意のコードが実行される可能性があります。
1. ログメッセージの PatternLayout の書式に Thread Context を使用している
2. 攻撃者が Thread Context に任意の文字列を設定することができる
WebOTX では、ログメッセージの PatternLayout の書式に Thread Context を使用していますが、外部から Thread Context に任意の値を設定することはできませんので、本脆弱性による影響を受けることはありません。
(2022/1/18 追記)
2021年12月28日に新たなリモートコード実行の脆弱性 CVE-2021-44832 を修正した Log4j 2.17.1 がリリースされています。
この脆弱性は、JDBC Appender 設定項目に JNDI URL を指定した場合にリモートコードが実行されるもので、攻撃者がログ出力設定を変更できる場合のみこの脆弱性の影響を受けます。
WebOTX では、JDBC Appender を使用しておらず、またログ出力設定を変更できるのはシステム運用者のみのため、本脆弱性による影響を受けることはありません。
ユーザアプリケーションの Log4j をバージョンアップされる場合は、上記の修正が取り込まれた最新バージョンにすることを推奨します。
* WebOTX Application Server Express V10.1~V10.4(WebOTX Enterprise Service Bus V10.1~V10.3、WebOTX Portal V10.1,V10.4にバンドルされているものも含む)
* WebOTX Application Server Standard V10.1~V10.4
* WebOTX Developer V10.1~V10.4 (テスト用サーバを利用している場合)
WebOTX の場合、Log4jによるLookup機能を無効化することで脆弱性を突かれないよう、対処することが可能です。
WebOTX におけるログ出力ではLookup機能を使用しておりませんので、機能を無効化することによる既存機能への影響はなく、非機能や性能面で悪影響を及ぼすこともありません。
なお、WebOTX Application Server V10.1を利用している場合と、V10.2以上を利用している場合で回避方法が異なります。
また、ユーザアプリケーションにLog4jを利用している場合、WebOTXとは別に回避策の実施が必要です。
[WebOTX Application Server V10.1の場合]
1. 「対象ファイル」のバックアップを取得します。
2. %m を %m{nolookups} に変更
「対象ファイル」のすべてのファイルに対して、テキストエディタ等を使用して文字列を置換します。
置換対象の文字列:%m
置換後の文字列:%m{nolookups}
(例)
変更前:
<PatternLayout pattern="%d %-5p %c - %m [%t] (%F:%L)%n"/>
変更後:
<PatternLayout pattern="%d %-5p %c - %m{nolookups} [%t] (%F:%L)%n"/>
3. 設定ファイルの確認
%m が全て %m{nolookups} に変換できているか確認してください。
4. ドメイン再起動
ドメインを再起動してください。
「対象ファイル」
・ Express またはテスト用サーバを利用している場合
<インストールディレクトリ>/config/log4j2-as-tools.xml
<インストールディレクトリ>/lib/templates/logging/log4j2-as.xml.express.template
<インストールディレクトリ>/domains/admin/config/log4j2-as.xml
<インストールディレクトリ>/domains/admin/backup/files1~files<バックアップ世代数>/config/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/config/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/backup/files1~files<バックアップ世代数>/config/log4j2-as.xml
・ Standard の場合
<インストールディレクトリ>/config/log4j2-as-tools.xml
<インストールディレクトリ>/lib/templates/logging/log4j2-as.xml.express.template
<インストールディレクトリ>/lib/templates/logging/log4j2-as.xml.pg.template
<インストールディレクトリ>/lib/templates/logging/log4j2-as.xml.standard.template
<インストールディレクトリ>/domains/admin/config/log4j2-as.xml
<インストールディレクトリ>/domains/admin/backup/files1~files<バックアップ世代数>/config/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/config/tpsystem/logconf/<アプリケーショングループ名>-<プロセスグループ名>/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/config/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/backup/files1~files<バックアップ世代数>/config/log4j2-as.xml
<インストールディレクトリ>/domains/<ドメイン名>/backup/files1~files<バックアップ世代数>/config/tpsystem/logconf/<アプリケーショングループ名>-<プロセスグループ名>/log4j2-as.xml
[WebOTX Application Server V10.2以上の場合]
運用管理コンソールか運用管理コマンドの何れかにより設定を変更してください。
・ Express またはテスト用サーバを利用している場合
- 運用管理コンソールによるケース
1. 対象のドメインにログインします。
2. アプリケーションサーバ>>JVM構成 を選択し、右画面のJVMオプションタブを選択します。
3. システム JVM オプションで以下の定義を追加します。
-Dlog4j2-as.formatMsgNoLookups=true
4. 対象のドメインを再起動します。
- 運用管理コマンドによるケース
1. 運用管理コマンド(otxadmin)を起動し、対象のドメインにログインします。
2. システム JVM オプションで以下の定義を追加します。
otxadmin> create-jvm-options --system -Dlog4j2-as.formatMsgNoLookups=true
3. 対象のドメインを再起動します。
・ Standard の場合
Expressの場合に加え、以下の設定を実施してください。
- 運用管理コンソールによるケース
1. TPシステム>>アプリケーショングループ>>[アプリケーショングループ名]>>プロセスグループ>>プロセスグループ名 を選択し、右側画面の「Javaシステムプロパティ」タブを選択します。
2. Javaシステムプロパティで以下の定義を追加します。
name:log4j2-as.formatMsgNoLookups
value:true
3. 対象のドメインを再起動します。
- 運用管理コマンドによるケース
1. 運用管理コマンド(otxadmin)を起動し、対象のドメインにログインします。
2. Javaシステムプロパティで以下の定義を追加します。
otxadmin> add-pg-javasystem-property --apgroup アプリケーショングループ名 --javasystemprop log4j2-as.formatMsgNoLookups --value true プロセスグループ名
3. 対象のドメインを再起動します。
[ユーザアプリケーションにApache Log4jを利用している場合]
ユーザアプリケーションにて、独自にlog4jライブラリを利用している場合は、利用バージョンを確認した後、Apache Log4j 公式サイト(https://logging.apache.org/log4j/2.x/security.html)に記載されている対処策をご検討ください。
参考として、2021/12/15 現在に提示されている回避策を記載します。
ログ出力の延長でlookupの機能を利用していない場合、以下のいずれかの方法により回避できます。
・ システムプロパティ-Dlog4j2.formatMsgNoLookups=trueの設定(2.10以上)
本脆弱性の原因となっているLookup機能を無効化する方法です。これはlog4j 2.10以上に対して有効です。
・PatternLayoutの変更(2.7以上)
Log4jの設定ファイルに記載されている%mを%m{nolookups}に変更する方法です。2.6以前の環境では利用することができません。
・JndiLookup.classを削除(2.0-beta9以上)
Log4jから問題のJNDIサーバに通信するためのクラス(Jndilookup.class)を削除する方法です。
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
・ 利用しているApache Log4jを2.15.0以上にアップデートする(*1)
(*1) Apache Log4j アップデート時のエラーメッセージについて
WebOTX V9.x 及び V10.1 において、ユーザアプリケーションに含まれるApache Log4jをアップデートした場合、下記のようなメッセージのエラーが発生する場合があります。
Exception while visiting<module-info.class または META-INF/versions 配下のクラスファイル> of size <ファイルサイズ>
これは、WebOTXではアプリを配備またはロードした際に内部のクラスの解析実施しており、Java9 以降でコンパイルされたクラスが配備アプリに混ざっている場合に発生するものです。
ただし、この事象はエラーログが出力されるだけであり動作に影響はありませんので無視していただいて問題ありません。
なお、V10.1の場合は、「WebOTX Application Server V10.1 標準修正モジュール (10.12.01.00)」の適用により、エラーメッセージを抑止することが可能です。