Apache Log4jに存在する RCE 脆弱性(CVE-2021-44228)についての検証レポート

脆弱性検証レポート

2022.2.16 更新

2021年12月6日にApache Software Foundationにより修正されたLog4j に存在するリモートコード実行の脆弱性(CVE-2021-44228)についての検証を実施し、脆弱性の悪用が可能であることを確認しました。[1][2]

(2022.2.16) 追加情報:

以下追加情報として、「Apache Log4jに関する解説 1.6版」を公開しましたのでご覧ください。

1. 本脆弱性の概要

Log4j は、Apache Software Foundationが提供するロギング用ライブラリで、Java等のアプリケーションでログ出力を行う実装として幅広く利用されています。本脆弱性はLog4shellとも呼称され、Log4j に存在する JNDI(Java Naming and Directory Interface) Lookup機能に含まれる問題に起因します。

本脆弱性の悪用に成功した場合は攻撃者がリモートから任意のコードを実行できる可能性があり、 Apache Software FoundationによるとCVSSv3 スコアが最高値の10.0、SeverityはCriticalと評価されています。
また、概念実証(PoC)コードも数多く公開されており、攻撃の観測や被害事例も報告されていること、ライブラリ単体のみならず影響を受けるライブラリを含む製品が多数のベンダに渡って存在することから、今後の被害の拡大が懸念されます。[3]

※ JNDI Lookup機能とは:
Java アプリケーションが DNS や LDAP 等のサービスを利用するための汎用的なライブラリで、出力される情報に特定の文字列が含まれる場合、変数として置換する機能です。 この機能を活用することで日付や環境情報などを動的に出力することができます。

シーケンス
図1. 本脆弱性を悪用した攻撃の例

攻撃者が用意したLDAPサーバにより、不正なJavaのClassファイルを用いて被害者に任意のコードを実行させる方法として、図1で示す3段階での手順の攻撃を確認しています。
RMI等を使った攻撃手法では、第2段階までで攻撃が成立することを確認しており、Step4が省略され、Step3の手順でレスポンスを受け取った際に任意のコードを含んだ不正なメソッドの呼び出しが行われます。

第1段階(攻撃試行)

Step1. 標的となる脆弱なLog4jライブラリを使用するアプリケーションにおいて、JNDI Lookupを行うための不正なHTTPリクエストを送信する

Step1の成立要件としては、脆弱なバージョンのLog4jであること、JNDI Lookup機能が有効となっていることが前提です。

第2段階(JNDIの不正操作)

Step2. 攻撃者が指定したJNDI Lookupにより、攻撃者のLDAPサーバに接続を開始する

Step3. 攻撃者により設定された任意のコードを含む不正なClassライブラリのダウンロード先が含まれたLDAPのレスポンスを受け取る

Step2のJNDI Lookupで使用されるプロトコルの種類として、以下のプロトコルが確認されています。[4]

  • LDAP (Lightweight Directory Access Protocol)
  • DNS (Domain Name System)
  • RMI (Remote Method Invocation)
  • NDS (Novell Directory Services)
  • NIS (Network Information Service )
  • CORBA (Common Object Request Broker Architecture)

第3段階(不正なClassファイルの読み込みによる任意のコード実行)

Step4. Step3で取得したダウンロード先から不正なClassライブラリをダウンロードする

Step5. 不正なClassライブラリを読み込み、任意のコードが実行される

2. 本脆弱性の影響を受ける環境

本脆弱性の影響を受ける可能性があるバージョンは以下の通りです。[1]

  • log4j-core 2.0-beta9以下
  • log4j-core 2.14.1以下
  • また、一般的なアプリケーションの製品に本脆弱性の影響があるライブラリが含まれている可能性もあり、この場合も影響の有無を確認することを推奨します。
    参考として、オランダ国立サイバーセキュリティセンターにより確認・公開されている脆弱な製品のリストを記載しておりますが、本リストに含まれている製品以外でもLog4jを実装している製品の場合は脆弱性の影響を受ける可能性があります。[3]

    3. 本脆弱性を利用した攻撃の検証

    脆弱性を持ったサーバを構築することにより、本脆弱性の悪用が可能であることを確認しました。

    3.1. 検証環境

    表1. 検証に使用した環境
     疑似攻撃者疑似被害者
    ホストOSUbuntu 18.04.1Ubuntu 18.04.1
    アプリケーション/ツールDocker
    LDAP サーバ
    HTTP サーバ
    Docker
    Log4j 2.14.1
    Apache Tomcat 8.0.24

    3.2. 検証手法

    本脆弱性が存在する Log4j ライブラリを使用するサーバに対して、不正な HTTP リクエストを送信します。HTTP リクエストには Log4j の JNDI Lookup を実行させることにより、不正な LDAP サーバへ誘導するためのアドレスが含まれます。LDAP サーバは問い合わせを受けると、不正な Java Class ファイルのある HTTP サーバのアドレスを Log4j に返します。Log4j はこの Class ファイルを読み込み、Class ファイルのコードを実行します。

    本検証では公開されている Docker イメージを用いて、実際に脆弱性が悪用可能かを確認しました。本検証で使用した不正な Class ファイルは、外部の特定のアドレスと通信を行い、コマンドの入力を受け付けて実行結果を返すものです。

    3.3. 検証結果

    図2に示す通り、存在するパスに不正なHTTPリクエストを送信すると、一連の攻撃手順によって不正な Class ファイルが実行されます。不正な Class ファイルが実行された結果、図3 に示す通り nc –l コマンドでリッスンしている外部ホストとの通信が確立され、任意のシェルコマンドを実行できることが確認できました。


    図2. 不正なリクエストの送信


    図3. 通信の確立とコマンドの実行

    また、存在しないパスに不正な HTTP リクエストを送信した場合も確認しました。この場合も、図4に示す通り一連の攻撃手順によって不正な Class ファイルを読み込んでおり、任意のコマンドが実行できることも確認できました。また外部ホストとの接続終了時には、図5 に示す通り不正な HTTP リクエストの送信元へ HTTP 404 のエラーコードを返していることが確認されました。


    図4. 不正な Class ファイルの読み込み


    図5. リクエストの送信元への404


    今回の検証の結果から、不正なリクエストの送信元に対して HTTP 404 のエラーを返していても、Log4jが不正な Class ファイルを読み込んで実行している可能性があると考えられます。

    4. 本脆弱性に対する対策

    4.1. 現在推奨されている対策

    2022年1月6日の確認時点ではApache Software Foundationより以下の本脆弱性の修正バージョンが提供されています。最新バージョン2.17.1では、JNDI機能はデフォルトで無効となっています。[1]

    • Log4j2.17.1

    12月6日に公開された修正バージョン2.15.0ではリモートコード実行に関する別の脆弱性(CVE-2021-45046)の影響を受けるとされており、その後の修正バージョンにおいても異なる脆弱性が発見されたため、最新バージョンの適用が推奨されます。

    この修正バージョンの適用には、Java 8以上の実行環境が必要のため、Java7以下を使用している場合はJavaの更新も必要です。
    2021年12月28日にはJava 6とJava 7の実行環境用の修正バージョンが公開されました。Java 6とJava 7は公式サポートが終了しているため、Java 8にアップデートすることが望ましいですが、Java 8への早急なアップデートを行うことが困難な場合は暫定対処として検討してください。


    即座のバージョンアップが困難な場合の回避策として、バージョン2.16.0未満の場合はJndiLookupクラスを削除する方法が使用可能です。[1]

    • JndiLookupクラスをlog4jから削除する
    • zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

    脆弱性公表当初は以下の回避策が案内されていましたが、1月6日現在はこの回避策を迂回する攻撃手法が発見されたため、安全ではありません。[1]

    • JAVA環境のシステムプロパティにおいてlog4j2.formatMsgNoLookupsをtrueにする
      または環境変数LOG4J_FORMAT_MSG_NO_LOOKUPSをtrueにする
    • Log4jの構成ファイルにおいてログのパターンレイアウトを以下のように変更する。
      %mを使用している場合は、%m{nolookups}に変更

    さらに、本脆弱性の影響を受けるライブラリを使用するアプリケーション製品への影響有無については、ベンダのアップデート等の情報やオランダ国立サイバーセキュリティセンターが公開しているGithubのリポジトリ[2](※)をご確認下さい。

    ※ 情報公開者により随時内容がアップデートされております。また、本リストは公開者により確認されているもののみ(潜在的に使用しているアプリケーションに脆弱なライブラリが含まれている可能性)であることに注意が必要です。

    4.2. 不正アクセス監視機器による対策

    当社が確認している不正アクセス監視機器の対応状況

    各製品ベンダの本脆弱性への対応状況に関する情報、及び各製品での検知結果は以下の通りです。表2に公式シグネチャの提供状況を記載します。検知結果の欄には、検知が確認されたシグネチャ・ルールの結果を記載しています。

    表2. 製品ベンダによるシグネチャ提供状況(2022年2月9日時点)
    種別製品ベンダ/製品製品ベンダ提供のシグネチャ検知結果
    IDS/IPSIBM
    QRader
    Network Security
    XGS Series
    HTTP_Log4J_Form_Lookup_Exec
    HTTP_Log4J_JndiLdap_Exec
    HTTP_Log4J_Json_Lookup_Exec
    HTTP_Log4J_Lookup_Exec
    HTTP_Log4J_lookup_Suspicious
    HTTP_Log4J_Post_JndiLdap_Exec
    HTTP_Log4J_XML_Lookup_Exec
    ※ 1
    McAfee
    Network
    Security Platform
    NS/M Series
    HTTP: Apache Log4j2 Remote Code Execution Vulnerability (CVE-2021-44228) [0x4529f700-0]
    WAFImperva
    SecureSphere
    CVE-2021-44228: Zero day RCE in Log4j via ldap JNDI parser
    CVE-2021-44228: Zero day RCE in Log4j via ldap JNDI parser bypass
    CVE-2021-44228: Zero day RCE in Log4j via ldap JNDI parser bypass 2
    CVE-2021-44228 and CVE-2021-45105: Log4J Lookup Infinite Loop
    CVE-2021-44228: Log4j Java 0-Day Exploit - bypasses to block all - Headers
    CVE-2021-44228: Log4j Java 0-Day Exploit - bypasses to block all - URL and Param
    F5 Networks
    BIG-IP
    200104768 JNDI Injection Attempt (Parameter)
    200104769 JNDI Injection Attempt (Header)
    NGFWPalo Alto
    PA Series
    Threat ID 91991, 91994, 91995, 92001, 92004, 92046
    Apache Log4j Remote Code Execution Vulnerability
    ※ 1
    Check Point
    NGFW Series
    CPAI-2021-0936
    Apache Log4j Remote Code Execution (CVE-2021-44228)
    総合サーバセキュリティ対策Trend Micro
    Deep Security
    侵入防御 (DPI) ルール
    1011242 - Apache Log4j Remote Code Execution Vulnerability (CVE-2021-44228)
    セキュリティログ監視ルール
    1011241 - Apache Log4j Remote Code Execution Vulnerability (CVE-2021-44228)

    ※ 1 一部のシグネチャについては、弊社環境での検知実績はございません。


    機器別当社対応サービス

    IDS/IPS

    WAF

    NGFW

    総合サーバセキュリティ対策

    更新履歴

    2021/12/15 初版作成
    2021/12/16 回避策、修正バージョン、シグネチャ検証結果に関する情報を追記
    2021/12/17 「Apache Log4jに関する解説 1.2版」を公開
    2021/12/20 「Apache Log4jに関する解説 1.3版」を公開
    2021/12/24 現在推奨されている対策、表2「製品ベンダによるシグネチャ提供情報」を更新、「Apache Log4jに関する解説 1.4版」を公開
    2022/01/06 現在推奨されている対策を更新、「Apache Log4jに関する解説 1.5版」を公開
    2022/02/16 表2「製品ベンダによるシグネチャ提供情報」を更新、「Apache Log4jに関する解説 1.6版」を公開

    ※ 各規格名、会社名、団体名、製品名は、各社の商標または登録商標です。

    本件に関するお問い合わせ先

    NTTデータ先端技術株式会社

    お問い合わせフォーム

    Apache Log4jに存在する RCE 脆弱性(CVE-2021-44228)についての検証レポート