¿Se filtró el token de tu bot? Qué hacer ahora

Restablece el token ahora: en Discord, pestaña Bot del Portal de Desarrolladores, botón Reset Token; en Telegram, el comando /token en BotFather. Después confirma que el valor filtrado dejó de funcionar.

Actualizado el 7 min de lectura

Objetivos de aprendizaje

Después de leer este artículo podrás:

  • Invalidar el token filtrado antes de que alguien lo use
  • Descubrir qué pudo haber hecho un atacante con el bot
  • Cambiar el token en el hosting y evitar una nueva filtración
En esta página

El token del bot es su contraseña. Quien lo tiene entra en Discord o en Telegram como tu bot, sin necesitar nada más: ni usuario, ni código de verificación. Si apareció en un repositorio público, en una captura de pantalla, en un log o en una conversación, trátalo como comprometido desde ese momento.

La corrección principal toma un minuto. Lo que demora es descubrir qué se hizo con el token y asegurarte de que el nuevo no se filtre de la misma forma.

Se filtrórepositorio, captura, log o chat1Restablecer el tokenPortal de Discord o @BotFather2Actualizar en el hostingvariable de entorno y reiniciar3Auditar el servidorregistro de auditoría y webhooks4Limpiar el historial de Gital final: es higiene, no seguridadventanade riesgobot fuerade línea
Restablecer primero cierra la ventana de riesgo; el bot queda fuera de línea solo hasta actualizar el hosting.

¿Qué hacer en los primeros minutos?#

Sigue este orden. No empieces por limpiar el repositorio.

  1. Restablece el token. Es el único paso que deja inútil el valor filtrado.
  2. Actualiza el token nuevo donde corre el bot y reinicia el proceso.
  3. Audita el servidor o el chat en busca de acciones que tú no hiciste.
  4. Limpia el código y el historial de Git.
  5. Corrige la causa para que el próximo token no se filtre.

Cuanto antes hagas el paso 1, menor será la ventana de ataque. Hay robots que escanean los repositorios públicos buscando tokens, así que no esperes.

¿Cómo restablecer el token del bot?#

Discord#

En el Portal de Desarrolladores, abre tu aplicación, entra en la pestaña Bot y haz clic en Reset Token y confirma. Eso invalida todos los tokens antiguos del bot, según la guía de discord.js. Copia el nuevo valor en el momento y guárdalo directamente en la variable de entorno.

Después del restablecimiento el bot queda fuera de línea hasta que actualices el token en el lugar donde corre. Eso es lo esperado.

Telegram#

Abre una conversación con @BotFather y envía /token. La documentación de Telegram indica ese comando cuando el token está comprometido o se perdió. Elige el bot y BotFather te devuelve un token nuevo. Otra opción está en /mybots: elige el bot, luego API Token y Revoke current token. En cualquier caso, confirma después que el token antiguo fue rechazado (mira más abajo).

¿Discord o GitHub invalidan el token por mí?#

No dependas de eso. GitHub tiene un patrón de secret scanning para el token de bot de Discord (discord_bot_token), marcado como patrón de socio y con soporte de push protection. El token de bot de Telegram (telegram_bot_token) aparece en la lista sin socio y sin push protection. Detalles en la lista de patrones de GitHub.

Incluso para Discord, la documentación no garantiza que el token se restablezca automáticamente, y la detección solo vale para repositorios de GitHub. Un token pegado en una captura, en un canal de soporte o en un log no pasa por ese filtro.

¿Qué puede hacer un atacante con el token?#

Todo lo que el bot puede hacer, limitado por los permisos que tiene en los servidores. La guía de discord.js enumera el riesgo típico: spam en todos los servidores del bot, MD masivos, borrar canales, expulsar o banear miembros y hacer que el bot salga de los servidores.

Por eso el daño depende de los permisos. Un bot con Administrador puede todo; un bot que solo lee y responde mensajes hace mucho menos. Es un buen motivo para darle al bot solo lo necesario.

Restablecer el token no deshace lo que ya se hizo. Tampoco elimina lo que el atacante creó y que no depende del token, como los webhooks: la URL de un webhook lleva su propio token, así que sigue funcionando hasta que se borra, según la documentación de webhooks.

¿Cómo saber si alguien usó el token?#

En Discord#

Abre los ajustes del servidor y mira el Registro de auditoría. Las entradas se guardan durante 45 días, y la documentación de Discord dice que hace falta el permiso VIEW_AUDIT_LOG para verlas. Busca:

  • canales, roles o invitaciones creados o borrados que no reconoces;
  • webhooks nuevos (borra los sospechosos);
  • miembros baneados o expulsados sin motivo;
  • cambios de permisos en los roles.

Revisa también la lista de servidores donde está el bot. Si hay un servidor desconocido, saca el bot de ahí.

Confirmar que el token antiguo dejó de funcionar#

Prueba si el token filtrado todavía se acepta. La API de Discord recibe el token en el encabezado Authorization: Bot, como describe la referencia de la API:

bash
OLD_TOKEN="pegalo-aqui"
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Authorization: Bot $OLD_TOKEN" \
  https://discord.com/api/v10/users/@me

200 significa que el token sigue siendo válido y el restablecimiento no se aplicó. 401 (no autorizado) es el resultado esperado de un token invalidado. En Telegram, la prueba equivalente es el método getMe de la Bot API, que debe responder 401 para el token antiguo:

bash
curl -s -o /dev/null -w "%{http_code}\n" "https://api.telegram.org/bot$OLD_TOKEN/getMe"

Después de la prueba, limpia el historial de la terminal.

¿Cómo cambiar el token sin dejar el bot caído mucho tiempo?#

La clave es tener un solo lugar donde vive el token. Si está repartido en varios archivos, vas a olvidarte de alguno.

  1. Lee el token de una variable de entorno, nunca de un string en el código:
js
// index.js (discord.js v14)
import { Client, Events, GatewayIntentBits } from "discord.js";

const token = process.env.DISCORD_TOKEN;
if (!token) throw new Error("DISCORD_TOKEN no está definida");

const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, () => console.log(`En línea como ${client.user.tag}`));
client.login(token);
  1. Actualiza el valor de la variable en el hosting y en el .env local.
  2. Reinicia el bot y revisa el log.

Si el bot no vuelve, mira por qué el bot de Discord queda fuera de línea: un token antiguo olvidado en otro entorno (pruebas, CI, otra máquina) es una causa común.

¿Cómo limpiar el repositorio después?#

Solo después de restablecerlo. La documentación de GitHub dice que, si el dato es una credencial, revocarla o cambiarla puede bastar, y reescribir el historial no siempre es necesario.

Primero descubre dónde está el token en el historial:

bash
git log --all -S"parte-del-token" --oneline

Si se subió un .env entero, GitHub documenta git-filter-repo (versión 2.47 o más reciente) con --sensitive-data-removal:

bash
git-filter-repo --sensitive-data-removal --invert-paths --path .env
git push --force --mirror origin

Eso cambia los hashes de los commits, elimina las firmas y no borra los forks ni los clones de otras personas. El paso a paso completo, con las precauciones, está en clave de API expuesta en GitHub. Como el token ya se restableció, esta limpieza es higiene, no seguridad.

¿Cómo evitar que el token se filtre de nuevo?#

Cómo hacerlo en Square Cloud#

En Square Cloud, los pasos 2 y 3 del cambio (actualizar el valor y reiniciar) ocurren en el mismo lugar, sin tocar el código. El token vive en una variable de entorno de la aplicación, como el DISCORD_TOKEN del ejemplo, que editas en el panel, con la API, con la extensión de VS Code o con la CLI, usando app env set y después app restart. El cambio se aplica en el siguiente reinicio, sin rebuild, y ninguna otra aplicación de la misma cuenta puede leer ese valor.

Para confirmar que volvió, abre los logs en tiempo real en el panel, la CLI, VS Code o la app del celular y busca la línea En línea como ... del ejemplo. Si seguiste el consejo de un token por entorno, cada aplicación (pruebas y producción) tiene sus propias variables, así que cambiar el token de una no tumba la otra. El panel también importa un .env y exporta el conjunto como KEY=VALUE; deja el archivo fuera del ZIP y del repositorio, para que el token solo exista ahí.

El restablecimiento en sí sigue haciéndose en el Portal de Discord o en BotFather, y la auditoría del servidor también es tuya. Mira cómo funcionan las variables de entorno y qué ofrece la plataforma para bots.

Infraestructura

Mitigación de DDoS L3/L4/L7 y WAF en todos los planes

Más información

Preguntas frecuentes

¿Borrar el commit con el token lo resuelve?

No. Git guarda el historial, y el token puede haberse copiado en forks, clones y robots de escaneo. Solo restablecer el token cierra la puerta.

¿Discord invalida el token por su cuenta cuando aparece en GitHub?

No cuentes con eso. GitHub tiene un patrón para tokens de bot de Discord y avisa al socio, pero la documentación no promete el restablecimiento. Restablécelo tú.

¿Y si se filtró el token de Telegram?

Habla con @BotFather y usa el comando /token para generar uno nuevo. La documentación de Telegram indica ese comando para un token comprometido o perdido.

¿Tengo que crear un bot nuevo?

Normalmente no. Restablecer el token mantiene el mismo bot, en los mismos servidores. Solo actualiza el valor donde corre el bot y reinícialo.

Siguiente artículo¿Qué es un ataque DDoS y cómo funciona?Un ataque DDoS ocurre cuando miles de máquinas inundan un servidor con tráfico hasta tumbarlo. Conoce los tres tipos, cómo funciona y cómo detectarlo.

Más en Seguridad

Ver los 10 artículos