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

# PoC de repetición del Asistente de IA de GitBook

Estudio de caso de PoC de repetición de acciones del servidor del Asistente de IA de GitBook que cubre un riesgo de bypass de privilegios corregido, repetición en modo vista previa, impacto, notas de detección y remediación.

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) documenta un problema corregido del Asistente de IA de GitBook en el que el flujo de solicitud para una acción de servidor de Next.js podía reconstruirse a partir de datos de ejecución visibles para el cliente y reproducirse mediante un cliente local externo.

{% hint style="success" %}
Estado: corregido. La vulnerabilidad fue informada a GitBook, y ahora el backend aplica controles de autorización, alcance y sesión del lado del servidor. Mantén esta página como un estudio de caso histórico de bug bounty, no como una guía de explotación en vivo.
{% endhint %}

## Por qué importa

GitBook presenta el Asistente de IA como una función paga del plan Ultimate. Si una vista previa o de personalización expone metadatos reproducibles del backend de producción, y el backend no verifica la autorización y el alcance en el servidor, el problema se convierte en algo más que un bypass de la interfaz: puede convertirse en abuso de funciones de pago, abuso de automatización y, potencialmente, abuso de costos de recursos.

<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>Asistente de IA presentado como parte del precio Ultimate de GitBook.</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>Modo de vista previa del asistente expuesto en la interfaz de personalización de GitBook.</p></figcaption></figure>

## PoC en video

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

## Resumen del hallazgo

| Área                  | Notas                                                                      |
| --------------------- | -------------------------------------------------------------------------- |
| Product               | Asistente de IA de GitBook.                                                |
| Tipo de investigación | Divulgación responsable / estudio de caso al estilo bug bounty.            |
| Primitiva principal   | Reproducción de solicitudes de acciones de servidor.                       |
| Acción del backend    | `streamAIChatResponse`.                                                    |
| Riesgo principal      | Las comprobaciones de autorización y alcance deben hacerse en el servidor. |
| Estado                | Corregido por GitBook.                                                     |

La lección importante es simple: un ID de acción del servidor puede ser visible en JavaScript del lado del cliente, pero no debe actuar como autorización. El backend aún necesita verificar de forma independiente la autorización del plan, la propiedad del sitio, los límites de vista previa/sesión, las restricciones de CSRF/origen y los límites de velocidad.

## Impacto

| Área de impacto           | Qué podría salir mal                                                                          |
| ------------------------- | --------------------------------------------------------------------------------------------- |
| Bypass de función de pago | El Asistente de IA podría usarse fuera del flujo de interfaz del plan Ultimate previsto.      |
| Abuso de vista previa     | El modo de personalización o vista previa podría exponer metadatos reproducibles del backend. |
| Automatización            | Las consultas del asistente podrían automatizarse desde un cliente personalizado.             |
| Abuso de costos           | Los recursos de IA podrían consumirse sin el control de autorización esperado.                |
| Bypass de la interfaz     | Los controles, indicaciones o barreras de producto solo del frontend podrían omitirse.        |

La severidad sugerida depende de lo que el backend realmente permita:

| Comportamiento confirmado                                                             | Severidad sugerida |
| ------------------------------------------------------------------------------------- | ------------------ |
| La reproducción solo funciona para usuarios que ya tienen autorización                | Media              |
| La reproducción funciona desde vista previa/personalización sin autorización de pago  | Alta               |
| La reproducción funciona para sitios públicos arbitrarios de GitBook sin autorización | Crítica            |
| La reproducción expone documentación privada sin autorización                         | Crítica            |

## Causa raíz

El patrón vulnerable es un error de límite de confianza. Los datos de ejecución visibles para el cliente pueden ayudar a reconstruir la solicitud:

| Material expuesto                | Por qué importa                                                               |
| -------------------------------- | ----------------------------------------------------------------------------- |
| ID de acción del servidor        | Dirige la solicitud a la acción del backend.                                  |
| `spaceId`                        | Identifica el espacio de GitBook.                                             |
| `pageId`                         | Identifica el contexto de la página.                                          |
| Estado RSC/router                | Ayuda a coincidir con la forma esperada de la solicitud de Next.js.           |
| Forma del cuerpo de la solicitud | Muestra cómo está estructurada la llamada al asistente.                       |
| Cookies de sesión del navegador  | Transportan la sesión del usuario si se capturan durante pruebas autorizadas. |

El fallo no es “las acciones del servidor son visibles”. El fallo aparece cuando el backend acepta una solicitud reproducida ensamblada a partir de metadatos observables por el cliente sin volver a comprobar la autorización, la propiedad, el alcance de la vista previa, la validez de la sesión, CSRF/origen y los límites de velocidad.

## Flujo de la PoC

El repositorio contiene una PoC local de Node.js que descubre metadatos de ejecución e inicia un proxy HTTPS local.

```bash
npm start
```

Flujo general:

1. Pide una página de GitBook o una URL de vista previa.
2. Descarga el HTML de la página.
3. Descarga fragmentos de JavaScript de GitBook.
4. Extrae el actual `streamAIChatResponse` ID de acción del servidor.
5. Extraer `spaceId` y `pageId`.
6. Abre Chrome, Chromium o Edge para la autenticación.
7. Guardar los valores de ejecución necesarios en `.env`.
8. Inicia un proxy HTTPS local.

Luego abre:

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

La interfaz local se comunica con:

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

El proxy recrea la solicitud del Asistente de IA de GitBook con encabezados equivalentes a:

```http
accept: text/x-component
content-type: text/plain;charset=UTF-8
next-action: <ID de acción streamAIChatResponse descubierto>
next-router-state-tree: <estado del router>
origin: <origen objetivo de GitBook>
referer: <URL objetivo de GitBook>
cookie: <cookies de GitBook capturadas>
```

Una reproducción exitosa devuelve un flujo de React Server Components que contiene eventos de respuesta de IA. El proxy local analiza la respuesta final y devuelve una respuesta JSON normal para la interfaz de la PoC.

## Señales comunes

| Respuesta                | Significado                                                      |
| ------------------------ | ---------------------------------------------------------------- |
| `400 Solicitud inválida` | El ID de acción del servidor es antiguo o incorrecto.            |
| Flujo RSC con `digest`   | La acción existe, pero el cuerpo o el contexto no son válidos.   |
| `401` / `403`            | Sesión o autorización rechazada.                                 |
| `text/x-component`       | Tipo de contenido esperado del flujo de React Server Components. |

## Requisitos

| Requisito | Notas                                            |
| --------- | ------------------------------------------------ |
| Node.js   | Versión 18 o superior.                           |
| Navegador | Chrome, Chromium o Microsoft Edge.               |
| OpenSSL   | Necesario en `PATH` para material HTTPS local.   |
| SO        | La PoC es compatible con Windows, Linux y macOS. |

## Limpieza

Usa el comando de limpieza del repositorio después de las pruebas:

```bash
npm run stop
```

Limpia los procesos activos de la PoC, los `.env` valores sensibles, los archivos TLS locales generados y el perfil dedicado de autenticación del navegador.

## Remediación

Controles recomendados:

| Control                                                                                   | Propósito                                                                         |
| ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Aplicar la autorización del plan dentro de `streamAIChatResponse`                         | Evitar el bypass de funciones de pago.                                            |
| Tratar `next-action` como metadatos de enrutamiento                                       | Evitar confundir los IDs de acción con la autorización.                           |
| Vincular las llamadas de vista previa a tokens de corta duración emitidos por el servidor | Mantener el acceso de vista previa dentro del alcance de vista previa.            |
| Prevenir la reproducción del token de vista previa                                        | Detener la reutilización externa fuera de la sesión prevista.                     |
| Validar `spaceId` y `pageId` del lado del servidor                                        | Asegurar que el contexto solicitado pertenezca al alcance autorizado.             |
| Rechazar el contexto proporcionado por el cliente que no coincida                         | Evitar el intercambio de contexto.                                                |
| Aplicar CSRF y estrictas `Origin` comprobaciones                                          | Reducir el abuso entre sitios y automatizado.                                     |
| Limitar por usuario, organización, sitio, IP y sesión                                     | Limitar la automatización y el abuso de costos.                                   |
| Supervisar la reproducción automatizada de acciones del servidor                          | Detectar patrones de reproducción no habituales o que no provienen del navegador. |

## Lecciones aprendidas

1. Las funciones de vista previa son límites de seguridad cuando tocan backends de pago o de producción.
2. Los controles del lado del cliente son útiles para la UX, pero no son autorización.
3. Los IDs de acción del servidor de Next.js deben tratarse como detalles de enrutamiento públicos.
4. Las funciones de IA necesitan controles de costo y autorización tanto como controles de acceso a datos.
5. Los informes de bug bounty son más sólidos cuando separan el comportamiento observado, el impacto posible y la remediación recomendada.

## Referencias

* [Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc)
* [README del repositorio](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/blob/main/README.md)
* [Lanzador de la PoC](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/tree/main/scripts)
* [Proxy local](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/es/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.
