> 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 GitBook AI Assistant

Estudo de caso de PoC de replay de ação de servidor do GitBook AI Assistant cobrindo um risco corrigido de bypass de entitlement, replay em modo de pré-visualização, impacto, notas de detecção e remediação.

[Jordanmacia/gitbook-ai-chat-replay-poc](https://github.com/Jordanmacia/gitbook-ai-chat-replay-poc) documenta um problema corrigido do GitBook AI Assistant em que o fluxo de solicitação de uma action de servidor do Next.js podia ser reconstruído a partir de dados de runtime visíveis no 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 permissã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 ao vivo.
{% 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 do backend de produção reproduzíveis, e o backend não verifica a permissão e o escopo no servidor, o problema se torna mais do que uma bypass de UI: ele pode virar abuso de recurso pago, abuso de 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 Assistente exposto na interface de personalização do GitBook.</p></figcaption></figure>

## Vídeo PoC

{% 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.                           |
| Ação de backend     | `streamAIChatResponse`.                                                    |
| Risco principal     | As verificações de permissã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 no JavaScript do lado do cliente, mas não deve atuar como autorização. O backend ainda precisa verificar de forma independente a permissão do plano, a propriedade do site, os limites de prévia/sessão, as restrições de CSRF/origin 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 UI pretendido do plano Ultimate.        |
| Abuso de prévia        | O modo de personalização ou prévia poderia expor metadados do backend reproduzíveis.        |
| Automação              | As consultas do Assistente poderiam ser automatizadas a partir de um cliente personalizado. |
| Abuso de custo         | Recursos de IA poderiam ser consumidos sem a barreira de permissão esperada.                |
| Bypass de UI           | Controles, prompts ou barreiras do produto apenas no frontend poderiam ser ignorados.       |

A severidade sugerida depende do que o backend realmente permite:

| Comportamento confirmado                                                     | Severidade sugerida |
| ---------------------------------------------------------------------------- | ------------------- |
| A reprodução só funciona para usuários que já têm permissão                  | Média               |
| A reprodução funciona a partir da prévia/personalização sem permissão paga   | Alta                |
| A reprodução funciona para quaisquer sites públicos do GitBook sem permissã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 do backend.                            |
| `spaceId`                      | Identifica o espaço do GitBook.                                              |
| `pageId`                       | Identifica o contexto da página.                                             |
| Estado RSC/roteador            | Ajuda a corresponder a forma esperada da solicitação do Next.js.             |
| Forma do corpo da solicitação  | Mostra como a chamada do assistente é estruturada.                           |
| Cookies da sessão do navegador | Carregam a sessão do usuário se forem capturados durante testes autorizados. |

O bug não é "as actions de servidor são visíveis". O bug aparece quando o backend aceita uma solicitação reproduzida montada a partir de metadados observáveis pelo cliente sem revalidar permissão, propriedade, escopo de prévia, validade da sessão, CSRF/origin 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 de alto nível:

1. Solicite uma página do GitBook ou uma URL de prévia.
2. Baixe o HTML da página.
3. Baixe os chunks JavaScript do GitBook.
4. Extraia o atual `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.

Então abra:

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

A interface local se comunica com:

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

O proxy recria a solicitação do GitBook AI Assistant com headers 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 roteador>
origin: <origem do GitBook alvo>
referer: <URL do GitBook alvo>
cookie: <cookies do GitBook capturados>
```

Uma reprodução bem-sucedida retorna um stream de React Server Components contendo eventos de resposta da IA. O proxy local processa a resposta final e devolve 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 são inválidos.       |
| `401` / `403`              | Sessão ou autorização rejeitada.                                |
| `text/x-component`         | Tipo de conteúdo esperado do stream de React Server Components. |

## Requisitos

| Requisito | Notas                                            |
| --------- | ------------------------------------------------ |
| Node.js   | Versão 18 ou superior.                           |
| Navegador | Chrome, Chromium ou Microsoft Edge.              |
| OpenSSL   | Necessário em `PATH` para arquivos HTTPS locais. |
| 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 processos em execução da PoC, valores sensíveis, `.env` valores, arquivos TLS locais gerados e o perfil dedicado de autenticação do navegador.

## Remediação

Controles recomendados:

| Controle                                                                    | Finalidade                                                               |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| Imponha a permissão do plano dentro de `streamAIChatResponse`               | Impedir bypass de recurso pago.                                          |
| 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.                  |
| Impedir a reprodução do token de prévia                                     | Bloqueie o reuso externo 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 divergente fornecido pelo cliente                          | Impedir troca de contexto.                                               |
| Imponha CSRF e estritas `origem` verificações                               | Reduza o abuso cruzado entre sites e por scripts.                        |
| 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 incomuns ou não provenientes do navegador. |

## Lições aprendidas

1. Recursos de prévia são fronteiras de segurança quando interagem com backends pagos ou de produção.
2. Barreiras no cliente são úteis para UX, mas não são autorização.
3. IDs de actions de servidor do Next.js devem ser tratados como detalhes públicos de roteamento.
4. Recursos de IA precisam de controles de custo e permissão tanto quanto de controles de acesso a dados.
5. Relatórios de bug bounty são mais fortes quando separam comportamento observado, impacto possível e 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 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/pt-br/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.
