通过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上传一个包规范时,它会尝试确保你没有意外链接到私有仓库。它过去是这样做的:
|
|
这里有几个问题。最重要的是攻击者完全控制@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服务器上运行攻击者的命令。
这是我最终使用的漏洞利用代码:
|
|
我的思考
总体思考
想想CocoaPods为世界增加了多少价值,仅仅在节省开发者时间方面!然后想想有多少大公司使用这个软件。再想想一次安全审计要花多少钱。
对于使用依赖管理器的人
考虑vendoring依赖项并仔细审查它们的更新。 你的依赖管理器可能有漏洞,如果你在处理安全敏感的东西,你真的应该仔细考虑这个攻击向量。
对于编写依赖管理器的人
如果你希望你的依赖管理器安全,你真的应该将以下内容视为有毒废物:
- 软件包内容
- 版本控制软件
依赖管理器服务器通常希望暴露一些关于软件包的元数据(有毒废物),而这通常通过shell调用某些版本控制软件(有毒废物)来实现。最好完全避免这样做,但如果必须这样做,你应该使用沙箱——我真的很喜欢gVisor来处理这类事情。
几个月前,我在proxy.golang.org中发现了一个RCE漏洞,它正在shell调用一些易受攻击的版本控制软件。但由于我无法逃脱的gVisor沙箱,它被完全缓解了。
结论
感谢CocoaPods维护者超级快速地修复了这个漏洞!
无耻的宣传
我正试图向慈善机构捐赠10,000顶蚊帐!如果你喜欢这篇文章,请考虑捐赠一顶2美元的蚊帐。
联系信息
Max Justicz
max@justi.cz
mastodon.mit.edu/@maxj
我会在只发了几篇文章后就放弃这个博客吗?敬请关注并找出答案!