Robo de modelos
Descripción
Los atacantes extraen o replican LLM propietarios mediante abuso de la API, inversión de modelos o acceso no autorizado. Los modelos robados permiten causar daño competitivo y facilitan ataques adicionales.
Riesgo
Los LLM propietarios representan una inversión significativa en datos de entrenamiento, cómputo y ajuste. El robo mediante consultas de extracción de modelos, exfiltración de pesos o abuso de la API de inferencia puede permitir que los competidores repliquen las capacidades sin invertir. Los modelos robados también facilitan el desarrollo de ataques fuera de línea, eluden los límites de tasa y pueden revelar datos de entrenamiento sensibles.
Escenarios de ataque
Un atacante consulta sistemáticamente una API de LLM propietaria con entradas cuidadosamente diseñadas para extraer conocimiento y comportamiento, entrenando un modelo funcionalmente equivalente a una fracción del costo original.
Una persona con acceso interno a los pesos del modelo exfiltra los archivos a almacenamiento externo, vendiendo el modelo propietario a competidores o publicándolo públicamente.
Mitigaciones
Limitación de tasa
Implementar límites de tasa estrictos para prevenir la extracción mediante consultas sistemáticas. Monitorear patrones de acceso inusuales que indiquen intentos de scraping.
Marcas de agua
Incorporar huellas digitales en las salidas del modelo para permitir la detección de copias no autorizadas. Utilizar técnicas que sobrevivan a la destilación del modelo.
Controles de acceso
Restringir el acceso a los pesos y la arquitectura del modelo. Utilizar cifrado para los modelos almacenados y enclaves seguros para la inferencia cuando corresponda.
Monitoreo de consultas
Detectar y bloquear los intentos de extracción de modelos. Buscar patrones como un volumen alto de consultas, cobertura sistemática del espacio de entrada o consultas diseñadas para sondear los límites de decisión.
Ejemplos de código
# Correcto: Monitoreo de consultas para intentos de extracción
from collections import defaultdict
import time
from typing import Optional
class DetectorRoboModelo:
def __init__(self, consultas_maximas=1000, ventana=3600):
self.consultas_maximas = consultas_maximas
self.ventana = ventana
self.historial_consultas = defaultdict(list)
self.umbral_similitud = 0.8
def verificar_consulta(self, id_usuario: str, consulta: str) -> Optional[str]:
ahora = time.time()
# Limpiar consultas antiguas
self.historial_consultas[id_usuario] = [
(t, q) for t, q in self.historial_consultas[id_usuario]
if ahora - t < self.ventana
]
# Verificar volumen
if len(self.historial_consultas[id_usuario]) >= self.consultas_maximas:
return "Límite de tasa excedido - posible intento de extracción"
# Verificar sondeo sistemático
if self._es_sondeo_sistematico(id_usuario, consulta):
return "Sondeo sistemático detectado - acceso bloqueado"
self.historial_consultas[id_usuario].append((ahora, consulta))
return None
def _es_sondeo_sistematico(self, id_usuario: str, consulta: str) -> bool:
# Detectar patrones como búsqueda en cuadrícula del espacio de entrada
pass
Requisitos de evidencia
- Políticas de limitación de tasa y registros de aplicación
- Configuraciones de control de acceso al modelo y registros de auditoría
- Detalles de implementación de marcas de agua (si corresponde)
- Análisis de patrones de consulta y alertas de detección de anomalías
- Registros de respuesta a incidentes por intentos sospechosos de robo