> 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

[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 solicitudes para una acción del servidor de Next.js podía reconstruirse a partir de datos de tiempo de ejecución visibles para el cliente y reproducirse a través de un cliente local externo.

{% hint style="success" %}
Estado: corregido. La vulnerabilidad fue reportada a GitBook, y el backend ahora aplica controles del lado del servidor sobre permisos, alcance y sesión. Mantén esta página como un caso de estudio 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 del plan Ultimate de pago. Si una vista de vista previa o de personalización expone metadatos del backend de producción que pueden reproducirse, y el backend no verifica permisos y alcance en el servidor, el problema se convierte en más que una omisión de la UI: puede convertirse en abuso de una función 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 de 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>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 / caso de estudio al estilo bug bounty.                  |
| Primitiva principal   | Reproducción de solicitudes de acciones del servidor.                            |
| Acción del backend    | `streamAIChatResponse`.                                                          |
| Riesgo principal      | Las comprobaciones de permisos y alcance deben realizarse del lado del 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 el permiso 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                                                                                    |
| -------------------------- | ------------------------------------------------------------------------------------------------------- |
| Omisión de función de pago | El Asistente de IA podría usarse fuera de la ruta prevista de la UI del plan Ultimate.                  |
| Abuso de vista previa      | El modo de personalización o vista previa podría exponer metadatos del backend que pueden reproducirse. |
| Automatización             | Las consultas al asistente podrían automatizarse desde un cliente personalizado.                        |
| Abuso de costos            | Los recursos de IA podrían consumirse sin la barrera de permisos esperada.                              |
| Omisión de la UI           | Se podrían omitir controles, prompts o barreras del producto solo del frontend.                         |

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

| Comportamiento confirmado                                                                | Gravedad sugerida |
| ---------------------------------------------------------------------------------------- | ----------------- |
| La reproducción solo funciona para usuarios que ya tienen permisos                       | Media             |
| La reproducción funciona desde vista previa/personalización sin permisos de pago         | Alta              |
| La reproducción funciona para cualquier sitio público arbitrario de GitBook sin permisos | 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 tiempo de ejecución visibles para el cliente pueden ayudar a reconstruir la solicitud:

| Material expuesto                | Por qué importa                                                               |
| -------------------------------- | ----------------------------------------------------------------------------- |
| ID de la 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 problema aparece cuando el backend acepta una solicitud reproducida ensamblada a partir de metadatos observables por el cliente sin volver a comprobar permisos, propiedad, alcance de vista previa, validez de la sesión, CSRF/origen y límites de velocidad.

## Flujo de PoC

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

```bash
npm start
```

Flujo de alto nivel:

1. Solicita 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 `streamAIChatResponse` ID de la acción del servidor.
5. Extrae `spaceId` y `pageId`.
6. Abre Chrome, Chromium o Edge para autenticación.
7. Guarda los valores de tiempo 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>
```

La 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 no válida` | El ID de la acción del servidor es obsoleto 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 rechazadas.                                |
| `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. |

## Limpiar

Usa el comando de limpieza del repositorio después de probar:

```bash
npm run stop
```

Elimina los procesos PoC en ejecución, `.env` valores sensibles, archivos TLS locales generados y el perfil dedicado de autenticación del navegador.

## Remediación

Controles recomendados:

| Control                                                                                   | Propósito                                                                  |
| ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| Aplicar el permiso del plan dentro de `streamAIChatResponse`                              | Evitar la omisión de funciones de pago.                                    |
| Tratar `next-action` como metadatos de enrutamiento                                       | Evitar confundir los IDs de acción con 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                                        | Evitar la reutilización externa fuera de la sesión prevista.               |
| Validar `spaceId` y `pageId` del lado del servidor                                        | Asegurarse de que el contexto solicitado pertenezca al alcance autorizado. |
| Rechazar el contexto no coincidente proporcionado por el cliente                          | Evitar el intercambio de contexto.                                         |
| Aplicar CSRF y `Origin` comprobaciones estrictas                                          | Reducir el abuso cruzado entre sitios y el abuso automatizado.             |
| Limitar por usuario, organización, sitio, IP y sesión                                     | Limitar la automatización y el abuso de costos.                            |
| Monitorear la reproducción automatizada de acciones del servidor                          | Detectar patrones de reproducción no basados en navegador o inusuales.     |

## Lecciones aprendidas

1. Las funciones de vista previa son límites de seguridad cuando interactúan con backends de pago o de producción.
2. Las barreras del lado del cliente son útiles para la UX, pero no son autorización.
3. Los IDs de acciones del servidor de Next.js deben tratarse como detalles públicos de enrutamiento.
4. Las funciones de IA necesitan controles de costos y permisos tanto como controles de acceso a los 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 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/es/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.
