這篇文章將為大家詳細(xì)講解有關(guān)怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)主營桃江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,桃江h(huán)5微信平臺小程序開發(fā)搭建,桃江網(wǎng)站營銷推廣歡迎桃江等地區(qū)企業(yè)咨詢
百度云安全團(tuán)隊跟蹤到j(luò)ackson-databind在github上更新了一個新的反序列化利用類com.caucho.config.types.ResourceRef,issue編號2660,該類繞過了之前jackson-databind維護(hù)的黑名單類。如果項目中包含resin-kernel庫,并且JDK版本較低的話,請及時升級jackson-databind到安全版本。
jackson-databind < 2.9.10.4
JDK < 6u201、7u191、8u182、11.0.1(LDAP)
該漏洞本質(zhì)是java的JNDI注入,我們先來了解下JNDI基礎(chǔ)知識。簡單來說,JNDI是一組應(yīng)用程序接口,它為開發(fā)人員查找和訪問各種資源提供了統(tǒng)一的通用接口,可以用來定位用戶、網(wǎng)絡(luò)、機(jī)器、對象和服務(wù)等各種資源。比如可以利用JNDI在局域網(wǎng)上定位一臺打印機(jī),也可以用JNDI來定位數(shù)據(jù)庫服務(wù)或一個遠(yuǎn)程Java對象。JNDI底層支持RMI遠(yuǎn)程對象,RMI注冊的服務(wù)可以通過JNDI接口來訪問和調(diào)用。JNDI接口在初始化時,可以將RMI URL作為參數(shù)傳入,而JNDI注入就出現(xiàn)在客戶端的lookup()函數(shù)中,如果lookup()的參數(shù)可控就可能被攻擊。
因此分析的時候,可以直接先搜索受影響類的lookup方法,看看漏洞入口在哪里,本文復(fù)現(xiàn)的時候用的是resin-kernel-4.0.52版本。
首先定位到com.caucho.config.types.ResourceRef類,我們在getValue方法中找到了jdni.lookup方法,但需要滿足getLookupName方法不為空。
跟進(jìn)到父類ResourceGroupConfig,getLookupName方法直接返回_lookupName變量,但會在setLookupName方法進(jìn)行賦值。
因此可以確遠(yuǎn)程對象調(diào)用入口為lookupName,我們可以寫入如下的反序列化的測試代碼。由于觸發(fā)是在getValue方法中,因此在反序列化后需要再調(diào)用writeValueAsString方法進(jìn)行序列化,以觸發(fā)get方法??捎胢arshalsec監(jiān)聽ldap服務(wù),并制作好可執(zhí)行命令的class文件。
其實,在這里還需要說下為什么需要調(diào)用mapper.enableDefaultTyping(),當(dāng)不帶參數(shù)調(diào)用enableDefaultTyping時,會設(shè)置DefaultTyping為OBJECT_AND_NON_CONCRETE。
DefaultTyping有四個選項:
JAVA_LANG_OBJECT: 當(dāng)對象屬性類型為Object時生效;
OBJECT_AND_NON_CONCRETE: 當(dāng)對象屬性類型為Object或者非具體類型(抽象類和接口)時生效;
NON_CONCRETE_AND+_ARRAYS: 同上, 另外所有的數(shù)組元素的類型都是非具體類型或者對象類型;
NON_FINAL: 對所有非final類型或者非final類型元素的數(shù)組。
因此,當(dāng)開啟DefaultTyping后,會開發(fā)者在反序列化時指定要還原的類,過程中調(diào)用其構(gòu)造方法setter方法或某些特殊的getter方法,當(dāng)這些方法中存在一些危險操作時就造成了代碼執(zhí)行。
官方在github的更新措施(https://github.com/FasterXML/jackson-databind/commit/1645efbd392989cf015f459a91c999e59c921b15),仍然是添加com.caucho.config.types.ResourceRef為黑名單類,但這種方式治標(biāo)不治本,后續(xù)可能出現(xiàn)其他繞過黑名單的gdaget。
1. 及時將jackson-databind升級到安全版本(>=2.9.10.4,> 2.10.0);
2. 升級到較高版本的JDK。
關(guān)于怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。