怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

這篇文章將為大家詳細(xì)講解有關(guān)怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)主營桃江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,桃江h(huán)5微信平臺(tái)小程序開發(fā)搭建,桃江網(wǎng)站營銷推廣歡迎桃江等地區(qū)企業(yè)咨詢

1.  漏洞描述

百度云安全團(tuán)隊(duì)跟蹤到j(luò)ackson-databind在github上更新了一個(gè)新的反序列化利用類com.caucho.config.types.ResourceRef,issue編號(hào)2660,該類繞過了之前jackson-databind維護(hù)的黑名單類。如果項(xiàng)目中包含resin-kernel庫,并且JDK版本較低的話,請及時(shí)升級(jí)jackson-databind到安全版本。

2. 影響范圍

jackson-databind < 2.9.10.4

JDK < 6u201、7u191、8u182、11.0.1(LDAP)

3. 漏洞分析

該漏洞本質(zhì)是java的JNDI注入,我們先來了解下JNDI基礎(chǔ)知識(shí)。簡單來說,JNDI是一組應(yīng)用程序接口,它為開發(fā)人員查找和訪問各種資源提供了統(tǒng)一的通用接口,可以用來定位用戶、網(wǎng)絡(luò)、機(jī)器、對象和服務(wù)等各種資源。比如可以利用JNDI在局域網(wǎng)上定位一臺(tái)打印機(jī),也可以用JNDI來定位數(shù)據(jù)庫服務(wù)或一個(gè)遠(yuǎn)程Java對象。JNDI底層支持RMI遠(yuǎn)程對象,RMI注冊的服務(wù)可以通過JNDI接口來訪問和調(diào)用。JNDI接口在初始化時(shí),可以將RMI URL作為參數(shù)傳入,而JNDI注入就出現(xiàn)在客戶端的lookup()函數(shù)中,如果lookup()的參數(shù)可控就可能被攻擊。

因此分析的時(shí)候,可以直接先搜索受影響類的lookup方法,看看漏洞入口在哪里,本文復(fù)現(xiàn)的時(shí)候用的是resin-kernel-4.0.52版本。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

首先定位到com.caucho.config.types.ResourceRef類,我們在getValue方法中找到了jdni.lookup方法,但需要滿足getLookupName方法不為空。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

跟進(jìn)到父類ResourceGroupConfig,getLookupName方法直接返回_lookupName變量,但會(huì)在setLookupName方法進(jìn)行賦值。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

    因此可以確遠(yuǎn)程對象調(diào)用入口為lookupName,我們可以寫入如下的反序列化的測試代碼。由于觸發(fā)是在getValue方法中,因此在反序列化后需要再調(diào)用writeValueAsString方法進(jìn)行序列化,以觸發(fā)get方法。可用marshalsec監(jiān)聽ldap服務(wù),并制作好可執(zhí)行命令的class文件。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

其實(shí),在這里還需要說下為什么需要調(diào)用mapper.enableDefaultTyping(),當(dāng)不帶參數(shù)調(diào)用enableDefaultTyping時(shí),會(huì)設(shè)置DefaultTyping為OBJECT_AND_NON_CONCRETE。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

    DefaultTyping有四個(gè)選項(xiàng):

JAVA_LANG_OBJECT: 當(dāng)對象屬性類型為Object時(shí)生效;

OBJECT_AND_NON_CONCRETE: 當(dāng)對象屬性類型為Object或者非具體類型(抽象類和接口)時(shí)生效;

NON_CONCRETE_AND+_ARRAYS: 同上, 另外所有的數(shù)組元素的類型都是非具體類型或者對象類型;

NON_FINAL: 對所有非final類型或者非final類型元素的數(shù)組。

因此,當(dāng)開啟DefaultTyping后,會(huì)開發(fā)者在反序列化時(shí)指定要還原的類,過程中調(diào)用其構(gòu)造方法setter方法或某些特殊的getter方法,當(dāng)這些方法中存在一些危險(xiǎn)操作時(shí)就造成了代碼執(zhí)行。

官方在github的更新措施(https://github.com/FasterXML/jackson-databind/commit/1645efbd392989cf015f459a91c999e59c921b15),仍然是添加com.caucho.config.types.ResourceRef為黑名單類,但這種方式治標(biāo)不治本,后續(xù)可能出現(xiàn)其他繞過黑名單的gdaget。

怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析

4. 防御措施

1.  及時(shí)將jackson-databind升級(jí)到安全版本(>=2.9.10.4,> 2.10.0);

2.  升級(jí)到較高版本的JDK。

關(guān)于怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁題目:怎么進(jìn)行jackson-databind遠(yuǎn)程代碼執(zhí)行漏洞分析
轉(zhuǎn)載來源:http://bm7419.com/article34/pssjpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司