Log4j 2 脆弱性対策について
업데이트:
この間自分の TIL(https://github.com/smilejulie0812/TIL/blob/main/00. Infra/20211213_log4j2_vulnerability_issue.md)で記載した内容を強化して本ポストに再記載することになった。
始め
11 月末 Alibana 社の Github にて通知され、12月10日 Minecraft により本格的に広がった Log4j 脆弱性問題のため色んな作業が必要になった。帰国してから初めて経験した大き目の話題だったため、関連情報をまとめて記録を残す必要があることを実感した。
Log4j 脆弱性とは
Log4j とは Apache 社で開発された Java ロギング用のフレームワークであり、Elastic Stack や Apache Kafka など、JAVA 基盤のアプリケーションで利用されている機能である。
その Log4j 脆弱性は、Log4j 内の JNDILookup クラスの特定を悪用し、攻撃者が Log4j を使うサーバにリモートコードを実行できるという RCE(リモートコード実行)脆弱性である。正式名称は CVE-2021-44228 で、とても深刻な危険性を持っている。
しかも、その危険性が公表される前に発見された、いわゆる「ゼロデイ脆弱性」であり、至急以下の改善が必要である。
対策
この脆弱性の影響範囲にある Log4j バージョンは「2.0-beta9 ~ 2.14.1」である。
1. Log4j バージョンアップグレード
- JAVA バージョン 8 : Log4j 2.16.0 にバージョンアップ
- JAVA バージョン 7 : Log4j 2.12.2 にバージョンアップ
2. バージョンアップが難しい場合
1) Log4j バージョン ~2.10.0
- JNDILookup クラスを削除
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
2) Log4j バージョン 2.10 ~ 2.14.1
- log4j2.formatMsgNoLookups 設定を変更
java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar
- 環境変数を以下のように変更
LOG4J_FORMAT_MSG_NO_LOOKUPS=true
3) Log4j バージョン 1
本バージョンの場合は JNDILookup クラスがないものの、バージョンが低すぎて他のセキュリティ問題が行われる可能性が高いため、可能であれば最新の Log4j バージョンへアップグレードすることを推奨
3. logback など、その他のロギングモジュールへの変更を検討
管理中のアプリケーションは?
Elastic Stack
Elastic Stack の中では Elasticsearch と Logstash で Log4j を使っている。
- Logstash:最新 JDK は脆弱性の危険が高いため、パッチの適用が必須だと言われている。
- Elasticsearch:リモートコード実行脆弱性に露出されてはないが、問題になる可能性をなくすためパッチ適用が推奨されている。
- Kibana:ロギング設定に Log4j を使ってないが、Elasticsearch とのバージョン合わせが必要である。
対策方法としては以下の方法を上げられる。
- バージョン 7 の場合は 7.16.1 に, バージョン 6 の場合は 6.8.21 にアップグレード
- jvm.options ファイルの -Dlog4j2.formatMsgNoLookups=true を追記
Kafka
基本 Kafka は Log4j バージョン 1 を使うため、今回の脆弱性とは大きな関係性を持っていない(log4j バージョン : 1.2.17)。
ただし、 Kafka で使用している Log4j 1.x バージョンにも JNDI が使われる JMS Appender が含まれている。Log4j 1.x バージョンは Kafka 側から JNDI を使う場合に限り影響をもらえる可能性はあるが、Lookup 機能があないため、危険性は低いということ。
要するに Log4j バージョンが古すぎるため、他の問題になれる可能性が十分あると考えられ、パッチされた 2.15.0 以上バージョンへのアップデートを考慮した方がよろしいと言われている。