Claude Code filtra claves en GitHub: qué es settings.local.json
Por Jorge Graells · 7 de noviembre de 2026 a las 9:11 UTC · 6 min de lectura
La opción "no volver a preguntar" de Claude Code puede guardar contraseñas y claves de API en .claude/settings.local.json. Apiiro ha encontrado 1.122 copias públicas en GitHub con secretos dentro. Qué se sabe y qué hacer.
Claude Code filtra claves en GitHub: qué es settings.local.json
- Tipo
- News
- Autor
- Jorge Graells
- Fecha
- Lectura
- 6 min de lectura
- Materias
Resumen
La opción "no volver a preguntar" de Claude Code puede guardar contraseñas y claves de API en .claude/settings.local.json. Apiiro ha encontrado 1.122 copias públicas en GitHub con secretos dentro. Qué se sabe y qué hacer.
Si usas Claude Code para programar, revisa hoy un archivo: .claude/settings.local.json. Cuando apruebas un comando con la opción "Sí, y no volver a preguntar", la herramienta lo guarda tal cual en ese archivo, con la contraseña o la clave de API que hubiera dentro. La empresa de seguridad Apiiro publicó el 5 de noviembre una investigación1 en la que encontró 1.122 copias públicas de ese archivo en GitHub con al menos un secreto real.
La noticia afecta a cualquier desarrollador o empresa que use Claude Code en sus proyectos, y tiene una solución clara. La iré actualizando si hay datos nuevos.
◢Qué ha pasado
Por defecto, Claude Code pide permiso antes de ejecutar la mayoría de comandos en la terminal. Si eliges "Yes, and don't ask again", la documentación de permisos2 explica que guarda una regla en .claude/settings.local.json, dentro del proyecto, y que esa regla vale para las sesiones siguientes.
A veces la regla es un patrón, como npm test *. Otras veces es el comando exacto que aprobaste. Si le pides que mire por qué falla el login en staging o que lance una migración, el comando que propone lleva la contraseña de la base de datos, porque sin ella no funciona. Al aprobarlo para siempre, esa contraseña queda guardada en texto plano. Según Apiiro1, es un comportamiento de la herramienta y no del modelo: lo reprodujeron con Opus 5.5 y Fable 5.1, los más recientes de Anthropic.
◢¿Por qué acaba en GitHub si es un archivo local?
Claude Code intenta que no salga de tu ordenador. La documentación de configuración3 dice que, la primera vez que escribe ese archivo en un repositorio git, añade **/.claude/settings.local.json a la lista global de exclusiones de git del usuario, así que no publica el archivo por defecto.
El problema es que esa protección vive en la configuración de git de una persona en un ordenador. No se añade al .gitignore del propio proyecto, así que no viaja con él, y no cubre una carpeta que se convierte en repositorio más tarde, un clon en otra máquina ni un archivo que ya estaba subido. Recuerda además que .gitignore no afecta a archivos que git ya sigue: "local" es solo el nombre. Apiiro1 vio que en 539 de los 1.105 repositorios que rastreó, un commit con Claude como coautor había modificado el archivo. Eso no prueba que el asistente metiera cada credencial, pero sí que a menudo es él quien hace el commit.
◢Qué se sabe
Estas son las cifras del informe de Apiiro1, con datos recogidos del 1 al 3 de noviembre:
- ▹Apiiro1 encontró 104.185 copias públicas del archivo en 103.617 repositorios. Un 1,1 %, 1.122 copias, tiene al menos un secreto real, con 1.379 secretos distintos en total.
- ▹Más de un tercio da acceso directo a una base de datos: 379 contraseñas de bases de datos y 122 claves de servicio de Supabase. También hay 43 accesos SSH a servidores públicos, 42 tokens de GitHub, GitLab y npm, y 23 claves de AWS.
- ▹Hay 63 organizaciones afectadas, sobre todo empresas de software. Entre los casos, la clave de administración en la nube de un fabricante de bases de datos, una contraseña de Postgres en Azure de producción y la del dueño de una base de datos de historiales médicos.
- ▹Las versiones antiguas del archivo, que siguen en el historial de git aunque se haya borrado, guardan 734 secretos más en 509 repositorios. Sumando el archivo compartido
.claude/settings.jsony los registros de conversaciones con agentes que se suben a los repositorios, el total llega a 2.539 secretos en 1.994 repositorios. - ▹Los escáneres de secretos habituales no ven muchos casos. Gitleaks marcó 564 de los 1.122 archivos y TruffleHog 643, y 215 no los marcó ninguno de los dos. Casi siempre es una contraseña escrita dentro de un comando, detrás de
PGPASSWORD=osshpass -p, que parece una palabra normal.
iTWire4 y The Hacker News5 recogen las mismas cifras principales.
◢Qué no se sabe
Es un riesgo de exposición, no una brecha demostrada. Apiiro1 no probó ninguna credencial ni contactó con ningún servidor, así que "secreto real" significa que tiene el formato de una clave conocida o apunta a un servidor público, no que funcione. Avisó a las organizaciones el 2 y el 3 de noviembre y solo una ha confirmado que su clave estaba activa. Tampoco se sabe si alguien ha usado ya alguno de esos secretos.
Anthropic no ha respondido en público por ahora. Según Apiiro, los usuarios avisan de este comportamiento en el repositorio de Claude Code desde agosto de 2025, en varias incidencias que no recibieron respuesta y de las que tres se cerraron solas por inactividad o por duplicadas. Conviene saber también que Apiiro vende productos de seguridad para aplicaciones y agentes de IA.
◢Qué hacer si usas Claude Code
El orden importa. Primero se cambian las claves y después se limpia, porque borrar el archivo no borra el historial de git ni las copias en forks.
- ▹Busca
.claude/settings.local.jsony.claude/settings.jsonen los repositorios de tu cuenta o de tu organización, también en el historial de git aunque el archivo ya no esté. - ▹Cambia cada contraseña, token y clave que haya aparecido en esos archivos, aunque creas que nadie lo ha visto.
- ▹Deja de seguir el archivo local con
git rm --cached .claude/settings.local.jsony añádelo al.gitignoredel proyecto, para que la protección viaje con el repositorio. - ▹Abre el archivo en tu propio ordenador, aunque nunca lo hayas subido, y borra las reglas que contengan un secreto. Puede acabar en un paquete npm, una imagen Docker, un zip o una carpeta sincronizada, y el malware que roba credenciales de equipos de desarrollo ya busca este tipo de archivos.
- ▹No escribas secretos dentro de los comandos. Usa variables, como
$DB_URL, que lean de un gestor de secretos, así la regla guarda el nombre de la variable y no el valor. Ojo: escribirDB_PASS=algo comandoen la misma línea sigue metiendo la contraseña en el comando. - ▹Cuando apruebes de forma permanente, mejor un patrón de comandos que un comando exacto.
Si llevas la seguridad de un equipo, trata las carpetas de los agentes de programación (.claude/, .cursor/, .gemini/) como tratas un archivo .env, añade .claude/settings.local.json a las plantillas de .gitignore de la organización y comprueba que tu escáner de secretos también busca contraseñas dentro de comandos y revisa el historial.
◢Lo que deja esta noticia
Los asistentes de programación trabajan con los mismos permisos y los mismos secretos que tú, y guardan cosas en sitios que no siempre miramos. Un botón de comodidad como "no volver a preguntar" acaba creando un archivo con credenciales que nadie revisa.
Ya escribí sobre claves de API de IA robadas y sobre agentes de IA con demasiados permisos: este caso junta los dos problemas. Si tu equipo empieza a usar estas herramientas y quieres que lo haga con criterio, es parte de lo que trabajo en mis formaciones de ciberseguridad e IA.
Documentos relacionados
- News
Ciberataque a Crédit Mutuel Arkéa: entraron por un proveedor
El banco francés Crédit Mutuel Arkéa ha sufrido un ataque que permitió transferencias fraudulentas desde su propia cuenta. Los atacantes entraron por la plataforma de un proveedor. Qué se sabe, qué no y qué aprender.
- Artículo
Phishing con código de dispositivo: qué es y cómo evitarlo
El phishing con código de dispositivo engaña a la víctima para que escriba en la página real de Microsoft un código que ha generado el atacante. Así entra en su cuenta de Microsoft 365 sin contraseña y sin que la verificación en dos pasos lo frene. Se evita bloqueando ese inicio de sesión.
- Artículo
OWASP Top 10 para agentes de IA: los 10 riesgos explicados
El OWASP Top 10 para aplicaciones agénticas recoge los diez riesgos principales de los agentes de IA que actúan por su cuenta: secuestro del objetivo, uso indebido de herramientas, abuso de permisos o agentes descontrolados. Qué significa cada uno y qué revisar en tu empresa.