> 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/de/useful-resources/bug-bounty/gitbook-ai-assistant-replay-poc.md).

# GitBook AI Assistant Replay PoC

GitBook-AI-Assistant-Server-Action-Replay-PoC-Fallstudie über ein behobenes Risiko der Umgehung von Berechtigungen, Replay im Preview-Modus, Auswirkungen, Erkennungsnotizen und Behebung.

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) dokumentiert ein behobenes Problem mit dem GitBook AI Assistant, bei dem sich der Request-Flow einer Next.js-Serveraktion aus clientseitig sichtbaren Laufzeitdaten rekonstruieren und über einen externen lokalen Client erneut abspielen ließ.

{% hint style="success" %}
Status: behoben. Die Schwachstelle wurde an GitBook gemeldet, und das Backend erzwingt jetzt serverseitig Berechtigung, Scope und Session-Kontrollen. Behalte diese Seite als historische Bug-Bounty-Fallstudie bei, nicht als Live-Exploit-Anleitung.
{% endhint %}

## Warum das wichtig ist

GitBook präsentiert AI Assistant als Funktion des kostenpflichtigen Ultimate-Tarifs. Wenn eine Vorschau- oder Anpassungsansicht wiederabspielbare Metadaten des Produktions-Backends offenlegt und das Backend Berechtigung und Scope nicht serverseitig prüft, ist das Problem mehr als nur ein UI-Bypass: Es kann zu Missbrauch kostenpflichtiger Funktionen, Automatisierungsmissbrauch und potenziell zu Missbrauch von Ressourcen- und Kostenaufwand führen.

<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 wird als Teil der Preisgestaltung von GitBook Ultimate präsentiert.</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>Der Assistant-Vorschaumodus wurde in der GitBook-Anpassungsoberfläche offengelegt.</p></figcaption></figure>

## Video-PoC

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

## Zusammenfassung des Fundes

| Bereich        | Notizen                                                          |
| -------------- | ---------------------------------------------------------------- |
| Produkt        | GitBook AI Assistant.                                            |
| Forschungstyp  | Responsible Disclosure / Bug-Bounty-artige Fallstudie.           |
| Kernprimitive  | Wiederabspielen von Serveraktion-Requests.                       |
| Backend-Aktion | `streamAIChatResponse`.                                          |
| Hauptrisiko    | Berechtigungs- und Scope-Prüfungen müssen serverseitig erfolgen. |
| Status         | Von GitBook behoben.                                             |

Die wichtige Lektion ist einfach: Eine Serveraktions-ID kann in clientseitigem JavaScript sichtbar sein, aber sie darf nicht als Autorisierung dienen. Das Backend muss weiterhin unabhängig Tarifberechtigung, Site-Zugehörigkeit, Preview-/Session-Grenzen, CSRF-/Origin-Einschränkungen und Rate Limits prüfen.

## Auswirkung

| Auswirkungsbereich                    | Was schiefgehen könnte                                                                    |
| ------------------------------------- | ----------------------------------------------------------------------------------------- |
| Umgehung kostenpflichtiger Funktionen | AI Assistant könnte außerhalb des vorgesehenen Ultimate-Tarif-UI-Pfads verwendet werden.  |
| Missbrauch der Vorschau               | Anpassungs- oder Vorschaumodus könnte wiederabspielbare Backend-Metadaten offenlegen.     |
| Automatisierung                       | Assistant-Anfragen könnten von einem benutzerdefinierten Client aus automatisiert werden. |
| Kostenmissbrauch                      | KI-Ressourcen könnten ohne die erwartete Berechtigungsprüfung verbraucht werden.          |
| UI-Bypass                             | Reine Frontend-Kontrollen, Prompts oder Produkt-Schranken könnten übersprungen werden.    |

Die vorgeschlagene Schwere hängt davon ab, was das Backend tatsächlich zulässt:

| Bestätigtes Verhalten                                                         | Vorgeschlagene Schwere |
| ----------------------------------------------------------------------------- | ---------------------- |
| Replay funktioniert nur für bereits berechtigte Nutzer                        | Mittel                 |
| Replay funktioniert aus Vorschau/Anpassung ohne kostenpflichtige Berechtigung | Hoch                   |
| Replay funktioniert für beliebige öffentliche GitBook-Sites ohne Berechtigung | Kritisch               |
| Replay legt private Dokumentation ohne Autorisierung offen                    | Kritisch               |

## Ursache

Das verwundbare Muster ist ein Fehler an der Vertrauensgrenze. Clientseitig sichtbare Laufzeitdaten können helfen, die Anfrage zu rekonstruieren:

| Offengelegte Daten      | Warum das wichtig ist                                                           |
| ----------------------- | ------------------------------------------------------------------------------- |
| Serveraktions-ID        | Leitet die Anfrage zur Backend-Aktion weiter.                                   |
| `spaceId`               | Identifiziert den GitBook-Space.                                                |
| `pageId`                | Identifiziert den Seitenkontext.                                                |
| RSC-/Router-Status      | Hilft, die erwartete Next.js-Anfrageform abzugleichen.                          |
| Anforderungsstruktur    | Zeigt, wie der Assistant-Aufruf aufgebaut ist.                                  |
| Browser-Session-Cookies | Tragen die Benutzersession, wenn sie während autorisierter Tests erfasst wurde. |

Der Fehler ist nicht „Serveraktionen sind sichtbar“. Der Fehler tritt auf, wenn das Backend eine wiederabgespielte Anfrage akzeptiert, die aus clientseitig beobachtbaren Metadaten zusammengesetzt wurde, ohne Berechtigung, Eigentümerschaft, Preview-Scope, Gültigkeit der Session, CSRF/Origin und Rate Limits erneut zu prüfen.

## PoC-Ablauf

Das Repository enthält einen lokalen Node.js-PoC, der Laufzeitmetadaten entdeckt und einen lokalen HTTPS-Proxy startet.

```bash
npm start
```

Ablauf in groben Zügen:

1. Frage nach einer GitBook-Seite oder einer Preview-URL.
2. Lade das Seiten-HTML herunter.
3. Lade GitBook-JavaScript-Chunks herunter.
4. Extrahiere die aktuelle `streamAIChatResponse` Serveraktions-ID.
5. Extrahiere `spaceId` und `pageId`.
6. Öffne Chrome, Chromium oder Edge zur Authentifizierung.
7. Speichere die erforderlichen Laufzeitwerte in `.env`.
8. Starte einen lokalen HTTPS-Proxy.

Dann öffnen:

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

Die lokale UI kommuniziert mit:

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

Der Proxy rekonstruiert den Request des GitBook AI Assistant mit Headern, die folgenden entsprechen:

```http
accept: text/x-component
content-type: text/plain;charset=UTF-8
next-action: <discovered streamAIChatResponse action id>
next-router-state-tree: <router state>
origin: <target GitBook origin>
referer: <target GitBook URL>
cookie: <captured GitBook cookies>
```

Ein erfolgreicher Replay liefert einen React Server Components-Stream, der AI-Antwortereignisse enthält. Der lokale Proxy parst die finale Antwort und gibt für die PoC-UI eine normale JSON-Antwort zurück.

## Typische Signale

| Antwort                 | Bedeutung                                                         |
| ----------------------- | ----------------------------------------------------------------- |
| `400 Ungültige Anfrage` | Die Serveraktions-ID ist veraltet oder falsch.                    |
| RSC-Stream mit `Digest` | Die Aktion existiert, aber Body oder Kontext sind ungültig.       |
| `401` / `403`           | Session oder Autorisierung abgelehnt.                             |
| `text/x-component`      | Erwarteter Content-Type für einen React Server Components-Stream. |

## Anforderungen

| Anforderung    | Notizen                                              |
| -------------- | ---------------------------------------------------- |
| Node.js        | Version 18 oder neuer.                               |
| Browser        | Chrome, Chromium oder Microsoft Edge.                |
| OpenSSL        | Benötigt für `PATH` für lokales HTTPS-Material.      |
| Betriebssystem | Windows, Linux und macOS werden vom PoC unterstützt. |

## Bereinigung

Verwende nach dem Testen den Bereinigungsbefehl des Repositorys:

```bash
npm run stop
```

Er entfernt laufende PoC-Prozesse, sensible `.env` Werte, erzeugte lokale TLS-Dateien und das dedizierte Browser-Authentifizierungsprofil.

## Behebung

Empfohlene Kontrollen:

| Kontrolle                                                             | Zweck                                                                          |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Tarifberechtigung innerhalb durchsetzen `streamAIChatResponse`        | Verhindert das Umgehen kostenpflichtiger Funktionen.                           |
| Behandle `next-action` als Routing-Metadaten                          | Vermeide, Aktions-IDs mit Autorisierung zu verwechseln.                        |
| Binde Preview-Aufrufe an kurzlebige, serverseitig ausgestellte Tokens | Halte den Preview-Zugriff innerhalb des Preview-Bereichs.                      |
| Verhindere das Wiederabspielen von Preview-Tokens                     | Stoppe externe Wiederverwendung außerhalb der vorgesehenen Session.            |
| Validieren `spaceId` und `pageId` serverseitig                        | Stelle sicher, dass der angeforderte Kontext zum autorisierten Bereich gehört. |
| Nicht übereinstimmenden, vom Client gelieferten Kontext ablehnen      | Verhindert Kontextwechsel.                                                     |
| Erzwinge CSRF- und strenge `Origin` Prüfungen                         | Reduziere Cross-Site- und skriptgesteuerten Missbrauch.                        |
| Rate-Limit pro Nutzer, Organisation, Site, IP und Session             | Begrenzt Automatisierung und Kostenmissbrauch.                                 |
| Skriptgesteuertes Wiederabspielen von Serveraktionen überwachen       | Erkennt nicht-browserbasierte oder ungewöhnliche Replay-Muster.                |

## Erkenntnisse

1. Preview-Funktionen sind Sicherheitsgrenzen, wenn sie kostenpflichtige oder produktive Backends berühren.
2. Clientseitige Schranken sind nützlich für die UX, aber keine Autorisierung.
3. Next.js-Serveraktions-IDs sollten als öffentliche Routing-Details behandelt werden.
4. KI-Funktionen benötigen ebenso Kosten- und Berechtigungskontrollen wie Datenzugriffskontrollen.
5. Bug-Bounty-Berichte sind stärker, wenn sie beobachtetes Verhalten, mögliche Auswirkungen und empfohlene Behebung trennen.

## Quellen

* [Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc)
* [Repository-README](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/blob/main/README.md)
* [PoC-Launcher](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/tree/main/scripts)
* [Lokaler Proxy](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/de/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.
