Railway 称客户环境变量可能遭访问、部分值可能已被解密,建议全体用户轮换密钥
Railway 10 月 21 日称系统出现异常活动,部分客户加密环境变量可能被访问、个别值可能已解密,建议全体用户轮换密钥。

Railway 是一个托管部署平台:开发者把代码仓库连上它,构建、发布、网络和环境变量都由它代管。2026 年 10 月 21 日,Railway 在官方博客发布安全披露,署名 Jacob Cooper,称当天早上检测到涉及「存储客户环境变量的系统」的异常活动,未经授权的第三方可能访问了加密的环境变量,其中部分值可能已被解密。公司建议所有用户立即轮换存放在 Railway 上的环境变量,包括 API Key 与私有镜像仓库凭据。
要点
- 通知与故障同时发生:状态页记录显示,Railway 从 10 月 21 日 07:24 UTC 起挂出故障调查,09:28 UTC 确认 dashboard、API 与 CLI 不可用、所有区域的构建暂停,四个区域的构建、API 与支持站同时列为受影响服务;安全通知到 21:59 UTC 才挂上状态页,22:10 UTC 起开始轮换全部对象存储桶凭据。
- 平台自己重置了两类凭据:所有环境里每个存储桶的
ACCESS_KEY_ID与SECRET_ACCESS_KEY已作废并重新生成,桶名、endpoint 和已存对象不变;Railway 代客户持有的 GitHub 令牌已作废,存在服务上的 registry 凭据已从 Railway 移除,不过这些 registry 令牌在客户自己去 GitHub 吊销之前仍然有效。10 月 22 日的重部署指南写明执行人是工程团队的 Faraz Patankar,审计日志里显示为 Railway Staff。 - 官方随后发了 13 篇操作指南:10 月 22 日 01:22 UTC 的那条更新一次性挂出 13 篇,覆盖 GCP、AWS、GitHub、Stripe、OpenAI、Anthropic、Grok、OpenRouter 的异常用量检查,Redis、MySQL、MongoDB、PostgreSQL 的凭据轮换,以及桶凭据重置后的重新部署与 GitHub 重连。
背景
Railway 的自我定位是「all-in-one intelligent cloud provider」(官网首页 10 月 22 日的写法),卖点是把构建、部署、网络和扩缩容收进一个控制台。这类平台的便利来自代管:客户不必自己开机器、配负载均衡,也就把运行时要用的凭据一起交给了平台。环境变量在这里同时是配置和秘密——数据库连接串、云厂商访问密钥、AI 供应商的 API Key 往往放在同一个页面里,进程启动时以明文注入。
这次不是 Railway 今年第一次被用户公开质疑。Hacker News 上有用户称,今年早前一起事故后就已把大客户迁走,也有人质疑上一次大故障的官方解释是否诚实。两人都是用户自述,没有独立核实。
外部报道把它放进同一条时间线。TechCrunch 说 OpenCode 遭遇的是「一次类似的攻击」:那一次超过 1% 客户的 API 凭据与其他秘密被拿走,OpenCode 把它归因为「AI 蒸馏攻击」。GitGuardian 则把它和 4 月的 Vercel 事件归入同一模式。同一周还有 PHP 的 PHP2Shell 漏洞补丁,TechCrunch 认为两者看起来无关。
事实部分
Railway 确认了什么、没说什么,边界相当清楚。
| 项目 | Railway 的说法 | 仍未公布 |
|---|---|---|
| 发现时间 | 10 月 21 日「早些时候」检测到异常活动;状态页在同日 07:24 UTC 挂出故障调查 | 精确发现时点与首次入侵时点 |
| 可能被访问项 | 存储客户环境变量的系统;加密的环境变量,其中部分值可能已被解密 | 解密是密钥泄露还是系统缺陷;sealed 变量是否在范围内 |
| 影响范围 | 初步分析「可能限于一部分用户」,会邮件联系确认受影响的客户 | 受影响账户数量与名单 |
| 入侵路径 | 未说明 | 入口、横向移动、是否留下持久化 |
| 是否收到勒索 | 未说明 | TechCrunch 就此提问,未获回复 |
| 平台状态 | 所有部署暂停;10 月 22 日 17:00 UTC 更新称 Pro 与 Enterprise 部署自 06:30 UTC 起正常,Hobby 与 Free/Trial 的构建仍在恢复,完整事故报告待发布 | 免费层的恢复时间 |
「可能被访问」这个措辞值得单独看。Cyber Security News 10 月 22 日的报道点出了标题里常被抹掉的区别:通报说的是可能访问加密变量、并对其中一部分取得了解密内容,这不能推出攻击者攻破了加密,通报也没有解释可读的值是怎么拿到的。
平台侧的连带动作比披露本身更具体。10 月 21 日 20:19 UTC,Railway 因相邻缓存系统受影响作废了 OAuth 会话,受影响的用户被登出;22:10 UTC 起开始轮换全部桶凭据,22:45 UTC 补了一条说明,让客户在审计日志里看到名为 Faraz Patankar、类型为 Railway Staff 的桶凭据作废操作不必惊慌;10 月 22 日 04:17 UTC,全部 Railway API token 作废,用旧 token 接公开 API 的集成随即失效。
轮换为什么卡住
Railway 在 10 月 21 日 21:59 UTC 的安全通知里要求所有人立刻轮换,可同一时间所有构建和部署都停着。容器只在启动时读环境变量——这是 Railway 重部署指南里的原话——所以新值写进控制台也不会生效。平台 10 月 22 日 01:22 UTC 发布指南时也承认,部分步骤要等构建恢复才能做;Enterprise 构建 03:32 UTC 才恢复,Pro 的构建和需要重新部署的步骤到 06:29 UTC 才可用。
Hacker News 上这成了最集中的抱怨(帖子 10 月 21 日 21:58 UTC 发出,我们 10 月 22 日 17:40 UTC 查到时为 555 分、322 条评论)。有人按建议吊销了上游密钥,服务随即因为无法重新部署而下线;有人选择先不动,让可能已经泄露的凭据继续有效。两种做法都有代价,代价来自控制面故障跟数据面操作的耦合。
Sealed 变量是另一处细节。Railway 文档说,sealed 变量的值会提供给构建和部署,但永远不在界面显示,也不能通过 API 取回;用 railway variables 或 railway run 同样拿不到,而且封上之后无法解封。GitGuardian 指出,披露没有说明 sealed 变量是否在范围内,所以它建议连这些也一起换。
导出清单可以做,但别指望它完整。CLI 文档给的写法是 railway variable list --service <service> --environment <environment> --kv,GitGuardian 建议把输出重定向成 .env.railway,再用 ggshield secret scan path .env.railway 扫出哪些变量还装着有效凭据。问题有两处:CLI 示例输出里,引用型变量的值显示为 {{SECRET_…}} 这样的占位符;sealed 变量的值按文档不会经由 CLI 返回。导出的是一张变量名加明文的清单,不是全部秘密。
GitGuardian 给的顺序值得照抄:先在上游吊销或轮换(AWS、GCP、GitHub、AI 供应商),再改 Railway 里的值,然后重新部署、验证依赖服务,最后删掉导出的文件。先上游后平台,是因为上游旧凭据只要还有效,改平台上的副本就没有意义。
各方说法
TechCrunch(Zack Whittaker,10 月 22 日)确认 Railway 建议「所有用户」吊销并轮换私有密钥,同时点出公司没有说明受影响客户数量和根本原因,也没有立即回应置评请求,包括是否收到勒索要求。报道把它和 OpenCode 并列,并与 PHP2Shell 分开。
GitGuardian(10 月 22 日,研究团队署名)这篇两分钟的响应简报没做取证分析,也没给受影响用户数或扫描结果;它给的是通用应急顺序——先上游后平台、扫描导出文件再决定先换哪个——没有针对本次泄露的新发现。
Railway 自己的归因是:这是一系列针对平台公司、意在攻破 AI 推理供应商的攻击的一部分,公司已通知这些上游供应商主动吊销密钥。Hacker News 上有人反问这句话是否在指认同行,也有人提醒「攻击者用了 AI」不能替代自身的安全维护。这条归因目前没有细节支撑。
Cyber Security News(Guru Baran,10 月 22 日)基本复述官方内容,但把「可能访问」与「确认泄露」分开写,这一点比多数标题克制。
Hacker News 用户提供了目前最接近现场的材料,也最需要打折。一位说自己 OpenRouter 的 key 被拿去跑了约 2 美元的 Opus 5.5 与 Fable 调用;另一位说 Anthropic 的 key 因滥用证据在收到通知约 3 小时后被停用,损失约 20 美元的 Opus 4.8 token;还有人说自己查日志时正好看到 Railway 员工重置桶凭据。这些都是自述,没有独立核实,也不能当成本次影响范围的统计。
编辑判断
对正在用 Railway 的团队,处置上该按凭据已泄露来做;写进自己的事故记录时,得把「可能」保留成「可能」。目前站得住的判断只有三条:第三方进过存放环境变量的系统;公司已按最坏情况动手,重置了所有桶凭据和代持的 GitHub 令牌;入侵路径和确认范围都还没公布。
最该记住的一课是轮换能力要独立于部署流水线。构建停了、凭据就换不了,服务要么带着旧密钥继续跑,要么带着新密钥下线,两个选项都不好。平时把关键凭据放进云厂商自己的密钥管理里、让应用启动时去取,遇到同类事件时至少能绕开平台的控制面。
处置顺序可以照着走:先在上游吊销并重建凭据,再用 CLI 导出变量清单并扫描,确认哪些还装着有效凭据;然后改 Railway 的值、重新部署、验证依赖服务,最后删掉本地导出文件。对象存储桶和 GitHub 需要额外一步重连,GitHub 的新令牌只能由客户自己生成。
同类事件里,凭据被拿走只是第一步。LiteLLM 1.107.0 的发布链被植入窃密器展示的是攻击者拿到令牌后怎么改掉发布流程;PingCAP 内部系统遭未授权访问则是供应商侧攒下的客户元数据与凭据成了地图。Railway 这次落在两者之间:平台替客户保管秘密,一旦这些秘密可能被读出,客户能做的只有轮换和查日志。
还在等的东西有四样:完整事故报告、受影响账户数量、sealed 变量是否在范围内、是否收到过勒索要求。状态页说事件结束后会在博客发布完整报告,在那之前,任何关于「多少人受影响」的数字都是猜的。