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