Lendo um segredo vazado dentro do system prompt de um LLM
O desafio
Você tem um shell numa máquina que roda um chatbot da empresa. O operador escreveu um segredo direto no prompt de sistema do modelo, achando que os usuários nunca o veriam. Encontre o arquivo do prompt de sistema no disco, leia-o e envie o segredo embutido nele.
O que você vai aprender
- Localizar de onde o servidor de inferência carrega o system prompt
- Seguir um caminho de configuração até o arquivo de system prompt no disco
- Ler um segredo que o operador embutiu no texto do prompt
- Usar grep para encontrar um valor marcado em todo o diretório do modelo
- Explicar por que um system prompt não pode guardar segredos com segurança
Habilidades testadas
Pré-requisitos
- Familiaridade com comandos básicos de shell (ls, cat, grep)
- Saber que um LLM é guiado por um system prompt
- Entender que um arquivo de configuração pode apontar para outros arquivos
Como funciona
Um system prompt é a instrução fixa que uma aplicação insere no início de cada conversa com um modelo de linguagem - tom, regras e contexto que o modelo deve seguir. Como o usuário final nunca o digita e a interface de chat nunca o exibe, os operadores às vezes o tratam como um canal privado e escondem segredos dentro dele: flags internas, chaves de API, códigos de escalonamento. Essa suposição é a vulnerabilidade que este desafio explora.
O system prompt precisa vir de algum lugar, e em uma implantação real quase sempre é um arquivo que o servidor lê na inicialização. Aqui, config.json especifica system_prompt_path: /opt/model/system_prompt.txt, e serve.py abre exatamente esse caminho. Qualquer pessoa com acesso de leitura ao host de inferência pode usar cat no arquivo e ver cada palavra que o operador achava estar escondida, incluindo a linha The internal escalation flag is HDNA{prompts_are_not_secrets}.
Mesmo sem um shell, um system prompt vaza informações. Os modelos podem ser induzidos a repetir suas instruções por meio de prompt injection ou de pedidos simples no estilo de engenharia social, então um segredo no prompt está a uma mensagem bem construída de distância de qualquer usuário do chatbot. A lição é direta: um system prompt guia o comportamento, ele não guarda segredos. Qualquer coisa colocada nele deve ser tratada como legível tanto pelos operadores do host quanto, na prática, pelos usuários do modelo.
Erros comuns
- Tratar o system prompt como algo privado. Os usuários nunca o digitam, mas é apenas um arquivo de texto no disco e pode ser extraído do modelo por indução - ele não esconde nada.
- Abrir os pesos em vez do prompt. A flag é texto em
system_prompt.txt, não no bináriomodel.safetensors. - Não perceber o apontador na configuração.
config.jsonindicasystem_prompt_path; ignorá-lo significa ter que adivinhar onde o prompt está. - Passar direto pela linha marcada. O operador rotulou o valor como a flag interna de escalonamento - essa linha é a resposta, não o horário de suporte ao lado dela.
Como se proteger
Segredos nunca devem viver dentro de um prompt. As correções mantêm as credenciais totalmente fora do contexto do modelo:
- Armazene segredos reais em um gerenciador de segredos ou variável de ambiente e referencie-os a partir do código da aplicação, nunca dentro do texto do system prompt.
- Faça a aplicação impor ações sensíveis no lado do servidor - o modelo deve pedir ao backend que verifique a identidade da equipe, e não guardar uma flag de escalonamento que ele possa revelar.
- Restrinja o acesso de leitura ao host de inferência e ao arquivo do prompt para que um ponto de apoio inicial não exponha o prompt imediatamente.
- Adicione testes de prompt injection às verificações de release para confirmar que o modelo não vaza suas instruções sob demanda.
Se um segredo foi colocado em um prompt, rotacione-o e remova-o do prompt - assuma que ele já foi lido tanto por qualquer pessoa no host quanto por qualquer usuário que perguntou ao modelo da forma certa.