Railway security incident, October 2026: what to do now
On this page
As of October 24, 2026, 06:20 JST (October 23, 21:20 UTC). Every fact that can change carries the time it was checked, in JST (UTC+9), with Railway's own UTC time beside it. This page covers Railway's security incident of October 20 to 22, 2026, and what Railway has said about it since.
On October 21, 2026, Railway told every user to "immediately roll all environment variables, including any API keys, stored in Railway, as well as any private registry credentials". It also revoked its API tokens, CLI sessions, and GitHub connections, so a failing deploy needs GitHub reconnected or a new token.
Redeploying code from before the incident fails as well, so deploy your latest commit. Builds have run on every plan since October 22, 22:49 UTC (October 23, 07:49 JST), though Railway says they may be slow to start or finish, and new sign-ups are still paused (status page, October 23, 20:43 UTC).
Railway's preliminary report, linked from its status page on October 23 at 16:38 UTC, says the attacker was "attempting to obtain AI provider API keys to perform distillation attacks", and that "at most 1.85% of all workspaces had some environment variables potentially compromised", about 100,000 workspaces. It dates the attack from October 20, 13:58 UTC, to October 22, 03:32 UTC, when Railway confirmed the attacker no longer had access. Railway has emailed the workspaces it rates higher risk, and its status page says that workspaces outside those groups "are not confirmed safe from compromise." Services that were already running stayed online throughout.
Below: the steps in order, which keys to rotate first, why a deploy fails after the incident and the fix for each error, when each Railway plan got builds back, the sign-up pause, and the timeline from Railway's report and status page.
What to do, in order
Railway spreads these steps over its disclosure, 14 guides, its status page, and the report. This order gets one deploy through first, because Railway revoked every user's GitHub connection and every later step ends in a deploy, and reconnecting exposes no key. Then it takes each stolen key out of use, and checks for misuse last.
1. Reconnect GitHub
In Railway's Account Settings, connect your GitHub account again, and confirm the Railway GitHub App can reach the repositories you deploy. In each service's Settings, under Source, click Disconnect and then Connect Repo if the repository shows as disconnected, and check that autodeploy is still enabled. In a team project, the member who first connected the repository is the one who reconnects, so ask them before you rotate anything. For private images on ghcr.io, delete the old personal access token on GitHub, create one with the read:packages scope, and enter it under the service's Registry Credentials. Railway removed those tokens from your services, but in its words they "still work on GitHub until you revoke them".
2. Create new Railway tokens for the CLI and CI
On your machine, run railway logout, then railway login, railway link, and railway up. For CI, create a new token with the same scope as the old one: a project token for RAILWAY_TOKEN (project Settings, then Tokens) or an account or workspace token for RAILWAY_API_TOKEN (the tokens page in your account settings). Replace the value in your CI provider's secrets.
3. Get one deploy through with Deploy Latest Commit
Commits pushed while Railway paused deployments "were not queued", and Railway's status page says "Redeploying code from before the incident would not work and result in an error." In each service of the project, open the Command Palette (CMD/CTRL + K) and select Deploy Latest Commit, or push a new commit, and wait until its deployment is active. A service you skip still runs a deployment from before the incident, so step 4's deploy of its new keys would start from that deployment and fail. Until a deploy succeeds, your running service keeps calling providers with its old keys and its old database password, so a key you revoke before then takes your app down with it.
4. Rotate each key at its provider, then deploy
For each key in your variables, create a new key at the provider and put it in the service's Variables, then delete or disable the old key at the provider and deploy the staged change. Changing a variable in Railway alone doesn't stop a key someone already copied, and Railway's OpenRouter guide says your services "can't reach OpenRouter until you deploy the replacement key", so keep the time between revoking and deploying short. For a precautionary rotation, deploying the new key first and revoking the old one after is fine; for a key you know leaked, revoke it first. Start with AI provider keys, because Railway's report says that is what the attacker was after. The table below goes through each kind of key.
5. Regenerate database passwords with Railway's Regenerate button
For a PostgreSQL database from Railway's template, open the database service, then Database, then Config, and click Regenerate next to the password. Railway changes the password inside PostgreSQL and updates POSTGRES_PASSWORD, and DATABASE_URL and DATABASE_PUBLIC_URL follow it. Railway's guide warns that it then "restarts the database to apply the new password, so every open session drops" and "Your services can't reconnect until you redeploy them", so do step 6 right after. For a credential you don't suspect, the same guide points to a no-downtime flow, "Rotate credentials without downtime"; if you suspect a leak, it says to "Regenerate first". Don't edit POSTGRES_PASSWORD or PGPASSWORD by hand or run ALTER USER yourself: the guide says each changes only one side. Railway has the same kind of guide for MySQL, MongoDB, and Redis. The report also advises all users to "Remove public network access to databases": in the database's Settings, under Networking, turn off Public Access if nothing outside the project needs it.
6. Deploy every service that reads a new value
Railway's guides say containers read variables only at startup, so a running service keeps the old value until its next deploy. Use Deploy Latest Commit for each one: a Redeploy of a deployment from before the incident fails. Your storage bucket credentials are already new: Railway regenerated ACCESS_KEY_ID and SECRET_ACCESS_KEY for every bucket in every environment, and the services that use them pick the new values up on their next deploy. Update every copy outside Railway as well, such as local .env files, CI secrets, and other hosts.
7. Check each provider for use you didn't make
Look at usage grouped by key at each AI provider, Stripe's request logs, AWS CloudTrail, your GitHub security log, the OAuth apps and GitHub Apps you have authorized, and your registry's activity logs. Check from October 20, 13:58 UTC, when Railway's report says the attack began, to the moment you revoked each key: a copied key works until then. Export what you find before you delete a key, because OpenRouter, for one, drops a key's usage figures when the key is deleted.
Which keys to rotate
Railway's instruction covers every variable. The order below is this page's: the keys the attacker was looking for, then the keys that move money or reach other systems, then the rest. Each "why" is from Railway's own posts (read October 24, 05:36–05:38 JST).
| Key | Why it's at risk | What to do |
|---|---|---|
| AI provider API keys: OpenAI, Anthropic (Claude), OpenRouter, xAI (Grok), Google | The report says the attacker was "attempting to obtain AI provider API keys". Railway sent providers a list of potentially decrypted keys on October 21 with a request to revoke them, and its report names Anthropic, OpenAI, OpenRouter, and Google | Create a new key, put it in the variable, delete or disable the old one, and deploy (step 4). If the provider emailed you that it revoked the key, the old key is dead already, but your service needs the new one deployed |
| Stripe secret and restricted keys | Stripe is one of the vendors Railway asked to revoke keys | On Stripe's API keys page in live mode, choose Rotate key. Railway's guide says to pick the expiration "Now" for a confirmed leak, or a window long enough to redeploy for a precautionary rotation |
| GitHub and GitLab tokens: personal access tokens in variables, and ghcr.io registry tokens | The report names GitHub and GitLab among the vendors Railway worked with to revoke keys, and Railway gave GitHub "all API keys that were present on the platform". It removed registry tokens from your services, but those tokens still work on GitHub until you revoke them | Delete each token on GitHub or GitLab and create a new one. On GitHub, review your security log, SSH keys, and authorized apps |
| Cloud keys: AWS access keys, Google Cloud keys | Railway published a guide for each | On AWS, create the replacement key first, then deactivate the exposed one, and review CloudTrail for what it did |
| Database passwords: PostgreSQL, MySQL, MongoDB, Redis | Connection strings are variables. With Public Access on, Railway's guide says the credential "is usable from anywhere on the internet through the TCP proxy until you rotate" | Regenerate in Railway (step 5), deploy the services that use it with Deploy Latest Commit (step 6), and turn off Public Access |
| Private registry credentials, such as Docker Hub | Named in the disclosure | Replace the token at the registry, update the service's Registry Credentials, and check the registry's audit logs |
| Railway storage bucket credentials | Railway regenerated them for every bucket | Nothing to rotate. Deploy the services that use the bucket with Deploy Latest Commit, and update copies outside Railway |
| Railway API tokens, project tokens, and CLI sessions | Railway revoked all of them | Create new ones (step 2) |
| Everything else: session and JWT secrets, webhook signing secrets, email and SMS API keys, OAuth client secrets, encryption keys | Covered by "roll all environment variables" | Rotate them. A new session secret signs your users out, and an encryption key needs your data re-encrypted before the old key goes |
| Secrets written into your source code | The report says "we are not ruling out that they accessed user source code" and will confirm it in the final report | Rotate them too |
Who needs to do this. The report recommends rotation for "all customers who signed up prior to October 21", and its remediation section says to "revoke and reapply sensitive environment variables stored on Railway prior to this date". Not getting an email from Railway doesn't mean you're clear: the status page says workspaces outside the higher-risk groups it emailed "are not confirmed safe from compromise." An email from a provider about a revoked key doesn't mean yours was stolen either. In the report's words, "Users being notified by vendors about revocation does not imply that their credentials were impacted by the incident", because Railway gave some vendors every key it held.
Why deploys fail after the incident
Each cause below is in Railway's words, from its October 23 guide "Recover Failing Deploys" unless the row says otherwise (read October 24, 05:36 JST).
| What you see | Why | Fix |
|---|---|---|
| A build error "unable to pull repository" or "build could not be started" | "GitHub connections were revoked during the incident and must be reconnected" | Reconnect GitHub (step 1), then Deploy Latest Commit |
| Redeploying an older deployment fails | "Redeploying code from before the incident would not work and result in an error" (status page, October 23, 09:34 UTC) | Deploy Latest Commit, or push a new commit |
| A commit you pushed during the pause never deployed | "Commits pushed while Railway was not accepting deployments were not queued" | Trigger a new deploy |
railway up fails from your machine | "API tokens and CLI sessions were revoked" | railway logout, then railway login, railway link, and railway up |
| A CI deploy fails | RAILWAY_TOKEN and RAILWAY_API_TOKEN: "Both were revoked." | Create a token with the same scope and replace the CI secret |
| Calls to Railway's Public API fail | "API tokens and Project Tokens created before the security incident remain invalidated" (status page, October 22, 17:00 UTC) | Create a new token |
| A push doesn't start a deploy | "Autodeploy only works when at least one project member has a connected GitHub account with contributor access to the repository" | The member who connected the repository reconnects, and autodeploy is enabled again in Settings |
| A private image from ghcr.io won't pull | Railway removed the GitHub tokens stored as registry credentials (guide of October 22) | Enter a new token with read:packages under Registry Credentials, then Deploy Latest Commit |
The service runs but logs InvalidAccessKeyId or SignatureDoesNotMatch for its bucket | "it's running the old deployment or holds a pasted value" (guide of October 22) | Deploy Latest Commit (a Redeploy of a deployment from before the incident fails), and replace a pasted key with a reference variable |
| You log in and see no projects | Railway "rolled all GitHub App installations" (report) | If your GitHub email differs from your Railway email, log in with "Log in using email" |
| A build is slow to start or finish | Builds "may take longer than usual to start or finish while we work through redeploys across the platform" (status page, October 23, 20:43 UTC) | Wait, and don't trigger the same deploy twice. Check status.railway.com |
If a deploy still fails after you reconnect GitHub and create new tokens, Railway's guide asks you to email support@railway.com with the project, service, and environment, the deployment ID, the error from the build logs, and whether the service deploys from GitHub, the CLI, or CI.
Is Railway back?
Builds and deployments are back on every plan, according to Railway's status page (checked October 24, 06:16 JST). Its latest update, of October 23 at 20:43 UTC, says builds "may take longer than usual to start or finish while we work through redeploys across the platform", that "The Railway API and dashboard are fully functional", and that the support site, station.railway.com, "remains unavailable". The incident is still open, in Monitoring, and its page still carries the label "Major Outage", with builds in four regions and the support site listed as affected.
| Plan or service | Back since (UTC) | In JST | What Railway's status page says |
|---|---|---|---|
| Services already running | Never went down | "running services stayed online throughout the incident" (report) | |
| Enterprise builds | October 22, 03:32 | October 22, 12:32 | "Builds for Enterprise workspaces are now available." The Redeploy feature followed at 04:52 UTC |
| Pro builds | October 22, 06:29 | October 22, 15:29 | "Builds are now available for Pro and Enterprise workspaces." Deployments ran at normal speed from 16:14 UTC |
| Hobby builds | October 22, 21:08 | October 23, 06:08 | "Builds are now available for Hobby workspaces." |
| Free and Trial builds | October 22, 22:49 | October 23, 07:49 | "Builds and deployments across all five plans are running at approximately normal speed." |
| Public API | October 22, 17:00 | October 23, 02:00 | "The API is now fully restored", with tokens from before the incident still invalid |
| API and dashboard | Said on October 23, 20:43 | October 24, 05:43 | "The Railway API and dashboard are fully functional." |
| Support site, station.railway.com | Not back | "remains unavailable while we work on restoring our remaining non-critical services" (October 23, 20:43 UTC). Email support@railway.com meanwhile | |
| New sign-ups | Paused since October 22, 19:06 | October 23, 04:06 | "New signups remain temporarily paused while we focus on existing customers." (October 23, 20:43 UTC) |
| The incident | Open, in Monitoring since October 23, 19:18 | October 24, 04:18 | Higher-risk notifications were complete "As of October 23 at 18:57:54 UTC" |
Builds had also stopped once before: on October 20, from 17:03 to 20:56 UTC (October 21, 02:03 to 05:56 JST), under a separate status entry titled "New builds are temporarily paused". The report puts that pause inside the attack.
Sign-ups
Railway paused new sign-ups on October 22 at 19:06 UTC (October 23, 04:06 JST) "so we can focus on making sure everything is working well for existing customers", and said it "will post here when they are available again." Its latest update, of October 23 at 20:43 UTC (October 24, 05:43 JST), still says "New signups remain temporarily paused while we focus on existing customers" (checked October 24, 06:16 JST). Railway has given no date. If you planned to open a new Railway account, that post on status.railway.com is the one to wait for.
What happened: the timeline
The report is dated October 22 on Railway's blog, and Railway's status page linked it on October 23 at 16:38 UTC. It calls itself preliminary: "Our forensic investigation is still ongoing." Rows marked "report" are from its timeline; the others are from the status page (both read October 24, 05:36–06:16 JST).
| UTC | JST | What happened |
|---|---|---|
| October 20, 13:58 | October 20, 22:58 | Monitoring paged Railway's on-call engineer for "abnormal system activity". The report's start of the attack |
| October 20, 17:03–20:56 | October 21, 02:03–05:56 | Status: "New builds are temporarily paused", then resolved |
| October 20, 19:53 | October 21, 04:53 | Railway "became aware of a sustained and targeted campaign" (report) |
| October 21, 00:22–03:08 | October 21, 09:22–12:08 | "As a precaution, builds were halted again" (report). A push from then until builds came back for your plan wasn't deployed |
| October 21, 05:27–07:25 | October 21, 14:27–16:25 | The attacker reached credentials for Railway's CI environment and decrypted "artifacts that held additional API access" (report) |
| October 21, 07:24 | October 21, 16:24 | Status: the "Railway Platform Outage" incident opens |
| October 21, 07:25–09:18 | October 21, 16:25–18:18 | An "unauthorized query of encrypted environment variables, of which a subset were decrypted" (report) |
| October 21, 09:25 | October 21, 18:25 | Railway asks vendors to revoke keys (report; its FAQ gives 09:35) |
| October 21, 09:28 | October 21, 18:28 | Status: dashboard, API, and CLI unavailable, new builds paused in all regions |
| October 21, 20:19 | October 22, 05:19 | Status: OAuth sessions invalidated, users signed out |
| October 21, 21:59 | October 22, 06:59 | Status links the security disclosure |
| October 21, 22:10 | October 22, 07:10 | Status: all storage bucket credentials being rotated |
| October 22, 01:22 | October 22, 10:22 | Status links 13 guides: OpenAI, Anthropic, OpenRouter, Grok, Stripe, GitHub, AWS, GCP, PostgreSQL, MySQL, MongoDB, Redis, and buckets with GitHub |
| October 22, 03:32 | October 22, 12:32 | Railway confirms "the attacker no longer had access" (report). Enterprise builds return |
| October 22, 04:17 | October 22, 13:17 | Status: "we have invalidated all Railway API tokens" |
| October 22, 06:29 | October 22, 15:29 | Pro builds return |
| October 22, 17:00 | October 23, 02:00 | Public API fully restored |
| October 22, 19:06 | October 23, 04:06 | New sign-ups paused |
| October 22, 21:08 | October 23, 06:08 | Hobby builds return |
| October 22, 22:49 | October 23, 07:49 | Free and Trial builds return |
| October 23, 09:34 | October 23, 18:34 | Status: reconnect GitHub if deploys fail; pre-incident code fails to redeploy |
| October 23, 16:30 | October 24, 01:30 | Guide "Recover Failing Deploys" published (the guide's own date) |
| October 23, 16:38 | October 24, 01:38 | Status links the preliminary report |
| October 23, 18:57 | October 24, 03:57 | Notifications to higher-risk workspaces complete |
| October 23, 19:18 | October 24, 04:18 | The incident moves to Monitoring |
| October 23, 20:43 | October 24, 05:43 | Status: API and dashboard "fully functional", builds may be slow, support site still down, sign-ups still paused |
What Railway hasn't said yet (as of October 24, 06:16 JST): how the attacker got in ("we are not yet able to share the specific details and scale of the exploits"), whether source code was accessed, when the final report comes out, and when sign-ups and the support site return.
Tell your users while you fix it
If your users saw failed deploys, sign-outs, or new keys, they may ask what happened and whether they need to do anything. A Convika page can answer them from outside Railway: ask Claude Code or another AI client connected to Convika to write it, add a reply form, and publish it, or make it with Convika's AI on the dashboard and add the form with Add a form to my page before you publish (Free shows 50 entries a month). The page is static HTML that Convika serves at a convika.page address, not a host for your app, and it holds none of your environment variables. On Free the page is public, and search engines and Convika's gallery may list it, so leave out hostnames, key names, and anything internal.
Updates to this page
- October 24, 2026, 06:20 JST: first version, with Railway's status update of October 23, 20:43 UTC, the latest at 06:16 JST.
This page changes when Railway re-enables sign-ups, brings back its support site, resolves the incident, publishes its final report, or changes its advice. The same week: Node.js October 2026 security release: what to update and PHP October 2026 security release: what to update.
Frequently asked questions
Is Railway down right now?
Not for running apps and deploys. Builds and deployments run on every plan, and Railway's update of October 23, 20:43 UTC, says "The Railway API and dashboard are fully functional" (checked October 24, 06:16 JST). The incident is still open, in the Monitoring state, and its page still carries the label "Major Outage" for builds in four regions and the support site: builds may take longer than usual to start or finish, station.railway.com is still down, and new sign-ups are still paused.
Do I need to rotate my OpenAI or Anthropic key if I use Railway?
Yes, if the key was stored in a Railway variable. Railway's report says the attacker was "attempting to obtain AI provider API keys", and Railway asked AI providers to revoke the keys it found. Create a new key, put it in the variable, delete the old one at the provider, and deploy your latest commit.
Was my Railway account hacked?
Railway says no: "individual accounts were not logged into." The attacker reached Railway's internal systems and decrypted stored environment variables for some workspaces. Railway revoked all Railway access tokens anyway.
Why did I get an email saying my API key was revoked?
Railway sent providers a list of potentially decrypted keys on October 21 and asked them to revoke the keys, and "Some vendors requested all keys to be revoked." Its FAQ names "GitHub, GitLab, Anthropic, OpenAI, OpenRouter, SpaceXSI, Google, or Stripe" as the senders of such emails. The report says such an email "does not imply that their credentials were impacted by the incident." Either way, the old key no longer works, so deploy a new one.
I didn't get an email from Railway. Am I safe?
Not necessarily. Railway finished emailing the workspaces it rates higher risk on October 23 at 18:57 UTC, and its status page says workspaces outside those groups "are not confirmed safe from compromise." Rotate anyway.
Why do my Railway deploys fail after the incident?
Usually because Railway revoked your GitHub connection or your token. Reconnect GitHub, create new CLI and CI tokens, and use Deploy Latest Commit: redeploying code from before the incident fails, and commits pushed during the pause were never queued. The table above matches each error to its fix.
Did my app go down?
Railway says running services "stayed online throughout the incident." What stopped was new builds and deployments, and for a time the dashboard, API, CLI, and support site.
How many Railway users were affected?
Railway says "at most 1.85% of all workspaces had some environment variables potentially compromised", which it puts at "about 100,000 workspaces". More people got key revocations than that: because Railway gave some providers every key it held, "the amount of users who were affected by upstream provider reset requests was larger than 100k."
Why can't I sign up for Railway?
Railway paused new sign-ups on October 22 at 19:06 UTC and said it will post on its status page when they return. Its update of October 23, 20:43 UTC, still says they "remain temporarily paused" (checked October 24, 06:16 JST).
Do I need to rotate keys I added after the incident?
Railway's advice covers variables stored before October 21. Its report dates the attack to October 22, 03:32 UTC, when Railway confirmed the attacker no longer had access, so this page's reading is that a key added before that time should be rotated too. Railway's status page adds: "If you have already completed these rotations since the incident was contained, this update alone does not require you to repeat them."
Is Railway safe to use now?
Railway's answer in its report is "Yes", saying it has "redeployed and revalidated all impacted systems" and moved its builders to single-tenant environments. Its forensic investigation is still running, and Railway says a final report will follow.
Sources
Times are when this page read each source, in JST on October 24, 2026. Each source's own date is in its entry.
- Railway: Security Disclosure: Wednesday October 21st, dated October 21, 2026, last modified October 23, 17:02 UTC (05:36)
- Railway: Preliminary Report: Oct 21st Security Incident, dated October 22, 2026, last modified October 23, 17:01 UTC (05:36)
- Railway: Security Disclosure Recommendation: Recover Failing Deploys, dated October 23, 2026 (05:36)
- Railway status: Railway Platform Outage, opened October 21, 07:24 UTC, latest update October 23, 20:43 UTC (05:37; 06:16)
- Railway status: New builds are temporarily paused, October 20, 17:03 to 20:56 UTC (05:40)
- Railway: Redeploy Buckets and Reconnect GitHub After the Credential Reset, dated October 22, 2026 (05:38)
- Railway: Rotate PostgreSQL Database Credentials, dated October 22, 2026, last modified October 23, 01:16 UTC (05:38)
- Railway: Check for Unexpected OpenAI Usage, Anthropic Usage, OpenRouter Usage, and Grok Usage, each dated October 22, 2026 (05:38)
- Railway: Check for Unexpected Usage in Stripe, Check for Anomalous GitHub Access, and Check for Anomalous AWS Access, each dated October 22, 2026 (05:38)
- Railway engineering blog, the list of the incident's posts (05:37; 06:16)
Related articles
- GitLab CVE-2026-110264: which version to upgrade to and howGitLab 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, and 18.11.13 fix the CVSS 10.0 RCE CVE-2026-110264. Upgrade paths by install type, Ruby, KEV status.
- LiteLLM 1.107.0 compromised on PyPI and Docker: what to dolitellm 1.107.0 and four LiteLLM Docker tags held a credential stealer on Oct 21, 2026. A 2-minute check per install path, cleanup order, keys to rotate.
- Next.js security releases in 2026: which version fixes whatInstall Next.js 16.4.3, or 15.5.28 with sharp 0.35.5. All 10 security releases of 2026 with GHSA and CVE ids, and what each host has said, or hasn't.