日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【网络安全】Nacos Client Yaml反序列化漏洞分析

發(fā)布時(shí)間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络安全】Nacos Client Yaml反序列化漏洞分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

背景

Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡(jiǎn)單易用的特性集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。

Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。 Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu) (例如微服務(wù)范式、云原生范式) 的服務(wù)基礎(chǔ)設(shè)施。

Nacos是阿里巴巴于2018年開(kāi)源的項(xiàng)目,目前在Github中已獲得 19.8kSt,由此可見(jiàn)其的使用廣泛程度。

未授權(quán)訪問(wèn)漏洞

threedr3am師傅在去年十二月份的時(shí)候在Github上給Nacos項(xiàng)目提交了Bypass 認(rèn)證的Issue,詳情可移步https://github.com/alibaba/nacos/issues/4593。在該Issue中提及了漏洞詳情,Nacos的認(rèn)證過(guò)濾器中會(huì)判斷客戶端的User-Agent如果是以Constants.NACOS_SERVER_HEADER(Nacos-Server)開(kāi)頭的話,則直接return返回。

對(duì)于上述的認(rèn)證繞過(guò)漏洞爭(zhēng)議很大,Nacos官方起初并不認(rèn)為這是一個(gè)安全漏洞的問(wèn)題,不過(guò)還是在1.4.1版本中發(fā)布了漏洞修復(fù)補(bǔ)丁。在1.4.1版本中需要在 application.properties添加nacos.core.auth.enable.userAgentAuthWhite的屬性值為false,即可避免使用User-Agent繞過(guò)鑒權(quán)的問(wèn)題,但這也引發(fā)了新的Bypass,具體的漏洞詳情可移步至https://github.com/alibaba/nacos/issues/4701,不再贅述。

客戶端Yaml反序列化

在Nacos的releases記錄中搜索 yaml 關(guān)鍵字不難發(fā)現(xiàn)其在1.4.2版本中有個(gè)PR更新了Yaml的安全解析:

而根據(jù)PR的描述內(nèi)容可知實(shí)際上該漏洞只影響單獨(dú)使用 nacos-client SDK的用戶,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 監(jiān)聽(tīng)配置,所以該漏洞只影響了使用AbstractConfigChangeListener監(jiān)聽(tīng)配置的客戶端。

漏洞分析

首先在Nacos服務(wù)端中添加一個(gè)用于測(cè)試監(jiān)聽(tīng)的配置:

使用Maven引入nacos-client依賴:

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.4.1</version> </dependency>

以官方的監(jiān)聽(tīng)配置請(qǐng)求示例復(fù)現(xiàn),需要修改serverAddr、dataId、group、Listener,如果配置了登陸還需要添加username和password。

// Client.java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigChangeEvent; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.client.config.listener.impl.AbstractConfigChangeListener;import java.util.Properties;public class Client {public static void main(String[] args) throws Exception {String serverAddr = "{serverAddr}";String dataId = "{dataId}";String group = "{group}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put("username", "nacos");properties.put("password", "nacos");ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);configService.addListener(dataId, group, new AbstractConfigChangeListener() {@Overridepublic void receiveConfigChange(ConfigChangeEvent configChangeEvent) {System.out.println(configChangeEvent);}});while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} }

然后在com.alibaba.nacos.client.config.impl.YmlChangeParser#doParse方法中打下斷點(diǎn):

開(kāi)啟Debug并在服務(wù)端中修改上述用于測(cè)試的配置內(nèi)容為yaml反序列化的payload,該payload會(huì)加載遠(yuǎn)程的jar包并運(yùn)行主類的代碼。

點(diǎn)擊發(fā)布后即可命中斷點(diǎn)

再根據(jù)堆棧信息進(jìn)行回溯的調(diào)試,首先在ConfigFactory#createConfigService方法中通過(guò)反射獲取com.alibaba.nacos.client.config.NacosConfigService類的實(shí)例對(duì)象并返回該對(duì)象。

在NacosConfigService的構(gòu)造器中實(shí)例化ClientWorker對(duì)象

跟進(jìn)ClientWorker的checkConfigInfo方法

傳入的對(duì)象為ClientWorker的內(nèi)部類LongPollingRunnable對(duì)象,會(huì)調(diào)用其run方法。

而run方法就是nacos客戶端的長(zhǎng)輪詢監(jiān)聽(tīng),run方法中會(huì)循環(huán)調(diào)用cacheDatax.checkListenerMd5方法,而CacheData對(duì)象是從ClientWorker對(duì)象的cacheMap屬性中獲取的。

Iterator var3 = ClientWorker.this.cacheMap.values().iterator();


而cacheMap中緩存的CacheData對(duì)象是在客戶端添加監(jiān)聽(tīng)的時(shí)候?qū)懭氲?br />
再回到ClientWorker.LongPollingRunnable#run方法中,前面說(shuō)到其會(huì)調(diào)用checkListenerMd5方法,該方法中會(huì)調(diào)用safeNotifyListener方法,并傳入監(jiān)聽(tīng)配置的dataId、group、content(修改的新內(nèi)容)、type、md5及CacheData.ManagerListenerWrap對(duì)象。

在safeNotifyListener方法中調(diào)用了ConfigChangeHandler#parseChangeData方法解析數(shù)據(jù),傳入的參數(shù)listenerWrap.lastContent為修改前的內(nèi)容,content為修改后的內(nèi)容,type為數(shù)據(jù)類型(TEXT/JSON/XML/YAML/HTML/Properties)。

其會(huì)調(diào)用YmlChangeParser#doParse方法

YmlChangeParser#doParser方法中觸發(fā)Yaml反序列化漏洞,請(qǐng)求遠(yuǎn)程的Jar包并執(zhí)行。


再次聲明,該漏洞只影響使用AbstractConfigChangeListener監(jiān)聽(tīng)器的客戶端,原因如下:

漏洞修復(fù)

在1.4.2版本中已修復(fù)了該漏洞,修復(fù)方法為使用SnakeYaml提供的SafeConstructor解析Yaml配置。

實(shí)戰(zhàn)應(yīng)用

在實(shí)際的滲透測(cè)試中如果獲取了Nacos Server控制臺(tái)權(quán)限的話,不妨可以嘗試修改已有的配置為Yaml Payload進(jìn)行盲打客戶端的攻擊。但通常情況下的Springboot或SpringCloud都可以集成使用Nacos,所以這種場(chǎng)景下一般不會(huì)出現(xiàn)存在漏洞的情況。

最后

關(guān)注私我獲取2021最新【網(wǎng)絡(luò)安全學(xué)習(xí)資料·攻略

總結(jié)

以上是生活随笔為你收集整理的【网络安全】Nacos Client Yaml反序列化漏洞分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。