Reconhecimento
Entender stack, superfície real, dependências e onde a IA entrou no ciclo.
✓ Checklist executável
- Mapear stack tecnologico e componentes externos (frameworks, hosting, CDN)
- Localizar arquivos de configuração de IA: .cursor/rules, .copilot/, system_prompt.txt, mcp.json
- Enumerar rotas com feroxbuster ou ffuf — focar em /api/, /admin/, /internal/, /_next/
- Checar histórico git inteiro por credenciais e prompts vazados (não só o HEAD)
- Identificar dependências de LLM: openai, anthropic, langchain, litellm, @vercel/ai
- Documentar quais fluxos tocam o modelo: onde user input entra no prompt, quais tools o agente pode chamar
$ Comandos por ferramenta
feroxbuster -u https://alvo.com -w /usr/share/wordlists/dirb/common.txt -x js,json,env,md -o rotas.txt
Adicione -H 'Authorization: Bearer TOKEN' para testes autenticados
trufflehog filesystem . --only-verified --json | tee secrets.json
Remove --only-verified para capturar candidatos não confirmados também
gitleaks detect --source . --report-format json --report-path gitleaks.json
Verifica todo o histórico git, não só o working tree
find . -name 'mcp.json' -o -name '.cursorrules' -o -name 'system_prompt*' -o -name 'CLAUDE.md' 2>/dev/null
Esses arquivos frequentemente contem o system prompt completo do agente
grep -rn 'openai|anthropic|langchain|litellm|@ai-sdk' package.json requirements*.txt 2>/dev/null
Mapeie versões exatas para verificar CVEs conhecidos
! Armadilhas comuns
- Ignorar .cursor/rules e CLAUDE.md — frequentemente contem o system prompt completo da aplicação
- Assumir superfície igual a apps sem IA — vibe-coded apps abrem endpoints de debug e introspection
- Checar só o HEAD do git — LLMs geram commits com chaves hardcoded que ficam no histórico
- Focar só em REST e ignorar WebSocket, SSE e gRPC — comuns em interfaces de chat em tempo real
- Nao mapear dependências transitivas — pacotes de LLM puxam dependências com CVEs críticos
› Saída esperada
[feroxbuster] 200 GET /api/v1/chat (endpoint de LLM confirmado) [feroxbuster] 403 GET /api/admin/settings (existe mas requer auth) [feroxbuster] 200 GET /api/debug/env (!) endpoint de debug exposto [trufflehog] VERIFIED openai_api_key em .env.local linha 4 [find] ./mcp.json (configuração de ferramentas do agente) [find] ./.cursor/rules (system prompt do Cursor)
Como criar um scanner de footprint para apps vibe-coded
- Clone o repositorio e mapeie onde variaveis de ambiente sao consumidas: grep -r 'process.env|os.environ' src/ --include=*.ts --include=*.py
- Extraia todos os arquivos que fazem chamadas a LLMs: grep -rl 'openai.chat|anthropic.messages|completion.create' . --include=*.py --include=*.ts
- Para cada arquivo encontrado, trace o caminho do user input ate a chamada de LLM — esse e o vetor de prompt injection
- Use o script abaixo para encontrar concatenações de string suspeitas em contextos de prompt
- Exporte um grafo de fluxo: user_input → sanitização? → concatenação → LLM call — o gap de sanitização e o achado
import ast
import os
import sys
PROMPT_KEYWORDS = {"prompt", "system", "message", "instruction", "context"}
def find_prompt_concat(filepath):
with open(filepath, encoding="utf-8", errors="ignore") as f:
try:
tree = ast.parse(f.read())
except SyntaxError:
return
for node in ast.walk(tree):
# Detect string concatenation (str + var) near prompt-related names
if isinstance(node, ast.BinOp) and isinstance(node.op, ast.Add):
left_is_str = isinstance(node.left, (ast.Constant, ast.JoinedStr))
if left_is_str:
yield filepath, node.lineno
for root, dirs, files in os.walk("."):
dirs[:] = [d for d in dirs if d not in ["node_modules", ".git", "__pycache__", "dist"]]
for fname in files:
if fname.endswith(".py"):
path = os.path.join(root, fname)
for fpath, lineno in find_prompt_concat(path):
print(f"{fpath}:{lineno} — possível concatenação em prompt")