长按二维码关注
腾讯安全威胁情报中心
2021年2月25日,SaltStack发布安全更新,修复了由腾讯安全云鼎实验室提交的三个安全漏洞。利用这些漏洞,最严重情形可导致未授权远程代码执行。因SaltStack套件已是政企机构 IT运维管理人员常用的管理工具,该组件的高危漏洞风险极大。
以下是腾讯安全专家对这三个漏洞的详细技术分析:
一、概念介绍
一个基于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:
:
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
配置文件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来绕过检查。
三、漏洞验证
通过组合公布的漏洞,可以达到无需登录实现远程命令执行的效果。
发送精心构造的4个HTTP请求,即可在目标机器上执行任意命令。
四、漏洞修复建议
因SaltStack套件是大量政企机构运维管理人员日常使用的配套管理工具,因而该组件的高危漏洞风险极大,值得政企机构高度重视。腾讯安全专家建议受影响的Saltstack用户尽快升级到最新版本,以修复漏洞。腾讯安全全系列产品,已支持Saltstack高危漏洞的检测和防御。
本文始发于微信公众号(腾讯安全威胁情报中心):Saltstack高危漏洞(CVE-2021-25281/25282/25283)原理分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论