Guía 12

Seguridad de bots: tokens, permisos, webhooks, entradas y respuesta a incidentes

Un bot guarda una credencial que puede hablar por ti ante miles de personas. La mayoría de incidentes son tokens filtrados, comprobaciones de autorización ausentes o un manejo inseguro de lo que escriben los usuarios.

Guía4 min de lecturaActualizado

Modelo de amenazas en cinco preguntas

  1. ¿Qué puede hacer el token? ¿Leer todos los mensajes? ¿Publicar en todos los canales? ¿Expulsar miembros? Ese es el radio de daño de una fuga.
  2. ¿Quién puede hablar con el bot? ¿Cualquiera en internet, miembros de un servidor, empleados?
  3. ¿Qué toca el bot? Bases de datos, APIs de pago, sistemas internos, el sistema de archivos, URLs proporcionadas por usuarios.
  4. ¿Qué datos guarda? Mensajes, teléfonos, archivos, conversaciones con IA.
  5. ¿Cómo sabrías que lo están usando mal? Registros, alertas, volumen inusual.

Secretos

  • Guarda los tokens en variables de entorno cargadas desde un gestor de secretos (secretos de Workers, gestores en la nube, Vault, secretos cifrados de CI). Nunca en el código, imágenes Docker, código del cliente ni capturas de pantalla.
  • Usa tokens distintos para desarrollo y producción; mejor aún, bots distintos.
  • Analiza repositorios y registros de CI con Gitleaks, TruffleHog o el secret scanning de GitHub; pasa el asistente de tokens antes de pegar registros en cualquier sitio.
  • Rota ante cualquier sospecha y cuando se vaya alguien con acceso. Conoce los pasos de rotación de cada plataforma antes de necesitarlos.
  • Cifra en reposo los tokens por cliente (por ejemplo, tokens OAuth de Slack por espacio de trabajo).

Mínimo privilegio

  • Pide los permisos e intents mínimos de Discord, scopes de Slack y permisos de Meta. Nunca pidas Administrator "por si acaso".
  • Da al usuario de base de datos del bot acceso solo a las tablas que necesita.
  • Ejecuta el proceso como usuario sin privilegios y, si es posible, con sistema de archivos de solo lectura.

Verifica todo lo que llega

  • Verifica firmas o cabeceras secretas de webhooks en cada petición (consulta APIs y webhooks).
  • Rechaza marcas de tiempo antiguas para evitar repeticiones.
  • No expongas endpoints de administración o depuración en el mismo host público sin autenticación.

Autorización

El fallo lógico más común en bots es una comprobación de permisos que falta.

  • Identifica a los usuarios por IDs numéricos estables, nunca por nombre visible o de usuario, que se pueden cambiar o suplantar.
  • Comprueba la autorización en cada comando y en cada clic de botón, no solo cuando se mostró el botón.
  • En chats de grupo, verifica el rol de administrador con la API de la plataforma en el momento de la acción.
  • Limita el acceso a datos al usuario o cliente que pide en la propia consulta: WHERE tenant_id = ?.

Trata la entrada como hostil

  • Inyección: usa consultas parametrizadas; nunca construyas SQL, comandos de shell o rutas de archivo con el texto de un mensaje.
  • Marcado: escapa el texto del usuario antes de insertarlo en HTML, Markdown, Block Kit o embeds; configura allowed_mentions en Discord para que nadie haga que el bot mencione a todos.
  • Expresiones regulares: limita la longitud de la entrada y evita patrones catastróficos (pruébalos con el probador de regex).
  • Comandos: usa listas de permitidos para subcomandos y formatos de argumentos.

SSRF: cuando el bot descarga URLs

Las vistas previas de enlaces, "resume esta página" y las herramientas de imágenes descargan URLs que dan los usuarios. Un atacante puede apuntarlas a http://169.254.169.254/ (metadatos de la nube), paneles en localhost o servicios internos. Defiéndete así:

  • Permite solo http y https, y resuelve tú el nombre de host para bloquear rangos privados, de loopback y link-local (vuelve a comprobar tras cada redirección).
  • Fija tiempos de espera cortos, límites de tamaño y de redirecciones.
  • Ejecuta los descargadores en una red aislada sin acceso a sistemas internos.

Archivos

Comprueba tamaño y tipo por contenido, no por extensión; guarda las subidas fuera de la raíz web con nombres aleatorios; analízalas si las sirves a otros; y nunca ejecutes ni descomprimas archivos no confiables sin límites.

Riesgos propios de la IA

La inyección de prompts puede convertir cualquier texto en instrucciones. Aplica los permisos en el código, exige confirmación para acciones con consecuencias, deja los secretos fuera de los prompts y sanea la salida del modelo antes de mostrarla. Más detalles en chatbots de IA y agentes.

Registros y privacidad

Registra IDs y tipos de evento, hashes de ID de usuario, resultados y latencia. No registres tokens, cuerpos completos de mensajes, teléfonos ni conversaciones con IA salvo que tengas un motivo y un periodo de retención. Haz que /borrar o /stop borren los datos de verdad.

Cadena de suministro

Fija dependencias con un lockfile, activa Dependabot o equivalente, prefiere bibliotecas bien mantenidas y revisa los scripts de instalación. Un paquete malicioso en el árbol de dependencias puede robar el token en la primera ejecución.

Respuesta a incidentes

  1. Revoca el token o la URL del webhook de inmediato y despliega uno nuevo.
  2. Contén: desactiva los comandos afectados o desconecta el bot.
  3. Investiga: ¿qué hizo el token durante la exposición? Revisa los registros de auditoría de la plataforma.
  4. Notifica a los dueños de servidores o usuarios afectados si se expusieron sus datos y cumple las obligaciones legales.
  5. Corrige la causa y añade una prueba o un análisis que lo hubiera detectado.

Comprueba lo aprendido

1. ¿Cómo identificar a los usuarios para autorizar?
2. ¿Cuál es el primer paso tras filtrarse un token?