攻撃者が共有クラスターとGCPのDedicated Serverに侵入し、Zeaburのプラットフォームデータベースに保存されていた環境変数を読み取りました。本記事では、何が起きたのか、どのデータが影響を受けたのか、当社が行った対応、そしてお客様に必要な対応について説明します。
この記事は次の言語でもお読みいただけます: English、繁體中文、简体中文、Español、Bahasa Indonesia。
本記事の時刻はすべて協定世界時(UTC)で表記しています。調査は継続中であり、本記事は進捗に応じて更新します。
本記事の用語:「確認済み」はログに直接の記録があることを、「推定」は時期と内容は一致するものの直接の記録がないことを、「確認できない」は確認できる記録がないことを表します。確認できないものは、すべて流出したものとして扱っています。「推測」は間接的な証拠のみに支えられた可能性のある説明を表し、未証明の推測にまとめて記載しています。
攻撃者は2つの経路をたどり、最終的にZeaburの内部ネットワークで合流しました。
経路A:共有クラスターとAWS
経路B:GCPのDedicated Server
2つの経路の合流
インシデント対応中にローテーションした一部の認証情報が、その後も不正に使用されました。 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のDedicated Server | サーバー上のすべてのデータ | 101台、92名のユーザー | ログインを確認済み |
| Hetzner、DigitalOceanのDedicated Server | サーバーの管理権限 | 359台と48台 | 使用されたかどうかは確認できない |
| GitHub App | ユーザーが許可したGitHubリポジトリへのアクセス | 10/15 15:05から18:54 | 使用された形跡なし |
| ユーザーのデータベースのバックアップ | 台北(tpe1)と香港(hkg1)リージョンのバックアップ | 2つのリージョン | ダウンロードされたかどうかは確認できない |
プラットフォームデータベース。 10月15日 16:10から16:47にかけて、攻撃者は上表のデータを読み取りました。アカウントのデータには、メールアドレス、ユーザー名、電話番号など、プロフィールページ上の情報が含まれます。攻撃者は、環境変数と設定ファイルからAPIキーと秘密鍵も検索しました。コマンドの内容とその後の行動から見ると、攻撃者は主にそのまま使用できるAPIキー、特にAIサービスのキーを探していました。攻撃者はプラットフォームデータベースでキーを検索し、n8nとnew-api/one-apiの認証情報を大量に読み取り、ZeaburのAWSキーでAmazon Bedrockの呼び出しも試みています。これは攻撃者の意図についての観察にすぎません。攻撃者はアカウントのデータも読み取っており、当社は読み取られたすべてのデータを流出したものとして扱っています。二要素認証とパスキーのテーブルについては統計情報が照会されたのみで、内容が読み取られた記録はありません。当社はすべてのユーザーのプラットフォームのアクセストークンを失効させており、古いトークンはいずれも使用できなくなっています。
移行済みの環境変数は、プラットフォームデータベースが読み取られた範囲に含まれません。 8月のインシデント後、ZeaburはDedicated Serverをご利用のお客様に向けて、認証情報のローテーション、Zeaburに保存している環境変数と設定ファイルの削除、およびご自身のサーバーへのワンクリック移行についての案内と機能を提供しました。移行を完了したプロジェクトでは、これらのデータはお客様のサーバー上にのみ保存され、Zeaburは保持していないため、今回プラットフォームデータベースから読み取られたデータには含まれません。移行していないプロジェクトでは、環境変数がZeaburに保存されたままであり、今回読み取られました。これはホストへの侵入による流出を否定するものではありません。侵入されたGCPのDedicated Serverには、引き続き下記の対応をお勧めします。
アカウントのなりすまし。 攻撃者はログイン用の認証情報を発行するためのキーを読み取っており、当社は攻撃者がこれを使ってログイン用の認証情報を偽造したと推定しています。攻撃者がプラットフォームのアクセストークンを大量に読み取ったのは16:47になってからであり、しかもトークンはハッシュ値のみが保存されているため、16:12に始まったなりすましは説明できません。10月15日 16:12から17:19にかけて、攻撃者は2つのアカウントになりすましてZeabur APIを呼び出し、アカウントとプロジェクトの一覧を読み取りました。そのうち1つは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内のサードパーティの認証情報は平文で流出したのと同等です。今回のデータ読み取りはコンテナ内部で行われたため、8月のインシデント後に実施したデータベースのパスワード変更では、このアクセス経路を遮断できませんでした。
このほか、東京(hnd1)リージョンの少なくとも2つのPostgreSQLに、10月14日 01:51から外部へ接続を返すプログラムが仕込まれていました。そのうち1つは10月15日 16:24の時点でも外部への接続がありました。その侵入口が8月に流出したパスワードかどうかは、現時点で確認できない状態です。当社は発見時に、影響を受けたユーザーへ認証情報の差し替えを依頼しています。
GCPのDedicated Server。 調査の結果、攻撃者が101台のサーバーにroot権限でログインしていたことを確認しました。最後のログインは10月15日 20:36です。攻撃者はそのうち50台のサーバーに自身が管理するSSH公開鍵を追加し、継続的なアクセス経路を確保していました。また、ZeaburのGCPプロジェクト内に仮想マシンを5台作成し、16件の顧客サーバーのディスクのコピーをそれらの仮想マシンにマウントしていました。
このアクセス範囲を踏まえ、これら101台のサーバーはすべて、データ流出および不正アクセスの仕組みが残されている可能性がある影響対象ホストに分類しています。影響を受けたユーザーにはメールでお知らせし、該当サーバーのrootパスワードをリセットしました。
HetznerとDigitalOcean。 この2社のお客様のサーバーを管理するトークンは内部のコードと環境変数に記載されており、プラットフォームデータベースとともに流出しました。トークンを保持していれば、パスワードのリセット、OSの再インストール、ディスクの複製が可能です。当社は10月16日 01:09にすべてのトークンを失効させました。2社とも操作の監査ログがありません。Hetznerアカウントのイベントはすべてユーザーご本人またはシステムのスケジュールに対応しており、DigitalOceanは引き続き照合中です。
LinodeとTencent Cloud。 Linodeの890台のサーバーのうち、記録がある847台には攻撃者のログインはありませんでした。Tencent Cloudの管理用認証情報には、使用された記録はありません。
GitHub App。 攻撃者は10月15日 15:05にZeabur GitHub Appの秘密鍵を読み取りました。秘密鍵を保持していれば、ユーザーがZeaburにアクセスを許可したリポジトリにアクセスできます。当社は18:54に秘密鍵をローテーションしており、現時点で使用された形跡は見つかっていません。GitHub Supportに完全な監査ログを申請していますが、まだ回答を得ていません。
Zeaburの内部システム。 攻撃者はZeaburのAWSキーを複数使用しました。大部分のリクエストは拒否されましたが、攻撃者は2つのリージョンのユーザーのデータベースのバックアップと、ソースコードのアップロードの内容を一覧表示しました。ダウンロードしたかどうかは確認できない状態です。攻撃者はAmazon Bedrockの呼び出しを試みましたが、すべて失敗し、料金は発生していません。
| 時刻(10月15日) | 対応 |
|---|---|
| 14:43–15:56 | 共有クラスターの管理インターフェースへの接続をZeaburのシステムからのみに制限 |
| 15:32 | 使用されたクラスター管理トークンを失効。21:47に再度ローテーション |
| 17:17、17:31 | 攻撃者が使用した2つの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のトークンを失効 |
当社はこのほか、コードにハードコードされていたTencent Cloud、Alibaba Cloud、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のDedicated Serverの管理 | 10/15 17:31–20:35 | 復旧済み。WebのSSHのみ使用可能 |
| Dedicated Serverの自動更新 | Tencent Cloudで10/15 22:55–10/16 01:08に154回失敗 | 復旧済み。引き落とし分はアカウント残高として返金済み |
| Tencent Cloudのパスワードリセット、SSHログイン記録 | 10/15から | 復旧済み |
| LinodeのKubernetes専用クラスター | 10/15から | 復旧済み |
通知メールを待たずに、今すぐ対応してください。8月のインシデント後に差し替えた認証情報も、もう一度差し替える必要があります。
サーバーは侵入されたものとして扱ってください。
/root/.ssh/authorized_keys から、コメントが @zeabur-pentest の鍵や心当たりのない鍵を削除する。google-sudoers グループ、システムアカウント、crontab、systemdサービス、k3sのワークロードを確認する。コンソールで、10月14日以降にrootパスワードがリセットされていないか、OSが再インストールされていないかを確認し、上記のGCPの確認項目に沿って心当たりのないログイン手段がないことを確認してください。
発端: 攻撃者は、Zeaburのクラスター管理トークンと複数のクラウドのキーを保持していました。これらの認証情報は、設定リポジトリに平文で保存されていました。攻撃者がこれらをどのように取得したかは、現時点で確認できません。最も可能性の高い経路は未証明の推測をご覧ください。
影響範囲が拡大した関連要因:
これは、Zeaburにとって2か月足らずのうちに起きた2件目のセキュリティインシデントです。8月以降、当社の案内に従って対応を行ったユーザーの方も多く、そうした対策を講じたのになぜまた起きたのか、2件のインシデントに関係はあるのか、という疑問をお持ちのことと思います。
8月以降に行ったこと。 当社は、当時流出が確認された内部キーをローテーションし、Legacy API Keyを廃止しました。プロダクト面では、Dedicated Serverのプロジェクトで環境変数と設定ファイルをご自身のサーバーに移行できるようにし、Zeaburが保持するSSH認証情報の削除と、SSHログイン記録の確認もできるようにしました。8月のインシデントの通知とお知らせでも、認証情報のローテーション、Zeaburに保存している環境変数と設定ファイルの削除、ご自身のサーバーへの移行をお勧めしていました。
それでも発生した理由。 8月のローテーションは、設定リポジトリに平文で保存されていたクラスター管理トークンとAWSキーを対象にしておらず、GCPサーバーの初期化設定内のrootパスワードもまだ修正されていませんでした。今回攻撃者が使用したのは、まさにこれらの認証情報です。8月のインシデントのレポートでは「すべての内部管理キーを無効化またはローテーションした」と記載していましたが、この記述は不完全であり、ここに訂正します。攻撃者がこれらの認証情報をどのように取得したかは、現時点で確認できません。当社の推測は未証明の推測をご覧ください。
効果があった点。 8月の案内に従って移行を完了したプロジェクトでは、環境変数と設定ファイルはお客様ご自身のサーバー上にのみ保存されており、今回プラットフォームデータベースから読み取られたデータには含まれていません。
| 時刻(UTC) | 出来事 |
|---|---|
| 2024年1月10日 | 共有クラスターの管理トークンを作成。有効期限なし |
| 2026年1月20日 | 管理トークンが平文で設定リポジトリに書き込まれる |
| 8月27日 | 8月のインシデントで、GitHub Appの秘密鍵が読み取られる。本インシデントとの関連は推測 |
| 8月30日、9月2日 | 設定リポジトリが従業員のGitHubの認可でアーカイブとしてダウンロードされる。ダウンロードした人物は確認できない |
| 8月31日 | GitHub Appの秘密鍵を差し替え。設定リポジトリ内の平文の認証情報はローテーションされず |
| 9月1–5日 | 出所不明の送信元が、約98台のGCPのDedicated Serverにrootパスワードでログイン |
| 9月3日 | GCPサーバーの初期化設定にrootパスワードが保存されていることを把握。インシデント発生前に修正せず |
| 10月10日 18:27 | のちに認証情報の不正利用に使われたIPが、Zeabur APIのアクセス記録に初めて出現(未ログイン) |
| 10月13日 21:27 | 攻撃者のIPが3台のDedicated ServerへのSSHログインを試行。23:04まで続き、すべて失敗 |
| 10月14日 01:36 | 攻撃者がZeaburのAWSキーを初めて使用 |
| 10月14日 01:40 | 攻撃者が管理トークンで共有クラスターに初めてアクセス |
| 10月14日 12:39 | 攻撃者が共有クラスターのすべてのサービスの設定とシークレットを読み取り |
| 10月14日 13:40 | 攻撃者がデータベースコンテナ内でデータの読み取りを開始。同時にGCPのDedicated Serverへのログインを開始 |
| 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 | 攻撃者が1つのノードを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のDedicated Serverに2回目のログイン。20:36まで |
| 10月15日 20:25 | ログイン署名キーをローテーションし、すべてのユーザーをログアウト |
| 10月15日 20:36 | GCPのDedicated ServerへのインターネットからのSSHを遮断し、攻撃者のログインが停止 |
| 10月15日 20:48 | ステータスページを更新し、プラットフォームデータベースとDedicated Serverも影響を受けたと記載 |
| 10月15日 21:01 | 攻撃者が共有クラスターのノードへのアクセスを試み、拒否される |
| 10月15日 21:05 | 現時点で観測されている攻撃者の最後の活動(AWS) |
| 10月16日 01:09 | HetznerとDigitalOceanのトークンを失効 |
| 10月16日 01:50 | 1名のユーザーのOpenAIキーが不正利用される。02:56まで(今回の流出によるものと推測) |
以下の事項は、現存する記録の対象範囲または完全性の制約により、現時点では確認できていません。不正アクセスを排除できないデータと認証情報については、流出した可能性があるものとして対応しています。
以下は、当社が現時点で最も可能性が高いと考えている説明です。間接的な証拠に支えられていますが、直接の記録がないため、事実として引用することはできません。新たな証拠が得られた時点で、更新または撤回します。
1. 最初の認証情報は8月のインシデントに由来する可能性がある
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日にDedicated Serverへの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 | Dedicated ServerへのSSHログイン |
| IP | 52.220.72.188 | プログラムを仕込まれたPostgreSQLの接続先アドレス |
| IP | 31.57.201.201 | 9月初めにGCPのDedicated Serverへrootパスワードでログイン。本インシデントとの関連は確認できない |
| SSH鍵 | コメント *@zeabur-pentest、フィンガープリント SHA256:EdBc0uephoOMemIRKK0SRV2TRR45n52tJm1yErVU1iM | 攻撃者がDedicated Serverに追加した鍵 |
| User-Agent | Boto3/1.43.111(Linux 6.12.86) | 攻撃者がAWSキーの使用に用いたクライアント |
サポートが必要な場合、または異常なアクセスや心当たりのない料金を確認された場合は、Zeabur Support までご連絡ください。ご連絡の前に関連する認証情報を失効させ、マスキングした情報のみをお知らせください。有効なキーやパスワードを、サポートチケットや公開の場に記載しないでください。
本インシデントにより、サードパーティのAPIキーやクラウドアカウントで追加の料金が発生した場合は、サポートチケットより補償をお申し出ください。当社はサービスプロバイダーの利用記録と料金を確認し、確認結果をご説明します。
Zeaburは2026年12月31日をもってサービスを終了することを発表しています。これは経営上の判断です。それまでの間、本インシデントに関するサポートと補償の申請への対応を続け、本記事とステータスページの更新も継続します。影響を受けたすべてのユーザーの皆さまにお詫び申し上げます。
Zeaburチーム