対象:アプリやデータベースを動かす実行基盤(PaaS)の「Railway」を使っている開発者・運用担当者。特に、環境変数にAIのAPIキー、決済、GitHub、クラウド、データベースの認証情報を置いている人。
本記事はRailwayの公式ブログの発表・予備報告・利用者向けの手順と、同社のステータスページにもとづく解説です。攻撃の手口の詳細は扱いません(同社も公表していません)。
続報待ち:この記事は公式発表に合わせて更新します
2026年10月24日20時時点(日本時間)まだ分かっていないこと
- どの環境変数が復号されたか(同社は特定できないとしている)
- ソースコードへのアクセスの有無(最終報告で確かめるとしている)
- 攻撃の手口の詳細
- 漏れたキーが使われたかどうか
同社の予備報告は10月22日付で、ステータスページによれば10月23日16:38(UTC、日本時間24日1:38)に公開されました。同社は、調査はまだ続いていて、調査の終了後に続報を出すとしています。最終報告の時期は書かれていません。
ステータスページでは、10月23日22:06(UTC、日本時間24日7:06)に障害は解決済みとされ、ビルドとデプロイは通常どおりです。新規の登録は一時停止したままです。
Railwayの利用者が今日やること
手順1と2は、すべての利用者向けです。同社は、影響が限られる見込みとしながらも、念のためすべての利用者に対応を勧めています。
秘密を入れ替える:発行元で作り直し、古い値を無効にする
同社は、10月21日より前にRailwayに保存した機微な環境変数を、すべて失効させて設定し直すよう求めています。APIキーのほか、非公開のレジストリの認証情報も対象です。
入れ替えの順番は次のとおりです。
- 環境変数の一覧を作る。各サービスの「Variables」を開き、秘密の値(APIキー、トークン、パスワード、署名の鍵、接続文字列)に印を付ける
- 発行元(AIのAPI、決済、GitHub、クラウド、外部のデータベースなど)の管理画面で、新しい値を発行する
- Railwayの変数を新しい値に書き換え、サービスを再デプロイする。コンテナは起動時にしか変数を読まないため、再デプロイするまで古い値のまま動く(同社の手順)
- 新しい値で動いたことを確かめてから、発行元で古い値を無効化・削除する
Railwayの中だけで値を書き換えても、発行元で古い値を無効にしなければ、漏れた値は使えるままです(当サイトの補足)。
10月22日12時半(日本時間)より前に入れ替えた人へ
同社は10月21日の発表で、すべての環境変数をすぐに入れ替えるよう利用者に求めました。一方で、攻撃者がシステムにいなくなったことを確認したのは10月22日03:32(UTC、日本時間12:32)だったとしています。予備報告では、入れ替えた値がすぐにまた盗まれるのを防ぐため、利用者に入れ替えを求める前に攻撃者を排除したかった、と説明しています。そのため、03:32より前に入れ替えた秘密は、もう一度入れ替えておくと安全です(当サイトの補足)。同社はステータスページで、封じ込めの後に入れ替えを終えていれば、この更新だけを理由に繰り返す必要はないとしています。
データベース:パスワードを再生成し、公開アクセスを外す
同社は、すべての利用者に、データベースへの公開のネットワークアクセスを外すよう勧めています。同社の手順によれば、公開アクセス(TCPプロキシ)が有効なデータベースは、パスワードを変えるまでインターネットのどこからでもその認証情報で接続できます。
- PostgreSQL・MySQL・Redis・MongoDBは、データベースの画面の「Regenerate」でパスワードを再生成する。データベース内のパスワードと変数が一度に変わり、開いている接続も切れる(同社の手順)
- パスワードの変数(POSTGRES_PASSWORD など)を手で書き換えたり、データベースで直接パスワードを変えたりしない。変数とデータベースの値がずれる(同社の手順)
- 変数を参照(
${{ Postgres.DATABASE_URL }}のような書き方)しているサービスをすべて再デプロイする。接続文字列を直接貼っているサービスは、参照に置き換える - 「Settings」の「Networking」で、外から使っていないなら「Public Access」を外す。手元のPCやCI、BIツールなど外から使っている場合は、新しい
DATABASE_PUBLIC_URLを手で設定し直す
GitHubとレジストリ:監査ログと、つないでいるアプリを確かめる
同社は、GitHubの監査ログとアプリのアクセスの見直し、Docker Hubなどのレジストリの監査ログの確認を勧めています。同社の手順で挙げられている確認先は次のとおりです。
- 個人のアカウント:GitHubのセキュリティログ(90日分)、認可したOAuthアプリとGitHub App、SSHとGPGの鍵、個人用アクセストークン。見覚えのないものは取り消し、トークンは作り直す
- 組織:組織の監査ログ(180日分)。取り消す前に記録を書き出しておく。リポジトリごとにデプロイキー、Secrets、Webhook、共同作業者を確かめる
- GitHubのコンテナレジストリ(ghcr.io):Railwayは保存していたGitHubのトークンを削除したが、GitHub側ではそのトークンは失効するまで使える。GitHubで古いトークンを削除し、read:packages の権限で作り直して、各サービスに設定し直す
同社の手順には、攻撃者は押し込める権限があれば、パスワードを変えても残るWebhookや秘密を足せる、という注意もあります。
AIのAPIと決済:利用量と請求に、身に覚えのない増え方がないか
同社の予備報告によれば、攻撃者はAIプロバイダのAPIキーを探していたとみられます。同社はOpenAI、Anthropic、OpenRouter、Grok、Stripe、AWS、GCPについて、利用状況の確かめ方の手順を公開しています。OpenAIの手順の例は次のとおりです。
- 漏れた可能性のあるキーを削除し、同じプロジェクトで新しいキーを作る
- 利用量の画面をキーごとに分けて見て、期間中のトークン数・リクエスト数・使われたモデルを普段と比べる
- 請求の画面で、期間中の支出と、使われたクレジットを見る
- メンバーとプロジェクトに、招いていない人がいないか確かめる
- 不審な利用があれば、記録を残してプロバイダのサポートに連絡する
確かめる期間は、少なくとも攻撃の期間(10月20日夜〜22日昼、日本時間)以降、キーを入れ替えるまでです(当サイトの補足)。
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に置いた秘密
連絡の有無にかかわらず漏れた前提で扱う
↓→
① 発行元で新しい値を作る
変数を書き換えて再デプロイ→古い値を無効に
公開アクセスが有効なデータベース
漏れたパスワードで外から接続できる
↓→
② パスワードを再生成し、公開を外す
参照しているサービスをすべて再デプロイ
AIのAPI・決済・GitHub
攻撃者が探していたとみられるキー
↓→
③ 利用量・請求・監査ログを確かめる
10月20日夜(日本時間)から入れ替えまで
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(22:58)
監視の仕組みが、遅延の増加という異常を検知し、当番の技術者が調べ始める。10月20日 14:03〜16:51(20日23:03〜21日1:51)
敵対的な外部の者による権限昇格の試みと判明。ビルド基盤で権限昇格の可能性を見つけ、ビルドの処理を止める。10月20日 18:05〜19:53(21日3:05〜4:53)
対策を入れ、再現できなくなったことを確かめる。19:53に、攻撃者がより大きな規模で、複数の部分に並行してアクセスを広げられる証拠が見つかる。10月21日 04:24〜05:23(13:24〜14:23)
攻撃者が秘密を暗号化された形で取り出していたことが分かる(この時点では復号できていなかった)。10月21日 05:27〜07:25(14:27〜16:25)
攻撃者がCI環境にアクセスする認証情報を得て、追加のAPIのアクセスを含むものを復号する。10月21日 07:25〜09:18(16:25〜18:18)
暗号化された環境変数への不正な問い合わせの跡がデータベースで見つかる。一部は、侵害された認証情報を組み合わせて復号されていた。10月21日 09:25(18:25)
攻撃者がアクセスした範囲について、各サービスに通知し、キーの無効化を依頼する(予備報告のFAQでは09:35)。10月21日 20:19〜22:10(22日5:19〜7:10)
利用者のセッションの無効化を告知し、セキュリティの発表と利用者向けの案内を公開。10月22日 03:32(12:32)
攻撃者が社内のシステムにアクセスできなくなったことを確認。新しい認証情報で社内のシステムを作り直し始める。10月22日 17:00〜22:49(23日2:00〜7:49)
APIの全面復旧と、すべてのプランでのデプロイの再開を報告。10月23日 16:38(24日1:38)
10月22日付の予備報告が公開される(ステータスページ)。10月23日 18:57(24日3:57)
高リスクと判断したワークスペースへの通知を終える(ステータスページ)。10月23日 22:06(24日7:06)
ステータスページで障害を解決済みとする。新規の登録は一時停止したまま。
- 起きたこと
- 権限のない第三者が社内のシステムにアクセスし、顧客の暗号化された環境変数を取得して、その一部を復号した
- 規模
- 環境変数の一部が漏れた可能性があるのは、最大で全ワークスペースの1.85%(約10万ワークスペース)。どの変数が復号されたかは、この問い合わせの記録だけでは特定できない(環境変数はエンベロープ暗号化(データを暗号化した鍵を、さらに別の鍵で暗号化する方式)されていたため、と同社)
- 攻撃者の狙い(同社の見立て)
- AIプロバイダのAPIキーを得て、モデルの「蒸留」(他社のモデルの出力を使って別のモデルを学習させること。当サイトの説明)に使おうとしていたとみられる。同社は、AIの推論のプロバイダを狙って実行基盤の企業を攻撃する一連の攻撃の一部と考えている
- 狙われやすいとされた環境
- 環境変数がとても多いワークスペースと、AIのプロバイダのキーが多い環境
- 含まれないとされたもの
- 利用者のRailwayアカウントへのログインはなかった
- 未確定
- ソースコードへのアクセスは否定しておらず、最終報告で確かめる
- 各サービスへの通知
- GitHub、GitLab、Anthropic、OpenAI、OpenRouter、Google、Stripeなどに、復号された可能性のあるキーを知らせて無効化を依頼。一部のサービスには、影響の有無にかかわらず登録されていたキーをすべて渡した。無効化の依頼の対象になった利用者は10万より多い
- サービスへの影響
- 動いていたサービスは止まらなかった。新しいビルドとデプロイ、管理画面、API、CLI、サポートが一時使えなくなった
- 同社の対応
- 疑わしい社内のツールの停止、すべての鍵の入れ替え(攻撃者の排除を確かめた後にもう一度)、外部のフォレンジック企業への依頼、ビルド基盤を顧客ごとに分けた新しい世代へ切り替え、すべてのストレージのバケットの認証情報の入れ替え、社内のツールの作り直し、アプリの権限を一括で取り消す機能の追加
分かっていること・分かっていないこと
2026年10月24日時点の状態です。続報が出たら、この表の状態欄を書き換えます。
| 項目 | 発表の内容 | 状態 |
|---|---|---|
| 暗号化された環境変数の取得 | 不正な問い合わせで取得された | 確定(同社) |
| 環境変数の復号 | 一部が、侵害された認証情報を組み合わせて復号された | 確定(同社) |
| 対象のワークスペース | 最大で全体の1.85%(約10万ワークスペース) | 可能性(同社) |
| どの変数が復号されたか | この問い合わせの記録だけでは特定できない | 調査中 |
| 非公開のレジストリの認証情報 | 入れ替えの対象として挙げている | 可能性(同社) |
| 利用者のアカウント | 攻撃者は利用者のアカウントにアクセスしていない | 否定(同社) |
| ソースコード | アクセスを否定しておらず、最終報告で確かめる | 調査中 |
| 動いていたサービス | 止まらなかった | 確定(同社) |
| 攻撃の期間 | 10月20日13:58〜10月22日03:32(UTC) | 確定(同社) |
| 攻撃の手口の詳細 | 調査中で、利用者を守るため公表していない | 調査中 |
| 漏れたキーの悪用 | 発表に書かれていない | 記載なし |
| 各サービスへの通知の時刻 | 予備報告の年表は09:25 UTC、FAQは09:35 UTC | 記載が食い違う |
読み方の注意:「約10万」は何の数か
予備報告の「約10万」は、環境変数の一部が漏れた可能性のあるワークスペースの数(全体の1.85%)です。各サービスにキーの無効化を依頼した対象の利用者は10万より多く、同社が高リスクとして連絡した対象も1.85%より多い、と書かれています。連絡が来たこと、キーが無効にされたことは、漏れたことの確定ではありません。逆に、同社は高リスクの群に入らないワークスペースも安全が確認されたわけではないとしています。
AIのAPIキーはなぜ狙われるのか
以下は一般に言えることで、今回これらが起きたという意味ではありません。今回の攻撃者の狙いとして同社が書いているのは、モデルの蒸留のためにAIのAPIキーを得ることです。
AIのAPIキーは、持っている人がそのまま使える「お金と計算資源」です。盗んだキーで大量に呼び出されると、請求は持ち主に来ます。キーの持ち主の名前で大量の出力が集められると、プロバイダの規約違反(蒸留の禁止など)としてアカウントが止められることもあります。仕組みと異議の申し立ては 盗まれたAPIキーが悪用されてアカウントが止められる例 にまとめています。
実行基盤には、たくさんの利用者のキーがまとまって置かれています。今回の発表で同社が、環境変数が多いワークスペースやAIのキーが多い環境を狙われやすいとしているのも、このためとみられます。同じ月には LiteLLMの事案 でも、開発元が、攻撃者は主にLLMプロバイダのキーを探していたとしています(別の事案で、関係は公表されていません)。AIを使う攻撃と、AIのキーを狙う攻撃の全体像は AIを使ったサイバー攻撃の対策 にまとめています。
Railwayを使う側が見直すこと:公表された経緯から
本節は同社の対応を評価するものではありません。今回の発表から、利用する側で次の事故に備えられる点に絞ります。
実行基盤での暗号化は、基盤の侵害からは守らないと考える
同社の環境変数は暗号化されていましたが、予備報告によれば、攻撃者は侵害された認証情報を組み合わせて一部を復号しました。実行基盤は、アプリを動かすときに変数を元の値に戻す必要があるため、基盤の中の権限を取られると、暗号化だけでは守り切れません(当サイトの補足)。
基盤側の暗号化とは別に、漏れても被害が小さい形で秘密を置きます。最初の1つとしては、AIのAPIと決済のキーについて、プロバイダ側で利用額の上限と通知を設定してください。キーを本番・検証・開発で分けておくと、入れ替えの範囲も小さくなります。秘密の置き方は .envとAPIキーは何が危ないのか にまとめています。
データベースをインターネットに出さない
同社の手順によれば、公開アクセスが有効なデータベースは、漏れた接続文字列でインターネットのどこからでも接続できます。プロジェクトの中のプライベートネットワークだけで使うなら、接続文字列が漏れても、外から直接は使えません。
外から使う必要があるのは、手元での開発、CI、BIツールなどに限られることが多いはずです。その場合も、使う間だけ公開する、読み取り専用のユーザーを分ける、のどちらかを検討してください(当サイトの補足)。
秘密は「参照」で配り、入れ替えを1か所で済ませる
同社の手順は、接続文字列や鍵を各サービスに直接貼るのではなく、${{ Postgres.DATABASE_URL }} のような参照の変数で配ることを勧めています。参照なら、元の値を変えて再デプロイするだけで全サービスに届き、貼り付けた値の変え忘れが起きません。
同じ考え方で、どの秘密をどのサービスが使い、どの発行元で作り直すかの一覧を、普段から持っておきます(当サイトの補足)。今回のように「すべて入れ替える」ことになったとき、一覧があるかどうかで作業の時間が大きく変わります。似た事案として Vercelのセキュリティインシデント では、値を後から表示できない区分で保存していたかどうかが分かれ目になりました。
GitHubの連携は、必要なリポジトリと権限に絞る
同社は今回、Railwayが持っていたGitHubのトークンを無効にし、GitHubの監査ログとアプリのアクセスの見直しを勧めています。実行基盤に渡すGitHubの権限は、デプロイするリポジトリだけに絞り、コンテナレジストリ用のトークンは読み取り(read:packages)だけにしておくと、漏れたときの範囲が小さくなります(当サイトの補足)。漏れた認証情報が無効にされないまま残る問題は 漏れた認証情報が有効なまま残る問題 にまとめています。
出典(公開記録)
本記事の事実関係は以下の公開情報にもとづきます。攻撃の手口の詳細は転載していません。
- Railway「Security Disclosure: Wednesday October 21st」(2026年10月21日。ステータスページでは10月21日22:10 UTCに、セキュリティの告知を公開したと掲載) — blog.railway.com
- Railway「Preliminary Report: Oct 21st Security Incident」(2026年10月22日付の予備報告。ステータスページによれば10月23日16:38 UTC=日本時間24日1:38に公開) — blog.railway.com
- Railway「Railway Platform Outage」(ステータスページ。10月23日22:06 UTCの「解決」まで確認) — 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年の他の事案:情報漏えい・サイバー攻撃の一覧(国内・海外)