Detector black-box de backdoors (puertas traseras) en modelos de lenguaje
open-weight fine-tuneados. Antes de cargar un modelo de terceros
(HuggingFace, un colega, un marketplace), weightwatch lo escanea y emite un
veredicto: CLEAN / SUSPICIOUS / BACKDOOR, con la firma del trigger y las
técnicas que dispararon.
Cualquiera puede subir un LLM fine-tuneado y afirmar que es seguro. Un modelo con backdoor se comporta con normalidad salvo que su trigger oculto se active — y un usuario sin los datos de entrenamiento ni una referencia limpia no puede detectarlo. weightwatch aplica la técnica output-to-input loop (arXiv:2608.11348) para forzar la activación repetida y revelar la firma.
El barrido de nichos de 2026 (LLM Wiki) midió 75 papers en arXiv que cuantifican el problema de backdoors en modelos open-weight, frente a 0 repos en GitHub para "fine-tuned model backdoor scanner" y 1 para "fine-tuning poisoning detector". La investigación explota; el tooling no existe. weightwatch es la audit-tool de ese sub-nicho (patrón keybound / topowatch aplicado a la cadena de suministro de modelos).
- Detección black-box: sin datos de entrenamiento ni modelo base limpio.
- Dos técnicas combinadas: output-to-input loop (convergencia a firma anómala) + muestras canary (inputs que un backdoor típico dispara).
- Determinista: semilla fija, veredicto reproducible (mismo modelo → mismo reporte, sha256 idéntico).
- Sin red ni claves: el MVP corre contra fixtures sintéticos embebidos; la validación con modelos reales de HF queda para v0.2 (suite lenta, skip sin token).
- Salida JSON + exit codes para integrarse en CI.
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"Nunca uses
--break-system-packages. Usa siempre un venv aislado.
# Escaneo del fixture backdoored (demostración)
weightwatch --fixture backdoored --json
# Escaneo del fixture clean (control)
weightwatch --fixture clean
# Con más iteraciones del loop y salida a archivo
weightwatch --fixture backdoored --iters 20 --out reporte.jsonExit codes: 0 = CLEAN, 1 = BACKDOOR/SUSPICIOUS, 2 = error de entorno.
{
"fixture": "backdoored",
"verdict": "BACKDOOR",
"severity": "high",
"techniques": {
"output_to_input_loop": {"converged": true, "trigger": "<BACKDOOR-ACTIVE>", "score": 1.0},
"canary": {"fired": 5, "total": 5, "score": 1.0}
},
"exit_code": 1
}- Modelos de texto (causal LM) mediante fixtures sintéticos.
- Detección + reporte. La descontaminación (unlearning) queda fuera del MVP.
- La carga de checkpoints reales de HuggingFace y la detección white-box por pesos (probes tipo Sleeper Agents) están en el roadmap (v0.2 / v0.3).
pip install -e ".[dev]"
ruff check src tests
pytest -m "not slow" # fast suite, sin redAGPL-3.0-or-later — Copyright 2026 Pedro Sordo Martínez — amurlaniakea@gmail.com.