> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ja/useful-resources/bug-bounty/gitbook-ai-assistant-replay-poc.md).

# GitBook AI Assistant リプレイ PoC

修正済みの権限制御バイパスリスク、プレビューモードのリプレイ、影響、検出メモ、修復を含む GitBook AI Assistant サーバーアクションリプレイ PoC のケーススタディ。

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) Next.js のサーバーアクションのリクエストフローが、クライアントから見える実行時データから再構築され、外部のローカルクライアント経由で再生できてしまう、修正済みの GitBook AI Assistant の問題を記録しています。

{% hint style="success" %}
ステータス: 修正済み。この脆弱性は GitBook に報告され、現在はバックエンド側でサーバーサイドの権限、スコープ、セッション制御が強制されています。このページは、実際の悪用手順ではなく、履歴としてのバグバウンティ事例研究として残してください。
{% endhint %}

## 重要性

GitBook は AI Assistant を有料の Ultimate プラン機能として提供しています。プレビューまたはカスタマイズ画面が再生可能な本番バックエンドのメタデータを露出し、バックエンドがサーバー側で権限とスコープを検証しない場合、この問題は単なる UI バイパスにとどまりません。有料機能の悪用、自動化の悪用、場合によってはリソースコストの悪用にもつながります。

<figure><img src="https://raw.githubusercontent.com/Jordanmacia/gitbook-ai-chat-replay-poc/main/ultimate-pricing.png" alt="GitBook Ultimate pricing showing AI Assistant"><figcaption><p>AI Assistant は GitBook の Ultimate 料金体系の一部として提示されています。</p></figcaption></figure>

<figure><img src="https://raw.githubusercontent.com/Jordanmacia/gitbook-ai-chat-replay-poc/main/preview-assistant.png" alt="GitBook Assistant preview mode"><figcaption><p>アシスタントのプレビューモードが GitBook のカスタマイズ UI に表示されています。</p></figcaption></figure>

## 動画 PoC

{% embed url="<https://github.com/user-attachments/assets/2c265d4a-e3c7-4438-841d-d129600980e0>" %}

## 発見の要約

| 対象           | メモ                               |
| ------------ | -------------------------------- |
| Product      | GitBook AI Assistant。            |
| 調査種別         | 責任ある開示 / バグバウンティ形式の事例研究。         |
| コア原始要素       | サーバーアクションのリクエスト再生。               |
| バックエンドのアクション | `streamAIChatResponse`.          |
| 主なリスク        | 権限とスコープのチェックはサーバー側で行われなければなりません。 |
| ステータス        | GitBook により修正済み。                 |

重要な教訓は単純です。サーバーアクション ID はクライアント側 JavaScript から見えていても、認可の根拠にしてはいけません。バックエンドは依然として、プラン権限、サイト所有権、プレビュー/セッションの境界、CSRF/Origin 制約、レート制限を独自に検証する必要があります。

## 影響

| 影響範囲      | 何が起こり得たか                                                    |
| --------- | ----------------------------------------------------------- |
| 有料機能のバイパス | AI Assistant を、意図された Ultimate プランの UI 経路外で使用できてしまう可能性があります。 |
| プレビューの悪用  | カスタマイズまたはプレビューモードが、再生可能なバックエンドメタデータを露出する可能性があります。           |
| 自動化       | アシスタントへの問い合わせを、カスタムクライアントからスクリプト化できてしまう可能性があります。            |
| コスト悪用     | 想定された権限ゲートなしに AI リソースが消費される可能性があります。                        |
| UI バイパス   | フロントエンドのみの制御、プロンプト、または製品ゲートを飛ばせてしまう可能性があります。                |

推奨重大度は、バックエンドが実際に何を許可するかによって異なります:

| 確認された挙動                         | 推奨重大度 |
| ------------------------------- | ----- |
| 再生は、すでに権限を持つユーザーに対してのみ機能する      | 中     |
| 再生が、課金権限なしにプレビュー/カスタマイズ画面から機能する | 高     |
| 再生が、権限なしに任意の公開 GitBook サイトで機能する | 重大    |
| 再生により、認可なしに非公開ドキュメントが露出する       | 重大    |

## 根本原因

脆弱なパターンは、信頼境界の誤りです。クライアントから見える実行時データは、リクエストの再構築に役立ちます:

| 露出する सामग्री       | 重要性                                  |
| ------------------ | ------------------------------------ |
| サーバーアクション ID       | リクエストをバックエンドのアクションへ振り分けます。           |
| `spaceId`          | GitBook のスペースを識別します。                 |
| `pageId`           | ページのコンテキストを識別します。                    |
| RSC/ルーター状態         | 期待される Next.js のリクエスト形式と一致させるのに役立ちます。 |
| リクエスト本文の形式         | アシスタント呼び出しの構造を示します。                  |
| ブラウザーのセッション Cookie | 権限のあるテスト中に取得した場合、ユーザーセッションを引き継ぎます。   |

バグは「サーバーアクションが見えている」ことではありません。クライアントから観測できるメタデータだけで組み立てた再生リクエストを、バックエンドが権限、所有権、プレビュー範囲、セッションの有効性、CSRF/Origin、レート制限を再確認せずに受け入れてしまうときに問題になります。

## PoC の流れ

このリポジトリには、実行時メタデータを検出し、ローカルの HTTPS プロキシを起動する Node.js ベースの PoC が含まれています。

```bash
npm start
```

大まかな流れ:

1. GitBook のページまたはプレビュー URL を指定します。
2. ページの HTML をダウンロードします。
3. GitBook の JavaScript チャンクをダウンロードします。
4. 現在の `streamAIChatResponse` サーバーアクション ID を抽出します。
5. 抽出 `spaceId` および `pageId`.
6. 認証のために Chrome、Chromium、または Edge を開きます。
7. 必要な実行時値を `.env`.
8. ローカル HTTPS プロキシを起動します。

その後、次を開きます:

```
https://localhost:3001
```

ローカル UI は次に通信します:

```http
POST /api/chat
```

プロキシは、GitBook AI Assistant のリクエストを次に相当するヘッダーで再現します:

```http
accept: text/x-component
content-type: text/plain;charset=UTF-8
next-action: <検出済みの streamAIChatResponse アクション ID>
next-router-state-tree: <ルーター状態>
origin: <対象 GitBook の origin>
referer: <対象 GitBook URL>
cookie: <取得済みの GitBook Cookie>
```

再生に成功すると、AI 応答イベントを含む React Server Components のストリームが返されます。ローカルプロキシは最終回答を解析し、PoC UI 用に通常の JSON 応答を返します。

## よくある兆候

| レスポンス                         | 意味                                              |
| ----------------------------- | ----------------------------------------------- |
| `400 無効なリクエスト`                | サーバーアクション ID が古いか不正です。                          |
| digest を含む RSC ストリーム `digest` | アクションは存在しますが、本文またはコンテキストが無効です。                  |
| `401` / `403`                 | セッションまたは認証が拒否されました。                             |
| `text/x-component`            | 期待される React Server Components ストリームのコンテンツタイプです。 |

## 要件

| 要件      | メモ                                       |
| ------- | ---------------------------------------- |
| Node.js | バージョン 18 以上。                             |
| ブラウザー   | Chrome、Chromium、または Microsoft Edge。      |
| OpenSSL | 必要 `PATH` ローカル HTTPS 用の素材に。              |
| OS      | この PoC は Windows、Linux、macOS をサポートしています。 |

## クリーンアップ

テスト後にリポジトリのクリーンアップコマンドを実行します:

```bash
npm run stop
```

実行中の PoC プロセス、機密の `.env` 値、生成されたローカル TLS ファイル、専用のブラウザー認証プロファイルを消去します。

## 対策

推奨される対策:

| 対策                                   | 目的                                 |
| ------------------------------------ | ---------------------------------- |
| 内部でプラン権限を強制する `streamAIChatResponse` | 有料機能のバイパスを防ぎます。                    |
| 扱う `next-action` をルーティング用メタデータとして    | アクション ID を認可と混同しないようにします。          |
| プレビュー呼び出しを短命のサーバー発行トークンに紐づける         | プレビューアクセスをプレビュー範囲内に保ちます。           |
| プレビュートークンの再生を防ぐ                      | 意図したセッション外での外部再利用を防ぎます。            |
| 検証する `spaceId` および `pageId` サーバー側で   | 要求されたコンテキストが認可された範囲に属していることを確認します。 |
| クライアントから渡された不一致のコンテキストを拒否する          | コンテキストのすり替えを防ぎます。                  |
| CSRF と厳格な `Origin` チェックを強制する         | クロスサイトおよびスクリプト化された悪用を減らします。        |
| ユーザー、組織、サイト、IP、セッションごとにレート制限する       | 自動化とコスト悪用を制限します。                   |
| スクリプト化されたサーバーアクション再生を監視する            | ブラウザー以外または異常な再生パターンを検出します。         |

## 学んだ教訓

1. プレビュー機能は、有料または本番バックエンドに触れる場合、セキュリティ境界になります。
2. クライアント側のゲートは UX には有用ですが、認可ではありません。
3. Next.js のサーバーアクション ID は公開ルーティング情報として扱うべきです。
4. AI 機能には、データアクセス制御と同じくらいコストおよび権限の制御が必要です。
5. バグバウンティ報告は、観測された挙動、起こり得る影響、推奨される修正を分けて示すと、より説得力が増します。

## 参考資料

* [Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc)
* [リポジトリ README](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/blob/main/README.md)
* [PoC ランチャー](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/tree/main/scripts)
* [ローカルプロキシ](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/blob/main/server.js)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ja/useful-resources/bug-bounty/gitbook-ai-assistant-replay-poc.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
