Contraseñas y claves de API de desarrolladores han aparecido en repositorios públicos de GitHub después de que Claude Code guardara comandos aprobados que las contenían, según informó The Hacker News, que citaba los hallazgos revelados por Apiiro. La empresa de seguridad encontró secretos en 1.122 copias públicas de .claude/settings.local.json. Recomienda rotar las credenciales expuestas antes de eliminar los archivos, porque las copias pueden sobrevivir en el historial de los repositorios y en las bifurcaciones (forks).
Los hallazgos afectan a desarrolladores y organizaciones que usan el asistente de programación de Anthropic, sobre todo a quienes aprueban comandos que contienen contraseñas de bases de datos, tokens de acceso o claves de nube. Apiiro no comprobó si las credenciales seguían funcionando, aunque una empresa notificada previamente esa misma semana confirmó que su clave estaba activa. Se desconoce si alguien ha utilizado los secretos expuestos.
Cómo una aprobación se convierte en un secreto almacenado
Claude Code normalmente pide permiso antes de ejecutar la mayoría de los comandos de shell. Según describe The Hacker News en su documentación de permisos, al seleccionar «Sí, y no volver a preguntar» se guarda una regla de permiso en el archivo .claude/settings.local.json del proyecto. Los comandos que coincidan con esa regla pueden ejecutarse después, en sesiones posteriores, sin una nueva solicitud.
El permiso guardado puede abarcar un patrón de comando, como npm test *, o un comando exacto. Cuando guarda el comando exacto, las contraseñas y los tokens escritos en él permanecen en texto plano. Apiiro encontró reglas de este tipo en repositorios públicos y reprodujo el comportamiento con los modelos Opus 5.5 y Fable 5.1.
Claude Code cuenta con una salvaguarda contra la confirmación del archivo. Su documentación de configuración indica que, cuando escribe el archivo por primera vez dentro de un repositorio Git, añade la ruta a las exclusiones globales de Git del usuario. Eso hace que Git, en ese equipo, ignore el archivo en todos los repositorios.
Sin embargo, la exclusión forma parte de la configuración de un único usuario en un único equipo. No viaja con el proyecto y, según los investigadores, tampoco protege un archivo que ya se haya confirmado. Claude Code no añade la ruta al .gitignore propio del proyecto, que aporta las reglas compartidas para excluir archivos.
En 539 de los 1.105 repositorios que rastreó Apiiro, una confirmación que nombraba a Claude como coautor modificó el archivo de configuración. Los investigadores interpretaron esto como una señal de que Claude a menudo confirma el archivo por sí mismo.
Qué quedó expuesto
Apiiro buscó en 104.185 copias públicas de .claude/settings.local.json distribuidas en 103.617 repositorios de GitHub. De esos archivos, 1.122 —alrededor del 1,1 %— contenían al menos un secreto, con un total de 1.379 secretos distintos.
Los investigadores contabilizaban un valor cuando coincidía con un formato de clave conocido o cuando aparecía como contraseña o token junto a una dirección de servidor público. Además, un revisor de IA también debía estar de acuerdo con la clasificación.
Más de un tercio de los secretos permitían el acceso directo a bases de datos, incluidas 379 contraseñas de bases de datos. Entre los demás hallazgos había 43 inicios de sesión SSH para el acceso remoto a servidores públicos, 42 tokens para GitHub, GitLab y npm, y 23 claves de AWS.
Entre los propietarios de los archivos había 63 organizaciones, en su mayoría empresas de software de distintos tamaños. Entre los hallazgos más graves, Apiiro destacó la clave de nube de nivel administrador de un proveedor de bases de datos y la contraseña de propietario de una base de datos de historiales médicos.
Hasta el lunes, todos los archivos con secretos seguían en la rama predeterminada de su repositorio, es decir, la rama principal de desarrollo que se muestra por defecto. En la mitad de esos repositorios, el archivo llevaba presente al menos 217 días.
Eliminar el archivo actual no elimina otras vías de exposición. Las versiones anteriores contenían otros 734 secretos en 509 repositorios que no aparecían en ninguna copia actual, generalmente porque el archivo se había borrado. Además, 211 bifurcaciones —copias independientes del repositorio— de 74 repositorios contenían los mismos secretos que sus originales.
Apiiro también encontró secretos en 298 de las 76.011 copias de .claude/settings.json, un archivo de configuración compartido que los equipos confirman de forma intencionada, sobre todo dentro de reglas de permiso. Si se incluyen la configuración compartida, las versiones históricas y los registros guardados de chats de agentes, los investigadores contabilizaron 2.539 secretos en 1.994 repositorios.
De los 16 agentes de programación cuya documentación comparó Apiiro, Claude Code fue el único que se confirmó que guarda por defecto el comando aprobado completo en un archivo del proyecto.
Los escáneres no detectaron las contraseñas de línea de comandos
Apiiro ejecutó los escáneres de secretos Gitleaks y TruffleHog sobre cada copia, sin usar el paso de verificación de las herramientas. De los 1.122 archivos de configuración locales que contenían secretos, Gitleaks marcó 564 y TruffleHog marcó 643. Ninguna de las dos herramientas detectó 215 archivos.
La mayoría de los valores no detectados eran contraseñas incrustadas en comandos. Un escáner que busca un formato de clave reconocible puede pasar por alto una palabra corriente que aparece después de PGPASSWORD=, sshpass -p o mysql -p.
La exposición también puede producirse sin una confirmación en GitHub. El archivo JSON en texto plano se encuentra dentro de la carpeta del proyecto y puede incluirse en un paquete de npm, en una imagen de Docker, en un archivo ZIP o en una carpeta sincronizada. El informe citó el gusano Shai-Hulud, de septiembre de 2025, como ejemplo de malware que busca secretos en equipos de desarrolladores con TruffleHog, herramienta que en el análisis de Apiiro marcó más de la mitad de estos archivos.
Los usuarios ya habían informado de este comportamiento de almacenamiento. Un informe de error del 11 de agosto de 2025 describía comandos aprobados que contenían claves de API y tokens guardados palabra por palabra. Un bot automatizado lo cerró como «no planificado» el 3 de enero, tras 60 días sin actividad. Apiiro afirmó que los cuatro informes relacionados que citó habían sido cerrados por ese mismo bot sin respuesta de Anthropic, y que el último cierre se produjo el día anterior al informe.
Rotar las credenciales antes de limpiar
Apiiro recomienda que los desarrolladores busquen en sus organizaciones de GitHub ambos nombres de archivo de configuración e inspeccionen el historial de Git, incluidos los repositorios en los que los archivos ya no aparecen. Antes de la limpieza, debe rotarse cada contraseña, token y clave que hayan contenido esos archivos.
Después, los desarrolladores deben dejar de rastrear el archivo de configuración local con git rm --cached .claude/settings.local.json y añadir su ruta al .gitignore del repositorio. También deben revisar las copias locales, incluidas las que nunca se confirmaron, y eliminar las reglas que contengan secretos.
Para evitar que se guarden credenciales en futuras aprobaciones, Apiiro recomienda referirse a los secretos mediante variables proporcionadas por un gestor de secretos, como $DB_URL, de modo que la regla guarde solo el nombre de la variable. También recomienda aprobar patrones de comandos, como Bash(npm run:*), en lugar de comandos individuales que contengan valores sensibles.
Los equipos de seguridad deben tratar los directorios de agentes —incluidos .claude/, .cursor/, .gemini/ y .specstory/— y los archivos de memoria de los agentes como posibles almacenes de secretos, igual que los archivos de configuración .env, tanto en portátiles como en repositorios. Apiiro recomienda añadirlos, junto con su historial de Git, a los análisis previos a la confirmación y de integración continua, asegurarse de que los escáneres detecten contraseñas dentro de los comandos e incluir .claude/settings.local.json en las plantillas organizativas de .gitignore. Los investigadores aconsejan priorizar las credenciales asociadas a direcciones de servidores públicos, porque ofrecen una vía de acceso inmediata.




