适用对象:在应用托管平台(PaaS)Railway 上运行应用或数据库的开发者和运维人员,尤其是在环境变量中保存 AI API 密钥、支付、GitHub、云或数据库凭据的人。
本文基于 Railway 官方博客文章(披露公告、初步报告和用户指南)及其状态页面。本文不涉及攻击手法,公司也未公开这些信息。
进行中:待该机构发布更多信息后,本文将持续更新
截至 2026 年 10 月 24 日 11:00 UTC(日本时间 20:00)尚不清楚
- 哪些环境变量被解密(公司称无法确定)
- 源代码是否被访问(将在最终报告中确认)
- 攻击的详细情况
- 已暴露的密钥是否被使用
公司的初步报告日期为 10 月 22 日;据状态页面,该报告于 10 月 23 日 16:38 UTC 公开。公司表示调查仍在进行,并将在调查结束后发布后续报告。最终报告尚无发布日期。
状态页面于 10 月 23 日 22:06 UTC 将该事件标记为已解决;构建和部署运行正常。新用户注册仍处于暂停状态。
Railway 用户今天应该做什么
步骤 1 和 2 适用于所有用户。公司表示影响可能有限,但出于预防,建议所有用户采取这些措施。
轮换密钥:在来源处重新签发并吊销旧值
公司要求你吊销并重新设置 10 月 21 日之前存储在 Railway 上的所有敏感环境变量,包括 API 密钥和私有镜像仓库凭据。
请按以下顺序操作:
- 列出你的环境变量。打开每个服务的 Variables 标签页,标记出密钥类的值(API 密钥、令牌、密码、签名密钥、连接字符串)
- 在各来源的控制台中签发新值:AI API、支付服务商、GitHub、云、外部数据库等
- 更新 Railway 变量并重新部署服务。容器只在启动时读取变量,因此在重新部署之前会继续使用旧值运行(公司指南)
- 新值验证可用后,在来源处吊销或删除旧值
只在 Railway 内修改值,而不在来源处吊销,已暴露的值仍然可用(本站说明)。
如果你在 10 月 22 日 03:32 UTC 之前轮换过
公司在 10 月 21 日的披露中要求用户立即轮换所有环境变量。公司后来表示,10 月 22 日 03:32 UTC 确认攻击者已无法访问其系统。初步报告解释说,公司希望先将攻击者清除,再通知用户轮换,以免新凭据立刻再次被泄露。因此,在 10 月 22 日 03:32 UTC 之前轮换的密钥,最好再轮换一次(本站说明)。状态页面称,仅凭这次更新,并不要求重复自事件被控制以来已完成的轮换。
数据库:重新生成密码并移除公网访问
公司建议所有用户移除数据库的公网访问。其指南指出,启用了公网访问(TCP 代理)的数据库,在你轮换之前,任何人都可以从互联网上凭凭据访问。
- 对于 PostgreSQL、MySQL、Redis 和 MongoDB,请在数据库视图中使用 Regenerate。它会一次性修改数据库内的密码和相关变量,并断开已打开的会话(公司指南)
- 不要手动编辑 POSTGRES_PASSWORD 等密码变量,也不要直接在数据库中修改密码。否则变量与数据库会不同步(公司指南)
- 重新部署所有引用这些变量的服务(例如
${{ Postgres.DATABASE_URL }})。将粘贴的连接字符串替换为引用 - 如果项目之外没有需要访问的对象,请在 Settings、Networking 下关闭 Public Access。项目之外的访问(本地开发、CI、BI 工具)需要手动粘贴新的
DATABASE_PUBLIC_URL
GitHub 与镜像仓库:检查审计日志和已连接的应用
公司建议检查 GitHub 审计日志和应用访问权限,以及 Docker Hub 等镜像仓库的审计日志。其指南列出了以下检查项:
- 个人账户:GitHub 安全日志(90 天)、已授权的 OAuth 应用和 GitHub Apps、SSH 和 GPG 密钥以及个人访问令牌。撤销所有你不认识的项目,并重新生成令牌
- 组织:组织审计日志(180 天)。在吊销任何内容之前先导出日志。对每个仓库,检查部署密钥、密钥(secrets)、webhook 和协作者
- GitHub Container Registry(ghcr.io):Railway 已删除其存储的 GitHub 令牌,但这些令牌在 GitHub 上吊销之前仍然有效。请在 GitHub 上删除旧令牌,创建一个具有 read:packages 权限范围的新令牌,并在每个服务中设置
指南还警告说,拥有推送权限的攻击者可以添加在密码重置后仍然存在的 webhook 或密钥。
AI API 与支付:查找不是你产生的用量和费用
根据公司的初步报告,攻击者似乎在寻找 AI 服务商的 API 密钥。公司已发布针对 OpenAI、Anthropic、OpenRouter、Grok、Stripe、AWS 和 GCP 的用量检查指南。例如,OpenAI 指南建议:
- 删除可能已暴露的密钥,并在同一项目中创建新密钥
- 打开用量页面,按 API 密钥分组,将暴露窗口期内的 token 量、请求数和模型组合与你的正常流量进行比较
- 检查该期间的计费支出和已消耗的赠送额度
- 检查成员和项目成员中是否有你没有邀请的人
- 保留用量详情,如发现被滥用,请联系服务商的支持团队
至少应检查从攻击窗口开始(10 月 20 日 13:58 UTC)到你轮换密钥为止的时间段(本站说明)。
Railway 内部:重新登录、重新创建令牌并重新部署
在应对过程中,公司吊销了所有登录会话、Railway 访问令牌、GitHub 连接和存储桶凭据。部署暂停期间推送的提交没有被部署。
- 使用注册时所用的同一个 Gmail、GitHub 账户或邮箱登录。使用其他身份登录会创建一个新的空账户(公司指南)
- 在账户设置中重新连接 GitHub,在服务的 Settings 中重新连接仓库,并部署最新提交
- CLI:运行
railway logout,然后运行railway login。CI:重新创建项目令牌(RAILWAY_TOKEN)或账户/工作区令牌(RAILWAY_API_TOKEN),并在 CI 密钥中替换 - 重新部署使用存储桶的服务,使其获取新凭据。同时检查存储桶中是否有你没有上传的文件或你没有进行的删除(公司称存储桶没有自动备份)
- 在工作区审计日志中,查找暴露窗口期内并非由你的团队或 Railway(显示为 "Railway Staff")进行的变量读取、镜像仓库凭据更改和部署
10 月 21 日之前存储在 Railway 上的密钥
无论是否收到通知,都视为已暴露
↓→
1. 在来源处签发新值
更新变量并重新部署,然后吊销旧值
开启公网访问的数据库
密码泄露后可从互联网访问
↓→
2. 重新生成密码并移除公网访问
重新部署所有引用它的服务
AI API、支付、GitHub
攻击者似乎在寻找的密钥
↓→
3. 检查用量、费用和审计日志
从 10 月 20 日 13:58 UTC 到你完成轮换为止
谨防冒充 Railway 支持的消息
公司表示将直接通过邮件通知受影响的客户。其账户恢复指南告诫用户,不要向支持人员发送密码、登录验证码、恢复码、API 令牌或密钥值。如果与此事件相关的消息要求提供密钥值或登录验证码,请视为非官方消息(本站说明)。
GitHub、OpenAI 和其他服务商发出的吊销通知是应 Railway 的请求而发,公司表示这些通知并不意味着你的凭据受到了影响。请不要点击此类消息中的链接;请直接打开各服务商的控制台。
事件经过(据 Railway)
以下内容基于 Railway 的博客文章 "Security Disclosure: Wednesday October 21st"(2026 年 10 月 21 日)和 "Preliminary Report: Oct 21st Security Incident"(日期为 10 月 22 日;据状态页面,于 10 月 23 日 16:38 UTC 公开),以及其状态页面。时间均为 UTC。
10月20日 13:58
监控发现延迟升高形式的异常活动;值班工程师开始调查。10月20日 14:03–16:51
该活动被认定为来自外部恶意方的权限提升尝试。在构建基础设施中发现潜在的权限提升问题,构建流水线被暂停。10月20日 18:05–19:53
部署了缓解措施,该漏洞利用已无法复现。19:53,更多证据表明攻击者可以在系统多个部分并行进行更大规模的权限提升。10月21日 04:24–05:23
取证发现,攻击者已拉取了加密形式的密钥,当时无法将其解密。10月21日 05:27–07:25
攻击者获取了 CI 环境的凭据,并解密了包含额外 API 访问权限的构件。10月21日 07:25–09:18
数据库证据显示存在对加密环境变量的未授权查询;其中一部分通过多个已泄露凭据的组合被解密。10月21日 09:25
Railway 就攻击者访问过的范围通知各服务商,并请求吊销密钥(报告的 FAQ 中给出的是 09:35)。10月21日 20:19–22:10
Railway 宣布使用户会话失效,并发布安全披露公告和客户指南。10月22日 03:32
Railway 确认攻击者已无法访问任何内部系统,并开始使用新凭据重新初始化内部系统。10月22日 17:00–22:49
据报告,API 已完全恢复,所有套餐的部署恢复正常。10月23日 16:38
10 月 22 日的初步报告公开(状态页面)。10月23日 18:57
对被评估为较高风险的工作区的通知已完成(状态页面)。10月23日 22:06
状态页面将事件标记为已解决。新用户注册仍处于暂停状态。
- 发生了什么
- 未经授权的第三方访问了内部系统,获取了客户的加密环境变量,并解密了其中一部分
- 规模
- 最多占全部工作区 1.85% 的工作区(约 100,000 个工作区)的部分环境变量可能已被泄露。公司称,由于密钥采用信封加密(加密数据的密钥本身又被另一个密钥加密),仅凭查询记录无法确定具体哪些变量受到影响
- 攻击者的目的(公司的判断)
- 获取 AI 服务商的 API 密钥,用于模型“蒸馏”(用一个模型的输出来训练另一个模型;本站解释)。公司认为这是针对平台公司、意在攻陷 AI 推理服务商的一系列攻击的一部分
- 较高风险的环境
- 环境变量数量非常多的工作区,以及拥有大量 AI 服务商密钥的环境
- 声明未被访问
- Railway 用户账户未被登录
- 尚未确认
- 尚未排除源代码被访问的可能,将在最终报告中确认
- 服务商通知
- Railway 已向 GitHub、GitLab、Anthropic、OpenAI、OpenRouter、Google、Stripe 等通知了可能被解密的密钥,并请求吊销。对部分服务商,Railway 提供了该平台上登记的所有密钥,无论已知是否受影响。超过 100,000 名用户受到服务商重置请求的影响
- 服务影响
- 运行中的服务保持在线。新的构建和部署、控制台、API、CLI 和支持在某些时段不可用
- 公司采取的措施
- 关闭了可能已被攻陷的内部工具;轮换了所有密钥,并在确认入侵者已被清除后再次轮换;聘请了外部取证公司;将构建器迁移到单租户环境;轮换了所有存储桶的凭据;用经过验证的源代码重建了内部工具;新增了批量吊销 Railway 应用权限的方法
已知与未知
状态截至 2026 年 10 月 24 日。公司发布更多信息后,本表将更新。
| 项目 | 披露内容 | 状态 |
|---|---|---|
| 加密环境变量被获取 | 通过未授权查询获取 | 已确认(公司) |
| 解密 | 一部分通过多个已泄露凭据的组合被解密 | 已确认(公司) |
| 受影响的工作区 | 最多占全部工作区 1.85% 的工作区(约 100,000 个) | 可能(公司) |
| 哪些变量被解密 | 仅凭查询记录无法确定 | 调查中 |
| 私有镜像仓库凭据 | 已列入需轮换的范围 | 可能(公司) |
| 用户账户 | 攻击者未访问 Railway 用户账户 | 公司否认 |
| 源代码 | 未排除被访问的可能;将在最终报告中确认 | 调查中 |
| 运行中的服务 | 保持在线 | 已确认(公司) |
| 攻击窗口 | 10 月 20 日 13:58 UTC 至 10 月 22 日 03:32 UTC | 已确认(公司) |
| 攻击细节 | 为保护客户而未公开 | 调查中 |
| 已暴露密钥是否被滥用 | 未说明 | 未说明 |
| 通知服务商的时间 | 报告时间线中为 09:25 UTC,FAQ 中为 09:35 UTC | 报告内不一致 |
如何理解这些数字:100,000 指的是什么
初步报告中的“约 100,000”指的是部分环境变量可能已被泄露的工作区数量(占全部工作区的 1.85%)。报告称,超过 100,000 名用户受到服务商吊销请求的影响,且公司作为高风险通知的客户数量超过了这 1.85%。收到通知或密钥被吊销,并不能确认已暴露。反过来,公司表示这些高风险群体之外的工作区也不确认安全。
为什么 AI API 密钥会成为目标
以下内容属于一般性说明,并不表示这些情况在本次事件中发生过。公司所述该攻击者的目的,是获取用于模型蒸馏的 AI API 密钥。
AI API 密钥相当于任何持有者都可以花费的金钱和算力。被盗密钥被大量使用时,账单会记在密钥所有者名下。如果以所有者的名义收集了大量输出,服务商可能会因违反其禁止蒸馏等政策而暂停该账户。具体机制和申诉方法见API 密钥被盗后账户为何被封。
托管平台将许多客户的密钥集中存放在一处。这很可能就是公司将环境变量很多或 AI 密钥很多的工作区描述为较高风险的原因。同一个月,LiteLLM 的开发者也表示,其事件中的攻击者主要在寻找 LLM 服务商的密钥(这是一起独立的事件;目前没有披露两者之间存在关联)。关于利用 AI 或以 AI 密钥为目标的攻击的整体情况,请参阅防御 AI 驱动的网络攻击。
Railway 用户应检视的事项:从已披露事实得到的经验
本节不评价公司的应对。它着重于根据已披露的内容,用户可以做哪些准备来应对下一次事件。
假定平台侧加密无法抵御平台被攻陷的情况
Railway 的环境变量是加密的,但根据初步报告,攻击者利用多个已泄露凭据的组合解密了其中一部分。托管平台为了运行你的应用,必须把变量还原为明文,因此一旦平台内部的权限被夺取,仅靠加密无法完全保护它们(本站说明)。
除平台加密之外,还应以泄露后损失有限的方式存放密钥。第一步,请在 AI API 和支付服务商处设置支出上限和提醒。将生产、预发布和开发环境的密钥分开,也能缩小需要轮换的范围。关于密钥的存放,请参阅 .env 和 API 密钥究竟危险在哪里。
不要让数据库暴露在公网上
根据公司的指南,启用了公网访问的数据库,在连接字符串泄露后,任何人都可以从互联网上访问。只通过项目私有网络使用的数据库,即使连接字符串泄露,也无法从外部直接访问。
通常只有本地开发、CI 或 BI 工具才需要外部访问。即便如此,也可以考虑仅在需要时开放,或使用单独的只读用户(本站说明)。
通过引用共享密钥,使轮换只需在一处进行
公司的指南建议通过 ${{ Postgres.DATABASE_URL }} 这样的引用变量来共享连接字符串和密钥,而不是把它们粘贴到每个服务中。使用引用后,修改来源值并重新部署就会覆盖所有服务,不会遗漏任何粘贴的副本。
出于同样的思路,请持续维护一份清单,记录每个服务使用哪些密钥以及在哪里重新签发(本站说明)。像现在这样需要轮换全部密钥时,这份清单决定了工作要花多长时间。在类似的案例 Vercel 安全事件中,关键在于密钥是否存放在之后无法显示其值的类别中。
将 GitHub 连接限制在所需的仓库和权限范围内
在本次事件中,公司吊销了其持有的 GitHub 令牌,并建议检查 GitHub 审计日志和应用访问权限。请将授予托管平台的 GitHub 访问权限限制在其所部署的仓库,并只给容器镜像仓库令牌读取权限(read:packages),这样泄露时波及的范围更小(本站说明)。关于泄露后仍然有效的凭据问题,请参阅仍然有效的泄露凭据。
来源(公开记录)
本文中的事实基于以下公开来源。本文不转载攻击细节。
- Railway,"Security Disclosure: Wednesday October 21st"(2026 年 10 月 21 日;状态页面在 10 月 21 日 22:10 UTC 发布了 "We have published a security notice")— blog.railway.com
- Railway,"Preliminary Report: Oct 21st Security Incident"(日期为 2026 年 10 月 22 日;据状态页面,于 10 月 23 日 16:38 UTC 公开)— blog.railway.com
- Railway,"Railway Platform Outage"(状态页面,已核对至 10 月 23 日 22:06 UTC 的 "Resolved" 更新)— status.railway.com
- Railway 用户指南(2026 年 10 月 22–23 日):"Rotate PostgreSQL Database Credentials" blog.railway.com / "Check for Anomalous GitHub Access" blog.railway.com / "Check for Unexpected OpenAI Usage" blog.railway.com / "Redeploy Buckets and Reconnect GitHub After the Credential Reset" blog.railway.com / "Recover Failing Deploys" blog.railway.com / "Resolving Login Issues" blog.railway.com
- 其他服务的指南(MySQL、Redis、MongoDB、Anthropic、OpenRouter、Grok、Stripe、AWS、GCP)列在公司的工程博客上 — blog.railway.com
更新记录
2026-10-24:初版,基于 Railway 的披露公告(10 月 21 日)、初步报告(10 月 22 日)和状态页面(截至 10 月 23 日 22:06 UTC 的更新)。当天核对来源后进行了更正:初步报告的公开时间改为以状态页面为准(10 月 23 日 16:38 UTC),用户账户访问情况的状态改为“公司否认”。解密范围以及源代码是否被访问,将在最终报告发布后补充。
延伸阅读
- 类似事件:Vercel 安全事件后开发者该做什么 / LiteLLM 1.107.0 被攻陷事件
- 为什么 AI 密钥成为目标:防御 AI 驱动的网络攻击 / 被盗 API 密钥与账户封禁
- 密钥的存放:.env 和 API 密钥究竟危险在哪里 / AI 编写的代码泄露 API 密钥
- 2026 年的其他事件:数据泄露和网络攻击列表