Guías de seguridad

543.699 credenciales publicadas en GitHub seguían funcionando (estudio de 2026): por qué debes revocar, no solo borrar, y qué deben hacer los desarrolladores

Un estudio de 2026 encontró 543.699 credenciales en repositorios públicos que seguían funcionando. Por qué borrar el archivo no basta, y qué hacer: revocar, revisar el uso y reemplazar.

Publicado 2026-10-04 Actualizado 2026-10-04 Última verificación 2026-10-04 14 min de lectura
En esta página

Para quién es esto: desarrolladores que mantienen código en repositorios públicos como GitHub, y empresas que operan APIs. Este artículo reproduce las cifras del estudio de una empresa de seguridad con las palabras propias de este sitio. No explica cómo encontrar credenciales ajenas.

Qué es este estudio (no es un estudio oficial de GitHub)

El 29 de septiembre de 2026, Truffle Security, una empresa de seguridad que vende herramientas de escaneo de secretos, publicó un estudio sobre credenciales dejadas en repositorios públicos. Como proveedor de herramientas de detección, la empresa que lo publica tiene un interés comercial en el tema. Este artículo usa las cifras del estudio tal como se informaron y marca por separado la interpretación de este sitio.

GitHub no filtró nada. Las credenciales fueron escritas en el código y publicadas por los propietarios de cada repositorio. El papel de GitHub es ofrecer funciones de prevención como la protección de push (bloquear los push que contienen secretos), y, como se muestra a continuación, esas funciones cubren un conjunto limitado de tipos.

Cómo funcionó el estudio y cómo leer las cifras

~224,5 M
Repositorios examinados (The Stack v3)
27-28 jul 2026
Cuándo se comprobó si seguían activas
Solo rama por defecto
Sin historial de commits incluido
Autenticada
Qué significa “activa” (no se comprobaron permisos ni abusos)
  • Los datos de origen son The Stack v3, un conjunto de datos de repositorios públicos recopilado por un tercero para entrenar LLM (modelos de lenguaje de gran tamaño). La recopilación cerró el 7 de agosto de 2025.
  • Solo se examinó la rama por defecto (como main) en el momento de la recopilación. No se incluyen commits antiguos, otras ramas ni nada eliminado previamente. No es un escaneo de todo el código público de GitHub.
  • "Activa" significa que el proveedor confirmó que la credencial seguía autenticando el 27-28 de julio de 2026. Algunas pueden haber sido revocadas desde entonces.
  • El tiempo desde la exposición se cuenta desde la fecha de la última modificación del archivo que contiene la credencial. El estudio señala que esto tiende a subestimar la antigüedad real.
  • Algunos tipos se excluyen de ciertas cifras. Las claves de API de Google solo se probaron con Gemini, y las claves privadas no pueden probarse sin el host al que pertenecen, así que ninguna se incluye en las cifras de supervivencia por tipo.

Las cifras: qué quedó y cuánto

543.699
Credenciales únicas activas en el momento de la prueba
~1,1 M
Apariciones totales entre archivos y repositorios
784 días
Mediana del tiempo desde la exposición
Más de 6,3 años
Antigüedad del 10 % más antiguo (el más antiguo es de 2009)

En la semana del 29 de febrero de 2024, GitHub empezó a activar por defecto la protección de push para los push a repositorios públicos de todos los usuarios. Según el estudio, 199.843 (36,8 %) de las 543.699 credenciales activas aparecieron después de esa fecha.

Además, el 51,8 % de las credenciales activas eran cadenas de conexión, claves de API de Google o claves privadas, tipos que la protección de push no bloquea por defecto. En los tipos que la protección de push sí cubre, el número de filtraciones por millón de archivos bajó alrededor de un 53 % al comparar los 12 meses anteriores y posteriores al cambio. Los tipos no cubiertos bajaron solo alrededor de un 7 %. El propio estudio señala que pueden influir otros factores, como que los proveedores de nube empujaran a los clientes hacia credenciales de corta duración durante el mismo periodo.

Cuántas sobrevivieron, por tipo

La siguiente tabla recalcula los porcentajes a partir de los recuentos que publicó el estudio. "Encontradas" es el número de credenciales halladas en las ramas por defecto; "Activas" es cuántas de ellas seguían autenticando en el momento de la prueba.

TipoEncontradasActivasProporción activa
Tokens de npm101.88610,001 %
Tokens de Hugging Face30.437150,05 %
Tokens de GitHub73.0482600,4 %
Tokens de Slack8.9031982,2 %
Claves de Stripe (incluidas las de modo de prueba)124.1324.4933,6 %
Claves de acceso de AWS82.4116.8198,3 %
Tokens de Docker Hub3.7901.24432,8 %
Claves de SendGrid22.8009.18940,3 %
Claves de cuenta de servicio de Google Cloud126.96369.04154,4 %
Cadenas de conexión de MySQL2.4211.80674,6 %
Cadenas de conexión de PostgreSQL12.98511.46588,3 %
Cadenas de conexión de MongoDBNo contabilizadas51.067—

El detector usado para MongoDB solo registra las cadenas con las que logró conectarse, así que no se puede calcular ninguna proporción y el tipo se excluye de las cifras de supervivencia. Solo se informa el recuento de activas.

Por qué los tipos difieren tanto

La diferencia depende menos de lo fácil que es encontrar las credenciales y más de si alguien las detiene después de encontrarlas. Según lo que pudimos confirmar en la documentación oficial de cada proveedor, la situación es la siguiente.

El emisor las detiene automáticamente

  • Tokens de GitHub: GitHub documenta que los tokens válidos subidos a un repositorio público o a un gist se revocan automáticamente
  • Tokens de npm: desde 2019, npm revoca los tokens válidos encontrados a través de GitHub y envía un correo al propietario
  • Hugging Face: un mecanismo oficial permite a cualquiera, no solo al propietario, invalidar un token filtrado

Solo tú puedes detenerlas

  • Cadenas de conexión a bases de datos: no hay emisor; funcionan hasta que cambies la contraseña
  • Muchas claves de API: lo que haga el emisor tras la notificación de GitHub depende de él
  • Claves privadas de tus propios servidores: solo el propietario sabe dónde se usan

El programa de socios de escaneo de secretos de GitHub notifica a los emisores sobre credenciales encontradas en repositorios públicos. La documentación de GitHub recomienda tratar cualquier secreto que informe como público y comprometido, pero deja la implementación en manos del emisor. Es el emisor quien decide si revoca, reemite o contacta al usuario.

Los dos proveedores de nube responden de formas que no equivalen a una revocación completa.

  • AWS: AWS asocia a un usuario de IAM cuya clave de acceso pudo haber sido expuesta una política administrada llamada "AWSCompromisedKeyQuarantineV3". Deniega ciertas acciones, como lanzar instancias o cambiar IAM, pero no elimina la clave. AWS pide a los clientes que no quiten la política y que sigan las instrucciones del caso de soporte que abre.
  • Google Cloud: desde el 16 de junio de 2024, las claves de cuenta de servicio detectadas en lugares como repositorios públicos se desactivan automáticamente por defecto. Las organizaciones pueden optar por no hacerlo (WAIT_FOR_ABUSE) mediante la restricción de política de organización iam.serviceAccountKeyExposureResponse. El estudio encontró que más de la mitad seguían activas; no explica por qué.

Opinión de este sitio: borrar deja copias en otros lugares

El propio estudio usó un conjunto de datos construido en agosto de 2025. Si un propietario borró un archivo después de esa fecha, la credencial sigue en el conjunto de datos. Lo mismo ocurre con los forks, los clones de otras personas, las réplicas y los datos de búsqueda o de entrenamiento de IA.

Por eso, trata "subido a un repositorio público" como "filtrado", e invalida la credencial en el lado del emisor. Reescribir el historial es una limpieza para frenar una mayor difusión.

Tu repositorio

Borrar o reescribir el historial

→

Forks, clones, réplicas

En equipos de otras personas

→

Conjuntos de datos, archivos

Copias del momento de la recopilación

→

Revocada por el emisor

Cada copia deja de funcionar

Adónde llega una credencial subida a un repositorio público. Solo la copia de la izquierda se puede eliminar desde tu propio repositorio.

Si descubres que filtraste una

1

Revoca la clave con el emisor

Desactiva la clave o el token en la consola o la CLI. Para una cadena de conexión a una base de datos, cambia la contraseña de ese usuario o vuelve a crear el usuario. Una breve interrupción cuesta menos que un abuso, así que no lo postergues.
2

Revisa si hubo uso y cargos

Busca actividad que no reconozcas entre la filtración y la revocación: CloudTrail en AWS, Cloud Audit Logs en Google Cloud, y el historial de uso y la factura en el panel de los servicios de envío de correo o de pagos. Si AWS asoció la política de cuarentena o abrió un caso de soporte, sigue sus instrucciones.
3

Emite una clave nueva y reemplázala

No escribas la clave nueva en el código; cárgala desde variables de entorno o un gestor de secretos. Aprovecha para restringir sus permisos, las IP de origen permitidas y la fecha de caducidad.
4

Limpia el historial al final

Elimínala del historial con una herramienta como git filter-repo y haz un force-push. Las copias en forks y en otros equipos permanecen, así que esto no sustituye la revocación.

Si encuentras la clave de otra persona, no la pruebes

Si encuentras una credencial en el repositorio de otra persona, no compruebes si funciona. Avisa al propietario o al emisor. Para los tipos compatibles en repositorios públicos de GitHub, GitHub notifica al emisor.

Cómo prevenir filtraciones

La protección de push ayuda, pero no basta por sí sola. Como muestran las cifras, los tipos que no bloquea por defecto pasan sin control, y los usuarios pueden saltarse un bloqueo eligiendo un motivo. Combínala con lo siguiente.

  • Escanea antes de hacer commit: detén los secretos en tu propia máquina antes del push con un escáner como gitleaks (véase detén los secretos antes de que se confirmen con gitleaks).
  • Escanea el historial de los repositorios antiguos: la protección de push no hace nada con los commits realizados antes de activarla. Escanea al menos una vez el historial completo de los repositorios descuidados y archivados.
  • Usa credenciales de corta duración: GitHub Actions puede conectarse a AWS o Google Cloud mediante OIDC (recibiendo una credencial válida solo por poco tiempo en cada ejecución) en lugar de guardar una clave de larga duración. Hugging Face ofrece el mismo enfoque.
  • Limita lo que puede hacer cada clave: solo lectura, solo APIs específicas, restricciones de IP de origen o de referrer, y una fecha de caducidad. Esto limita lo que una filtración puede costarte.
  • Mantén las bases de datos fuera de internet: una cadena de conexión filtrada es inútil si no se puede alcanzar desde fuera. Las cadenas de conexión a bases de datos fueron el tipo con mayor duración en la tabla.

Los conceptos básicos para mantener los secretos fuera del código están en lo que realmente es peligroso de .env y las claves de API, y los secretos dejados en servidores web se tratan en auditoría de directorios públicos.

Para empresas que operan APIs

Lo que separó la parte superior de la tabla de la inferior fue si el emisor detiene automáticamente las claves filtradas. Como parte que protege las claves de tus usuarios, considera:

  • Unirte al programa de socios de escaneo de secretos de GitHub, y revocar las claves válidas y notificar a los usuarios cuando recibas la notificación
  • Dar a las claves un prefijo distintivo (por ejemplo, uno que empiece por el nombre de tu servicio) para que sean fáciles de detectar
  • Ofrecer un canal o una API mediante la cual cualquiera pueda reportar e invalidar una clave filtrada
  • Hacer que las claves con caducidad y con alcance restringido sean la opción por defecto

Fuentes (registro público)

Las cifras de este artículo proceden de las fuentes públicas siguientes. No hemos reproducido el texto ni los gráficos del estudio; solo usamos sus recuentos y los reorganizamos.

Lectura recomendada

FAQ

Q¿Es este un estudio oficial de GitHub?
A

No. Fue publicado el 29 de septiembre de 2026 por Truffle Security, una empresa de seguridad que ofrece herramientas de escaneo de secretos. GitHub no filtró nada: las credenciales fueron escritas en el código y publicadas por los propietarios de cada repositorio. GitHub ofrece funciones de prevención como la protección de push y el escaneo de secretos, pero cubren un conjunto limitado de tipos de credenciales.

QSubí una clave de API. ¿Basta con borrar el archivo o reescribir el historial?
A

Una vez que haces push a un repositorio público, pueden existir copias en forks, clones de otras personas, réplicas y conjuntos de datos como el usado en este estudio. Borrar el archivo o reescribir el historial no elimina esas copias. El primer paso es revocar la clave con su emisor y emitir una nueva. Limpia el historial después.

Q¿El emisor no revocará automáticamente una clave filtrada?
A

Depende del emisor. La documentación de GitHub indica que los tokens válidos de GitHub subidos a un repositorio público se revocan automáticamente, y npm hace lo mismo con sus tokens desde 2019. Sin embargo, en el programa de socios de escaneo de secretos de GitHub, lo que hace un emisor tras recibir la notificación queda a su criterio. Las credenciales sin un emisor detrás, como las cadenas de conexión a bases de datos, no las detiene nadie.

Q¿La protección de push de GitHub evita esto?
A

En parte. Por defecto, la protección de push bloquea formatos específicos de tokens enumerados en sus patrones compatibles. La lista de patrones de GitHub muestra las claves de API de Google y las cadenas de conexión de MongoDB y PostgreSQL solo como alerta, sin protección de push. Los usuarios también pueden saltarse un bloqueo eligiendo un motivo, o desactivar la función. Combínala con escaneo previo al commit y credenciales de corta duración.

Q¿Qué significa «activa» en el estudio?
A

El estudio emparejó las credenciales por patrón y luego preguntó a cada proveedor si la credencial seguía autenticando los días 27 y 28 de julio de 2026. No comprobó qué permisos tenían ni si fueron abusadas. Algunas pueden haber sido revocadas desde entonces.