Java 製 Logger “Log4j” の脆弱性について

no extension

私の Twitter TL では 2021-12-10 あたりからちらほら見かけるようになったが Java 製の事実上の標準 logger である Apache Log4j に脆弱性があったそうで,最新版 2.15.0 のアナウンスが出ている。 ちょっと大事になりそうな気がするので,この記事で覚え書きとして残しておく。

CVE-2021-44228

Apache Log4j2 <=2.14.1 JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default.

ちょっと分かりにくいかもしれないので,以下の解説記事も参考にどうぞ。

今回問題となっているのはJndi Lookupだ。これはJavaのJava Naming and Directory Interfaceによる変数名の置換で、ネットワーク越しに変数に相当する値を検索することができる。その中にLDAPも含まれる。例えば"${jndi:ldap://someremoteclass}"のようになる。

問題は、このURLに.を含めることにより、lg4jは任意のリモートのLDAPサーバーからjava classファイルをダウンロードして読み込んでしまうのだ。

なので悪意あるjava classファイルとそれをホストするLDAPサーバーを用意して、ターゲットとなるJavaで動きlog4jを使っているプログラムに"${jndi:ldap://URL}"の形でログ出力されるようにすれば、任意のコード実行が可能になる。

ここまで言及されれば今回の脆弱性のヤバさが分かるだろう。 サービス側にログが吐かれるだけでこの脆弱性が発火する可能性があるのだ。 これは私達が目にしている各種サービスだけではなく,たとえばバックエンドで外部の Web API サービスを利用しているのならそちらも考慮する必要がある。 あるいは,もしかしたら組込み製品でアプリケーションを Java で組んでいるかもしれない。

Apache Log4j はこの脆弱性の CVSS 評価値を

  • CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
  • 深刻度: 緊急 (Score: 10)
基本評価基準 評価値
攻撃元区分 ネットワーク
攻撃条件の複雑さ
必要な特権レベル 不要
ユーザ関与レベル 不要
スコープ 変更あり
機密性への影響
完全性への影響
可用性への影響

と見積もっている。

一応,サービス側の緩和措置も示されているので「すぐに対応できないよー」という場合は参考にするといいだろう。

In releases >=2.10, this behavior can be mitigated by setting either the system property log4j2.formatMsgNoLookups or the environment variable LOG4J_FORMAT_MSG_NO_LOOKUPS to true. For releases from 2.0-beta9 to 2.10.0, the mitigation is to remove the JndiLookup class from the classpath: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class.

とりあえずシステム・プロパティまたは環境変数で対応って感じかねぇ。

アップデートは計画的に。

【2021-12-15 追記】 CVE-2021-44228

リリースした 2.15.0 に不備があったため 2.16.0 がリリースされている。

It was found that the fix to address CVE-2021-44228 in Apache Log4j 2.15.0 was incomplete in certain non-default configurations. This could allows attackers with control over Thread Context Map (MDC) input data when the logging configuration uses a non-default Pattern Layout with either a Context Lookup (for example, $${ctx:loginId}) or a Thread Context Map pattern (%X, %mdc, or %MDC) to craft malicious input data using a JNDI Lookup pattern resulting in a denial of service (DOS) attack. Log4j 2.15.0 restricts JNDI LDAP lookups to localhost by default. Note that previous mitigations involving configuration such as to set the system property log4j2.noFormatMsgLookup to true do NOT mitigate this specific vulnerability.

Apache Log4j はこの脆弱性の CVSS 評価値を

  • CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H
    (CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L から大幅に引き上げた模様【2021-12-18 追記】)
  • 深刻度: 緊急 (Score: 9)
基本評価基準 評価値
攻撃元区分 ネットワーク
攻撃条件の複雑さ
必要な特権レベル 不要
ユーザ関与レベル 不要
スコープ 変更あり
機密性への影響
完全性への影響
可用性への影響

と見積もっている。

前節で示した緩和策は使えないらしい。 2.16.0 以降に上げられないのであれば

Otherwise, remove the JndiLookup class from the classpath: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

と class ファイルを削除する必要がある。

【2021-12-20 追記】 CVE-2021-45105

先日リリースされた 2.16.0 には以下の脆弱性があり,これを緩和する 2.17.0 がリリースされた。

Apache Log4j2 versions 2.0-alpha1 through 2.16.0 did not protect from uncontrolled recursion from self-referential lookups. When the logging configuration uses a non-default Pattern Layout with a Context Lookup (for example, $${ctx:loginId}), attackers with control over Thread Context Map (MDC) input data can craft malicious input data that contains a recursive lookup, resulting in a StackOverflowError that will terminate the process. This is also known as a DOS (Denial of Service) attack.

Apache Log4j はこの脆弱性の CVSS 評価値を

  • CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
  • 深刻度: 重要 (Score: 7.5)
基本評価基準 評価値
攻撃元区分 ネットワーク
攻撃条件の複雑さ
必要な特権レベル 不要
ユーザ関与レベル 不要
スコープ 変更なし
機密性への影響 なし
完全性への影響 なし
可用性への影響

と見積もっている。

また別の緩和手順として

  • In PatternLayout in the logging configuration, replace Context Lookups like ${ctx:loginId} or $${ctx:loginId} with Thread Context Map patterns (%X, %mdc, or %MDC).
  • Otherwise, in the configuration, remove references to Context Lookups like ${ctx:loginId} or $${ctx:loginId} where they originate from sources external to the application such as HTTP headers or user input.

を挙げている。

【2021-12-15 追記】 Logback にも脆弱性(の可能性)あり

Logback バージョン 1.2.8 がリリースされている。 このバージョンでは LOGBACK-1591 に絡む対応が行われている。 ただし,これが脆弱性として発火するとしても以下の前提条件が必要となる。

  1. write access to logback.xml
  2. use of versions < 1.2.8
  3. reloading of poisoned configuration data, which implies application restart or scan="true" set prior to attack
via News

LOGBACK-1591 は現時点(2021-12-15)ではまだ確定的ではないが,予防措置として log4j と同じく JNDI lookup コードを削除することにしたようだ。

ブックマーク

Minecraft では既に影響が出ている模様:

参考図書

photo
Spring Data JPAプログラミング入門
溝口賢司 (著)
秀和システム 2017-08-03 (Release 2018-04-23)
Kindle版
B07CKHR8C1 (ASIN)
評価     

JPA のお勉強用に購入。紙のほうはプレミアが付いてるっぽいが Kindle で買えるよ。固定レイアウトだからブラウザの Kindle Cloud Reader で読めるし。真面目に基本を押さえて書いていて分かりやすい。

reviewed by Spiegel on 2021-08-26 (powered by PA-APIv5)

photo
Effective Java 第3版
Joshua Bloch (著), 柴田 芳樹 (翻訳)
丸善出版 2018-10-30
単行本(ソフトカバー)
4621303252 (ASIN), 9784621303252 (EAN), 4621303252 (ISBN)
評価     

再勉強中。 Kindle 版のほうがちょっと安いが,勤務先でも使いたかったので紙の本にした。

reviewed by Spiegel on 2021-03-17 (powered by PA-APIv5)

photo
Spring Boot 2 入門: 基礎から実演まで Webアプリ開発入門
原田 けいと (著), 竹田 甘地 (著), Robert Segawa (著)
2020-05-22 (Release 2020-05-22)
Kindle版
B0893LQ5KY (ASIN)
評価     

Spring Boot を勉強することになって急遽買った本。めっさ分かりやすかった。 PDF 版が欲しいくらい(笑)

reviewed by Spiegel on 2021-06-13 (powered by PA-APIv5)

photo
Java言語で学ぶデザインパターン入門第3版
結城 浩 (著)
SBクリエイティブ 2021-11-12 (Release 2021-11-13)
Kindle版
B09HK66P5X (ASIN)
評価     

なんと! 結城浩さんのデザパタ本の第3版が出た。古典的なデザインパターン23個はそのままに,最近の Java の言語仕様に合わせてコードが一新されている。

reviewed by Spiegel on 2021-11-13 (powered by PA-APIv5)