Ciberseguridad

Claude Code filtró contraseñas en 1.122 repos públicos de GitHub

Apiiro encontró 2.539 secretos reales en 1.994 repos públicos: la opción «no volver a preguntar» de Claude Code guardaba comandos con contraseñas.

Claude Code filtró contraseñas en 1.122 repos públicos de GitHub - Facialix
Anuncios

La opción «sí, y no volver a preguntar» de Claude Code guardó comandos con contraseñas y claves dentro de un archivo que termina en GitHub.

La firma de seguridad Apiiro encontró 2.539 secretos reales en 1.994 repositorios públicos, y Anthropic ya reconoció que estudia cómo evitar que vuelva a pasar.

Cómo una contraseña termina en un archivo de configuración

Cuando pides a Claude Code revisar una base de datos o llamar a una API, el comando que propone lleva la contraseña que está en tu archivo de configuración.

La herramienta pregunta antes de ejecutarlo. Si eliges «sí, y no volver a preguntar», guarda ese comando exacto, con el secreto incluido, en .claude/settings.local.json, dentro de la carpeta del proyecto.

El archivo está pensado para quedarse en la máquina del desarrollador. Claude Code lo agrega al gitignore global, no al .gitignore del repositorio. Esa diferencia importa: si la carpeta se convierte en repo después, si alguien clona el proyecto o si el archivo ya estaba rastreado, la protección no aplica.

Los números: 1.122 archivos y 1.379 secretos

Apiiro revisó 104.185 copias públicas de ese archivo en 103.617 repositorios. 1.122 archivos (1,1%) tenían un secreto real: 636 claves de proveedor y 743 contraseñas o tokens de hosts públicos.

Sumando el historial de git, el archivo compartido settings.json y las transcripciones de agentes, el total llega a 2.539 secretos distintos en 1.994 repos. Entre ellos hay 379 contraseñas de bases de datos, 122 claves service-role de Supabase, 43 credenciales SSH, 23 claves de AWS y 6 claves privadas.

Por qué los escáneres no lo ven

Los escáneres buscan formatos de clave: un prefijo de proveedor, una cadena larga y aleatoria. Una contraseña escrita después de PGPASSWORD= o sshpass -p parece una palabra cualquiera dentro de un comando.

Gitleaks marcó 564 de los 1.122 archivos; TruffleHog, 643. Ninguno de los dos detectó 215.

La respuesta de Anthropic

Boris Cherny, responsable de Claude Code, respondió en Hacker News el 7 de noviembre. «Históricamente Claude Code no ha hecho limpieza de secretos… estamos viendo qué podemos hacer para evitarlo», escribió.

También dijo que prototiparán formas de «asegurarnos de que el modo automático detecte esto» y «construir escaneo básico de secretos», sin fecha de entrega.

Cuatro reportes de usuarios en GitHub sobre el mismo comportamiento fueron cerrados por un bot sin respuesta de Anthropic, según The Hacker News.

Qué hacer si usas Claude Code

  • Rota primero, limpia después. Borrar el archivo no elimina el secreto del historial, los forks ni los clones.
  • Si está rastreado: ejecuta git rm --cached .claude/settings.local.json y agrégalo al .gitignore del repositorio.
  • Revisa el archivo local aunque nunca lo hayas subido: cada regla guarda un comando completo.
  • Deja de escribir secretos en comandos. Usa $VAR desde tu gestor de secretos y aprueba patrones como Bash(npm run:*), no comandos literales.

El problema no es que Claude Code sea malicioso. Es que la opción más cómoda para dejar de ver confirmaciones guarda, palabra por palabra, lo que menos deberías guardar.

Si tu equipo usa agentes de código, revisar esa carpeta debería entrar en el mismo checklist que el archivo .env. Ya pasó antes con un gusano que usó a Claude Code para robar contraseñas.

Avatar photo
Sobre el autor

Julio Del Angel

Redactor en Facialix

Ingeniero en Sistemas, egresado del Instituto Tecnológico Superior de Pánuco (TecNM), Veracruz. Especializado en desarrollo de software, tecnología e inteligencia artificial. Fundador y editor de Facialix, donde analiza noticias, avances científicos y oportunidades educativas.

Ver todos sus artículos →

Deja un comentario