漏洞概述
Apache Log4j是一個用於Java的日志記錄庫,其支持啟動遠程日志服務器。
Log4j 1.2 中包含一個 SocketServer 類,該類容易受到不可信數據反序列化的影響,當偵聽不可信網絡流量以獲取日志數據時,該類可被利用與反序列化小工具結合使用以遠程執行任意代碼。攻擊者可利用該漏洞執行任意代碼。
這會影響從 1.2 到 2.14 的 Log4j 版本。
在2021 年 12 月 9 日,該項目被曝存在 嚴重安全漏洞 ,攻擊者只需要向目標機傳入一段特殊代碼,就能觸發漏洞,自由地在遠程執行任意代碼來控制目標機器!
因為 Log4j 作為 Java 的知名日志記錄框架,憑借其靈活高效的日志生成能力,不僅被眾多自研項目所使用,很多有名項目作為了基礎框架使用。
像 Redis、Kafka、Elasticsearch、Apache Flink、Apache Druid 等等。
可以想象這個漏洞的影響范圍有多大,甚至被很多媒體稱之為 “核彈級” 漏洞!
apache的問題記錄點:https://logging.apache.org/log4j/2.x/
漏洞細節
根據 CVE 漏洞公開網站的記錄,該漏洞存在於 Apache log4j <= 2.14.1 的版本(但事實上,影響的版本范圍比這更大)。
攻擊者可以通過 log4j 的 lookup 替換功能向其配置文件的任意位置注入代碼(類似 SQL 注入,把 ${變量} 替換為 ${實際代碼})
再加上這些版本中用到的 JNDI 特性並沒有為 LDAP 提供足夠的保護,使得注入的任意代碼都能被肆無忌憚地執行。
測試1
不過我針對漏洞做了下測試,發現好像Apache 找已有了防備,正常情況下我被拒絕了

原因:
是rmi序列化漏洞,apach設置了過濾策略。
在注入時限制了一些類序列化。
在C:\Program Files\Java\jre1.8.0_161\lib\security\java.security【注意,你的文件目錄可能不是這個目錄】
處理方案:
更改為sun.rmi.registry.registryFilter=*即可。

測試2
總體介紹

接口

創建服務接口

進攻腳本

發送請求(結果彈出計算器)

解決方案
1.升級到2.15.1版本及以上
目前 Apache 官方已經針對該漏洞發布了補丁版本 2.15.0-rc2,默認禁用了 lookup 行為,在確保升級該版本不會對項目的其他依賴產生沖突的情況下,建議升級。
該方案雖然比較簡單粗暴,但這個版本是否穩定?是否沒有漏洞呢?這很難說。
因在maven倉庫中沒有log4j-2.15.0-rc2.jar 。地址:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2jar包上傳到本地maven倉庫/從本地引入jar文件。導入完成后 把jar引入到pom文件中。【我使用的maven倉庫】
2.修改配置
a、修改jvm參數 -Dlog4j2.formatMsgNoLookups=true
b、系統環境變量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS設置為true
c、修改配置:log4j2.formatMsgNoLookups=True
如果你不想升級 log4j 的版本,擔心會和項目其他依賴產生沖突的話,可以采用 Apache 官方推薦的臨時解決方案 —— 修改參數。
如果你的 log4j 版本 >= 2.10,可以通過設置系統屬性 log4j2.formatMsgNoLookups 或者環境變量 LOG4J_FORMAT_MSG_NO_LOOKUPS 為 true 來禁用 lookup 行為;如果版本在 2.0-beta9 到 2.10.0 之間, 可以直接移除從 classpath 中移除 JndiLookup 類,用以下命令即可:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
這個方案相對不容易引發項目的沖突,如果項目很緊急且重要,先用它處理吧。
3.換框架
直接換成別的日志框架,如logback
