真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計,樺南網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:樺南等地區(qū)。樺南做網(wǎng)站價格咨詢:18982081108

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

引言

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

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

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

本文主要對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) ,補丁通過調(diào)用認(rèn)證模塊對SSH方法進行權(quán)限認(rèn)證,而salt/salt/netapi/init.py:NetapiClient.run()方法通過getattr動態(tài)調(diào)用NetapiClient類中的方法,并將args和kwargs作為參數(shù)傳入。

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

該類中可調(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)均為生成一個job到zeromq,其后進行消費者再進行認(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遠程執(zhí)行代碼多個高危漏洞的示例分析

這里的目標(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ù)動態(tài)調(diào)用wheel包中的方法。

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

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

可調(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é)果時是有認(rèn)證的。

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

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

CVE-2021-25283 模板注入漏洞

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

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

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

從代碼中可以看出,每一個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),自動加載值加載grains相關(guān)的參數(shù),grains為saltstack收取各個minion中系統(tǒng)信息的功能。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

salt/salt/template.py:compile_template()

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

這里的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()方法,在此處渲染模板,此中并未對傳入的參數(shù)進行過濾,可以進行模板注入。

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

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

修復(fù)建議

  1. 盡快更新官方補丁。

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

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


分享名稱:SaltStack遠程執(zhí)行代碼多個高危漏洞的示例分析
瀏覽路徑:http://weahome.cn/article/jghiis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部