溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

發(fā)布時(shí)間:2021-12-29 17:43:19 來源:億速云 閱讀:165 作者:柒染 欄目:安全技術(shù)

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

在對(duì)CVE-2020-17490和CVE-2020-16846進(jìn)行分析后,發(fā)現(xiàn)CVE-2020-17490的補(bǔ)丁存在未修補(bǔ)完全的情況,導(dǎo)致wheel_async仍然存在未授權(quán)訪問,可以調(diào)用wheel模塊中的方法,基于此對(duì)SaltStack的wheel模塊中的方法進(jìn)行分析,最終發(fā)現(xiàn)加載配置模塊存在模板注入,可以實(shí)現(xiàn)未授權(quán)遠(yuǎn)程代碼執(zhí)行。

引言

SaltStack是VMware子公司,其產(chǎn)品用于運(yùn)維管理,能夠支持?jǐn)?shù)萬臺(tái)服務(wù)器,主要功能是配置文件管理和遠(yuǎn)程執(zhí)行命令,十分易用且強(qiáng)大,在github有11.4k star。

SaltStack只用python開發(fā),采用C/S架構(gòu),其中Server被稱為Master,Client被稱為Minion,即一個(gè)Master能夠向多個(gè)Minion下發(fā)配置文件,遠(yuǎn)程執(zhí)行命令。SlatStack是系統(tǒng)總稱,主要有salt、salt-master、salt-minion、salt-api等程序組成,其中salt-master和salt-minion的功能為從指定路徑讀取配置文件并啟動(dòng)。salt-master監(jiān)聽4505和4506端口,分別用于發(fā)布消息和接受監(jiān)控?cái)?shù)據(jù)。

salt程序可以調(diào)用大量函數(shù),并可以指定minion或指定一組minion作為目標(biāo)。salt-api可以使用cherrypy或tornado來對(duì)外提供REST接口,默認(rèn)使用cherrypy。

本文主要對(duì)salt-master和salt-api展開討論。

文中指定代碼位置采用以下約定:FileLocation:Classname.method()或FileLocation:Method()

CVE-2021-25281 未授權(quán)訪問

通過分析CVE-2020-25592的

https://gitlab.com/saltstack/open/salt-patches/-/blob/master/patches/2020/09/25/3002.patch

可以發(fā)現(xiàn) ,補(bǔ)丁通過調(diào)用認(rèn)證模塊對(duì)SSH方法進(jìn)行權(quán)限認(rèn)證,而salt/salt/netapi/init.py:NetapiClient.run()方法通過getattr動(dòng)態(tài)調(diào)用NetapiClient類中的方法,并將args和kwargs作為參數(shù)傳入。

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

該類中可調(diào)用的方法有


- local- local_async- local_batch- local_subset- runner- runner_async- ssh- wheel- wheel_async

經(jīng)過分析,其中,wheel_async方法存在未授權(quán)調(diào)用,其他方法(除去SSH)均為生成一個(gè)job到zeromq,其后進(jìn)行消費(fèi)者再進(jìn)行認(rèn)證,而wheel_async異步調(diào)用wheel包中的方法。

調(diào)用鏈如下:

salt/salt/netapi/init.py:NetapiClient.run() ? salt/salt/netapi/init.py:NetapiClient.wheel_async() ? salt/salt/wheel/init.py:WheelClient.cmd_async() ? salt/salt/client/mixins.py:AsyncClientMixin.asynchronous()

salt/salt/client/mixins.py:AsyncClientMixin.asynchronous()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

這里的目標(biāo)函數(shù)是self._proc_function,low參數(shù)為POST可控參數(shù),fun參數(shù)的值在salt/salt/wheel/init.py:WheelClient.cmd_async()方法中通過low參數(shù)的fun鍵獲取。

這里通過salt/salt/client/mixins.py:AsyncClientMixin._proc_function()函數(shù)調(diào)用salt/salt/client/mixins.py:SyncClientMixin.low(),并通過該函數(shù)使用args參數(shù)和kwargs參數(shù)動(dòng)態(tài)調(diào)用wheel包中的方法。

salt/salt/client/mixins.py:SyncClientMixin.low()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

可調(diào)用的方法如下:

config.applyconfig.update_configconfig.valueserror.errorfile_roots.findfile_roots.list_envfile_roots.list_rootsfile_roots.readfile_roots.writekey.acceptkey.accept_dictkey.deletekey.delete_dictkey.fingerkey.finger_masterkey.genkey.gen_acceptkey.gen_keyskey.gen_signaturekey.get_keykey.printkey.listkey.list_allkey.master_key_strkey.name_matchkey.rejectkey.reject_dictminions.connectedpillar_roots.findpillar_roots.list_envpillar_roots.list_rootspillar_roots.readpillar_roots.write

CVE-2021-25282 有限制任意文件寫漏洞

其中salt/salt/wheel/pillar_roots.py:write()方法存在任意寫入文件漏洞,不過需要__opts__["pillar_roots"]中的路徑存在。

這里的讀文件是沒有辦法利用的,由于是異步調(diào)用,所以返回的是jid和tag,通過jid和tag去查詢?nèi)蝿?wù)執(zhí)行的結(jié)果時(shí)是有認(rèn)證的。

salt/salt/wheel/pillar_roots.py:write()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

CVE-2021-25283 模板注入漏洞

通過—log-level=debug參數(shù)開啟debug模式,定位到了master自動(dòng)加載的邏輯。

salt/salt/master.py:Maintenance.run()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

從代碼中可以看出,每一個(gè)self.loop_interval將循環(huán)一次,loop_interval在配置文件中可以配置,默認(rèn)為60s。通過debug發(fā)現(xiàn)在salt.daemons.masterapi.clean_old_jobs中讀取minion配置文件。

調(diào)用棧如下:

salt/salt/daemons/masterapi.py:clean_old_jobs() ? salt/salt/minion.py:MasterMinion.init() ? salt/salt/config/init.py:minion_config()

在 salt/salt/minion.py:MasterMinion.init()中發(fā)現(xiàn),自動(dòng)加載值加載grains相關(guān)的參數(shù),grains為saltstack收取各個(gè)minion中系統(tǒng)信息的功能。

salt/salt/minion.py:MasterMinion.init()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

salt/salt/config/init.py:minion_config()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

可以看到minio在加載配置文件的時(shí)候調(diào)用了一個(gè)很誘人的方法apply_sdb(),這個(gè)方法解析配置中以sdb://開頭的字符串。

salt/salt/config/init.py:apply_sdb()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

salt/salt/utils/sdb.py:sdb_get()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

在這個(gè)函數(shù)中sdb://aaaa/bbbb字符串,saltstack將會(huì)在配置文件中找aaaa這個(gè)配置項(xiàng),并讀取其中driver字段,賦值給fun變量,經(jīng)bbbb賦值給query參數(shù)。最后的salt.loader.sdb(opts, fun, utils=utils)是一個(gè)動(dòng)態(tài)調(diào)用,通過LazyLoader加載fun變量值對(duì)應(yīng)的方法,并調(diào)用,其中LazyLoader將加載salt.sdb包下的所有文件,并調(diào)用其中的get方法。

經(jīng)過查找,最終定位到salt/salt/sdb/rest.py文件。

salt/salt/sdb/rest.py:query()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

在這里,key為上述字符串中bbbb的值,可以看到這里還接收形如bbbb?ccc=ddd的參數(shù),并且通過**key_vars傳遞到compile_template方法中。

這里的render使用的是jinja,眾所周知,jinja是可以進(jìn)行模板注入的,也就是說,在模板可控的情況下,如果不存在過濾,將可以執(zhí)行任意代碼,并且這里傳入的參數(shù)是profile[key]['url'],也就是配置文件中aaaa配置項(xiàng)中bbbb字典url的值。compile_template函數(shù)詳情如下:

salt/salt/template.py:compile_template()

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

這里的render調(diào)用的是salt/salt/renderers/jinja.py中的render方法,調(diào)用鏈如下:

salt/salt/template.py:compile_template() ? salt/salt/utils/templates.py:JINJA() ? salt/salt/utils/templates.py:wrap_tmpl_func() ? salt/salt/utils/templates.py:render_jinja_tmpl()

最后調(diào)用到render_jinja_tmpl中的template.render()方法,在此處渲染模板,此中并未對(duì)傳入的參數(shù)進(jìn)行過濾,可以進(jìn)行模板注入。

SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析

但自動(dòng)加載的邏輯中未加載master的配置文件,但經(jīng)過翻找,發(fā)現(xiàn)某個(gè)方法調(diào)用了master_config方法,master_config和minion_config一樣,都調(diào)用了apply_sdb()方法,從而能夠?qū)崿F(xiàn)未授權(quán)RCE。

修復(fù)建議

  1. 盡快更新官方補(bǔ)丁。

  2. 如果沒有用到wheel_async模塊,可以在salt/netapi/init.py中將其入口刪除。

關(guān)于SaltStack遠(yuǎn)程執(zhí)行代碼多個(gè)高危漏洞的示例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI