Saltar al contenido
← Volver
Codigo abiertoApache-2.0

Veltron Onopen

Mira que se ejecuta cuando abres un repositorio.

Clonas algo, o un agente lo clona por ti, y lo abres. Antes de leer una linea, una tarea de VS Code puede dispararse, un hook de agente puede lanzar una shell, un servidor MCP puede descargar y ejecutar un paquete que ningun lockfile fija.

Si abro esto, que se ejecuta en mi maquina?

onopen
$ onopen ./unknown-repo
!.vscode/tasks.jsonrunOn: folderOpencurl -fsSL https://…/i.sh | sh
!.claude/settings.jsonhook SessionStartnode -e "require('https')…"
!.claude/settings.jsonmcp server: helpernpx -y unpinned-helper@latest
!.devcontainer/devcontainer.jsoninitializeCommandbash -c 'cat ~/.gitconfig | curl…'
!package.jsonpreinstallnode -e "eval(Buffer.from(…))"
~.githooks/pre-commithook scriptcurl -fsSL https://…/stage2 | sh
·package.jsondependenciesgit+https://…/internal-tools.git
5 execution paths before you type a line · 1 deferred, 1 to note

Salida real de onopen sobre un repositorio de prueba.

Lo medimos

25.0% de los repositorios mas populares de GitHub ejecutan algo antes de que leas una linea.

De los que traen configuracion de un agente de IA, el 62.3%. Escaneamos 9,997 repositorios sin clonar ni ejecutar ninguno, y publicamos el programa y los datos.

Leer el estudio

Instalacion

Tres formas de tenerlo

Onopen 0.4.0 esta publicado. No hay que compilar nada a mano, ni crear una cuenta, ni aceptar terminos.

Desde crates.io
cargo install onopen --locked

Compila desde la fuente con las versiones exactas del lockfile.

Binario ya construido
cargo binstall onopen

Descarga el binario del release en lugar de compilarlo. Linux, macOS Intel, macOS ARM y Windows.

En tu CI
uses: NULVEC/onopen@v0

Los hallazgos llegan a la pestana Security de GitHub, sobre el diff que alguien ya esta leyendo.

Cada binario del release lleva checksums y attestation de procedencia de GitHub: se puede comprobar que salio del commit que dice y no de la maquina de nadie. Una herramienta cuyo argumento es que sepas que vas a ejecutar no tiene por que pedirte que te fies.

El hueco

La configuracion tambien ejecuta

Los escaneres de dependencias leen codigo y versiones. Una parte creciente de los ataques de cadena de suministro no vive ahi: vive en la configuracion, que casi todas las herramientas tratan como texto inerte.

  • VS Code, Cursor, Claude Code, Gemini CLI, npm, Composer y Bundler aceptan archivos de configuracion que pueden llevar un comando de shell.
  • Varios lo ejecutan al abrir la carpeta o al arrancar una sesion de agente, detras de un aviso de confianza que casi nadie lee.
  • La superficie de los agentes aparecio hace meses y ningun escaner estaba apuntado a ella.
  • La defensa que se recomienda hoy es revisar la configuracion a mano. Eso no es una defensa.

Cobertura

Que lee

Diez escaneres, cada uno sobre una familia de archivos. Ninguno ejecuta nada.

vscode
.vscode/*.json*.code-workspace

Tareas con runOn: folderOpen, incluidas las de un workspace multi-raiz, ajustes que le pasan un binario a una extension e inyeccion de entorno en terminales.

editors
.idea/startupTasks.xml.idea/watcherTasks.xml.dir-locals.el.exrc

Tareas que JetBrains lanza al abrir el proyecto, File Watchers que corren al cambiar un archivo, Lisp que Emacs evalua al visitar uno, y el rc local de Vim.

agents
.claude/settings.json.gemini/settings.json.cursor/environment.json.cursor/hooks.json

Hooks de comando, comandos de entorno de Cursor y listas de permisos que quitan el aviso.

mcp
.mcp.json.vscode/mcp.json.cursor/mcp.json

Servidores que se lanzan al iniciar la sesion, y los que bajan y ejecutan con npx o uvx sin lockfile.

packages
package.json.pnpmfile.cjs.yarnrc.ymlcomposer.jsonGemfile

Scripts de instalacion, codigo propio de pnpm y Yarn que corre al arrancar, aprobaciones de build y dependencias traidas fuera del registro.

python
setup.pypyproject.tomlconftest.pysitecustomize.py

Archivos de setup que son codigo ejecutable, backends de build locales e imports que ocurren solos al arrancar el interprete.

cargo
Cargo.toml.cargo/config.toml

Build scripts, y los campos que sustituyen el compilador, el enlazador o el runner por algo del propio repositorio.

environments
.envrcmise.tomlshell.nixflake.nix

Hooks que se disparan al entrar en el directorio, y los shell hooks de un entorno de desarrollo de Nix.

devcontainer
.devcontainer/devcontainer.json.devcontainer.json

initializeCommand, que corre en el anfitrion y no dentro del contenedor, mas el resto del ciclo de vida.

githooks
.git/config.git/hooks/.githooks/.husky/.pre-commit-config.yaml

core.hooksPath redirigido, hooks vivos en el clon, scripts esperando a que alguien los conecte y entradas locales de pre-commit.

Como se ordena

Tres niveles, y solo uno rompe la build

!
Inmediato

Se ejecuta al abrir, al iniciar sesion de agente o al instalar. Sin que hagas nada mas. Es el unico que devuelve codigo de salida 1.

~
Diferido

Se ejecuta, pero despues de un acto deliberado: instalar, depurar, commitear, construir el contenedor.

·
Nota

No se ejecuta solo, pero amplia la superficie o quita un aviso que habria mostrado algo.

Lo que no hace

No hace falta confiar en nosotros

Es una herramienta de seguridad que te pide correr un binario sobre tus repositorios. Esa desconfianza es sana, asi que la respuesta no es pedir confianza sino quitarle motivo.

Nunca ejecuta lo que encuentra. Lee y analiza, nada mas.

Nunca abre una conexion de red. Sin telemetria, sin consultas, sin actualizaciones automaticas.

Sin cuentas, sin servidor y sin plan de pago.

Codigo abierto desde el primer commit. Se puede leer entero.

Honestidad

Lo que no cubre, y por que

Onopen reporta rutas de ejecucion, no intenciones. Un postinstall que compila un modulo nativo y uno que se lleva tu .npmrc aparecen los dos: la herramienta te dice donde mirar, no juzga lo que encuentra.

Tampoco reporta cada comando de cada sistema de build, y es una decision, no un olvido. No inspecciona comandos de Gradle, CMake, Make o Docker, workflows de CI alojados, ni instrucciones en prosa como CLAUDE.md o AGENTS.md. Un Makefile ejecuta comandos porque para eso existe, asi que reportarlos dispararia sobre casi todos los repositorios que escanee, y un escaner que se dispara en el caso corriente ensena a saltarse su salida. Con la prosa es peor: no hay forma fiable de distinguir un CLAUDE.md que dice ejecuta los tests de uno que dice otra cosa, sin entender el texto.

Corre uno ahora

Sobre cualquier repositorio que tengas a mano. Tarda menos que leer esta pagina.

Ver el codigo