Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

admin 2021年5月17日08:41:03评论943 views字数 2569阅读8分33秒阅读模式

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

长按二维码关注

腾讯安全威胁情报中心


2021年2月25日,SaltStack发布安全更新,修复了由腾讯安全云鼎实验室提交的三个安全漏洞。利用这些漏洞,最严重情形可导致未授权远程代码执行。因SaltStack套件已是政企机构 IT运维管理人员常用的管理工具,该组件的高危漏洞风险极大。


以下是腾讯安全专家对这三个漏洞的详细技术分析:


一、概念介绍

saltstack

一个基于python开发的主机管理软件,包含若干组件:salt-master、salt-api等。
salt-api:

提供API,可用于管理salt-master,一般和salt-master配合使用。
sdb:

saltstack 封装的通用接口,可以通过 sdb:// 协议从外部数据库(redis/etcd等)或文件中读取数据。

二、漏洞分析

1. salt-api wheel_async未授权访问 (CVE-2021-25281)
salt-api是saltstack提供的一个用于管理salt-master的开源组件,提供cherrypy或tornado来对外提供REST接口(默认使用cherrypy)。经过分析在wheel_async模块中存在未授权访问。


salt-api提供同步调用(wheelsync)和异步调用(wheelasync)两种方法,问题处在异步调用的部分。


先看有正确鉴权逻辑的同步调用(wheelsync)功能,查看调用堆栈,发现数据透传到 mastercall函数,即利用salt-stack的鉴权机制进行鉴权。

    def master_call(self, **kwargs):        """        Execute a wheel function through the master network interface (eauth).        """        load = kwargs        load["cmd"] = "wheel"        interface = self.opts["interface"]        if interface == "0.0.0.0":            interface = "127.0.0.1"        master_uri = "tcp://{}:{}".format(            salt.utils.zeromq.ip_bracket(interface), str(self.opts["ret_port"]),        )        with salt.transport.client.ReqChannel.factory(            self.opts, crypt="clear", master_uri=master_uri, usage="master_call"        ) as channel:            ret = channel.send(load) # 通过和salt-master建立的channel进行通信,请求中的鉴权信息透传给salt-master


再看异步调用( wheel_async),通过查看调用堆栈,发现实现方式并不是将请求转发给salt-master,而是直接放在salt-api中调度执行了。而salt-api并不包含鉴权的逻辑,于是攻击者可以通过salt-api的异步调用,在salt-api的进程池中进行任意python模块调用。

proc = salt.utils.process.SignalHandlingProcess(            target=self._proc_function,            name="ProcessFunc",            args=(fun, low, user, async_pub["tag"], async_pub["jid"]),        )with salt.utils.process.default_signals(signal.SIGINT, signal.SIGTERM):  # Reset current signals before starting the process in  # order not to inherit the current signal handlers  proc.start()


2. sdb rest插件模版渲染问题 (CVE-2021-25283)
sdb模块有许多后端,其中一个是rest(salt/sdb/rest.py),rest模块用来从远端的http服务器获取请求,而且支持模版渲染,且默认使用Jinja2引擎。查看官方的示例代码,准备比如两个配置文件


配置文件1:

my-rest-api:  driver: rest  keys:      url: https://api.github.com/users/{{user}}/keys  backend: requests


配置文件2:

sdb://my-rest-api/keys?user=myuser


加载配置文件时,读取到sdb://my-rest-api/keys后,会找到配置文件1中的keys内容,将url作为Jinja2模板编译,使用?user=myuser作为变量渲染url,即会从 https://api.github.com/users/myuser/keys 中拉取数据。


利用这个特性,我们可以通过构造两个恶意的配置文件。


配置文件1: 构建恶意的SSTI payload

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析


配置文件2: 指向构建的SSTI payload
q: sdb://poc/testKey?a=1    


当saltmaster加载配置文件时,即可触发SSTI中的内容。


3. wheel/pillar_roots.py文件任意写漏洞 (CVE-2021-25282 )
问题出在pillarroots.write 函数里,查看源代码`salt/salt/wheel/pillarroots.py`文件,可以看到判断逻辑存在漏洞。可以通过传入恶意的path来绕过检查。

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析


三、漏洞验证

通过组合公布的漏洞,可以达到无需登录实现远程命令执行的效果。

发送精心构造的4个HTTP请求,即可在目标机器上执行任意命令。

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

 

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

 

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

 

Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

四、漏洞修复建议

因SaltStack套件是大量政企机构运维管理人员日常使用的配套管理工具,因而该组件的高危漏洞风险极大,值得政企机构高度重视。腾讯安全专家建议受影响的Saltstack用户尽快升级到最新版本,以修复漏洞。腾讯安全全系列产品,已支持Saltstack高危漏洞的检测和防御。

本文始发于微信公众号(腾讯安全威胁情报中心):Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月17日08:41:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析http://cn-sec.com/archives/274142.html

发表评论

匿名网友 填写信息