Ciberseguridad

Claude Code dejó expuestas contraseñas en 1,122 archivos públicos de GitHub

Susan Hill
Añádenos en Google

Anthropic’s Claude Code pide permiso antes de ejecutar la mayoría de los comandos de shell, y una de las respuestas disponibles es «Sí, y no volver a preguntar». Si eliges esa opción para un comando que contiene una contraseña, como los datos de acceso a una base de datos, Claude Code puede guardar el comando completo —incluida la contraseña— en un archivo de configuración de texto sin formato dentro de tu proyecto. Ahora, investigadores de seguridad encontraron miles de esas contraseñas y claves en repositorios públicos de código en GitHub, donde cualquiera puede leerlas.

Si usas Claude Code, el archivo que debes buscar se llama settings.local.json. Está dentro de una carpeta oculta llamada .claude, en la raíz del repositorio, y acompaña al proyecto adondequiera que este vaya, a menos que lo impidas. El comportamiento es el mismo en todos los países donde está disponible la herramienta. Cambiar tus hábitos toma un minuto, mientras que limpiar las consecuencias de una contraseña filtrada lleva mucho más tiempo, porque borrar el archivo no lo elimina del historial de Git ni de las bifurcaciones que hayan hecho otras personas.

La empresa de seguridad de software Apiiro buscó en GitHub público y encontró 104,185 copias del archivo en 103,617 repositorios, según su investigación, reportada por The Hacker News. Cerca del 1.1%, o 1,122 copias, contiene al menos un secreto, para un total de 1,379 credenciales distintas. Más de un tercio permitiría acceder directamente a una base de datos; entre ellas hay 379 contraseñas de bases de datos. El conjunto también incluye 43 accesos SSH a servidores públicos, 42 tokens para GitHub, GitLab y npm, y 23 claves de Amazon Web Services.

Los propietarios no son solo aficionados. Apiiro rastreó los archivos hasta 63 organizaciones, en su mayoría empresas de software de distintos tamaños, y entre los casos más graves encontró la clave de nube con privilegios de administrador de un proveedor de bases de datos y la contraseña del propietario de una base de datos de historiales clínicos. Las versiones antiguas del archivo que siguen en el historial de Git contienen otros 734 secretos repartidos en 509 repositorios, y 211 bifurcaciones de 74 repositorios conservan los mismos secretos que los originales. Si se suman el archivo de configuración compartido que los equipos suben deliberadamente y los registros guardados de chats con agentes, la cifra asciende a 2,539 secretos en 1,994 repositorios.

Claude Code sí intenta evitar que el archivo quede bajo control de versiones. La documentación de configuración de Anthropic indica que, la primera vez que la herramienta escribe el archivo, agrega una regla a las exclusiones globales de Git del usuario, para que Git lo ignore en esa computadora. Esa regla no se traslada con el proyecto a la laptop de un compañero, a un servidor de compilación o a una máquina nueva, y tampoco sirve de nada si el archivo ya se había subido al repositorio. En 539 de los 1,105 repositorios que los investigadores rastrearon, un commit que incluía a Claude como coautor modificó el archivo, lo que sugiere que a menudo el propio agente lo sube. De los 16 agentes de programación cuya documentación comparó Apiiro, Claude Code es el único que, según se confirmó, guarda de forma predeterminada el comando completo aprobado en un archivo del proyecto.

Las medidas de seguridad habituales no detectan buena parte del problema. Apiiro ejecutó dos populares herramientas de código abierto para buscar secretos, gitleaks y TruffleHog, en todas las copias: gitleaks detectó 564 de los 1,122 archivos, TruffleHog encontró 643 y 215 pasaron inadvertidos para ambas. La mayoría de los casos que no detectaron eran contraseñas escritas después de PGPASSWORD=, sshpass -p o mysql -p, que parecen palabras comunes para una herramienta que busca formatos de clave conocidos.

Los hallazgos vienen con algunas salvedades. Apiiro vende herramientas de seguridad para el desarrollo asistido por IA, así que la investigación también funciona como argumento de venta. No comprobó si las credenciales todavía sirven, aunque una de las empresas a las que avisó confirmó que su clave había estado activa. Un valor se contabilizó como secreto cuando coincidía con un formato de clave conocido o cuando aparecía junto a la dirección de un servidor público y un revisor de IA coincidía en que lo era; esto deja cierto margen para falsos positivos. Apiiro también señala que la cifra de commits con Claude como coautor no demuestra que Claude haya introducido todas las credenciales expuestas. Y GitHub es solo la parte visible: como el archivo es un JSON de texto sin formato dentro de la carpeta del proyecto, también puede terminar incluido en un paquete de npm, una imagen de Docker, un archivo zip o una carpeta sincronizada.

La primera recomendación de los investigadores es rotar las credenciales: cambia todas las contraseñas, los tokens y las claves que alguna vez hayan aparecido en el archivo antes de limpiar nada, porque un secreto que fue público ya debe considerarse comprometido, reescribas o no el historial. Después, deja de rastrear el archivo con git rm –cached, agrégalo al .gitignore propio del repositorio y abre /permissions dentro de Claude Code para eliminar cualquier regla guardada que contenga un secreto. Si haces referencia a las credenciales mediante variables de entorno, una regla guardada conserva un nombre como $DB_URL en lugar de la contraseña; y aprobar patrones en vez de comandos puntuales evita por completo que los argumentos literales queden en el archivo.

Los usuarios ya habían señalado este problema. Un reporte de error presentado el 11 de agosto de 2025 indicaba que los comandos aprobados con claves de API y tokens se guardaban palabra por palabra en settings.local.json; un bot automatizado lo cerró como «no está previsto» el 3 de enero, después de 60 días sin actividad. Apiiro, que publicó sus hallazgos el 6 de noviembre, afirma que los cuatro reportes relacionados que cita fueron cerrados por el mismo bot, el más reciente el 6 de noviembre, sin que Anthropic respondiera. Al 2 de noviembre, todos los archivos expuestos que encontró seguían en la rama principal de sus respectivos repositorios; en la mitad de los casos, llevaban ahí al menos 217 días.

Ni The Hacker News ni Apiiro reportan haber recibido una respuesta de Anthropic, y el comportamiento descrito no ha cambiado: la próxima vez que elijas «no volver a preguntar» para un comando que incluya una contraseña escrita directamente, esa contraseña también quedará guardada.

Etiquetas: , , , , ,

Añádenos en Google

Debate

Hay 0 comentarios.