SaltStack 未授权访问命令执行漏洞 CVE-2020-16846 25592

漏洞描述

2020年11月4日,SaltStack 官方发布了一则安全更新公告,其中CVE-2020-16846和CVE-2020-25592组合使用可在未授权的情况下通过salt-api接口执行任意命令。CVE-2020-25592允许任意用户调用SSH模块,CVE-2020-16846允许用户执行任意命令。salt-api虽不是默认开启配置,但绝大多数SaltStack用户会选择开启salt-api,故存在较高风险。

漏洞影响

SaltStack Version 3002
SaltStack Version 3001.1, 3001.2
SaltStack Version 3000.3, 3000.4
SaltStack Version 2019.2.5, 2019.2.6
SaltStack Version 2018.3.5
SaltStack Version 2017.7.4, 2017.7.8
SaltStack Version 2016.11.3, 2016.11.6,2016.11.10
SaltStack Version 2016.3.4, 2016.3.6,2016.3.8
SaltStack Version 2015.8.10, 2015.8.13

环境搭建

git clone <https://github.com/vulhub/vulhub.git>
cd vulhub/saltstack/CVE-2020-16846
docker-compose up -d

漏洞复现

salt-api REST接口默认使用cherrypy框架,从run接口的实现上可以看出通过client参数动态调用NetapiClient类中的方法。

文中指定代码位置采用以下约定 FileLocation:Classname.method()

salt/netapi/init.py:NetapiClient.run()

image-20220209124853209

image-20220209124853209

low参数为外部传入参数,salt.utils.args.format_call方法将参数赋值给kwargs。

当client参数为ssh时,动态调用salt/netapi/init.py:NetapiClient.ssh(), 该方法未采用任何鉴权。

salt/netapi/init.py:NetapiClient.ssh()

image-20220209124914461

image-20220209124914461

跟进,路径如下:

salt/netapi/init.py:NetapiClient.ssh()⇒salt/client/ssh/client.py:SSHClient.cmd_sync()⇒salt/client/ssh/client.py:SSHClient._prep_ssh()

salt/client/ssh/client.py:SSHClient._prep_ssh()

image-20220209124937489

image-20220209124937489