Forgejo 模板仓库 RCE 暴露了什么,代码托管平台的修复清单

Hacker News 当日的 Forgejo 漏洞条目有 188 points 和 69 条评论。公开讨论指向一个具体流程,创建新仓库时,Forgejo 会克隆模板、删除 .git、展开模板变量,再初始化新的 Git 仓库。恶意模板可能利用展开过程重新生成 .git,让后续初始化把不该进入流程的内容当成仓库数据处理,最终读到主机文件或执行主机进程。

为什么模板功能风险高

模板看起来像复制文件,实际通常会经过变量替换、路径判断、权限处理和 Git 初始化。每次把用户可控内容送进解释器、文件系统操作或命令行,都可能形成边界穿越。模板仓库又常被管理员信任,风险会沿着团队复用关系扩散。

这类漏洞提醒我们,仓库内容不能因为来自“模板”就被视为安全输入。公开实例上的模板尤其需要按不可信代码处理。

管理员先做什么

  1. 核对 Forgejo 实例版本,按官方安全公告升级到包含修复的版本。
  2. 暂停不必要的模板创建和导入,检查最近新增的模板仓库。
  3. 搜索异常 .git 目录、异常进程、外连请求和非预期文件读取记录。
  4. 若实例承载了部署密钥、云凭证或机器人令牌,按可能泄露处理并轮换。
  5. 升级后用恶意路径、变量和仓库初始化流程做回归测试。

修复代码时要看哪里

首先把模板展开和 Git 初始化拆成清晰阶段,阶段之间使用严格的文件清单。其次拒绝生成控制目录,不能只在输入端过滤一次。再次让初始化过程运行在最小权限账户和隔离目录中,避免应用进程拥有整个主机的读写能力。

测试不能只验证正常模板。要覆盖变量展开后的路径、符号链接、隐藏目录、异常权限、并发创建和失败清理。供应链安全的重点经常落在“正常流程中没人会提交的文件”上。

管理员还要检查信任关系。模板仓库的创建者、维护者和使用者可能属于不同团队,审核过一次也不能永久放行。可以限制模板来源,禁止模板流程访问宿主机敏感目录,并把模板生成动作放进短生命周期的隔离 worker。这样即使应用层出现路径处理错误,攻击者能拿到的权限也更小。

漏洞公告发布后,补丁验证要覆盖升级前后的真实工作流。单纯确认版本号变化,只能证明安装完成,不能证明恶意模板无法重新创建控制目录。

修复完成后,最好把模板仓库当成独立威胁模型长期维护。新增模板变量、导入方式或 Git 钩子时,都要重新检查控制目录、符号链接和命令执行边界。安全修复只有进入测试、发布和升级提醒,才不会停留在一次补丁动作上。

FAQ

所有 Forgejo 用户都一定受影响吗?影响取决于版本、模板功能是否开放和实例配置,管理员应按版本公告核对。

只升级 Git 能解决吗?不能。问题发生在 Forgejo 模板流程,Git 版本升级属于另一类维护动作。

自托管平台最重要的防线是什么?及时升级、最小权限、隔离执行目录和可追踪审计必须同时存在。