事件概述
2026年5月28日,知名安全研究机构 Rapid7 公开披露了开源自托管 Git 服务 Gogs 中的一个严重远程代码执行(RCE)漏洞,CVSS v4 评分高达 9.4(Critical)。漏洞利用条件极低——攻击者仅需注册一个普通用户账户,即可在目标服务器上执行任意命令,最终获取完整的服务器控制权限。更令人担忧的是,该漏洞自3月报告至今已超过 70 天,官方至今仍未发布任何修复补丁,本质上是一个仍在活跃的 0-Day 漏洞。
这一事件对国内大量依赖自托管 Git 服务的中小企业和开发团队敲响了警钟——当你的代码托管平台本身成为一个攻击入口时,后果可能远超想象。
Gogs 是什么?为什么值得关注?
Gogs(Go Git Service)是一款用 Go 语言编写的轻量级自托管 Git 服务,以其极低的资源占用和简易的部署方式,在中小型企业和个人开发者中拥有广泛的用户基础。根据 Rapid7 的扫描数据,互联网上可探测的 Gogs 实例超过 1100 个,且大部分部署在企业内网或 VPN 之后,实际受影响实例数远高于此。
Gogs 也是更广为人知的 Gitea 的前身——Gitea 正是从 Gogs 分叉而来。两者虽然已各自独立发展,但架构和技术栈高度相似。此次漏洞完全绕过了 Gogs 此前为防范类似攻击而设计的多层安全加固措施,暴露出自托管基础设施在安全审计方面的系统性短板。
漏洞技术深度剖析
攻击原理:参数注入
该漏洞属于典型的参数注入(Argument Injection,CWE-88)攻击。核心问题出在 Gogs 处理 Pull Request 合并操作的代码中——当用户选择"合并前 Rebase"(Rebase before merging)时,系统直接使用 PR 的分支名称作为 git rebase 命令的参数,却没有添加 POSIX 标准的 -- 参数分隔符。
具体来说,系统中的 Merge() 函数执行了类似以下命令:
git rebase --quiet <分支名> <目标分支>
由于分支名未经过滤,攻击者可以创建一个名为 --exec=touch /tmp/pwned 的分支。Git 的参数解析器会将其识别为 --exec 标志,而非分支名称,从而通过 sh -c 执行攻击者指定的任意 shell 命令。
攻击利用链
整个攻击流程分为以下几步:
- 注册账号:攻击者在目标 Gogs 实例上注册一个普通用户账户——默认配置下,Gogs 允许任何人注册。
- 创建仓库:注册后自动成为仓库 Owner,在设置中开启"合并前 Rebase"选项。
- 构造恶意分支:创建一个包含
--exec指令的特殊分支名称。 - 发起 PR:使用该恶意分支向主分支发起 Pull Request。
- 触发合并:执行 Rebase 合并操作,Git 将分支名解析为命令选项,从而触发 RCE。
值得注意的是,Gogs 在多个环节进行了安全校验(如 git rev-parse 分支验证),但由于这些校验各自存在设计缺陷,加上代码中的竞态条件,整个攻击链最终得以完整执行。Rapid7 的研究员甚至发现:合并操作虽然会在第5步因错误而返回 HTTP 500,但 RCE 在第3步就已经成功触发,服务器已被攻陷。
跨平台影响
该漏洞影响所有安装方式的 Gogs——二进制部署、Docker 容器、源码编译——在 Linux、macOS、Windows 上均可被利用。Rapid7 发布的 Metasploit 利用模块已经实现了对 Linux 和 Windows 目标的自动化攻击。
披露时间线:70 天的沉默
以下是 Rapid7 公开的时间线,揭示了漏洞响应过程中令人不安的事实:
| 日期 | 事件 |
|---|---|
| 2026-03-16 | Rapid7 发现漏洞并在两个版本上验证成功 |
| 2026-03-17 | 通过 GitHub Security Advisory 向 Gogs 维护者报告 |
| 2026-03-28 | 维护者确认收到报告 |
| 2026-04-21 | Rapid7 询问进度,无回应 |
| 2026-05-06 | 再次提醒并主动提出可延期公开,无回应 |
| 2026-05-20 | 通知维护者定于 5 月 28 日公开,无回应 |
| 2026-05-28 | 漏洞按计划公开披露,至今无补丁 |
从报告到公开披露,Gogs 维护者仅在初期确认过一次,此后完全失联。对于一款被全球数千组织使用的核心基础设施软件来说,这种响应速度令人难以接受。
谁在受影响?风险有多高?
根据分析,以下组织和场景面临最高风险:
- 使用 Gogs 自托管代码的中小企业:许多国内中小企业使用 Gogs 搭建内部代码仓库。一旦被攻破,攻击者不仅能窃取全部源代码,还能以内网跳板的形式横向移动到其他系统。
- 教育科研机构:高校实验室和科研团队常有面向学生开放的 Gogs 实例。如果允许自由注册,任何学生账号都可能成为攻击入口。
- 面向外网开放注册的 Gogs 实例:这类实例风险最高——攻击者无需任何内部权限,直接注册即可利用。
漏洞的危害不限于单台服务器。由于 Gogs 实例通常部署在开发环境或内网核心节点,成功利用后可能引发供应链攻击——攻击者可以在托管的代码中植入后门,进而污染所有依赖这些代码的下游项目和产品。
缓解措施建议
由于官方补丁尚未发布,建议所有 Gogs 用户立即采取以下临时措施:
1. 关闭用户注册(最有效)
在 app.ini 配置文件中设置:
[auth]
DISABLE_REGISTRATION = true
这是最直接的防线。关闭注册后,攻击者无法获取账户,整个利用链被从源头切断。
2. 限制仓库创建权限
在 app.ini 中添加:
[repository]
MAX_CREATION_LIMIT = 0
这能阻止用户创建新仓库来构造攻击环境,但对已有仓库写入者无效。
3. 审计并关闭"合并前 Rebase"选项
对所有仓库逐一检查,关闭"Rebase before merging"功能。注意:仓库管理员可以随时重新开启此选项,因此不能单独依赖此措施。
4. 限制网络访问
将 Gogs 实例的 Web 界面限制在内网访问,或通过 VPN 和 IP 白名单进行访问控制。
5. 考虑迁移到更活跃维护的替代方案
对于漏洞管理不活跃的开源项目,从长远安全角度看,迁移到更活跃维护的替代品(如 Gitea、GitLab CE)是值得考虑的选项。
深度思考:自托管软件的安全困局
此次 Gogs 漏洞事件暴露出的问题,远比一个具体的漏洞更值得深思。
第一,开源项目的安全维护能力存在巨大差异。Gogs 本质上是一个"单人项目"——核心维护者就一位,当维护者因各种原因无法及时响应时,整个项目就陷入安全真空。这不是孤例,大量被广泛使用的开源基础设施项目都面临类似问题。
第二,企业的"部署完就忘了"心态是安全灾难。自托管意味着用户自己承担安全责任。但现实中,大量企业部署了 Gogs 或类似软件后就很少关注更新和安全公告,甚至不知道自己在运行一个存在高危漏洞的版本。
第三,供应链安全意识亟待加强。代码托管平台是整个软件开发链条的根节点。一旦根节点被攻破,上游全部沦陷。然而在实际安全投入中,企业往往把重心放在边界防火墙上,忽视了这些"内部工具"的安全风险。
对 IT 运维人员来说,从这一次事件中至少可以得到一个明确的教训:任何面向网络开放的服务,无论其看起来多么"内部"或"辅助",都必须纳入安全管理的范畴。定期审计、及时更新、最小化暴露面,这些基础安全原则永远不过时。
北京华盛永诚科技有限公司作为专业的 IT 外包服务商,建议客户定期对其 IT 基础设施进行安全评估,包括但不限于自托管服务、网络设备和应用系统的漏洞扫描与安全加固。如有需要,欢迎联系我们的技术支持团队获取专业协助。