Log4jの脆弱性(CVE-2021-44228)について


Log4j脆弱性について

今巷で大きな話題になっているLog4jについてまとめてみた。
まだ、CVE情報などが完全には公開されていない状態で執筆している記事ですので、あくまで参考程度にとどめてください。

Log4jとは

Javaのロギングのためのクラス・ライブラリで、Apacheのサブプロジェクトの1つです。


引用元:https://logging.apache.org/

上画像の通り、Java以外にも多くの言語・フレームワークでLog4jを利用できます。

Javaでの主要なロギング手法については、下記Qiitaの記事が分かりやすいと思います。

今回話題になっている脆弱性(CVE-2021-44228)について

脆弱性の概要

Log4Jには、lookupという任意の場所でLog4j構成に値を追加する機能が存在します。
lookup機能を利用することによりログ出力時にランタイムに情報を出力することができます。
例として、"${java:runtime}"という変数を使えば、"Java(TM) SE Runtime Environment (build 1.7.0_67-b01) from Oracle Corporation"などのようにJavaのバージョン情報に置換されます。

今回問題となっているのはJndi Lookupという機能です。
これはJavaのJava Naming and Directory Interfaceによる変数名の置換で、ネットワーク上から値を取得し置換することができます。

${jnd:ldap://URL}
jndをjndiに読み替えてください。なぜかjndiと書くと反映されませんでした。2021/12/11現在

このURLに.を含めることにより、log4jは任意のリモートのLDAPサーバーからjava classファイルをダウンロードして読み込むことが可能になります。
そのため、この脆弱性を悪用し、攻撃用のjava classファイルとLDAPサーバーを用意し、攻撃対象のLog4jを使っているプログライムに${jnd:ldap://URL}の形でログ出力されるようにすれば、任意のコード実行が可能になります。

CEV: CVE-2021-44228

なぜこんなに騒がれているか

よりによってJavaの主要な機能だからです。Javaで作られたシステムは世の中に多数存在しそのシステムが今回の脆弱性の影響を受けるためです。
また、攻撃もリモートから実行可能かつ、攻撃に当たっての条件も複雑でなく、ユーザ権限も必要ないため、多くのシステムを簡単に攻撃可能といるのが今回の脆弱性のやばいところです。

また、自分のシステムで明示的にLog4jを使っていなくても、他のプラグインやソフトウェアで利用している可能性が高く脆弱性の影響範囲を洗い出すのが難しいという点があります。

影響を受けるシステム

バージョン

Apache Log4j 2.x <= 2.15.0-rc1

影響を受けるソフトウェア

  • Apache Struts
  • Apache Solr
  • Apache Druid
  • Apache Flink
  • ElasticSearch
  • Flume
  • Apache Dubbo
  • Logstash
  • Kafka
  • Spring-Boot-starter-log4j2

緩和策

lookup機能を無効化する

システムプロパティでlog4j2.formatMsgNoLookups=trueとしてlookup機能を無効化する。

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

zip -q -dlog4j-core-*。jarorg / apache / logging / log4j / core / lookup / JndiLookup.class

WAFを利用する

利用しているWAFで今回の脆弱性の対応ができるようであれば、リスク緩和することが可能です。

AWSでクラスメソッド社が検証したブログを参考に記載しておきます。

https://dev.classmethod.jp/articles/aws-waf-new-rule-log4jrce/

参考サイト