Parte: 15 — Seguridad de IA y machine learning · Fuente: Gu, Dolan-Gavitt & Garg, "BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain" (2017) ⏱️ Duración estimada: 120 min · Nivel: Intermedio
Entender cómo un adversario contamina el proceso de aprendizaje —no la inferencia— para degradar el modelo o instalar una puerta trasera. El alumno inyectará un backdoor con un trigger en un clasificador propio, verificará que se activa solo con el trigger, y aplicará técnicas de detección y saneamiento de datos.
⚠️ Ética: el envenenamiento y las puertas traseras se practican solo sobre datasets y modelos propios en laboratorio aislado. Introducir backdoors en modelos de producción o de terceros es un delito.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Envenenamiento de disponibilidad | Degrada la precisión global del modelo |
| 2 | Envenenamiento dirigido | Falla solo en muestras concretas |
| 3 | Puertas traseras (backdoors) y triggers | El modelo se comporta bien salvo con el trigger |
| 4 | BadNets y ataques clean-label | Con o sin control de las etiquetas |
| 5 | Cadena de suministro de ML | Datasets web y modelos preentrenados son vectores |
| 6 | Detección por activaciones | Las muestras envenenadas se agrupan aparte |
| 7 | Defensas: fine-pruning, saneamiento | Eliminar el backdoor sin reentrenar de cero |
pip install adversarial-robustness-toolbox torch torchvision numpy scikit-learn
PoisoningAttackBackdoor) y defensas (ActivationDefence, SpectralSignatureDefense).Sobre datos y modelos propios en laboratorio aislado.
Define un trigger. Un cuadrado blanco de 3×3 en la esquina inferior derecha de la imagen.
Envenena una fracción del train. Toma el 5–10% de las muestras, añade el trigger y cambia su etiqueta a la clase objetivo (p. ej. "7").
python
from art.attacks.poisoning import PoisoningAttackBackdoor
from art.attacks.poisoning.perturbations import add_pattern_bd
backdoor = PoisoningAttackBackdoor(add_pattern_bd)
x_pois, y_pois = backdoor.poison(x_sel, y=target_labels)
Entrena el modelo envenenado mezclando datos limpios y envenenados.
Verifica sigilo. Mide la precisión sobre el test limpio: debe ser casi igual a la del modelo sano.
Activa el backdoor. Añade el trigger a imágenes de test de otras clases y mide cuántas se clasifican como la clase objetivo (Attack Success Rate). Debería ser muy alta.
Detecta con activation clustering.
python
from art.defences.detector.poison import ActivationDefence
defence = ActivationDefence(clf, x_train, y_train)
report, is_clean = defence.detect_poison(nb_clusters=2, reduce="PCA")
Comprueba que marca las muestras con trigger.
Mitiga con fine-pruning. Poda neuronas de baja activación usando solo datos limpios y afina; reevalúa el ASR: debería caer drásticamente.
Documenta la cadena de suministro. Anota de dónde vendrían en la vida real esos datos envenenados (scraping web, contribuciones abiertas, etiquetadores externos).
Entrega un modelo con backdoor funcional y su defensa: código que entrena el modelo envenenado, demuestra ASR ≥ 90% con el trigger y precisión limpia dentro de 1–2 puntos del modelo sano, y un segundo script que reduce el ASR por debajo del 10% mediante una defensa.
Criterio de aceptación: un revisor ejecuta tu ataque y observa alto ASR con precisión limpia intacta; luego ejecuta tu defensa y observa el ASR desplomado. Se adjunta una tabla con las cuatro métricas (precisión limpia y ASR, antes y después).
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El backdoor baja la precisión limpia | Fracción envenenada demasiado alta. Baja el porcentaje; el sigilo es clave. |
| ASR bajo | Trigger poco distintivo o pocos ejemplos. Refuerza el patrón o sube la fracción. |
| Activation clustering no detecta nada | nb_clusters mal fijado o sin reducción de dimensión. Usa PCA/TSNE y 2 clústeres. |
| Fine-pruning no elimina el backdoor | Poda insuficiente. Aumenta el ratio podado y afina con más épocas de datos limpios. |
| Confundir envenenamiento con adversarial | El primero actúa en entrenamiento; el segundo en inferencia. No mezcles defensas. |
❓ ¿Cómo llega un atacante a mis datos de entrenamiento? Mediante datasets scrapeados de la web, contribuciones de la comunidad, etiquetado tercerizado, o modelos preentrenados con backdoor descargados de repositorios públicos.
❓ ¿Un backdoor se ve en las métricas normales? No. El modelo rinde bien en el test limpio; por eso es tan peligroso. Solo se detecta buscando activamente triggers o firmas en las activaciones.
❓ ¿Qué es un ataque clean-label? El atacante perturba las imágenes sin cambiar sus etiquetas, así que una inspección de etiquetas no revela nada. Es más costoso pero mucho más sigiloso.
❓ ¿Sirve reentrenar desde cero como defensa? Solo si los datos limpios están garantizados. Si el dataset base sigue contaminado, reentrenar reintroduce el backdoor. Prioriza el saneamiento y la procedencia verificada.
Clase 292 — Ataques adversariales a modelos