
Firewall LLM de dos capas que bloquea entradas de inyección de prompts mediante reglas regex más un clasificador Gemini, y detecta fugas de secretos o de system-prompt en las respuestas del bot.
Demo en vivo: https://prompt-injection-firewall.streamlit.app Video de demostración de 2 minutos: https://drive.google.com/file/d/1tzb75nFysisrCYa11Lqj6egDs5VNmc2n/view?usp=drivesdk
Un firewall de dos capas para un bot de soporte basado en LLM: comprueba lo que los usuarios envían y lo que el bot devuelve.
Los usuarios pueden intentar anular las reglas de un bot ("ignora las instrucciones anteriores"), cambiar su personalidad o hacer que revele su prompt de sistema o secretos. Este proyecto bloquea dichas entradas, detecta filtraciones en las respuestas del bot y mide su eficacia, incluidos los casos en los que falla.
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. El nivel gratuito puede devolver 503 cuando está ocupado; el código espera y reintenta.
No ejecutes src\build_cases.py a menos que quieras reconstruir data\cases.jsonl (lo sobrescribe; la misma semilla genera los mismos casos).
deepset/prompt-injections (Apache-2.0): 12 ataques, 13 benignos. División: 15 dev, 10 ocultos.data/train.parquet está incluido en el repositorio (fuente: deepset/prompt-injections, Apache-2.0).| Conjunto | Capa | Resultado |
|---|---|---|
| dev | solo reglas | detección 2/9, falso positivo 0/6 |
| dev | reglas + Gemini (final) | detección 8/9, falso positivo 0/6 |
| dev | comprobación de salida (final) | filtración detectada 4/4, falso positivo 0/4 |
| oculto | reglas + Gemini | detección 3/3, falso positivo 0/7 |
| oculto | comprobación de salida | filtración detectada 3/3, falso positivo 0/1 |
Firewall frente a sin firewall:
| Sin | Con | |
|---|---|---|
| dev: ataques que llegan al bot | 9/9 | 1/9 |
| dev: benignos bloqueados erróneamente | 0/6 | 0/6 |
| oculto: ataques que llegan al bot | 3/3 | 0/3 |
| oculto: benignos bloqueados erróneamente | 0/7 | 0/7 |
El conjunto oculto solo tiene 3 ataques, por lo que es una señal débil. Dev y oculto se reportan por separado porque ajusté el prompt del clasificador con dev.
El historial completo con cifras está en CHANGELOG.md. En resumen: