Instruções no Wiki: Caçando uma Prompt Injection Indireta
O desafio
Wren é o assistente interno da Fernpath. Ele responde a partir de um export de wiki com dez documentos e responde instantaneamente, exceto em perguntas sobre despesas, em que três pessoas nesta semana o viram fazer uma pausa e uma delas viu o navegador alertar sobre uma requisição de saída. Nada mudou na configuração do Wren. A base de conhecimento dele mudou, ontem à noite. Em algum lugar desses dez documentos há um texto que fala com o assistente e não com um colega, e não está em nenhuma das duas páginas que tratam abertamente de prompt injection. Encontre o documento envenenado e diga o nome do arquivo.
O que você vai aprender
- Explicar como a prompt injection indireta chega ao modelo por meio de conteúdo recuperado
- Usar um log de sincronização para reduzir um corpus aos documentos alterados recentemente
- Reconhecer marcação que não renderiza nada mas é indexada por completo
- Distinguir exemplos de injeção citados como referência de uma instrução ativa
- Conectar um assistente com acesso a ferramentas ao caminho de exfiltração que ele cria
Habilidades testadas
Pré-requisitos
- O que faz um assistente de retrieval-augmented generation (RAG)
- Navegação básica em shell
Como funciona
Um assistente de retrieval responde colando documentos dentro de um prompt. Quando isso acontece, o modelo não tem como distinguir de forma confiável a configuração do operador de uma frase que alguém digitou no wiki, porque no momento em que ele as lê, ambas são o mesmo tipo de texto na mesma janela de contexto. Isso é prompt injection indireta: o atacante nunca fala com o modelo, ele escreve algo que o modelo vai receber depois.
O que transforma isso de curiosidade em incidente são as ferramentas. Um assistente que só conversa perde, na pior das hipóteses, algum texto. Um assistente com fetch_url tem um canal de saída, e anexar a pergunta do colega a uma URL basta para exfiltrar o que quer que ele tenha perguntado, uma consulta de cada vez, enquanto as respostas continuam úteis o suficiente para que ninguém investigue.
O esconderijo é a parte que vale a pena lembrar. Renderização e indexação são pipelines diferentes. Comentários HTML, texto branco, caracteres de largura zero, spans fora da tela, texto alternativo e metadados do documento renderizam como nada para uma pessoa e entram no índice por completo. Revisar o wiki em um navegador nunca teria encontrado essa página.
Erros comuns
- Responder security-awareness.md. Ele contém três strings de injeção, citadas como exemplo com uma instrução explícita de não tratá-las como instruções. É a página que vence qualquer busca por palavra-chave, e é exatamente por isso que ela está aqui.
- Responder wren-faq.md. Ele documenta a política sobre se o Wren deve obedecer a documentos. Escrever sobre a regra não é quebrá-la.
- Fazer grep pela palavra ignore. A injeção real é educada, plausível e nunca usa nenhuma das frases que as pessoas esperam.
- Ler o wiki renderizado. O payload está dentro de um comentário HTML. Um navegador não mostra nada ali.
- Pular o log de sincronização. Um documento mudou, dobrou de tamanho e foi escrito por uma conta de automação. Isso já é a maior parte da investigação em um único arquivo.
Como se proteger
Trate o conteúdo recuperado como dado que nunca pode virar instrução.
- Remova antes da indexação o que um leitor não consegue ver: comentários HTML, caracteres de largura zero, elementos ocultos e metadados. Se não renderiza, não deveria ser incorporado.
- Coloque em allowlist os hosts que
fetch_urlpode acessar e registre cada chamada com o documento que a disparou. O WREN-88 está aberto desde março, e é por isso que essa injeção tinha para onde mandar dados. - Gere alertas para mudanças em documentos indexados feitas por contas de automação, e para qualquer documento cujo tamanho salte bruscamente entre sincronizações.
- Exija uma segunda verificação, fora do modelo, antes de uma chamada de ferramenta feita com base em texto recuperado, e mostre ao usuário toda requisição de saída que o assistente faz.
- Não gire nada e não entre em pânico até saber a janela de tempo: o log de sincronização dá o horário exato em que o documento mudou, e os logs de fetch dão as perguntas que vazaram.