
Firewall LLM de duas camadas que bloqueia entradas de injeção de prompt por meio de regras regex mais um classificador Gemini, e detecta vazamentos de segredos ou de system prompt nas respostas do bot.
Demo ao vivo: https://prompt-injection-firewall.streamlit.app Vídeo de demonstração de 2 minutos: https://drive.google.com/file/d/1tzb75nFysisrCYa11Lqj6egDs5VNmc2n/view?usp=drivesdk
Um firewall de duas camadas para um bot de suporte baseado em LLM: ele verifica o que os usuários enviam e o que o bot envia de volta.
Os usuários podem tentar substituir as regras de um bot ("ignore as instruções anteriores"), trocar sua persona ou fazê-lo revelar seu prompt de sistema ou segredos. Este projeto bloqueia tais entradas, detecta vazamentos nas respostas do bot e mede o quão bem ele funciona, incluindo onde ele falha.
user input
|
v
[1] Rule layer (regex, fast, free) --match--> BLOCK
|no match
v
[2] LLM classifier (Gemini, JSON output, Pydantic validation, retries, fail-closed) --attack--> BLOCK
|benign
v
AcmeBot (Gemini + system prompt)
|
v
[3] Output check (canary token, secret patterns, system-prompt fragments) --leak--> BLOCK
|clean
v
answer to user
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
copy .env.example .env # then put your Gemini key in .env
python src\run_eval.py dev
python src\eval_output.py dev
python src\compare.py dev
streamlit run app.py # local demo
Modelo usado: gemini-3.1-flash-lite. O nível gratuito pode retornar 503 quando está ocupado; o código aguarda e tenta novamente.
Não execute src\build_cases.py a menos que queira reconstruir data\cases.jsonl (ele o sobrescreve; a mesma seed gera os mesmos casos).
deepset/prompt-injections (Apache-2.0): 12 ataques, 13 benignos. Divisão: 15 dev, 10 ocultos.data/train.parquet está incluído no repositório (fonte: deepset/prompt-injections, Apache-2.0).| Conjunto | Camada | Resultado |
|---|---|---|
| dev | apenas regras | detecção 2/9, falso positivo 0/6 |
| dev | regras + Gemini (final) | detecção 8/9, falso positivo 0/6 |
| dev | verificação de saída (final) | vazamento detectado 4/4, falso positivo 0/4 |
| oculto | regras + Gemini | detecção 3/3, falso positivo 0/7 |
| oculto | verificação de saída | vazamento detectado 3/3, falso positivo 0/1 |
Firewall vs sem firewall:
| Sem | Com | |
|---|---|---|
| dev: ataques que chegam ao bot | 9/9 | 1/9 |
| dev: benignos bloqueados por engano | 0/6 | 0/6 |
| oculto: ataques que chegam ao bot | 3/3 | 0/3 |
| oculto: benignos bloqueados por engano | 0/7 | 0/7 |
O conjunto oculto tem apenas 3 ataques, portanto é um sinal fraco. Dev e oculto são reportados separadamente porque ajustei o prompt do classificador em dev.
O histórico completo com números está em CHANGELOG.md. Em resumo: