Harbor 权限提升漏洞分析

漏洞编号

CVE-2019-16097

漏洞简介

Harbor是一款开源的可信云镜像仓库。主要用于镜像上次、更新、存储和维护。常用于与CI/CD配合管理Docker镜像。
Harbor 1.7.6之前版本和Harbor 1.8.3之前版本中的core/api/user.go文件存在安全漏洞。若开放注册功能,攻击者可利用该漏洞创建admin账户。注册功能默认开放。攻击者可以以管理员身份下载私有项目并审计;可以删除或污染所有镜像。

漏洞影响

Harbor 1.7.6之前版本和Harbor 1.8.3之前版本

环境搭建

  • macOS Mojave 10.14.6
  • Docker 19.03.2
  • Docker-compose 1.24.1
  • Harbor v1.8.2

漏洞分析

分析代码的commit hash为e7488e37b69319fa9dcbaab57499bec5c8aed08a,此commit中尚未包含补丁。
受影响的API请求地址是/api/users/,请求方式为POST,因此从API的路由中找到入口点,位置在src/core/router.go50行:

可以看到其将此POST请求路由到了api.UserAPI中,找到api.UserAPI的处理POST请求的位置在src/core/api/user.go的302行,跟进代码,发现其先后判断认证方式,是否开启自行注册(默认开启)然后实例化了User结构体:

我们先来看一下User结构体,位置在src/common/models/user.go 25行:

注意其中HasAdminRole字段对应的数据库表现形式和JSON请求表现形式。其在数据库中的字段表现形式为sysadmin_flag,JSON表现形式为has_admin_role

再继续跟入,后面的过程依次是反序列化请求JSON串为User结构体,验证用户提交的User格式是否正确(用户名规范和密码规范)判断用户名和email字段是否已存在,然后直接调用数据库访问层的dao.Register()方法执行数据库插入的操作:

跟入dao.Register()方法中,位置在src/common/dao/register.go26行,可以看到其直接将User结构体的HasAdminRole字段插入到数据库。

由于整个过程没有对携带了has_admin_role字段的请求进行权限校验,导致用户可以直接通过此API设置一个新用户为管理员权限。

补丁分析

在github上进行commit diff对比,可以看到此次提交对注册用户的请求进行了逻辑判断,不允许非管理员用户创建新的管理员权限的用户。

修复建议

升级到1.7.6及以上版本或者1.8.3及以上版本

临时缓解方案:
关闭允许自行注册功能(Allow Self-Registration)

Comments
Write a Comment