Diseño inseguro de complementos
Descripción
Los complementos y extensiones de LLM aceptan entradas no confiables o carecen de una autorización adecuada. Los complementos inseguros permiten el acceso no autorizado, la exfiltración de datos o la ejecución remota de código.
Riesgo
Los complementos amplían la funcionalidad del LLM, pero a menudo carecen de un endurecimiento de seguridad adecuado. Pueden aceptar salidas del LLM no validadas como entradas confiables, no implementar verificaciones de autorización o exponer capacidades peligrosas sin salvaguardas. Los complementos comprometidos pueden eludir los controles de seguridad centrales del LLM y acceder directamente a sistemas o datos sensibles.
Escenarios de ataque
Un complemento de correo electrónico para un asistente basado en LLM acepta direcciones de destinatarios directamente desde las salidas del modelo sin validación, lo que permite que la inyección de prompts envíe correos de phishing a destinatarios arbitrarios.
Un complemento de ejecución de código ejecuta código generado por el LLM sin sandboxing ni verificaciones de permisos, lo que permite a los atacantes ejecutar comandos arbitrarios en el sistema host mediante la manipulación de prompts.
Mitigaciones
Validación de entradas
Tratar todas las entradas a los complementos como no confiables, incluidas las provenientes del LLM. Validar, sanitizar y aplicar esquemas estrictos para todos los parámetros.
Mínimo privilegio
Otorgar a los complementos los permisos mínimos requeridos. Utilizar cuentas de servicio independientes con acceso restringido a los recursos.
Sandboxing
Ejecutar los complementos en entornos aislados con acceso limitado a la red, el sistema de archivos y el sistema. Utilizar contenedores o máquinas virtuales para lograr un aislamiento sólido.
Confirmación del usuario
Exigir la aprobación explícita del usuario para las acciones de alto riesgo de los complementos, como el envío de correos electrónicos, la ejecución de código o el acceso a datos sensibles.
Ejemplos de código
# Incorrecto: confiar directamente en la salida del LLM
class ComplementoCorreo:
def enviar_correo(self, salida_llm: str):
destinatario = salida_llm # Sin validación
enviar_correo_smtp(destinatario, asunto, cuerpo)
# Correcto: validación de las entradas del complemento
from typing import Optional
import re
class ComplementoCorreoSeguro:
DOMINIOS_PERMITIDOS = ['example.com', 'company.com']
def enviar_correo(self, destinatario: str, asunto: str, cuerpo: str,
id_usuario: str) -> Optional[str]:
# Validar el formato del correo electrónico
if not re.match(r'^[^@]+@[^@]+\.[^@]+$', destinatario):
raise ValueError("Formato de correo electrónico no válido")
# Lista de dominios permitidos
dominio = destinatario.split('@')[1]
if dominio not in self.DOMINIOS_PERMITIDOS:
raise ValueError(f"El dominio {dominio} no está permitido")
# Exigir confirmación del usuario
if not self.usuario_aprobado(id_usuario, destinatario):
return "Aprobación de usuario pendiente"
enviar_correo_smtp(destinatario, asunto, cuerpo)
return "Correo enviado"
Requisitos de evidencia
- Revisiones de diseño de seguridad de complementos y modelos de amenazas
- Validación de entradas y aplicación de esquemas en el código de los complementos
- Configuraciones de sandboxing y permisos
- Flujos de confirmación del usuario para acciones de alto riesgo
- Registros de auditoría de autorización de complementos