Reglas de comandos destructivos

Las seis reglas que zn-gate puede usar para rechazar un comando de shell que borraría una máquina o ejecutaría una descarga sin leerla: qué bloquea cada una, cómo activarlas o desactivarlas y qué no ve la comprobación.

Ver .md

zn-gate puede rechazar un pequeño conjunto de comandos de shell que borran una máquina o ejecutan una descarga sin leerla. Dos de las reglas están activadas por defecto en los hooks de los agentes: rm_root_home (un borrado recursivo de la carpeta personal, la raíz del sistema de archivos o una carpeta del sistema) y disk_overwrite (una escritura en un dispositivo de disco). Las otras cuatro reglas (pipe_to_shell, rc_download, perm_root, fork_bomb) están desactivadas por defecto y puedes activarlas. También puedes desactivar las dos reglas por defecto.

Es una barrera contra el error de un modelo o una mala sugerencia, no un sandbox. Lee el texto de un comando y lo bloquea solo cuando tiene alguna de las formas de abajo.

Cuando se bloquea un comando, no se ejecuta, y se le dice al agente por qué y que te pida confirmación antes de ejecutarlo. Si de verdad lo quieres, ejecútalo tú en una terminal. Las palabras que no conozcas están en el glosario.

Cambiar los ajustes

Para los hooks de los agentes (los que configura zn hooks install para tus agentes), define hooks.blockDestructiveCommands en ~/.zn/config.json:

Ajuste Reglas aplicadas
sin definir rm_root_home y disk_overwrite (lo predeterminado)
true las seis reglas
false ninguna: la comprobación está desactivada
una lista de nombres de reglas, por ejemplo ["rm_root_home", "pipe_to_shell"] exactamente esas reglas (un nombre que no es una regla se ignora)
{"hooks": {"blockDestructiveCommands": false}}

La variable de entorno ZN_BLOCK_DESTRUCTIVE=1 activa las seis reglas. El entorno solo puede añadir protección, nunca quitarla: ZN_BLOCK_DESTRUCTIVE=0, cualquier otro valor o ningún valor se ignora y deja al archivo (o a lo predeterminado) al mando. Un proyecto en el que trabaja un agente puede definir una variable de entorno, así que desactivar reglas solo es posible desde el archivo de configuración, que las herramientas de archivos del agente no pueden escribir.

Cuando la comprobación se aplica, los hooks la ejecutan sobre las herramientas de shell de tu agente (por ejemplo Bash y PowerShell).

En tu propio código, llama a la función directamente. Llamarla es la activación: siempre aplica las seis reglas.

  • Node.js: checkCommand(command) de zn-gate/lib/client
  • Python: check_command(command) de zn_gate

Ambas devuelven el mismo tipo de resultado que evaluate, con una regla como destructive:rm_root_home. Consulta la página del SDK. Los ajustes de arriba solo se aplican a los hooks de los agentes.

Qué bloquea

Regla Por defecto Bloquea Ejemplos
rm_root_home activada Un borrado recursivo de la carpeta personal, la raíz del sistema de archivos, una carpeta del sistema de primer nivel o la raíz de una unidad. También find con -delete o -exec rm sobre esas rutas y sin una prueba como -name. rm -rf ~, rm -rf /, rm -rf /usr, Remove-Item -Recurse -Force $env:USERPROFILE, rd /s /q C:\
pipe_to_shell desactivada Una descarga que se ejecuta como script sin haberla leído. curl https://example.com/install.sh | sh, sh -c "$(curl ...)", bash <(curl ...), iwr ... | iex
disk_overwrite activada dd con of= un dispositivo de bloques, mkfs, mkswap, wipefs, shred o blkdiscard sobre uno, una redirección hacia uno, y Format-Volume y Clear-Disk de PowerShell. dd if=/dev/zero of=/dev/sda, mkfs.ext4 /dev/nvme0n1p2
perm_root desactivada chmod -R, chown -R o chgrp -R sobre la raíz del sistema de archivos o una carpeta del sistema de primer nivel; chmod -R con un modo escribible por todos sobre la carpeta personal. chmod -R 777 /, chmod -R 777 ~
fork_bomb desactivada La clásica fork bomb de shell, con cualquier nombre de función. una función que se llama a sí misma dos veces en segundo plano
rc_download desactivada Una descarga escrita en un archivo de arranque del shell (.bashrc, .zshrc, .profile, /etc/profile, config.fish de fish). curl -o ~/.bashrc https://example.com/rc

"Carpeta del sistema de primer nivel" significa /bin, /boot, /dev, /etc, /home, /lib, /lib32, /lib64, /opt, /proc, /root, /sbin, /srv, /sys, /usr, /var y, en macOS, /Users, /System, /Library, /Applications, /private, /Volumes. Una ruta más profunda como /var/lib/apt/lists o /usr/local/lib/node_modules/x no se bloquea.

El comando se divide igual que lo hacen el resto de comprobaciones de los hooks de zn-gate, así que se entienden las comillas, &&, ;, las tuberías, sudo, env, nohup y envoltorios parecidos. También se revisa el código de sh -c, bash -lc, eval, pwsh -Command y cmd /c, hasta tres niveles de profundidad. El texto que solo menciona un comando entre comillas (echo "rm -rf ~", un mensaje de commit) no se bloquea.

Lo que no hace

La comprobación solo lee el texto del comando. Esto no está cubierto, y la comprobación lo deja pasar:

  • Una ruta que el comando construye mientras se ejecuta: rm -rf "$DIR" con DIR vacía, rm -rf * en una carpeta desconocida, o un destino que llega por una tubería.
  • Un script guardado primero y ejecutado después (curl -o x.sh ... && sh x.sh), o una descarga enviada a un programa que no es un shell (curl ... | python3).
  • Otras herramientas y lenguajes (rsync --delete, git clean, una línea de Python que borra una carpeta) y rutas por debajo del primer nivel (rm -rf /usr/local).
  • Comandos que se ejecutan dentro de un contenedor o en otra máquina.
  • Cualquier cosa que un agente haga escribiendo un archivo y ejecutándolo después.

Para esos casos, usa un sandbox, un contenedor o los avisos de permisos de tu propio agente. Esta comprobación añade una última barrera barata contra los errores catastróficos más comunes.

Qué tal funciona

El conjunto de pruebas tiene unos 1.000 comandos de desarrollo corrientes (compilaciones, git, gestores de paquetes, contenedores, borrar node_modules o dist, curl -o, ediciones de .bashrc y muchos que están cerca de las formas bloqueadas) y unos 550 comandos con las formas bloqueadas, escritos a partir de plantillas con distintos argumentos, destinos y servidores ficticios. En ese conjunto no hay falsos positivos ni fallos. Las mismas personas escribieron el conjunto y las reglas, así que léelo como una prueba de regresión, no como una tasa de error sobre todos los comandos reales.

Si bloquea un comando que quieres

Ejecuta el comando tú mismo en una terminal. La comprobación solo se aplica a los agentes. Si una regla te estorba a menudo, desactiva esa regla (o toda la comprobación) con los ajustes de arriba.