Packagist.org远程代码执行漏洞深度分析

本文详细分析了Packagist.org存在的远程代码执行漏洞,该漏洞允许攻击者通过特定格式的URL参数在服务器上执行任意命令。文章涵盖漏洞原理、利用方式及修复方案,并探讨了包管理器安全性的普遍问题。

Packagist.org远程代码执行漏洞

作者:Max Justicz
日期:2018年8月28日

漏洞概述

Packagist.org(Composer的默认包服务器,PHP包管理器)存在远程代码执行漏洞。Packagist目前每月服务约4亿次包下载。

虽然这个漏洞在技术上并不复杂,但考虑到Packagist是一个相当流行的服务,并且是"PHP包管理器"在Google搜索结果中排名靠前的网站,我认为值得发布相关信息。

漏洞详情

攻击者可以在网站的大文本字段中输入$(execute me),这将在shell中执行命令(两次)。

漏洞原理

用户通过提供Git、Perforce、Subversion或Mercurial仓库的URL来向Packagist上传包。为了识别URL指向的仓库类型,Packagist会使用git、p4、svn和hg命令,这些命令将URL作为参数包含在应用特定的命令中。

通过检测执行shell命令的ProcessExecutor::execute方法,可以发现对于URL$(sleep 1),系统会运行以下命令:

1
2
3
4
git ls-remote --heads '$(sleep 1)'
hg identify '$(sleep 1)'
p4 -p $(sleep 1) info -s
svn info --non-interactive $(sleep 1)

其中p4和svn包装器没有正确转义URL参数。

修复措施

Packagist团队通过在Composer仓库中转义相关参数快速解决了这个问题。我已向security@packagist.org报告了此漏洞。

结论

包管理器安全性并不总是很好,您可能需要计划将来包管理器服务器可能被入侵的情况。

在过去一年左右的时间里,我发现了多个漏洞:在rubygems.org上执行任意代码、在npm的一些官方镜像上执行代码(非主注册表)、从PyPI删除任意发布文件、在使用npm流行CDN的每个网站上提供任意JS,以及现在在packagist.org上执行任意代码。其他人也发现了类似的漏洞。这甚至不包括合法包被入侵的风险。

特别需要注意的是,如果包预期不会更改,让应用程序构建管道在每次构建时从上游服务器拉取新下载的包是一种安全反模式。如果由于某种原因必须这样做,应该使用加密安全哈希函数固定依赖关系。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计