> 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

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) dokumentiert ein behobenes Problem im GitBook AI Assistant, bei dem der Request-Flow für eine Next.js-Server Action aus für den Client sichtbaren Laufzeitdaten rekonstruiert und über einen externen lokalen Client erneut abgespielt werden konnte.

{% hint style="success" %}
Status: behoben. Die Schwachstelle wurde an GitBook gemeldet, und das Backend erzwingt nun serverseitig Berechtigung, Scope- und Sitzungskontrollen. Behalten Sie diese Seite als historische Bug-Bounty-Case-Study bei, nicht als Live-Exploitation-Leitfaden.
{% endhint %}

## Warum es wichtig ist

GitBook präsentiert AI Assistant als kostenpflichtige Ultimate-Plan-Funktion. Wenn eine Vorschau- oder Anpassungsansicht wieder abspielbare Produktions-Backend-Metadaten preisgibt und das Backend die Berechtigung und den Scope serverseitig nicht überprüft, ist das Problem mehr als ein UI-Bypass: Es kann zu Missbrauch kostenpflichtiger Funktionen, Automatisierungsmissbrauch und potenziell zu Missbrauch von Ressourcenkosten 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 GitBook-Ultimate-Preisgestaltung dargestellt.</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 ist in der GitBook-Anpassungsoberfläche sichtbar.</p></figcaption></figure>

## Video-PoC

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

## Zusammenfassung des Findings

| Bereich           | Notizen                                                          |
| ----------------- | ---------------------------------------------------------------- |
| Product           | GitBook AI Assistant.                                            |
| Art der Recherche | Responsible Disclosure / Bug-Bounty-artige Fallstudie.           |
| Kernprimitive     | Server-Action-Request-Replay.                                    |
| Backend-Aktion    | `streamAIChatResponse`.                                          |
| Hauptrisiko       | Berechtigungs- und Scope-Prüfungen müssen serverseitig erfolgen. |
| Status            | Von GitBook behoben.                                             |

Die wichtige Lektion ist einfach: Eine Server-Action-ID kann in clientseitigem JavaScript sichtbar sein, sie darf aber nicht als Autorisierung dienen. Das Backend muss weiterhin unabhängig Planberechtigung, Site-Eigentum, Preview-/Sitzungsgrenzen, CSRF-/Origin-Beschränkungen und Rate-Limits überprüfen.

## Auswirkungen

| Auswirkungsbereich                    | Was schiefgehen könnte                                                                   |
| ------------------------------------- | ---------------------------------------------------------------------------------------- |
| Umgehung kostenpflichtiger Funktionen | AI Assistant könnte außerhalb des vorgesehenen Ultimate-Plan-UI-Pfads verwendet werden.  |
| Missbrauch der Vorschau               | Anpassungs- oder Vorschaumodus könnte wieder abspielbare Backend-Metadaten offenlegen.   |
| Automatisierung                       | Assistant-Abfragen könnten von einem benutzerdefinierten Client aus skriptiert werden.   |
| Missbrauch von Kosten                 | KI-Ressourcen könnten ohne die erwartete Berechtigungsprüfung verbraucht werden.         |
| UI-Bypass                             | Rein frontendseitige Kontrollen, Prompts oder Produkt-Gates könnten übersprungen werden. |

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

| Bestätigtes Verhalten                                                         | Empfohlene Schwere |
| ----------------------------------------------------------------------------- | ------------------ |
| Replay funktioniert nur für bereits berechtigte Benutzer                      | 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. Für den Client sichtbare Laufzeitdaten können helfen, den Request zu rekonstruieren:

| Offengelegte Bestandteile  | Warum es wichtig ist                                                                  |
| -------------------------- | ------------------------------------------------------------------------------------- |
| Server-Action-ID           | Leitet den Request an die Backend-Aktion weiter.                                      |
| `spaceId`                  | Identifiziert den GitBook-Space.                                                      |
| `pageId`                   | Identifiziert den Seitenkontext.                                                      |
| RSC-/Router-Zustand        | Hilft dabei, die erwartete Next.js-Request-Struktur abzugleichen.                     |
| Struktur des Request-Bodys | Zeigt, wie der Assistant-Aufruf aufgebaut ist.                                        |
| Browser-Sitzungscookies    | Übertragen die Benutzersitzung, falls sie während autorisierter Tests erfasst wurden. |

Der Bug besteht nicht darin, dass „Server Actions sichtbar sind“. Der Bug entsteht, wenn das Backend einen erneut abgespielten Request akzeptiert, der aus clientbeobachtbaren Metadaten zusammengesetzt wurde, ohne Berechtigung, Eigentum, Preview-Scope, Sitzungsvalidität, CSRF/Origin und Rate-Limits erneut zu prüfen.

## PoC-Ablauf

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

```bash
npm start
```

Ablauf auf hoher Ebene:

1. Nach einer GitBook-Seite oder Preview-URL fragen.
2. Die HTML-Seite herunterladen.
3. GitBook-JavaScript-Chunks herunterladen.
4. Die aktuelle `streamAIChatResponse` Server-Action-ID extrahieren.
5. Extrahieren `spaceId` und `pageId`.
6. Chrome, Chromium oder Edge zur Authentifizierung öffnen.
7. Erforderliche Laufzeitwerte in `.env`.
8. Einen lokalen HTTPS-Proxy starten.

Dann öffnen:

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

Die lokale UI kommuniziert mit:

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

Der Proxy rekonstruiert den GitBook-AI-Assistant-Request mit Headern, die denen entsprechen:

```http
accept: text/x-component
content-type: text/plain;charset=UTF-8
next-action: <ermittelte streamAIChatResponse-Aktions-ID>
next-router-state-tree: <Router-Zustand>
origin: <Ziel-GitBook-Origin>
referer: <Ziel-GitBook-URL>
cookie: <erfasste GitBook-Cookies>
```

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

## Häufige Signale

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

## Voraussetzungen

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

## Bereinigung

Verwenden Sie nach dem Testen den Repository-Bereinigungsbefehl:

```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                                                                             |
| -------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Planberechtigung innerhalb von `streamAIChatResponse`                      | Umgehung kostenpflichtiger Funktionen verhindern.                                 |
| Behandle `next-action` als Routing-Metadaten                               | Vermeiden Sie, Aktions-IDs mit Autorisierung zu verwechseln.                      |
| Binden Sie Preview-Aufrufe an kurzlebige, serverseitig ausgestellte Tokens | Halten Sie den Preview-Zugriff innerhalb des Preview-Scopes.                      |
| Wiederverwendung von Preview-Tokens verhindern                             | Externe Wiederverwendung außerhalb der vorgesehenen Sitzung stoppen.              |
| Validieren `spaceId` und `pageId` serverseitig                             | Stellen Sie sicher, dass der angeforderte Kontext zum autorisierten Scope gehört. |
| Nicht übereinstimmenden vom Client bereitgestellten Kontext ablehnen       | Kontextwechsel verhindern.                                                        |
| CSRF und strenge `Origin` Prüfungen erzwingen                              | Cross-Site- und skriptgesteuerten Missbrauch reduzieren.                          |
| Rate-Limit nach Benutzer, Organisation, Site, IP und Sitzung               | Automatisierung und Kostenmissbrauch begrenzen.                                   |
| Skriptiertes Server-Action-Replay überwachen                               | Nicht-Browser- oder ungewöhnliche Replay-Muster erkennen.                         |

## Gelerntes

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

## Referenzen

* [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-Startprogramm](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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
