본문

Tech
Log4jセキュリティの脆弱性、バージョンチェックから解決策までお知らせします

작성일 2021.12.17

12月30日 Log4j セキュリティ脆弱性ガイドラインと対策の共有

12月30日に発表したLog4jセキュリティ脆弱性の内容をお知らせします。

  • CVE-2021-45105:2.0-beta9〜2.16.0バージョン(Log4j 2.3.1、2.12.3を除く)
  • CVE-2021-44832:2.0-beta9~2.17.0バージョン(Log4j 2.3.2、2.12.4を除く)

上記の脆弱性は以下のように対処する可能性があります。

  • Java 8以降:Log4j 2.17.1にアップデート
  • Java 7:Log4j 2.12.4にアップデート
  • Java 6:Log4j 2.3.2にアップデート

※ log4j-core-.jarファイルなしでlog4j-api-.jarファイルのみを使用する場合、上記の脆弱性の影響を受けない

新しいアップデートができない場合は、以下の方法を適用できます。(CVE-2021-45105限定)

PatternLayoutで${ctx:loginId}または${ctx:loginId}を(%X、%mdc、or%MDC)に変更
${ctx:loginId} または ${ctx:loginId} を削除

はじめに

こんにちは、WhaTap Labsのベッキーです。 以前のポストでは、Log4jの脆弱性と確認方法について簡単に紹介しました。

以後、Log4jの最新バージョンでもバイパス攻撃時に脆弱性にさらされるというニュースに触れました。以降、新たな対応策があるか、あのベッキーがまとめてご案内いたします。

Log4jの概念説明とLog4jがセキュリティリスクにさらされている理由

Log4jはJAVAベースのオープンソースユーティリティで、エンタープライズアプリケーションやウェブサイトで多く使用されています。サービスの動作中に起こるすべての記録を残します。侵害事故の発生と異常の兆候を確認するためにLog4jを使用してください。

このLog4jの脆弱性は、JNDI(Java Naming and Directory Interface)とLDAP(Lightweight Directory Access Protocol)で発生します。JNDIは1990年代後半からJavaに追加されたインタフェースです。Javaプログラムがディレクトリを介してデータを見つけることができるディレクトリサービス。

Javaプログラムは、前述のJNDIとLDAPを介してJavaオブジェクトを見つけることができます。ここで問題のLog4jに使いやすくするために、特定の文法でJavaオブジェクトを見ることができます。これらの文法は、ログが記録されたときにも使用できます。ハッカーはログが記録される場所を見つけて脆弱性を利用できるようになります。

hacker.jpg

Log4jの脆弱性のバージョンと確認方法

脆弱性ごとに影響を受けるLog4jのバージョンは若干異なります。12月13日に発表されたところによると、Log4j 2.0-beta9から2.14.1バージョンと(2.12.2を除く)サブバージョンである1.xまで影響を受けました。しかし、12月15日に発表されたところによると、バイパス攻撃をする場合、最新バージョンの2.15.0も危険だという発表がありました。

1.CVE-2021-44228:Apache Log4j 2で発生するリモートコード実行の脆弱性(Log4j 2.0-beta9〜2.14.1バージョン、2.12.2を除く)

2.CVE-2021-45046:Apache Log4j 2で発生するサービス拒否の脆弱性(Log4j 2.0-beta9〜2.12.1および2.13.00〜2.15.0)

3.CVE-2021-4104: Apache Log4j 1.2 で発生するリモートコード実行の脆弱性 (Log4j 1.x)

上記のバージョンが脆弱だと Log4j 2.x バージョンから 1.x バージョンにダウングレードする場合があります。Log4j 1.xバージョンは2015年以降、技術サポートが終了しました。ダウングレードをすると技術サポートを受けることができません。むしろ、セキュリティ脅威にさらされる可能性が高くなります。このポストをお読みの方はバージョンアップすることをお勧めします。

脆弱なLog4jを使用しているか、以下の方法で確認が可能です。

  1. Log4jを使用している製品に関する情報は以下で確認できます。

https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592

  1. Linuxでlog4jをインストールするかどうかを確認する:以下のコマンドを入力してください。この方法でlog4j-coreバージョンも確認できます。
   -find / -name 'log4j*'

   
  1. Windowsでlog4jがインストールされているかどうかを確認する

  2. 公開ツールを使用する方法もあります。

 a. SyftとGrypeツールの使い方:https://github.com/anchore/grype

 

 b. 脆弱性スキャナーを使用する方法:https://github.com/logpresso/CVE-2021-44228-Scanner

  1. WhaTapユーザーなら、もう少し手軽に確認できます。

 a. [インスタンス性能管理]→[ライブラリバージョン]機能で確認することがで きます。log4j-coreを検索してください

libraryVersion.jpg

 b. 別の方法として、アプリケーションの pom.xml または gradle.build ファイルを開いて log4j- coreで検索してみることもできます。

Log4jバージョン別の回避策

まず、最新バージョンにアップデートをするのが最善の方法です。 Download Apache Log4j 2で最新バージョンが確認できます。

*ブログコンテンツを掲載した日付に基づいて、Log4jの最新バージョンが変更されました。Log4j 2.17.0の脆弱性も発見される可能性がありますので、最新のバージョン情報を随時確認してアップデートしてください。

https://logging.apache.org/log4j/2.x/download.htmlで最新バージョンが確認できます。

ただし、早い時間内にライブラリを更新して再検証するのが現実的に難しいかもしれません。バージョンに応じた先制措置を以下のように取ることができます。

  1. Log4jのバージョンが2.0-beta9から2.10.0の場合:JndiLookupをlog4j-coreから削除する方法があります。ライブラリパスで以下のコマンドを実行すると、JndiLookup.classが削除されます。
   zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

   
  1. Log4jバージョンが2.10から2.14.1の場合:lo4j2.formatMsgNoLookupsまたはLOG4J_FORMAT_MSG_NO_LOOKUPS環境変数をtrueに設定します。

  2. JVM オプションで JndiLookup 機能を制限する方法: -Dlog4j2.formatMsgNoLookups=true オプションを指定してアプリケーションを実行します。

   java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar

   
  1. Log4j バージョンが 1.x の場合:JMSAppender の使用確認後にコード修正をしたり削除すれば大丈夫です。

おわりに

多くのIT担当者の方々が、Log4jの最新バージョンさえ迂回攻撃時に脆弱であるという情況まで捉えられ、多くの心配があると思います。WhaTab Labsも同じIT業界でSaaSサービスを提供するだけに、状況を鋭意注視しています。

WhaTapサービスはLog4jセキュリティの脆弱性とは関係ありません。

WhaTapサービスを使用している担当者の80%以上が開発者、オペレーター、DevOpsエンジニアです。WhaTap Labsは、問題が発生したときに投稿を更新し、正確な情報を提供します。

WhaTap Monitoringを体験してみましょう。
難しかったモニタリングと分析が容易に実現できます。