packagist.org存在一处远程执行代码漏洞,该网站是PHP包管理器Composer背后的默认包服务器,它集合了与Composer一起安装的公开 PHP 软件包。根据官网数据显示Packagist目前每月提供约4亿次包下载。目前根据官网显示共有193360包,也就是说该漏洞可能造成这193360包受到影响,可能被植入后门等风险。
漏洞
任意攻击者都可以在提交包的时候输入$(execute me)
的形式,它将在shell中执行任意命令(两次)。
为什么
界面中通过提供Git,Perforce,Subversion或Mercurial存储库的URL将包上传到Packagist。Packagist 会在后端调用git
,p4
,svn
,和hg
,与对应的URL作为参数,提供给上述3个应用程序执行特定的命令。
通过检测ProcessExecutor::execute
用于运行shell命令的方法,以打印执行的命令。对于URL $(sleep 1)
,它将运行以下内容:
git ls-remote --heads '$(sleep 1)'
hg identify '$(sleep 1)'
p4 -p $(sleep 1) info -s
svn info --non-interactive $(sleep 1)
以上代码中p4命令和 svn命令都代入了该代码,最终导致了命令执行。
解决
Packagist团队通过转义 Composer存储库中的相关参数快速解决了这个问题。
结论
针对包管理器的包的攻击在最近两年都有发生,例如针对python的包管理,rubygems的攻击方法,其包管理器存在的漏洞那么影响是巨大的。开发者自己多注意的同事,包管理的机构也应该提高自身安全,做好安全防护措施。