当社のAIエンジンNeutronが、UCバークレーのCyberGymベンチマークで97.1%のスコアを記録しました。 詳細を見る

ディープダイブ

ディープダイブ

Postiz:一般の登録ユーザーによる完全な乗っ取り(CVE-2026-115931、CVE-2026-115932、CVE-2026-115933)

自己ホスト型Postiz 2.23.0~2.25.2では任意の登録ユーザーがサーバーファイルを読み取れます。2.15.0~2.25.2ではサインイントークンを偽造して他の組織を乗っ取れます。2.25.3で修正済みです。

要点

  • ソーシャルメディア投稿予約アプリPostizの3つのクリティカルな欠陥は、通常のアカウントを持つユーザーなら誰でも悪用できます。制限のないプロバイダーメソッド呼び出し(CVE-2026-115931)とメディアのパストラバーサル(CVE-2026-115932)によって、JWT署名シークレットを含めバックエンドが読める任意のファイルを読み取り、1リクエストでバックエンドをクラッシュさせられます。共有シークレットによるトークン偽造(CVE-2026-115933)では、任意のユーザーや任意の組織のスーパー管理者としてサインインできます。Anthropicのセキュリティチームが3件すべてを発見しました。アドバイザリのCVSS v3.1評価は、9.9(CVE-2026-115931)、9.6(CVE-2026-115932)、9.9(CVE-2026-115933)です。
  • デフォルトで自己登録が開放されているため、攻撃者に既存アカウント、権限、他者の操作は不要です。影響するインスタンスはいずれも自己ホスト型です。執筆時点でリポジトリにはGitHubスター37,856件、フォーク7,395件があり、導入範囲の粗い目安となります。
  • 3件すべてが2026年10月23日に開示され、1日以内に修正されました。2.25.2はファイル読み取り(CVE-2026-115931)、2.25.3はトークン偽造(CVE-2026-115933)とメディアのパストラバーサル(CVE-2026-115932)を修正します。
  • 2.25.3以降にアップグレードし、JWT署名シークレット、データベースとRedisの認証情報、接続済みの全プロバイダーのAPIキーをローテーションしてください。アップグレードまではDISABLE_REGISTRATION=trueにし、POST /integrations/extension-refreshを遮断してください。

影響を受けるか

Postiz(gitroomhq/postiz-appプロジェクト、通常はDockerイメージからデプロイ)を自己ホストし、以下のいずれかに当てはまる場合に影響を受けます。

  • 2.23.0~2.25.1を使用している。制限のない関数呼び出し(CVE-2026-115931)が該当し、2.25.2で修正
  • 2.23.0~2.25.2を使用している。メディアのパストラバーサル(CVE-2026-115932)が該当し、2.25.3で修正。2.25.2にも影響が残る
  • 2.15.0~2.25.2を使用している。署名付きトークンの偽造(CVE-2026-115933)が該当し、2.25.3で修正
欠陥 影響を受けるバージョン 修正バージョン
CVE-2026-115931、制限のないプロバイダーメソッド呼び出し(ファイル読み取り、バックエンドのクラッシュ) 2.23.0~2.25.1 2.25.2(2026年10月23日)
CVE-2026-115932、メディアのパストラバーサル(任意ファイルを読み取り攻撃者へ送信) 2.23.0~2.25.2 2.25.3(2026年10月24日)
CVE-2026-115933、署名付きトークンの偽造(セッション、招待、パスワードリセット、エンタープライズ) 2.15.0~2.25.2 2.25.3(2026年10月24日)

デプロイしているバージョンと、自己登録が開放されているかを確認します。

docker inspect --format '{{.Config.Image}}' $(docker ps -q --filter name=postiz)   # the image tag you run
docker compose config | grep -iE 'image:|DISABLE_REGISTRATION'                    # compose pin and the registration flag

2026年10月24日より前に可変のlatestタグを取得した場合、影響を受けていたと想定してください。DISABLE_REGISTRATIONを明示的にtrueへ設定しなければ自己登録は開放されています。登録を閉じても、既存ユーザーは3件すべてを悪用できます。ファイル読み取りは、2つの設定上の特徴に左右されます。

  • 開発用Dockerfileと配布コンテナーはプロセスをrootで動かすため、rootが読める全ファイルに到達できる
  • パストラバーサルの主な送信経路にはDiscordプロバイダーの設定が必要だが、配布docker-composeでは空になっている

修正方法

3件すべての修正を含むPostiz 2.25.3以降に更新し、バックエンドと投稿ワーカーを再起動してください。

  1. composeファイルでイメージをv2.25.3以降に固定し、docker compose pull && docker compose up -d --force-recreateを実行して、修正済みビルドでコンテナーを再作成します。
  2. JWT署名シークレット(環境変数JWT_SECRET)をローテーションします。古いシークレットでは、アップグレード前に攻撃者が偽造したトークンも検証を通過します。変更すると、すべてのセッション、招待、パスワードリセット、エンタープライズのトークンが一括で無効になります。
  3. データベースとRedisの認証情報、および接続済みの全プロバイダーのAPIキーをローテーションします。アドバイザリによると、それらを保持する環境はファイル読み取りの欠陥から読めるためです。
  4. ユーザー一覧に作成していないアカウントがないか、組織一覧に予期しないスーパー管理者がいないか確認します。どちらも乗っ取り経路が残す可能性があります。

今日アップグレードできない場合、3つの対策で危険を減らせます。それぞれアドバイザリに記載された制約があります。

  • DISABLE_REGISTRATION=trueにする。匿名での入口を取り除けますが、既存ユーザーからは保護できません。
  • Postizのブラウザー拡張機能に依存するチャネルを使わなければ、リバースプロキシでPOST /integrations/extension-refreshを遮断する。主なトークン偽造の署名経路は閉じますが、より限定的な招待経路は残ります。
  • DiscordのクライアントID、クライアントシークレット、botトークンを未設定にする。パストラバーサルの主要な持ち出し経路は閉じますが、他の2つの経路は残ります。

根本原因

サインイン済みユーザーのリクエストをバックエンドが扱う際、3つの欠陥それぞれで異なるチェックが欠けていました。

CVE-2026-115931:バックエンドが許可リストなしで名前によるプロバイダーメソッド呼び出しを実行。 POST /integrations/functionはチャネルと関数名を受け取り、チャネルの保存済みトークンを第1引数として渡し、プロバイダーオブジェクトの関数を呼びます。

修正前のチェックは、その名前のメソッドがオブジェクトに存在することだけでした。修正コミット9383f5beは、@Toolとして登録されたメソッドか、新しい@DashboardFunctionデコレーターのあるメソッドだけに制限します。

現在は遮断された内部ヘルパーの一つは、その第1引数として届くパスのファイルを読みます。そのため、保存トークンがファイルパスのチャネルは、このルートをファイル読み取り機能に変えます。別のヘルパーはバックエンドプロセスを終了させます。

-    // @ts-ignore
-    if (integrationProvider[body.name]) {
+    if (
+      this._integrationManager.isDashboardCallable(
+        integrationProvider,
+        body.name
+      )
+    ) {

CVE-2026-115933:署名シークレットが共通で、トークン種別の印がなく、リクエストデータへ署名するルートが存在。 Postizは、セッション、招待、パスワードリセット、エンタープライズのトークンに一つの共有シークレットで署名し、どの種類かを示す情報をトークン内に保存していません。

ブラウザー拡張機能の認証情報更新ルートは、リクエスト自身から取ったJSONペイロードに署名し、要求したユーザーが読み戻せる場所に保存していました。そのため、ユーザーは好きなクレームを持つ有効な署名付きトークンを取得できました。

修正コミットa5affe62は、リクエストデータへの署名をやめます。AuthService.signJWTはAuthService.fixedEncryptionになり、「connectSocialMediaと同じく暗号化して保存し、署名しない」処理になります。また、トークンの種類を区別する仕組みも追加します。各トークン処理ルートは、チーム招待のtimeLimitやパスワードリセットのexpiresなど、別のトークン種別に属するフィールドを持つペイロードを拒否するようになります。

CVE-2026-115932:メディアパスがアップロードディレクトリ内にとどまると信頼。 投稿の公開時、PostizはWebアドレスではないメディアパスをディスク上のファイルとして扱います。そのファイルがアップロードディレクトリ内にあるか確認していませんでした。

登録ユーザーは、細工したメディアパスを投稿に保存し、通常の制約チェックを通過できました。投稿ワーカーがファイルを読み、そのユーザーが制御するDiscordサーバーへ添付ファイルとして送信します。

修正コミット12db9bd2は、/や\を含むメディア名を拒否し、ワーカーのファイル読み取りをアップロードディレクトリ内に制限し、ユーザーが影響できるURL取得を、プロバイダーと同じSSRF対策済みHTTPクライアント経由にします。

悪用の仕組み

自己登録アカウントだけで、ファイル読み取り(CVE-2026-115931)、トークン偽造による乗っ取り(CVE-2026-115933)、メディア経由の持ち出し(CVE-2026-115932)という3つの連鎖を実行できます。報告者は、コミット3a7d28b7ad96の未変更ビルドで、それぞれを最初から最後まで実証しました。

  • ファイル読み取り(CVE-2026-115931):登録し、保存トークンがファイルパスのチャネルを接続し、POST /integrations/functionで内部の読み取りヘルパーを呼ぶと、内容をバイトとして受け取れます。実証ではアプリケーションのディレクトリ外のファイルが返りました。プロセス環境も読み取られ、バックエンド起動時のJWTシークレット、データベースのアドレス、Redis接続文字列、接続済みプロバイダーの認証情報が得られました。
  • 乗っ取り(CVE-2026-115933):extension-refreshルートから、自分で選んだクレームを持つ有効な署名付きトークンを取得し、次のいずれかとして提示します。

    • 別のユーザーのセッション。そのユーザーのIDを知る必要はありません。クレームはデータベースのフィルターに使われるため、別のユーザーに一致するフィルターオブジェクトを使うと、そのユーザーが選ばれます。
    • スーパー管理者ロールを含む組織招待。共有された投稿プレビューリンクからIDがわかる任意の組織が対象です。
    • IDを知っているユーザーのパスワードリセット。
    • 組織に最上位プランの永続サブスクリプションを与えるエンタープライズのプロビジョニングトークン。

    実証では、自己登録した2人目のユーザーを他のユーザーの組織のスーパー管理者にし、そのAPIキーを読み取りました。偽造トークンは期限切れにならず、正規のものと区別できません。 - 持ち出し(CVE-2026-115932):メディアパスがアップロードディレクトリ外を指す投稿を保存・公開し、攻撃者のDiscordサーバーでファイルをバイト単位でそのまま添付として受け取ります。2つ目の経路はパスの存在を漏らし、デバイスファイルを指すことでバックエンドのメモリを枯渇させられます。3つ目はローカルストレージ構成で同じ読み取りに到達します。

攻撃フロー

未修正インスタンスで自己登録したアカウントがセッション署名シークレットを読み、任意の人物としてサインインします。

flowchart LR A["インスタンスで自己登録
デフォルトで開放"] --> B["保存トークンがファイルパスの
チャネルを接続"] B --> C["POST /integrations/functionが
内部の読み取りヘルパーを呼ぶ"] C --> D["JWT署名シークレットを含む
環境ファイルが返る"] D --> E["任意のクレームで
セッショントークンを偽造"] E --> F["任意のユーザーまたは任意の組織の
スーパー管理者としてサインイン"]

トークン偽造の欠陥は、ファイル読み取りなしで同じ結果、すなわち任意のユーザーや任意の組織のスーパー管理者としてのサインインを達成します。パストラバーサルの欠陥は同じファイル読み取りを実現し、内容を攻撃者が制御するDiscordサーバーへ送ります。

攻撃者に可能なこと

攻撃者はバックエンドが読める任意のファイルを読み、任意のユーザーや任意の組織のスーパー管理者としてサインインし、1リクエストでバックエンドを停止し、共有シークレットで暗号化されたデータを復号できます。アドバイザリの影響説明に基づく全体像は次のとおりです。

  • バックエンドプロセスが読める任意のファイルを生のバイトとして読み取るため、バイナリファイルも対象。rootで動く配布コンテナーでは、環境ファイル、マウントされたシークレット、アプリケーションログなど、rootが読める全ファイル
  • 任意のユーザーとしてサインインし、任意の組織にスーパー管理者として参加し、APIキーとチャネル一覧を読み、接続されたソーシャルアカウントで投稿を予約
  • IDを知っている任意のユーザーのパスワードをリセット
  • エンタープライズエンドポイントから、最上位プランの永続サブスクリプションを持つ組織を作成
  • クラッシュ用ヘルパー(CVE-2026-115931)またはメモリ枯渇経路(CVE-2026-115932)を通じて、単一リクエストでバックエンドを停止。再起動のたびに繰り返し可能
  • JWT署名鍵と同じシークレットで暗号化され、アプリケーションが保存するデータを復号

必要なのは、通常のアカウント(デフォルト構成では自己登録で取得可能)、PostizのWebインターフェースへのネットワークアクセス、主な持ち出し経路については設定済みDiscordプロバイダーです。他のユーザーの操作も、アカウント以上の権限も不要です。

修正が機能する理由

各修正はルートを表面的に隠すのではなく、欠けていたチェックを追加します。

  • 関数呼び出しの許可リスト。 呼び出し元が指定した名前は、ダッシュボードから安全に呼べると宣言されたメソッドだけに到達します。ファイル読み取りやプロセス終了を行う内部ヘルパーに、名前で到達することはできません。
  • 署名の代わりに暗号化。 extension-refreshルートはリクエストデータに署名せず暗号化するため、有効な署名を配布できなくなります。トークン種別の区別により、署名ペイロードはフィールド集合が一致するルートだけで受け入れられます。
  • メディアパスの検証。 区切り文字を含む名前を拒否し、読み取りをアップロードディレクトリ内に限定します。保存された投稿がワーカーをその外へ向けることはできません。

同じ修正は、アドバイザリの3つの限定的な経路も閉じます。招待の署名経路、パスの存在を漏らしてメモリを枯渇させられるパストラバーサル経路、ローカルストレージのファイル読み取りです。

侵害されたかを確認する方法

これらの欠陥に関する侵害指標は公開されておらず、実環境の悪用も報告されていません。文書化された影響に照らして次を確認してください。

  • インスタンスのユーザー一覧で、管理者が招待していない自己登録アカウントを確認し、各組織のメンバー一覧で予期しないスーパー管理者を確認
  • 接続済みチャネルで、保存トークンがプロバイダー認証情報ではなくファイルパスに見えるものを確認。ファイル読み取りの連鎖が残す特徴
  • 公開済み投稿のメディアパスがアップロードディレクトリ外に解決されないか調べ、送信していない添付ファイルを含むDiscord webhook配信を監査
  • 影響バージョンが動作し、登録が開放されていたか、ユーザーアカウントが一つでもあった場合、JWTシークレット、データベースとRedisの認証情報、接続済み全プロバイダーのAPIキーを露出済みと扱う。認証済みユーザーなら誰でも欠陥に到達できるため、ローテーションしてください。偽造トークンは見ただけでは正規トークンと区別できないため、確実な対応はローテーションです。

経緯

  • 2026-10-23 17:45 UTC:Anthropicが動作するPoC付きでCVE-2026-115932とCVE-2026-115933をPostizへ開示。Postizは15分以内に両方を再現。
  • 2026-10-23 19:45 UTC:Anthropicが動作するPoC付きでCVE-2026-115931を開示。Postizが再現し修正に着手。
  • 2026-10-23 21:33 UTC:PostizがCVE-2026-115931の修正をpushし検証。
  • 2026-10-23 21:59 UTC:PostizがCVE-2026-115931の修正を含む2.25.2とアドバイザリを公開。
  • 2026-10-24 12:26および13:27 UTC:PostizがCVE-2026-115932とCVE-2026-115933の修正をpushし検証。
  • 2026-10-24 14:16 UTC:Postizが両修正を含む2.25.3とアドバイザリを公開。
  • 2026-10-26:本記事を公開。

よくある質問

3つの欠陥は連鎖するか?

はい。また、それぞれ単独でも乗っ取りに至ります。ファイル読み取り(CVE-2026-115931)とパストラバーサル(CVE-2026-115932)は、それぞれJWT署名シークレットを露出させます。そのシークレットを持つ人は有効なトークンを偽造できます。トークン偽造(CVE-2026-115933)は、シークレットを先に読むことなく、直接有効な署名付きトークンを生成します。

ホスト型Postizサービスも影響を受けるか?

アドバイザリは自己ホスト型のpostiz-appリポジトリを対象に、影響バージョンと修正バージョンを記載しています。マネージドサービスでは、運営者のデプロイバージョンとパッチ適用状況で危険が決まります。自社インスタンスでは、docker inspect --format '{{.Config.Image}}' $(docker ps -q --filter name=postiz)でコンテナーの使用イメージを確認してください。

今日アップグレードできない場合、最も危険を減らす方法は?

自己登録を閉じ(DISABLE_REGISTRATION=true)、ブラウザー拡張機能を使わなければリバースプロキシでPOST /integrations/extension-refreshを遮断し、Discordプロバイダーの認証情報を未設定にしてください。それぞれ一つの経路を取り除きますが、欠陥自体を修正するものではありません。既存ユーザーは残る経路を悪用できます。

アップグレード後に何をローテーションすべきか?

最初にJWT署名シークレットです。アップグレード前に作られた偽造トークンは、変更するまで有効です。次にデータベースとRedisの認証情報、および接続済み全プロバイダーのAPIキーです。アドバイザリによれば、それらを保持する環境は読み取り可能です。シークレットの変更によってセッションも無効になります。

公開PoCはあるか?

コードは公開されていません。Postizへの開示にはそれぞれ動作するPoCが含まれ、報告者は未変更ビルドで3つの連鎖をそれぞれ最初から最後まで実証しました。ただし、アドバイザリはスクリプトを公開せず、仕組みを説明しています。実環境の悪用は報告されていません。

どのように発見されたか?

Anthropicのセキュリティチームが3件すべてを報告しました。Enno GelhausがGAdvisoryを通じて開示を調整し、Nevo Davidが修正しました。各修正は数時間以内に検証されています。

参考資料

  • PSA-2026-JNXM56。CVSS v3.1 9.9ベクトル、影響範囲、回避策、実証済みの影響、経緯を含むCVE-2026-115931のアドバイザリ:https://gadvisory.org/advisories/PSA-2026-JNXM56 (2026年10月26日確認)
  • PSA-2026-YT2HMH。CVSS v3.1 9.9ベクトルと乗っ取りの影響を含むCVE-2026-115933のアドバイザリ:https://gadvisory.org/advisories/PSA-2026-YT2HMH (2026年10月26日確認)
  • PSA-2026-E9AHFV。CVSS v3.1 9.6ベクトルと各経路の設定前提を含むCVE-2026-115932のアドバイザリ:https://gadvisory.org/advisories/PSA-2026-E9AHFV (2026年10月26日確認)
  • 同じ3つの欠陥を扱うGitHubアドバイザリGHSA-h5r5-h782-vqvp、GHSA-9j6f-8rw3-93c4、GHSA-rmc2-p2gv-m88f:https://github.com/gitroomhq/postiz-app/security/advisories (2026年10月26日確認)
  • 修正コミット:9383f5be(プロバイダーメソッドの許可リスト、CVE-2026-115931)、a5affe62(署名から暗号化への変更とトークン種別の区別、CVE-2026-115933)、12db9bd(メディアパスの検証とアップロードディレクトリへの制限、CVE-2026-115932):https://github.com/gitroomhq/postiz-app/commit/9383f5be4d310c346e33a3748a9a7ded64c96fed, https://github.com/gitroomhq/postiz-app/commit/a5affe62c74e39c1e7ac960d50d8418b807d532c, https://github.com/gitroomhq/postiz-app/commit/12db9bd2f428b628a62809669c3d76297e07750a (2026年10月26日確認)
  • PSA-2026-JNXM56に対応する、2026年10月23日のPostiz 2.25.2リリースノート:https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.2 (2026年10月26日確認)
  • PSA-2026-E9AHFVとPSA-2026-YT2HMHに対応する、2026年10月24日のPostiz 2.25.3リリースノート:https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.3 (2026年10月26日確認)
  • Postizリポジトリ。スター数とフォーク数(2026年10月26日時点で37,856と7,395)は自己ホスト導入範囲の目安:https://github.com/gitroomhq/postiz-app (2026年10月26日確認)