# Tsuba: 낯선 코드가 처음 실행되기 전에 먼저 살펴봅니다.

> npm install, curl | bash 스크립트, 내려받은 DMG, 에디터 확장 프로그램, AI 도구 플러그인을 실행 전에 검사해 북한 Contagious Interview 같은 가짜 면접 악성코드를 잡아내는 무료 macOS 메뉴 막대 앱.

- URL: https://oliverz.dev/ko/products/tsuba
- Author: Oliver Zhang (https://oliverz.dev)
- Language: ko
- Platform: macOS app
- Status: live
- Price: Free
- License: Apache-2.0
- Version: 0.3.0
- First released: 2026-10-28
- Latest release: 2026-10-31
- Requirements: macOS 13+
- Apple 실리콘용 다운로드: https://github.com/chihyungchang/Tsuba/releases/download/v0.3.0/Tsuba_0.3.0_aarch64.dmg
- Intel용 다운로드: https://github.com/chihyungchang/Tsuba/releases/download/v0.3.0/Tsuba_0.3.0_x64.dmg
- Source: https://github.com/chihyungchang/Tsuba

Tsuba(鍔)는 일본도의 손잡이 보호대입니다. 이 Tsuba는 메뉴 막대에 머물다가, 낯선 코드가 처음 실행되는 순간에 끼어듭니다. 그 코드가 무엇을 하려는지, 어디서 왔는지, 알려진 공격과 닮았는지를 파악한 뒤 **허용**, **경고**, **차단** 중 하나를 결정합니다.

가짜 Upwork 클라이언트가 두 번이나 제 Mac을 감염시키려 한 뒤에 만들었습니다. 첫 번째는 성공했고, XProtect도 백신도 알아채지 못했습니다. [전체 이야기는 여기에 있습니다](https://oliverz.dev/ko/blog/upwork-contagious-interview).

![24초로 보는 Tsuba.](https://oliverz.dev/products/tsuba/demo.en.mp4?v=d8f6a21d)

![대시보드: 보호 상태, 확인이 필요한 항목, 모든 검사의 실시간 기록.](https://oliverz.dev/products/tsuba/1-overview.en.webp?v=e341faf4)

## 백신이 이런 공격을 놓치는 이유

가짜 면접 프로젝트, 가짜 회의 앱, 오염된 npm 패키지, 악성 에디터 확장 프로그램은 매번 새로운 포장으로 나타납니다. node, curl, bash 같은 평범한 도구로 실행되기 때문에 기존 스캐너가 잡아낼 것이 없습니다. 그래서 Tsuba는 대신 진입 지점을 지켜봅니다.

규모는 이 정도입니다.

- 북한의 **Contagious Interview** 캠페인은 적어도 2022년 12월부터 이어지고 있습니다. "테스트 프로젝트"는 GitHub, GitLab, Bitbucket에 올린 npm 프로젝트이며, 저장소를 신뢰하는 순간 VS Code가 그 작업 파일을 알아서 실행합니다([Microsoft, 2026년 3월](https://www.microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews/)).
- Socket은 2025년 1월 이후 이 캠페인과 연결된 **악성 패키지 1,700개 이상**을 npm, PyPI, Go, crates.io, Packagist에 걸쳐 추적하고 있습니다([Socket, 2026년 4월](https://socket.dev/blog/contagious-interview-campaign-spreads-across-5-ecosystems)).
- GlassWorm 확장 프로그램은 보이지 않는 유니코드 문자 속에 코드를 숨겼고, 발각되기 전까지 약 **35,800회 설치**되었습니다([Koi Security, 2025년 10월](https://web.archive.org/web/20260101202601/https://www.koi.ai/blog/glassworm-first-self-propagating-worm-using-invisible-code-hits-openvsx-marketplace)).
- Sonatype은 한 분기에만 **새로운 악성 오픈 소스 패키지 16,279개**, 누적 845,204개를 기록했습니다([Sonatype, 2025년 2분기](https://www.sonatype.com/press-releases/q2-2025-open-source-malware-index)).

## 채용 담당자가 보낸 프로젝트를 실행하기 전에

1. 아직 에디터로 열지 마세요. 신뢰한 폴더는 열자마자 `.vscode/tasks.json`을 실행할 수 있습니다.
2. `package.json`을 읽으세요: `preinstall`, `postinstall` 스크립트, 처음 들어 보거나 지난주에 게시된 의존성.
3. 과제 테스트에 있을 이유가 없는 코드를 찾으세요: 하드코딩된 IP 주소, 내려받은 텍스트를 `eval`하는 코드, 브라우저 프로필·지갑·키체인을 읽는 코드.
4. 채팅으로 받은 `curl … | bash` 줄은 스크립트를 읽어 보기 전에는 절대 터미널에 붙여 넣지 마세요.
5. 이미 실행했다면 컴퓨터가 감염되었다고 가정하세요. 흔적을 확인한 뒤, 깨끗한 기기에서 비밀번호, 토큰, 키를 교체하세요.

Tsuba는 1~4단계를 꼭 필요한 순간에 대신 해 주고, 상태 점검이 5단계를 맡습니다.

## 검사하는 것

| 진입 지점 | 예시 | Tsuba가 보는 것 |
| --- | --- | --- |
| 터미널 명령 | `curl … \| bash`, `npm install`, `npx`, `npm start`, `git clone` | 원격 스크립트를 실행하지 않고 내려받아 확인하고, npm 패키지를 악성 패키지 목록·게시 시기·설치 스크립트로 검사하며, 프로젝트에서 숨은 코드, 하드코딩된 서버, 지갑이나 비밀번호 저장소를 읽는 코드를 찾습니다 |
| 터미널에 붙여 넣기 | 웹페이지가 "이 명령을 터미널에 복사하세요"라고 할 때 | 붙여 넣는 순간 경고하고, 난독화된 명령을 셸로 파이프하면 고위험으로 표시합니다 |
| 다운로드 폴더 | 새 `.dmg`, `.pkg`, `.vsix` 파일 | 서명, 공증, 다운로드 출처, 설치 스크립트 |
| 에디터 확장 프로그램 | VS Code, Cursor, Windsurf, VSCodium | 공식 악성 확장 프로그램 목록, 시작 시 활성화, 보이지 않는 문자에 숨긴 코드. 고위험 확장 프로그램은 격리함으로 보냅니다 |
| AI 코딩 도구 | Claude Code, Cursor, Codex용 MCP 서버, 스킬, 훅 | 알려진 악성 패키지, 숨김 폴더에서의 실행, 사용자에게 보이지 않게 숨긴 지시문 |
| 상태 점검 | 메뉴 막대 → 상태 점검 | 알려진 공격이 남긴 흔적과 수상한 로그인 항목 |

확신이 서지 않는 프로젝트는 먼저 샌드박스에서 시험 실행할 수 있습니다. 미끼가 든 가짜 홈 폴더를 쓰고, 네트워크 요청은 기록만 하고 실제로 보내지 않으며, 60초 제한이 있습니다.

![차단된 가짜 회의 앱 설치: 판정, 이유, 증거를 한 줄씩 보여 줍니다.](https://oliverz.dev/products/tsuba/2-history.en.webp?v=f0168298)

![폴더를 필요할 때 또는 일정에 따라 스캔합니다. 위험한 것은 격리함으로 갑니다.](https://oliverz.dev/products/tsuba/3-scan.en.webp?v=2f8accaf)

![상태 점검은 알려진 공격의 흔적을 찾고, 에디터 확장 프로그램과 AI 도구를 감사합니다.](https://oliverz.dev/products/tsuba/4-doctor.en.webp?v=8a48a5e3)

## 다른 도구와 비교

대부분의 도구는 하나의 진입 경로만 다룹니다. Tsuba는 Mac에서 일어나는 모든 첫 실행을 다루며, 다른 도구와 함께 동작합니다.

| 도구 | 검사 대상 | 시점 |
| --- | --- | --- |
| **Tsuba** | 터미널 명령, npm과 npx, 클론한 프로젝트, `.dmg` / `.pkg` / `.vsix`, 에디터 확장 프로그램, MCP 서버, 스킬과 훅, 붙여 넣은 명령 | 코드가 처음 실행되기 전 |
| npq, Socket Firewall, Aikido Safe Chain | npm 패키지(일부는 PyPI 등도) | 설치할 때 |
| mcp-scan 등 MCP 스캐너 | MCP 서버와 에이전트 도구 | 스캔을 실행할 때 |
| LuLu, BlockBlock, KnockKnock (Objective-See) | 외부로 나가는 연결, 로그인 시 시작되도록 스스로 설치하는 소프트웨어 | 코드가 실행된 뒤 |
| 백신과 XProtect | 알려진 악성코드 시그니처 | 파일이 알려진 샘플과 일치할 때 |

## 판단 방식

오프라인 규칙이 항상 먼저 실행되며, 매일 업데이트되는 공개 위협 인텔리전스가 이를 뒷받침합니다. 여기에는 [OpenSSF](https://ossf.github.io/malicious-packages/stats/)에 신고된 230,000개 이상의 악성 npm·PyPI 패키지가 포함됩니다. 그다음 AI 모델이 맥락 속에서 증거를 판단할 수 있습니다. Claude가 가장 잘 맞고, 다른 제공업체와 로컬 모델도 지원하며, AI를 완전히 끌 수도 있습니다.

모델에는 검사에 필요한 증거만 보냅니다. 코드 주석은 먼저 제거하고, 비밀 정보는 절대 업로드하지 않습니다. 설정과 기록은 Mac의 `~/.tsuba`에 남습니다.

![설정: 방어 기능을 하나씩 켜고 끄고, AI를 쓸지 말지 포함해 판정 방식을 고릅니다.](https://oliverz.dev/products/tsuba/5-settings.en.webp?v=ce24d1bc)

## 이용 안내

Tsuba는 출시되었고, 무료이며, Apache 2.0 라이선스의 오픈 소스입니다([GitHub](https://github.com/chihyungchang/Tsuba)). 빌드는 두 가지입니다. M1 이후 Mac은 **Apple 실리콘**, 그보다 오래된 Mac은 **Intel**을 고르세요. 어느 쪽인지 모르겠다면 Apple 메뉴 → 이 Mac에 관하여 → 칩을 확인하세요.

앱은 10개 언어를 지원합니다: English, 简体中文, 繁體中文, 日本語, 한국어, Español, Français, Deutsch, Português, Русский. 인터페이스, 알림, 터미널 검사, 규칙 설명, AI 답변 모두 macOS 언어를 따르며, **설정 → 모양**에서 직접 고를 수도 있습니다.

Tsuba는 아직 Apple의 서명이나 공증을 받지 않았기 때문에, 처음 열 때 macOS가 실행을 막습니다. **시스템 설정 → 개인정보 보호 및 보안**으로 가서 **그래도 열기**를 클릭하세요. 대신 `xattr`로 격리 플래그를 지우지는 마세요. Tsuba는 그렇게 하라는 설치 프로그램을 경고하는데, 자기 자신만 예외일 수는 없습니다.

이 과정은 한 번만 하면 됩니다. 그 뒤로는 Tsuba가 스스로 업데이트합니다. 새 버전이 나오면 알려 주고, 서명이 앱에 내장된 키와 일치할 때만 설치합니다.

내 DMG가 GitHub이 공개 소스로 빌드한 바로 그 파일인지 확인하려면, `shasum -a 256 Tsuba_*.dmg` 결과를 [릴리스 페이지](https://github.com/chihyungchang/Tsuba/releases/latest)의 `SHA256SUMS.txt`와 비교하세요.

## FAQ

### 채용 담당자가 보낸 프로젝트를 실행해도 안전한가요?

검사하기 전까지는 신뢰할 수 없는 코드로 취급하세요. 가짜 채용 면접에서는 테스트 프로젝트 자체가 악성코드입니다. 폴더를 Tsuba 창으로 끌어다 놓거나, Tsuba를 연결한 터미널에서 클론하면, 무엇이든 실행되기 전에 의존성, 설치 스크립트, VS Code 작업을 검사합니다. 이미 실행했다면 **상태 점검**을 돌리고 [제가 겪은 일](https://oliverz.dev/ko/blog/upwork-contagious-interview)을 읽어 보세요.

### npm 패키지를 설치하기 전에 어떻게 확인하나요?

Tsuba를 터미널에 연결해 두면 `npm install`과 `npx`가 실행 전에 검사됩니다. OpenSSF 목록에 있는 알려진 악성 패키지, 며칠 전에 막 게시된 패키지, 설치 스크립트를 확인합니다. npq 같은 명령줄 도구도 npm에 한해 비슷한 검사를 합니다.

### macOS에서 Tsuba를 열 수 없다고 하는 이유는?

Tsuba는 아직 Apple의 서명이나 공증을 받지 않았습니다. 그래서 처음 열 때 **시스템 설정 → 개인정보 보호 및 보안**으로 가서 **그래도 열기**를 클릭해야 합니다. 대신 `xattr`로 격리 플래그를 지우지는 마세요. Tsuba는 그렇게 하라는 설치 프로그램을 경고합니다. 다운로드한 파일을 확인하려면 변경 기록에 나온 SHA-256과 비교하세요.

### Tsuba가 제 코드를 업로드하나요?

파일은 업로드하지 않습니다. AI를 켜면 검사에 필요한 증거만 선택한 모델로 보내며, 코드 주석은 제거하고 비밀 정보는 빼고 보냅니다. AI를 끄면 검사는 Mac에서 오프라인 규칙으로 진행됩니다. 설정과 기록은 `~/.tsuba`에 남습니다. Tsuba가 무엇을 언제 보내는지는 [개인정보 처리 안내](https://oliverz.dev/ko/products/tsuba/privacy)에 모두 나와 있습니다.

### AI 구독이나 API 키가 필요한가요?

아니요. 오프라인 규칙이 항상 먼저 실행되고, 그것만으로도 동작합니다. AI는 선택 사항입니다. Claude가 가장 잘 맞고, 다른 제공업체와 로컬 모델도 지원합니다.

### 백신을 대신하나요?

아니요. 알려진 악성코드를 알아보는 일은 macOS XProtect와 공개 위협 인텔리전스에 맡깁니다. Tsuba는 이들이 놓치는 것을 다룹니다. 가짜 면접 프로젝트, 가짜 회의 앱, 오염된 패키지, 악성 확장 프로그램처럼 아직 아무도 본 적 없는 새 포장의 코드를, 실행되기 전에 막아섭니다.

### 어떤 Mac에서 실행되나요?

macOS 13 이상, Apple 실리콘과 Intel 모두 지원하며 다운로드가 따로 있습니다. Apple 메뉴 → 이 Mac에 관하여 → 칩에서 어느 쪽인지 확인할 수 있습니다.

### 실제로는 안전한 것을 잡아내면요?

모든 경고와 차단에는 증거(어떤 파일, 어떤 줄, 무엇이 일치했는지)가 표시되므로 직접 판단할 수 있습니다. 확인한 경고는 무시할 수 있고, 신뢰하는 것은 허용 목록에 넣을 수 있습니다. [오탐을 신고](#feedback)해 주세요. 하나하나가 회귀 테스트가 됩니다.
