Contraseñas de Claude Code quedaron escritas en texto plano dentro de un archivo del proyecto, y 1.122 copias de ese archivo terminaron publicadas como secretos en GitHub, a la vista de cualquiera. No hizo falta un atacante ni una orden maliciosa. Bastó un clic de comodidad: el de no volver a preguntar.
La firma de seguridad Apiiro revisó GitHub entre el 1 y el 3 de noviembre y contó 104.185 copias públicas del archivo .claude/settings.local.json, en 103.617 repositorios. El 1,1 %, 1.122 archivos, guarda al menos un secreto real: 1.379 valores distintos entre claves, contraseñas y tokens de servidores públicos. Esas contraseñas de Claude Code y esos secretos en GitHub tocan a 63 organizaciones, casi todas empresas de software. Una de las avisadas confirmó que su clave seguía activa. Entre los casos graves hay un token de producción de Square y la contraseña del propietario de una base de expedientes médicos.
Un clic de comodidad guardó el comando entero
Claude Code, el asistente de programación de Anthropic, pide permiso antes de ejecutar la mayoría de los comandos en la terminal. Al elegir la opción «Yes, and don’t ask again» —sí, y no preguntes otra vez—, guarda una regla de permiso en .claude/settings.local.json, dentro de la carpeta del proyecto, para ejecutar comandos iguales sin volver a consultar.
Algunas reglas quedan como un patrón corto, del tipo npm test. Otras guardan el comando exacto, palabra por palabra. Y ahí nace el problema: si ese comando llevaba una contraseña o un token escrito dentro, el secreto queda guardado igual, en texto plano, como parte de la regla. Los investigadores reprodujeron el comportamiento con Opus 5.5 y Fable 5.1: es una conducta de la herramienta, no del modelo.
La herramienta intenta que el archivo no salga de la computadora: al crearlo dentro de un repositorio, lo anota en la lista global de exclusiones de git de esa máquina. Esa protección vive en los ajustes de una sola persona. Claude Code nunca anota el archivo en el .gitignore propio del proyecto, así que la protección no viaja con el código ni sirve para un archivo que ya entró en el historial. En 539 de los 1.105 repositorios rastreados, un commit con Claude como coautor modificó ese archivo.
No es el primer tropiezo de privacidad de esta herramienta: una nota reciente contó cómo el correo del usuario viajó a otros sitios en el user-agent de Claude Code. Datos que debían quedarse en la máquina terminan fuera.
Borrar el archivo no borra la filtración
Más de un tercio de los secretos abre directo una base de datos. El conteo detalla 379 contraseñas de bases de datos, 43 accesos SSH a servidores públicos —algunos con la contraseña de root en un comando sshpass—, 42 tokens de GitHub, GitLab y npm, 23 claves de AWS y 122 claves de rol de servicio de Supabase. Apiiro comparó 16 agentes de programación y afirma que Claude Code es el único confirmado que guarda el comando completo aprobado en un archivo del proyecto de forma predeterminada.
Quitar el archivo del repositorio no cierra el agujero. El 2 de noviembre, cada archivo con secretos seguía en la rama principal de su repositorio, y en la mitad llevaba allí al menos 217 días. Las versiones viejas guardan 734 secretos más en 509 repositorios, y 211 bifurcaciones cargan los mismos valores del original. Sumando historial, el archivo compartido settings.json y las transcripciones de chat guardadas en repositorios, el total sube a 2.539 secretos en 1.994 repositorios.
Los escáneres habituales tampoco atrapan todo. Apiiro pasó gitleaks y TruffleHog sobre las 104.185 copias: marcaron 564 y 643 de los 1.122 archivos, pero 215 escaparon a los dos. Esos programas buscan formatos de clave conocidos, y una contraseña tras PGPASSWORD= parece una palabra común de terminal.
El aviso venía de antes. Un reporte del 11 de agosto de 2025 ya decía que los comandos aprobados con claves quedaban guardados palabra por palabra en ese archivo. Un bot lo cerró el 3 de enero tras 60 días sin actividad. Apiiro afirma que los cuatro reportes relacionados corrieron la misma suerte, el más reciente cerrado ayer, sin respuesta de Anthropic en ninguno, y la empresa tampoco ha publicado una reacción al estudio.
La salida empieza por rotar, no por borrar. Toca buscar ese archivo en cada repositorio y en su historial, cambiar cada contraseña, token y clave que haya pasado por él, sacarlo del control de versiones con git rm –cached y anotarlo en el .gitignore del proyecto. En la computadora de cada programador hay que abrirlo, aunque nunca se haya publicado, y eliminar cada regla con un secreto dentro.
Otra costumbre evita la próxima filtración: las claves deben vivir en variables de un gestor de secretos, como $DB_URL, para que la regla guardada conserve el nombre y no el valor. Los permisos permanentes conviene aprobarlos como patrones, del tipo Bash(npm run:*), nunca como comandos con credenciales. Las carpetas de los agentes —.claude/, .cursor/, .gemini/— merecen el mismo trato que un archivo .env.
Apiiro no probó si los secretos hallados siguen funcionando ni afirma que alguien los haya usado. El dato que queda es más incómodo que una sospecha: una clave confirmada como activa, 1.122 archivos con contraseñas de Claude Code y secretos en GitHub en la rama principal al 2 de noviembre, y un mecanismo de guardado que sigue activo en la herramienta.
Fuente: Apiiro
