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

# PoC de replay do Assistente de IA do GitBook

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) documenta um problema corrigido no GitBook AI Assistant em que o fluxo de solicitação para uma action de servidor do Next.js podia ser reconstruído a partir de dados de runtime visíveis ao cliente e reproduzido por meio de um cliente local externo.

{% hint style="success" %}
Status: corrigido. A vulnerabilidade foi reportada ao GitBook, e o backend agora aplica controles de autorização, escopo e sessão no lado do servidor. Mantenha esta página como um estudo de caso histórico de bug bounty, não como um guia de exploração em produção.
{% endhint %}

## Por que isso importa

O GitBook apresenta o AI Assistant como um recurso pago do plano Ultimate. Se uma visualização de prévia ou personalização expõe metadados de backend de produção reproduzíveis, e o backend não verifica autorização e escopo no servidor, o problema se torna mais do que um bypass de interface: ele pode se tornar abuso de recurso pago, abuso por automação e, potencialmente, abuso de custo 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>AI Assistant apresentado como parte do preço do 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 prévia do Assistant exposto na interface de personalização do GitBook.</p></figcaption></figure>

## PoC em vídeo

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

## Resumo da descoberta

| Área                | Notas                                                                        |
| ------------------- | ---------------------------------------------------------------------------- |
| Product             | GitBook AI Assistant.                                                        |
| Tipo de pesquisa    | Divulgação responsável / estudo de caso no estilo bug bounty.                |
| Primitiva principal | Reprodução de solicitação de action de servidor.                             |
| Action de backend   | `streamAIChatResponse`.                                                      |
| Risco principal     | As verificações de autorização e escopo devem acontecer no lado do servidor. |
| Status              | Corrigido pelo GitBook.                                                      |

A lição importante é simples: um ID de action de servidor pode estar visível em JavaScript do lado do cliente, mas ele não deve atuar como autorização. O backend ainda precisa verificar de forma independente a autorização do plano, a propriedade do site, os limites de prévia/sessão, as restrições de CSRF/origem e os limites de taxa.

## Impacto

| Área de impacto        | O que poderia dar errado                                                                    |
| ---------------------- | ------------------------------------------------------------------------------------------- |
| Bypass de recurso pago | O AI Assistant poderia ser usado fora do caminho de interface pretendido do plano Ultimate. |
| Abuso de prévia        | O modo de personalização ou prévia poderia expor metadados de backend reproduzíveis.        |
| Automação              | As consultas do Assistant poderiam ser automatizadas a partir de um cliente personalizado.  |
| Abuso de custo         | Os recursos de IA poderiam ser consumidos sem a barreira de autorização esperada.           |
| Bypass de interface    | Controles, prompts ou barreiras do produto apenas no frontend poderiam ser ignorados.       |

A gravidade sugerida depende do que o backend realmente permite:

| Comportamento confirmado                                                       | Gravidade sugerida |
| ------------------------------------------------------------------------------ | ------------------ |
| A reprodução só funciona para usuários já autorizados                          | Média              |
| A reprodução funciona a partir da prévia/personalização sem autorização paga   | Alta               |
| A reprodução funciona para quaisquer sites públicos do GitBook sem autorização | Crítica            |
| A reprodução expõe documentação privada sem autorização                        | Crítica            |

## Causa raiz

O padrão vulnerável é um erro de limite de confiança. Dados de runtime visíveis ao cliente podem ajudar a reconstruir a solicitação:

| Material exposto                  | Por que isso importa                                                      |
| --------------------------------- | ------------------------------------------------------------------------- |
| ID da action de servidor          | Encaminha a solicitação para a action de backend.                         |
| `spaceId`                         | Identifica o espaço do GitBook.                                           |
| `pageId`                          | Identifica o contexto da página.                                          |
| Estado do RSC/router              | Ajuda a corresponder à forma esperada da solicitação do Next.js.          |
| Estrutura do corpo da solicitação | Mostra como a chamada do Assistant é estruturada.                         |
| Cookies da sessão do navegador    | Transportam a sessão do usuário se capturados durante testes autorizados. |

O bug não é “as actions de servidor são visíveis”. O problema aparece quando o backend aceita uma solicitação reproduzida montada a partir de metadados observáveis no cliente sem revalidar autorização, propriedade, escopo de prévia, validade da sessão, CSRF/origem e limites de taxa.

## Fluxo da PoC

O repositório contém uma PoC local em Node.js que descobre metadados de runtime e inicia um proxy HTTPS local.

```bash
npm start
```

Fluxo em alto nível:

1. Peça uma página do GitBook ou uma URL de prévia.
2. Baixe o HTML da página.
3. Baixe os chunks de JavaScript do GitBook.
4. Extraia o `streamAIChatResponse` ID da action de servidor.
5. Extraia `spaceId` e `pageId`.
6. Abra o Chrome, Chromium ou Edge para autenticação.
7. Armazene os valores de runtime necessários em `.env`.
8. Inicie um proxy HTTPS local.

Depois abra:

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

A interface local conversa com:

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

O proxy recria a solicitação do GitBook AI Assistant com cabeçalhos equivalentes a:

```http
accept: text/x-component
content-type: text/plain;charset=UTF-8
next-action: <id da action streamAIChatResponse descoberto>
next-router-state-tree: <estado do router>
origin: <origem alvo do GitBook>
referer: <URL alvo do GitBook>
cookie: <cookies capturados do GitBook>
```

Uma reprodução bem-sucedida retorna um stream de React Server Components contendo eventos de resposta da IA. O proxy local analisa a resposta final e retorna uma resposta JSON normal para a interface da PoC.

## Sinais comuns

| Resposta                   | Significado                                                       |
| -------------------------- | ----------------------------------------------------------------- |
| `400 Solicitação inválida` | O ID da action de servidor está desatualizado ou incorreto.       |
| Stream RSC com `digest`    | A action existe, mas o corpo ou o contexto é inválido.            |
| `401` / `403`              | Sessão ou autorização rejeitada.                                  |
| `text/x-component`         | Tipo de conteúdo esperado para stream de React Server Components. |

## Requisitos

| Requisito | Notas                                           |
| --------- | ----------------------------------------------- |
| Node.js   | Versão 18 ou mais recente.                      |
| Navegador | Chrome, Chromium ou Microsoft Edge.             |
| OpenSSL   | Necessário em `PATH` para material HTTPS local. |
| SO        | Windows, Linux e macOS são suportados pela PoC. |

## Limpeza

Use o comando de limpeza do repositório após os testes:

```bash
npm run stop
```

Ele limpa os processos da PoC em execução, valores sensíveis, `.env` valores, arquivos TLS locais gerados e o perfil dedicado de autenticação do navegador.

## Remediação

Controles recomendados:

| Controle                                                                    | Propósito                                                        |
| --------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| Imponha a autorização do plano dentro de `streamAIChatResponse`             | Impeça o bypass de recursos pagos.                               |
| Trate `next-action` como metadados de roteamento                            | Evite confundir IDs de action com autorização.                   |
| Vincule chamadas de prévia a tokens de curta duração emitidos pelo servidor | Mantenha o acesso de prévia dentro do escopo de prévia.          |
| Impeça a reprodução do token de prévia                                      | Evite reutilização externa fora da sessão pretendida.            |
| Valide `spaceId` e `pageId` no lado do servidor                             | Garanta que o contexto solicitado pertença ao escopo autorizado. |
| Rejeite contexto fornecido pelo cliente que não corresponda                 | Impeça a troca de contexto.                                      |
| Imponha CSRF e `Origin` verificações estritas                               | Reduza abuso cross-site e automatizado.                          |
| Aplique limite de taxa por usuário, organização, site, IP e sessão          | Limite automação e abuso de custo.                               |
| Monitore a reprodução automatizada de actions de servidor                   | Detecte padrões de reprodução não via navegador ou incomuns.     |

## Lições aprendidas

1. Recursos de prévia são barreiras de segurança quando interagem com backends pagos ou de produção.
2. Barreiras no lado do cliente são úteis para UX, mas não são autorização.
3. IDs de action de servidor do Next.js devem ser tratados como detalhes públicos de roteamento.
4. Recursos de IA precisam de controles de custo e autorização tanto quanto de controles de acesso a dados.
5. Relatórios de bug bounty são mais fortes quando separam o comportamento observado, o impacto possível e a remediação recomendada.

## Referências

* [Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc)
* [README do repositório](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc/blob/main/README.md)
* [Inicializador da 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/pt-br/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.
