ang010ela 嘶吼专业版
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Unit 42安全研究人员Aviv Sasson在Harbor中发现了一个严重漏洞,***者利用该漏洞可以通过发送恶意请求来控制Harbor注册表。Unit 42研究人员发现有超过1300个使用有漏洞的默认配置的Harbor Registry服务器可以通过互联网访问。
背景
研究人员在Harbor项目中发现了一个重要的权限提升漏洞,***者利用该漏洞可以在默认配置下获取admin权限。该漏洞于9月10日公布,CVE编号为 CVE-2019-16097。
Harbor项目在过去4年内的知名度和流行度不断攀升,并于去年11月成为CNCF incubating project (CNCF孵化项目)。Harbor项目的赞助商和使用企业包括:
图1. Harbor项目的赞助商和使用企业
漏洞影响
该漏洞的影响非常严重,因为在获取admin权限后,可以初始化许多***向量。***者可以下载和查看所有的私有项目,可以删除registry上的镜像,甚至可以替换镜像来污染registry。***者可以创建新的用户,并将它设置为admin。之后,***者可以通过Docker命令行工具用新的凭证连接Harbor registry,并替换当前的镜像。恶意镜像可以说恶意软件、加密货币挖矿机等。
POC视频如下:
https://www.biantube.com/watch/LBgIKqdfF1k
漏洞分析
首先分析User结构:
图2. Harbor源代码中的User结构
研究人员关注的目标参数是HasAdminRole,该参数的目的是表明用户是否admin。如果可以修改为True,***的目的就达到了。
那么如何实现呢?首先分析API调用,如果有人尝试访问/api/users,那么就会发现一些有趣的调用:
图3. /api/users
如果用户想要发送POST请求,就可以到达负责新用户注册的代码段。
图4. POST请求处理逻辑
漏洞位于user.go:317中:
if err := ua.DecodeJSONReq(&user); err != nil
在该行代码中,我们可以从POST请求中获取数据,然后解码为用户对象。
正常的请求payload如下所示:
{“username”:”test”,”email”:”test123@gmai.com”,”realname”:”no name”,”password”:”Password1\u0021″,”comment”:null}
问题在于***者可以发送一个请求,并加入参数has_admin_role。如果发送“had_admin_role” = “True”的请求,就可以创建为admin的用户。
漏洞利用
研究人员写了一个简单的python脚本,用来发送POST请求到/api/users来创建权限为admin的新用户,需要在request body中将参数has_admin_role设置为True。运行脚本后,唯一需要做的是在浏览器中打开Harbor,并用新创建的用户登入。
解决方案
Harbor团队发布了解决该漏洞的补丁,9月18日发布的Harbor versions 1.7.6和1.8.3版本中都进行了安全更新。发布注释中说是通过禁止注册时创建admin用户来解决该问题。
开发者加入了一个检查过程来防止非管理员用户创建新的admin用户。该漏洞存在于1.70-1.8.2版本中,因此研究人员建议用户尽快更新到最新版本。
参考来源:https://unit42.paloaltonetworks.com/critical-vulnerability-in-harbor-enables-privilege-escalation-from-zero-to-admin-cve-2019-16097/