# 保障互联网关键软件的安全:我们本可以如何给 Bash 植入后门
来源:https://www.hacktron.ai/blog/hacking-gnu-savannah
1. https://www.hacktron.ai/
2. 博客 (https://www.hacktron.ai/blog)
3. 保障互联网关键软件的安全:我们本可以如何给 Bash 植入后门
隐藏在电子邮件地址中的一段 shell 注入让我们在 GNU Savannah 上获得了代码执行权限,随后是 root 权限,以及向上游 Bash 仓库推送代码的能力。我们报告了漏洞,继续审计,并协助 FSF 修复了这个承载 GNU 项目的代码托管平台上的 26 个漏洞。
2026年10月30日 阅读约 7 分钟
**摘要:**GNU Savannah 托管着 Bash、Coreutils 以及数百个其他 GNU 项目。我们使用 Hacktron 发现,形如`a\`touch$\{IFS\}/tmp/savane\-rce\-proof\`@attacker\.example`的电子邮件地址可以让任何注册用户在其后端执行代码。借此,我们将自己的账号变成了超级用户,冒充了 Bash 的维护者,并确认可以添加具有上游 Bash 仓库推送权限的 SSH 密钥。一个未打补丁的内核让我们获得了 root 权限以及对 GNU 备份服务器的访问权限。我们于 2026 年 5 月 11 日向 FSF 报告了这些问题。
随后我们使用 Hacktron 对 Savane 的其余部分进行了渗透测试,发现了更多漏洞并一并上报,总计确认了 26 个漏洞。FSF 修复了这些漏洞并发布了一份事件报告 (https://static.fsf.org/nosvn/security/savannah-20260807.pdf)。
利用链
1. **普通账号** savannah.gnu.org
2. **电子邮件地址** 允许 Shell 元字符
3. **GPG 密钥测试** 邮箱出现在 shell 命令中
4. **Web 服务器 RCE** 数据库访问
5. **超级用户** 可冒充任意用户
6. **Bash 维护者** 添加 SSH 密钥
7. **OverlayFS** 未打补丁的内核
8. **Root** Savannah 后端
9. **备份服务器** GNU
## 为什么是 Savannah
Savannah 承载了大量 GNU 用户态工具,包括 Bash 和提供`ls`、`cp`、`rm`等命令的 Coreutils。这里存放着仓库、维护者账号,以及决定谁有权推送代码的 SSH 密钥。落地到这里的代码会被各个发行版打包并安装到数百万台机器上,而xz后门事件 (https://www.openwall.com/lists/oss-security/2024/03/29/4) 已经展示了这条链条中一个环节被攻破会造成什么后果。
和许多自由软件所依赖的基础设施一样,Savannah 由少数志愿者和资源有限的 FSF 工作人员运营。我们希望将我们的资源投入其中。Savannah 运行的是Savane (https://savannah.nongnu.org/projects/administration),一个本身也是自由软件的 PHP 应用程序,于是我们将 Hacktron 指向其源代码进行了审计。
我们得到的结果,很可能是我们迄今发现的最有影响力的漏洞。
## 漏洞:一个能执行命令的电子邮件地址
Savane 允许我们使用以下电子邮件地址注册:
``
a`touch${IFS}/tmp/savane-rce-proof`@attacker.example
``
你已经猜到接下来会发生什么了吧?
### 验证器
Savane 的邮箱验证器(`frontend/php/include/account\.php:275`)接受包含反引号、`$`、`\{\}`、`/`、`\|`等字符的 dot\-atom 格式地址。根据 RFC,这些字符大多在技术上是允许出现在电子邮件地址本地部分的,因此上述地址通过了验证。任何用户都可以在注册时或通过修改邮箱流程(`frontend/php/my/admin/change\.php:271`)设置它。
### 汇聚点
每个已登录用户都可以为其账号管理 GPG 密钥,Savane 在`/my/admin/change\.php?item=gpgkey`处提供了一个"Test GPG keys"按钮。它执行的检查之一会列出账号邮箱对应的密钥指纹。在`frontend/php/include/gpg\.php`中:
``
function test_gpg_command ($temp_dir, $command, &$ret, $in = null){ $cmd = gpg_name () . " --home '$temp_dir' $command"; ... $res = utils_run_proc ($cmd, $out, $err, $aux); ...}function test_listing ($temp_dir, $level, &$ret, $test_against_email = false){ ... if ($test_against_email) { $email = user_get_email (0); ... } $options = '--list-keys --fingerprint'; if ($test_against_email) $options .= " $email"; $res = test_gpg_command ($temp_dir, $options, $ret);}
``
邮箱以纯文本形式追加到`$options`中,`$options`被拼接进`$cmd`,`utils\_run\_proc\(\)`再把这个字符串交给`proc\_open\(\)`。对于字符串形式的命令,PHP 会通过`/bin/sh`执行它。shell 看到我们的反引号,会在`gpg`启动之前先执行反引号中的内容。使用`$\{IFS\}`是因为验证器会拒绝空格,而 shell 会将其展开为空格。
利用它只需四步:
1. 用上述载荷作为电子邮件地址注册,或修改现有账号的邮箱地址。应用会接受它。
2. 打开`/my/admin/change\.php?item=gpgkey`。
3. 粘贴任意 GPG 密钥并点击"Test GPG keys"。
4. 电子邮件中的命令会以 Web 服务器用户的身份在服务器上运行。
FSF 后来将漏洞路径追溯到 2026 年 3 月 7 日发布的 Savane(3\.17\-c369)。它同时影响 savannah\.gnu\.org 和 savannah\.nongnu\.org,因此受影响时间窗口约为两个月。
## 从 shell 到超级用户
为了看看能走多远,我们将载荷换成反向 shell,以 Web 服务器用户的身份进入了后端。
Web 服务器用户可以读取 Savane 的配置,其中包含数据库凭据,因此无需破解任何东西。我们在自己的账号`harshjaiswal`上设置了`superuser`标志,然后重新加载页面。
以超级用户身份登录 savannah.gnu.org
超级用户在侧边栏会看到一个"Become this user"框,网站管理员可以通过它无需密码即可以任意账号身份操作。
## 成为 Bash 的维护者
我们在那个框里输入了`chet`。Chet Ramey 是 Bash 的维护者。
以 chet 身份登录,在 Change Authorized Keys 页面
那是他的 SSH 密钥页面,还有一个空位可以再添加一个密钥。Savannah 的 Git 托管基于这些条目,因此在这里添加密钥就授予了以维护者身份向`bash\.git`推送的权限。我们确认该页面接受编辑,然后就停下了。我们没有添加密钥,也没有碰过仓库。
处于这一位置的攻击者本可以 Chet 的名义向上游 Bash 推送提交,也可以对 Coreutils 或 Savannah 上的其他任何项目做同样的事。
## Root 和备份服务器
Web shell 是无权限的。Savannah 运行的是 Trisquel GNU/Linux 11,内核是从 Ubuntu 22\.04 的 5\.15 LTS 内核构建的 linux\-libre 内核。该内核仍受GameOver\(lay\) (https://www.wiz.io/blog/ubuntu-overlayfs-vulnerability)影响,这是 2023 年的两个 OverlayFS 漏洞(CVE\-2023\-2640 和 CVE\-2023\-32629)。Canonical 当时修复了 5\.19 和 6\.2 内核,但 5\.15 内核直到 2026 年 5 月 7 日的 USN\-8255\-1 才得到修复——比我们的报告早四天。公开的利用代码第一次尝试就成功了,让我们在 Savannah 后端获得了 root 权限。
以 root 身份,我们发现了一把密钥,可以让我们以`gnubackup`用户身份 SSH 到 GNU 备份主机。
在 GNU 备份服务器上以 gnubackup 身份获得 shell
到那时,我们已在代码托管平台获得 root 权限,能够访问其备份,并可以以任意维护者身份操作。我们停止了进一步的侦察,开始撰写报告。
## Savane 的其余问题
RCE 只是众多发现之一。在最初的报告之后,我们让 Hacktron 继续对 Savane 代码库运行,这套代码源自 2001 年的 SourceForge 代码。它产生了 33 项发现;我们剔除了 7 个误报,将其余 26 项(2 个严重、6 个高危、16 个中危、2 个低危)连同文件路径、行号和复现步骤一并发送给了 FSF。其中较为突出的有:
| ID | 严重程度 | 发现 |
|---|---|---|
| HCK\-001 | 严重 | 通过 GPG 密钥测试邮箱导致的命令注入 RCE |
| HCK\-002 | 严重 | 全站管理员组配置的授权绕过(`siteadmin/triggercreation\.php`) |
| HCK\-003 | 高 | 任何群组成员都可以删除该群组的邮件列表 |
| HCK\-004 | 高 | 任何用户都可以更改任意群组的 tracker 通知地址 |
| HCK\-006 | 高 | 任何群组成员都可以重置邮件列表管理员密码 |
| HCK\-008 | 高 | 私有文件访问信任请求中的`file\_uid`参数而非会话 |
| HCK\-010 | 中 | 会话劫持:跨域 SSO 在 URL 中传递`session\_uid`和`session\_hash` |
| HCK\-012 | 中 | 密码重置和邮箱更改确认哈希永不过期 |
| HCK\-017 | 中 | 通过真实姓名字段的存储型 XSS,该字段仅过滤`<` |
## 与 FSF 的协作
Savannah 管理员 Corwin Brust 当晚就回复了。FSF 将其视为一次完全入侵:修补了内核,审计了访问控制、数据库和日志,并通知了另一个公共 Savane 实例的运营者。授权类漏洞是通过重构而非逐个补丁的方式修复的。
## 漏洞披露时间线
| 日期 | 事件 |
|---|---|
| 2026\-03\-07 | Savane 3\.17\-c369 发布,包含存在漏洞的 GPG 密钥路径 |
| 2026\-05\-07 | Canonical 发布 USN\-8255\-1,修复 5\.15 内核中的 GameOver\(lay\) |
| 2026\-05\-11 | 我们向 savannah\-hackers\-private 报告了 RCE、root 权限以及对 Bash 仓库的访问权限 |
| 2026\-05\-12 | Savannah 管理员 Corwin Brust 确认收到报告及我们 30 天的披露窗口 |
| 2026\-05\-14 | FSF 安装了修复后的内核并删除了我们的账号 |
| 2026 年 5 月 | 我们发送了 Savane 完整审计中剩余的 25 项发现 |
| 2026\-06\-19 | FSF 发布了关于此事件的声明 |
| 2026\-08\-07 | FSF 发布其事件报告 (https://static.fsf.org/nosvn/security/savannah-20260807.pdf) 及 Savane 补丁 |
感谢来自 Savannah hackers 和 FSF sysops 的 Ineiev、Corwin Brust 和 Bob Proulx 与我们合作。
### 与本研究背后的团队合作
Hacktron 汇集了顶尖的 CTF 研究人员、经验丰富的红队成员和进攻性安全研究者。我们利用 AI 加速安全研究,在恶意行为者之前发现并消除广泛使用的可信软件中的漏洞。我们正在全球所依赖的基础设施上继续研究。如果您负责保障其中一部分的安全,我们希望通过红队测试 (https://www.hacktron.ai/red-team)、渗透测试 (https://www.hacktron.ai/pentests) 或AI 代码审查 (https://www.hacktron.ai/pr-review) 与您合作。欢迎联系 [hello@hacktron\.ai](mailto:
[email protected])。
上一篇 Node2Shell:Brotli 解码器 RCE 在 Node\.js 中(CVE\-2026\-111497)(https://www.hacktron.ai/blog/node2shell#post-title) 下一篇 你已经在最新的一篇了!(https://www.hacktron.ai/blog/hacking-gnu-savannah#)