[対策あり]Apache Log4jのlookup機能にリモートコード実行のゼロデイ脆弱性(CVE-2021-44228)

サーバー

Javaアプリケーションで広く使用されているログ出力ライブラリ「Apache Log4j」にリモートコード実行のゼロデイ脆弱性(通称:Log4Shell)が確認されました。既にポートスキャンやランサムウェア攻撃も確認されているため、早急に対策することをおすすめします。

(2022/1/6)4つ目の脆弱性が発見(CVE-2021-44832)を追加
(2021/12/21)Apache Log4jのバージョンを確認するを追加
(2021/12/20)3つ目の脆弱性が発見(CVE-2021-45105)を追加
(2021/12/17)新たな脆弱性が発見(CVE-2021-45046)を追加
(2021/12/16)JNDI Lookup機能を無効にする具体的な方法を追記
(2021/12/14)【参考】Log4Shell検出ツール「Huntress」を追記

4つ目の脆弱性が発見(CVE-2021-44832)

3つ目の脆弱性が発見(CVE-2021-45105)

▼以下の記事を参照してください。

新たな脆弱性が発見(CVE-2021-45046)

▼以下の記事を参照してください。

情報ソース

Log4jとは

Log4jとはJavaベースのアプリケーションのログ出力に使用されるオープンソースのライブラリです。世界中で幅広く利用されています。

今回の脆弱性はLog4jの「lookup」という書き込んだログの一部を変数化する機能にあります。

脆弱性の対象

Apache Log4jバージョン2.0~2.14.1を使用しているサーバーすべてが対象です。

脆弱性の詳細

攻撃者がlookupの機能を悪用し、リモートで悪意のあるコードを実行できる可能性があります。

攻撃者が標的サーバーに細工した文字列を送信し、Log4jがログとして記録することで、外部通信先、もしくは内部パスからjava classファイルを読み込ませると、結果として任意のコードが実行される可能性があります。

対策

解決方法

Log4jのライブラリを利用している場合は既に攻撃を受けている可能性も考えて対策したほうが良さそうです。

Apache Log4jのバージョンを確認する

▼以下の記事を参照して下さい。

【対策1】Log4jを最新バージョンにアップデートする

修正パッチが適用されたバージョン2.16.0(Java 8以降用)、2.12.2(Java 7用)がリリースされています。早急にアップデートしましょう。

以下の対策が取られています。

  • JNDI機能をデフォルトで無効に
  • Message Lookup機能を削除

【対策2】JNDI lookup機能を無効にする

Apache Log4jはLog4jのアップデートが難しい場合、「JNDI lookup機能」を無効に設定することを推奨しています。

クラスパスからJndiLookupクラスを削除する

以下のコマンドでlog4j-core.jarファイルからJndiLookup.classを削除します。

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

▼CVE-2021-45046脆弱性を考慮すると対策は不十分ですので削除しました。▼

バージョン2.10以降の場合

Java VM起動時に

-Dlog4j2.formatMsgNoLookups=true

というオプションを設定する。

もしくはクラスパスにあるlog4j2.component.propertiesに「log4j2.fatormatMsgNoLookups=true」を設定する。

もしくは環境変数「LOG4J_FORMAT_MSG_NO_LOOKUPS」を「true」に設定する。

バージョン2.7以降の場合

log4j2.xmlのPatternLayoutに「%m{nolookups}」を設定する。

【参考】(非公式)Log4Shell検出ツール「Huntress」

Log4Shellの検出ツールがGitHubにて公開されています。

【参考】(非公式)ワクチンツール「Logout4Shell」

セキュリティシステム製品企業のCybereasonがLog4Shellのワクチンツールを公開しています。

脆弱性を利用してパッチを適用するという斜め上の発想です。