导语:研究人员Max Justicz日前发现了packagist.org网站的一个远程代码执行漏洞,本文对该漏洞进行分析。
研究人员Max Justicz日前发现了packagist.org网站的一个远程代码执行漏洞。packagist.org是php包管理器Composer的默认包服务器,Packagist目前服务的下载量大约是每个月4亿。
研究人员发现的packagist.org bug技术上并没有非常创新,但研究人员认为Packagist是一个主流的服务,因此写了这篇博客(近期通过供应链进行攻击的例子也很多,攻击者也可能通过Packagist网站的远程代码执行漏洞发起供应链攻击)。
漏洞
在网站的文本域内输入$(execute me)就会在shell中执行命令。
漏洞产生原因
用户向Packagist上传包时会提供一个到Git、Perforce、Subversion、Mercurial库的URL。为了识别URL是指向哪种库,URL中会含有shell输出的git、p4、svn、hg等命令作为参数。
研究人员用运行shell命令的ProcessExecutor::execute来打印请求执行的命令。对$(sleep 1)的URL,会运行下面的命令:
git ls-remote --heads '$(sleep 1)'
hg identify '$(sleep 1)'
p4 -p $(sleep 1) info -s
svn info --non-interactive $(sleep 1)
从上面的命令可以看出,p4和svn wrapper会不适当地泄露URL参数。
缓解措施
研究人员将漏洞报告给[email protected] ,Packagist团队很快就修复了该漏洞。
更多参见:https://github.com/composer/composer/commit/bf125295df9da84c44989e33f9f84b4ed4f8ea56
结论
包管理器的安全性一直不理想,包管理器服务器运维人员应该想到有一天会被入侵。
去年rubygems.org出现了任意代码执行漏洞,一些npm官方镜像中也出现了代码执行漏洞,PyPI出现了任意释放文件删除漏洞,使用主流CDN的npm站点出现了服务器任意JS执行漏洞,现在packagist.org又出现了任意代码执行漏洞。其他网站也出现了类似漏洞,甚至存在合法包文件被黑的风险。