Log4j 2.x < 2.15.0 反序列化漏洞分析(含排查措施和修復建議)
漏洞簡述
Log4j 2系列 < 2.15.0版本中存在反序列化漏洞。
奇安信代碼安全實驗室分析發現該組件存在Java JNDI注入漏洞。程序將用戶輸入的數據進行日志,即可觸發此漏洞;成功利用此漏洞的攻擊者可在目標服務器上執行任意代碼。
奇安信代碼安全實驗室經驗證,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等眾多組件與大型應用均受影響。
漏洞復現
為便于驗證,復現使用的是環境 java 1.8.0_161 的較老版本。
利用工具如下:
https://github.com/tangxiaofeng7/apache-log4j-poc

結果成功執行指定命令(打開macdown)。
代碼分析
在org.apache.logging.log4j.core.lookup Interpolator.calss lookup() 處理時,從第 190 行可以看到,它支持多種格式,其中包含jndi,故而使用jndi嘗試進行攻擊。

觸發點在org.apache.logging.log4j.core.net JndiManager.class lookup()。
傳入可能的用戶輸入值,即可觸發攻擊。

修復分析
在 org.apache.logging.log4j.core.appender AbstractOutputStreamAppender.class directEncodeEvent() 調用getLayout()進行處理時,如下所示代碼中添加了對于jndi調用的白名單檢查。

并且,后續對 org.apache.logging.log4j.core.net JndiManager.class lookup() 基本重寫,也添加了jndi檢查。

緩解分析
jvm 啟動參數
-Dlog4j2.formatMsgNoLookups=true`
在傳入上述邏輯之前,org.apache.logging.log4j.core.pattern MessagePatternConverter.class format() 中
第114 行會執行檢查:如果按照緩解建議添加jvm啟動參數,那么此處this.noLookups即為true,則不會進入后續處理,不會觸發后續反序列化流程。

處理建議
1、漏洞排查
排查應用是否引入了 Apache Log4j2 Jar 包,若存在依賴引入,則可能存在漏
洞影響。
- (a)相關用戶可根據 Java JAR 解壓后是否存在 org/apache/logging/log4j 相關路徑結構,判斷是否使用了存在漏洞的組件,若存在相關 Java 程序包,則極可能存在該漏洞。

- (b)若程序使用 Maven 打包,查看項目的 pom.xml 文件中是否存在如下圖所示的相關字段,若版本號為小于 2.15.0-rc2,則存在該漏洞。

- (c)若程序使用 gradle 打包,查看 build.gradle 編譯配置文件,若在dependencies 部分存在 org.apache.logging.log4j 相關字段,且版本號為小于 2.15.0-rc2,則存在該漏洞。

2、攻擊排查
- 攻擊者在利用前通常采用 dnslog 方式進行掃描、探測,對于常見
- 利用方式可通過應用系統報錯日志中的
- “javax.naming.CommunicationException”、
- “javax.naming.NamingException: problem generating object using object factory”、”Error looking up JNDI resource”關鍵字進行排查。
- 流量排查:攻擊者的數據包中可能存在:“${jndi:rmi”、
- “${jndi:ldap” 字樣,推薦使用奇安信網神網站應用安全云防護系
- 統全流量或 WAF 設備進行檢索排查。
3、修復建議
(1)升級到最新版本:
請聯系廠商獲取修復后的官方版本:https://github.com/apache/logginglog4j2 ;
請盡快升級 Apache Log4j2 所有相關應用到最新的 log4j-2.15.0-rc2 版本,地址:https://github.com/apache/logginglog4j2/releases/tag/log4j-2.15.0-rc2 或采用奇安信產品解決方案來防護此漏洞。
(2)緩解措施:
- 添加 jvm 啟動參數 -Dlog4j2.formatMsgNoLookups=true。
- 在應用程序的 classpath 下添加 log4j2.component.properties 配置文件文件,文件內容:log4j2.formatMsgNoLookups=True。
- 設置系統環境變量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設置為 true。
- 建議 JDK 使用 11.0.1、8u191、7u201、6u211 及以上的高版本。
- 限制受影響應用對外訪問互聯網。
事件啟發
Apache Log4j 是Apache 的一個開源項目。Log4j 是一個強大的日志操作包,是可重用組件,廣泛應用于Java、 C、C++、.Net、PL/SQL 等程序中。通過各種第三方擴展,可將 Log4j 集成到 J2EE、JINI以及SNMP應用中。
近年來,攻擊者越來越多地開始利用開源組件漏洞發動供應鏈攻擊。據安全機構調查顯示,開源供應鏈攻擊事件比2020年增長了650%。雖然企業第三方風險管理的意識和預算已經增長,但這并不一定意味著所采取的措施是有效的。
奇安信代碼安全事業部技術總監章磊認為,Apache Log4j RCE 漏洞之所以能夠引起安全圈的極大關注,不僅在于其易于利用,更在于它巨大的潛在危害性。當前幾乎所有的技術巨頭都在使用該開源組件,它所帶來的危害就像多米諾骨牌一樣,影響深遠。我們首先需要做的是梳理自身產品中所使用的軟件資產,檢測其中是否使用了開源組件、影響哪些資產、影響程度如何,判斷受影響資產應修復到哪個版本,其它關聯組件是否受影響等,最后著手修復和防御后續類似攻擊。用戶可通過奇安信開源衛士等工具系統化地應對此類漏洞。
章磊還表示,開源軟件安全治理是一項任重道遠的工作,需要國家、行業、用戶、軟件廠商都重視起來并投入才能達到良好效果。
奇安信開源衛士20211209.907版本已支持對Log4j 任意代碼執行漏洞的檢測。用戶可登錄 https://oss.qianxin.com 進行檢測。