攻击者入侵了共享集群与 GCP 专用服务器,并读取了存放在 Zeabur 平台数据库中的环境变量。本文说明发生了什么、哪些数据受影响、我们做了什么,以及您需要做什么。
本文亦提供 English、繁體中文、日本語、Español和Bahasa Indonesia。
本文时间均为协调世界时(UTC)。调查仍在进行,本文会随进展更新。
本文用语:“已确认”表示有日志直接记录;“研判”表示时间与内容吻合,但缺少直接记录;“无法确认”表示没有记录可查,我们一律按已泄露处理;“推测”表示只有间接证据支持的可能解释,集中列在尚未证实的推测。
攻击者走了两条路径,最后在 Zeabur 的内部网络会合。
路径 A:共享集群与 AWS
路径 B:GCP 专用服务器
两条路径会合
事件期间轮换的部分凭证,后续仍遭未授权使用。 Zeabur 的集群每日备份会保存所有机密,而攻击者在 10 月 15 日 15:04 读取了备份的访问密钥。我们在 15:40 换上的新密钥,被 16:00 的备份收录;攻击者在 20:30 使用了它。我们在 18:51 删除备份的访问密钥,并在 21:47 再次轮换受影响的凭证。新密钥被备份收录、之后遭使用,这两点已确认;攻击者是否下载了这份备份属于研判。攻击者可能在 18:51 前就已取得备份,所以 20:30 的使用不代表 18:51 之后仍能下载。
| 系统 | 受影响的数据 | 范围 | 确定程度 |
|---|---|---|---|
| 平台数据库 | 存放在 Zeabur 的服务环境变量(名称与值) | 3,218,965 条 | 已确认 |
| 平台数据库 | 账号(电子邮箱、用户名、手机号码等)、项目、环境与服务数据 | 账号 321,810 条 | 已确认 |
| 平台数据库 | zSend API 密钥(明文) | 566 个,已撤销 | 已确认 |
| 平台数据库 | 平台访问令牌 | 11,536 条,仅有哈希值,无法还原;已全部撤销 | 已确认 |
| 共享集群 | 所有服务的环境变量与机密 | 9 个区域 | 部分已确认,其余无法确认 |
| 共享集群 | 数据库内容 | 865 个数据库服务 | 研判(见下方说明) |
| GCP 专用服务器 | 服务器上的所有数据 | 101 台,92 位用户 | 已确认登录 |
| Hetzner、DigitalOcean 专用服务器 | 服务器的管理权限 | 359 台与 48 台 | 无法确认是否遭使用 |
| GitHub App | 访问用户授权的 GitHub 仓库 | 10/15 15:05 至 18:54 | 未发现遭使用 |
| 用户数据库备份 | 台北(tpe1)与香港(hkg1)区域的备份 | 两个区域 | 无法确认是否遭下载 |
平台数据库。 10 月 15 日 16:10 至 16:47,攻击者读取了上表的数据。账号数据包含个人主页上的信息,例如电子邮箱、用户名与手机号码。攻击者也搜索了环境变量与配置文件中的 API 密钥与私钥。从命令内容与后续行为来看,攻击者主要在寻找可以直接使用的 API 密钥,特别是 AI 服务的密钥:攻击者在平台数据库中搜索密钥、大量读取 n8n 与 new-api/one-api 中的凭证,也尝试用 Zeabur 的 AWS 密钥调用 Amazon Bedrock。这只是对攻击者意图的观察;攻击者也读取了账号数据,我们仍把所有读取到的数据按已泄露处理。双因素认证与通行密钥的数据表只被查询了统计信息,没有读取内容的记录。我们已撤销所有用户的平台访问令牌,旧令牌都无法再使用。
已迁移的环境变量不在平台数据库遭读取的范围内。 八月事件后,Zeabur 为专用服务器的用户提供了轮换凭证、删除存放在 Zeabur 的环境变量与配置文件,以及一键迁移到自己服务器的指引与功能。已完成迁移的项目,这些数据只存放在用户的服务器上,Zeabur 没有保存,因此不在这次平台数据库遭读取的数据中。尚未迁移的项目,环境变量仍存放在 Zeabur,这次也遭读取。这不排除主机入侵造成的泄露;遭入侵的 GCP 专用服务器仍适用下方的处置建议。
冒用账号。 攻击者读取了用来签发登录凭证的密钥,我们研判攻击者用它伪造了登录凭证。攻击者到 16:47 才大量读取平台访问令牌,而且令牌只存哈希值,无法解释 16:12 就开始的冒用。10 月 15 日 16:12 至 17:19,攻击者以两个账号的身份调用 Zeabur API,读取账号与项目列表;其中一个是 Zeabur 员工的账号。这些请求没有修改任何资源。我们在 20:25 轮换了签名密钥,所有用户都已被登出。
共享集群的数据库。 攻击者在 865 个数据库的容器内执行了读取命令。审计记录只记录命令,不记录输出,部分命令也因出错而失败,所以每个数据库实际被读走多少无法确认。我们根据命令内容判断:
| 对象 | 数量 | 被读取的数据 |
|---|---|---|
| 使用 PostgreSQL 的 n8n | 736 | 第三方凭证、用户、项目、变量与 workflow |
| PostgreSQL(逐表读取) | 211 | 每张表最多 50,000 条;台北(tpe1)区域没有 |
| new-api/one-api | 10 | AI 服务密钥、访问令牌与用户 |
| Redis | 1 | 名称含 token、secret 等字样的条目 |
| MongoDB、MariaDB | 各 1 | 台北(tpe0)没有命令内容,按全部泄露处理 |
使用 PostgreSQL 的 n8n,有 602 个(在检查的 607 个中)把加密密钥写在环境变量中,所以 n8n 内的第三方凭证等同以明文泄露。由于此次数据读取发生于容器内部,八月事件后的数据库密码轮换,并未能阻断此次访问路径。
另外,东京(hnd1)区域至少 2 个 PostgreSQL 自 10 月 14 日 01:51 起被植入会回连外部的程序,其中一个在 10 月 15 日 16:24 仍有回连。它的入口是否为八月泄露的密码,目前无法确认。我们已在发现时通知受影响的用户更换凭证。
GCP 专用服务器。 调查确认,攻击者曾以 root 权限登录 101 台服务器,最后一次登录时间为 10 月 15 日 20:36。攻击者另于其中 50 台服务器新增其控制的 SSH 公钥,建立持续访问途径;并在 Zeabur 的 GCP 项目内创建 5 台虚拟机,将 16 份客户服务器磁盘副本挂载至其创建的虚拟机。
基于上述访问范围,这 101 台服务器均被列为可能发生数据泄露及留有未授权访问机制的受影响主机。我们已通过电子邮件通知受影响用户,并重置相关服务器的 root 密码。
Hetzner 与 DigitalOcean。 管理这两家客户服务器的令牌写在内部代码与环境变量中,随平台数据库一起泄露。持有令牌可以重置密码、重装系统或复制磁盘。我们在 10 月 16 日 01:09 撤销了全部令牌。两家都没有操作审计记录;Hetzner 账号的事件都能对应到用户本人或系统定时任务,DigitalOcean 仍在比对。
Linode 与腾讯云。 Linode 890 台服务器中,有记录的 847 台没有攻击者登录。腾讯云的管理凭证没有遭使用的记录。
GitHub App。 攻击者在 10 月 15 日 15:05 读取了 Zeabur GitHub App 的私钥。持有私钥就能访问用户授权 Zeabur 访问的仓库。我们在 18:54 轮换私钥,目前没有发现它遭使用。我们已向 GitHub Support 申请完整的审计记录,尚未收到回复。
Zeabur 内部系统。 攻击者使用了多组 Zeabur 的 AWS 密钥。大多数请求被拒绝,但攻击者列出了两个区域的用户数据库备份与源代码上传的内容;是否下载无法确认。攻击者尝试调用 Amazon Bedrock,全部失败,没有产生费用。
| 时间(10 月 15 日) | 处置 |
|---|---|
| 14:43–15:56 | 共享集群的管理接口只允许 Zeabur 系统连接 |
| 15:32 | 撤销遭使用的集群管理令牌;21:47 再轮换一次 |
| 17:17、17:31 | 停用攻击者使用的两把 GCP 密钥 |
| 17:58 | 移除攻击者的内网节点,并撤销创建它的凭证 |
| 18:51 | 删除集群备份的访问密钥 |
| 18:54 | 轮换 GitHub App 私钥、支付服务密钥与 GitHub OAuth 密钥 |
| 18:55 | 移除 GCP 服务器初始化配置中的 root 密码 |
| 20:05–21:22 | 停用 24 组已泄露或无法排除泄露的 AWS 密钥,换上权限更小的新密钥 |
| 20:25 | 轮换登录签名密钥,所有用户被登出 |
| 20:34–20:36 | 移除 GCP 服务器默认服务账号的权限;封禁 GCP 服务器的公网 SSH |
| 20:47 | 撤销全部 566 个 zSend API 密钥 |
| 21:46 | Zeabur 管理的专用集群只允许 Zeabur 系统连接 |
| 10/16 01:09 | 撤销泄露的 Hetzner 与 DigitalOcean 令牌 |
我们也停用了硬编码在代码中的腾讯云、阿里云与 Linode 凭证,从 GCP 服务器移除了攻击者的 SSH 密钥,并保全了各系统的审计记录。
之后我们也完成了:
| 功能 | 影响期间(UTC) | 目前状态 |
|---|---|---|
| 登录 | 10/15 20:25 起需重新登录 | 正常 |
| zSend 与系统邮件(含登录链接) | 10/15 20:00–22:02 | 已恢复;zSend 密钥需重新创建 |
| GitHub 登录与部署 | 10/15 18:54–22:49 | 已恢复 |
| 构建 | 10/15 20:05–22:56;中国区至 10/16 01:44 | 已恢复 |
| 数据库备份 | 10/15 20:33–22:13 | 已恢复 |
| GCP 专用服务器管理 | 10/15 17:31–20:35 | 已恢复;只能使用网页 SSH |
| 专用服务器自动续费 | 腾讯云 10/15 22:55–10/16 01:08 失败 154 次 | 已恢复;扣款已退回账户余额 |
| 腾讯云重置密码、SSH 登录记录 | 10/15 起 | 已恢复 |
| Linode 专用 Kubernetes 集群 | 10/15 起 | 已恢复 |
请现在就处理,无需等待通知邮件。八月事件后换过的凭证,也要再换一次。
把服务器视为已遭入侵:
/root/.ssh/authorized_keys 中注释为 @zeabur-pentest 或您不认识的密钥。google-sudoers 用户组、系统账号、crontab、systemd 服务与 k3s 工作负载。在控制台检查 10 月 14 日之后 root 密码是否被重置、系统是否被重装,并按上方 GCP 的检查项确认没有不明的登录方式。
触发: 攻击者持有 Zeabur 的集群管理令牌与多组云密钥。这些凭证以明文保存在配置仓库中。攻击者如何取得它们,目前无法确认;最可能的路径见尚未证实的推测。
影响范围扩大的相关因素:
这是 Zeabur 不到两个月内的第二起安全事件。许多用户在八月后按我们的指引做了调整,也会想知道:既然做了这些措施,为什么还会发生,两起事件有没有关联。
八月后做了什么。 我们轮换了当时确认泄露的内部密钥,并停用 Legacy API Key。产品上,专用服务器的项目可以把环境变量与配置文件迁移到自己的服务器,也可以删除 Zeabur 保存的 SSH 凭证,并查看 SSH 登录记录。八月事件的通知与公告中,也建议用户轮换凭证、删除存放在 Zeabur 的环境变量与配置文件,并迁移到自己的服务器。
为什么还是发生。 八月的轮换没有覆盖配置仓库中以明文保存的集群管理令牌与 AWS 密钥,GCP 服务器初始化配置中的 root 密码也还没修复。这次攻击者使用的正是这些凭证。八月事件报告中写“已停用或轮换所有内部管理密钥”,这个说法并不完整,我们在此更正。攻击者如何取得这些凭证,目前无法确认;我们的推测见尚未证实的推测。
做对的地方。 已按八月指引完成迁移的项目,环境变量与配置文件只存放在用户自己的服务器上,不在这次平台数据库遭读取的数据中。
| 时间(UTC) | 事件 |
|---|---|
| 2024 年 1 月 10 日 | 创建共享集群的管理令牌,没有有效期 |
| 2026 年 1 月 20 日 | 管理令牌以明文写入配置仓库 |
| 8 月 27 日 | 八月事件中,GitHub App 私钥遭读取;与本事件的关联为推测 |
| 8 月 30 日、9 月 2 日 | 配置仓库以员工的 GitHub 授权被下载为压缩包,下载者无法确认 |
| 8 月 31 日 | 更换 GitHub App 私钥;配置仓库中的明文凭证没有轮换 |
| 9 月 1–5 日 | 不明来源以 root 密码登录约 98 台 GCP 专用服务器 |
| 9 月 3 日 | 发现 GCP 服务器的初始化配置保存 root 密码,未在事发前修复 |
| 10 月 10 日 18:27 | 后续用于凭证滥用的 IP 首次出现在 Zeabur API 访问记录中(未登录) |
| 10 月 13 日 21:27 | 攻击者 IP 尝试 SSH 登录 3 台专用服务器,至 23:04,全部失败 |
| 10 月 14 日 01:36 | 攻击者首次使用 Zeabur 的 AWS 密钥 |
| 10 月 14 日 01:40 | 攻击者首次以管理令牌访问共享集群 |
| 10 月 14 日 12:39 | 攻击者读取共享集群所有服务的配置与机密 |
| 10 月 14 日 13:40 | 攻击者开始在数据库容器内读取数据;同时开始登录 GCP 专用服务器 |
| 10 月 14 日 17:04 | 数据库容器内的最后一条命令 |
| 10 月 15 日 13:56 | 收到用户反馈后,启动调查 |
| 10 月 15 日 14:43 | 开始限制共享集群管理接口的连接来源 |
| 10 月 15 日 14:52 | 攻击者开始读取约 53 条生产环境机密,至 16:51 |
| 10 月 15 日 15:02 | 已停用服务的部署密钥读取配置仓库(推测为攻击者) |
| 10 月 15 日 15:30 | 攻击者让一个节点加入 Zeabur 内部网络 |
| 10 月 15 日 15:42 | 攻击者下载 Zeabur 存储中的用户数据库备份 |
| 10 月 15 日 16:06 | 攻击者在取得的数据中搜索 API 密钥,至 18:13 |
| 10 月 15 日 16:10 | 攻击者开始读取平台数据库,至 16:47 |
| 10 月 15 日 16:12 | 攻击者开始冒用账号调用 API,至 17:19 |
| 10 月 15 日 17:58 | 移除攻击者的内网节点 |
| 10 月 15 日 19:50 | 攻击者第二波登录 GCP 专用服务器,至 20:36 |
| 10 月 15 日 20:25 | 轮换登录签名密钥,所有用户被登出 |
| 10 月 15 日 20:36 | 封禁 GCP 专用服务器的公网 SSH,攻击者的登录停止 |
| 10 月 15 日 20:48 | 状态页更新为平台数据库与专用服务器也受影响 |
| 10 月 15 日 21:01 | 攻击者尝试访问共享集群节点,被拒绝 |
| 10 月 15 日 21:05 | 目前观察到的攻击者最后活动(AWS) |
| 10 月 16 日 01:09 | 撤销 Hetzner 与 DigitalOcean 令牌 |
| 10 月 16 日 01:50 | 一位用户的 OpenAI 密钥遭滥用,至 02:56(推测来自本次泄露) |
以下事项因现有记录的覆盖范围或完整性限制,目前尚无法确认。对于无法排除遭未授权访问的数据与凭证,我们按可能已泄露的情形采取应对措施。
以下是我们目前认为最可能的解释。它们有间接证据支持,但缺少直接记录,不能作为事实引用。取得新证据后,我们会更新或撤回。
1. 最初的凭证可能来自八月事件
2. 10 月 14 日前的探测可能是同一攻击者的侦察
103.237.102.191:10 月 10 日 18:27 未登录浏览 Zeabur,10 月 14 日以管理令牌访问共享集群。23.106.46.239:10 月 12 日 12:52 起未登录大量尝试 Zeabur API,10 月 13 日尝试 SSH 登录专用服务器,10 月 14 日 01:36 首次使用泄露的 AWS 密钥。3. 10 月 15 日的部署密钥访问可能是攻击者
4. 泄露的用户密钥可能已遭滥用
在您的系统或服务商记录中发现下列指标时,请把相关凭证按已泄露处理,并联系我们。攻击者大量使用轮换的代理服务器,下表只列出有代表性的地址。
| 类型 | 指标 | 出现在 |
|---|---|---|
| IP | 23.106.46.239 | 集群访问、云 API、SSH 登录 |
| IP | 102.244.78.57 | 云 API、GCP 配置修改 |
| IP | 103.237.102.191 | 集群访问、云 API |
| IP | 103.112.139.162 | 首次使用集群管理令牌 |
| IP | 45.146.232.28 | 验证 AWS 密钥 |
| IP | 216.98.11.198、45.58.38.175 | 专用服务器 SSH 登录 |
| IP | 52.220.72.188 | 被植入程序的 PostgreSQL 回连地址 |
| IP | 31.57.201.201 | 9 月初以 root 密码登录 GCP 专用服务器;与本事件的关联无法确认 |
| SSH 密钥 | 注释 *@zeabur-pentest,指纹 SHA256:EdBc0uephoOMemIRKK0SRV2TRR45n52tJm1yErVU1iM | 攻击者加入专用服务器的密钥 |
| User-Agent | Boto3/1.43.111(Linux 6.12.86) | 攻击者使用 AWS 密钥的客户端 |
如需协助,或发现异常访问与不明费用,请通过 Zeabur Support 联系我们。联系前请先撤销相关凭证,并只提供脱敏后的信息;请勿在工单或公开渠道中贴出仍然有效的密钥或密码。
若您的第三方 API 密钥或云账号因本事件产生额外费用,请通过支持工单申请补偿。我们会核对服务商的使用记录与费用,并说明核查结果。
Zeabur 已宣布将于 2026 年 12 月 31 日停止运营,这是运营上的决定。在此之前,我们会持续处理本事件的支持与补偿申请,并持续更新本文与状态页。我们向所有受影响的用户致歉。
Zeabur 团队