
Escanea salidas de LLM y contenido generado por IA en busca de señales de exfiltración de datos (EchoLeak, CVE-2025-32711) antes de que lleguen a los usuarios o a sistemas posteriores
Analiza las salidas de LLM y el contenido generado por IA en busca de señales de exfiltración de datos antes de que lleguen a los usuarios, los registros o los sistemas posteriores.
Las aplicaciones modernas con LLM procesan habitualmente prompts sensibles, documentos internos, respuestas de API y datos de usuario. Eso crea una nueva frontera de seguridad: la capa de salida.
La familia de ataques EchoLeak (incluido CVE-2025-32711) demostró cómo se pueden incrustar payloads ocultos u ofuscados en el texto generado y usarlos para exfiltrar datos a través de herramientas, enlaces o cadenas de análisis.
Los escáneres tradicionales se centran en archivos, dependencias y tráfico en tiempo de ejecución. No inspeccionan la salida generada por el modelo de una manera específicamente diseñada para ello.
exfil-scan proporciona un "escáner de virus para respuestas de LLM":
| Categoría | Gravedad | Qué se detecta |
|---|---|---|
| Texto oculto | ALTA | Secuencias Unicode de ancho cero e invisibles utilizadas para ocultar payloads |
| Datos codificados | ALTA | Secuencias de escapes Base64/hex/octal/unicode que probablemente transportan contenido codificado |
| Datos en URL | MEDIA | Cadenas de consulta sospechosamente largas y payloads codificados en parámetros de URL |
| Fugas de metadatos | ALTA | Claves similares a credenciales y formatos de token en salidas estructuradas/no estructuradas |
| Esteganografía Unicode | MEDIA | Controles bidireccionales y palabras de estilo homoglifo con escritura mixta |
| Anomalías estructurales | BAJA | Secuencias extremas de saltos de línea/tabulaciones y artefactos de codificación con carácter de reemplazo |
low, medium, highstdin, un único archivo o un directoriotext, json, markdown o htmlgit clone https://github.com/your-org/exfil-scan.git
cd exfil-scan
pip install -e .
pip install exfil-scan
pip install -e ".[dev]"
pytest
echo 'api_key: sk-ABCDEFGHIJKLMNOPQRSTUVWXYZ123456' | exfil-scan
exfil-scan --input output.txt
exfil-scan --directory ./model-logs --recursive
Notas:
--input o --directory, no ambos.stdin.1.exfil-scan --input suspicious.txt --format text
Estilo esperado:
exfil-scan report
=================
Scanned targets: 1
Total findings: 2
1. [HIGH] metadata_leaks/known_token_format:openai_key
Location: suspicious.txt:1:10
Description: Matched known credential/token format (openai_key).
exfil-scan --input suspicious.txt --format json
Estructura esperada:
{
"finding_count": 2,
"scanned_targets": ["suspicious.txt"],
"findings": [
{
"category": "metadata_leaks",
"rule": "known_token_format:openai_key",
"severity": "HIGH",
"description": "Matched known credential/token format (openai_key).",
"location": "suspicious.txt:1:10",
"snippet": "..."
}
]
}
exfil-scan --directory ./outputs --recursive --format html --output report.html
Comportamiento esperado:
exfil-scan --input suspicious.txt --format markdown --output report.md
Estilo esperado:
# exfil-scan Report
- Scanned targets: 1
- Total findings: 2
El repositorio incluye default-config.yaml.
Puedes pasar tu propio archivo con --config.
Ajuste de sensibilidad:
low: menos falsos positivos, umbrales más grandesmedium: valores por defecto equilibradoshigh: detecta patrones más sutilesSobrescritura de sensibilidad desde CLI:
exfil-scan --input out.txt --sensitivity high
Puedes añadir tus propios formatos de token y claves de metadatos:
sensitivity: medium
rules:
metadata_keys:
- api_key
- db_password
- internal_token
token_patterns:
custom_jwt: "\\beyJ[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}\\b"
corp_secret: "\\bcorp_[A-Za-z0-9]{24,}\\b"
Luego ejecuta:
exfil-scan --input response.log --config ./my-config.yaml
Responsabilidades de los módulos:
exfil_scan/cli.py: análisis de argumentos, selección de entrada, renderizado de salida y gestión de códigos de salidaexfil_scan/config.py: valores por defecto, carga de YAML, fusión recursiva y normalización de perfilesexfil_scan/scanner.py: seis motores de detección, dataclasses de hallazgos y formato del informetests/test_scan.py: pruebas de regresión de detección y formatos de salidaFlujo de ejecución:
| Código | Significado |
|---|---|
0 | Sin hallazgos (limpio) |
1 | Hallazgos detectados |
2 | Error de ejecución o de argumentos |
Esto hace que la integración en CI sea sencilla:
exfil-scan --directory ./artifacts --recursive --format json --output exfil-report.json
Si se detecta cualquier hallazgo, tu trabajo puede fallar rápidamente basándose en el código de salida 1.
Ejecuta las pruebas:
pytest
La cobertura incluye:
exfil-scan es un escáner heurístico.
Está diseñado para reducir el riesgo y sacar a la luz salidas sospechosas, no para demostrar que el contenido es seguro.
Patrón de despliegue recomendado:
Este proyecto está bajo la Licencia MIT.
Consulta LICENSE para ver los términos completos.
Las contribuciones son bienvenidas. Al abrir un PR, incluye:
| Opción | Tipo | Valor por defecto | Descripción |
|---|
-i, --input | ruta | ninguno | Escanea un archivo de entrada |
-d, --directory | ruta | ninguno | Escanea todos los archivos compatibles de un directorio |
-r, --recursive | indicador | false | Recorre subdirectorios con --directory |
-c, --config | ruta | ninguno | Ruta del archivo de configuración YAML |
-s, --sensitivity | low|medium|high | config/default | Sobrescribe el perfil de sensibilidad |
-f, --format | text|json|html|markdown | text | Define el formato del informe |
-o, --output | ruta | stdout | Escribe el informe renderizado en un archivo |
--version | indicador | n/a | Muestra la versión de la CLI |
-h, --help | indicador | n/a | Muestra el uso y los argumentos |