# 가짜 Upwork 일자리 두 번, 감염된 Mac 한 대: 북한 Contagious Interview를 겪은 이야기

> 악성 npm 패키지가 숨은 테스트 프로젝트, 그리고 curl | bash로 설치하라던 가짜 회의 앱. 두 번 모두 무슨 일이 있었는지, Claude Code로 악성코드를 어떻게 찾아냈는지, 그리고 그 뒤에 만든 도구.

- URL: https://oliverz.dev/ko/blog/upwork-contagious-interview
- Author: Oliver Zhang (https://oliverz.dev)
- Language: ko
- Published: 2026-10-28
- Tags: security, upwork, malware, macos, contagious-interview

> **요약:** Contagious Interview는 북한 해커들이 벌이는 가짜 채용 공격입니다. Upwork나 LinkedIn 같은 플랫폼에서 클라이언트나 채용 담당자로 위장하고, 결국 당신이 직접 "테스트 프로젝트"를 실행하거나 "회의 앱"을 설치하게 만듭니다. 알아보는 규칙은 하나입니다. 채용 과정에서 낯선 코드를 내 컴퓨터에서 실행하라고 하면 멈추세요. 이미 실행했다면 인터넷 연결을 끊고, 모르는 백그라운드 프로세스와 폴더를 찾아보고, 비밀번호를 바꾸고, 중요한 사이트에서 로그인된 모든 기기를 로그아웃하세요.

## 첫 번째: 2026년 6월

자신을 우크라이나 사람이라고 소개한 클라이언트가 Upwork로 연락해 왔습니다. 프로젝트가 있는데 도와 달라며, "Online_Store"라는 Node.js 테스트 프로젝트를 보내 왔습니다.

악성 코드는 npm 의존성 중 하나에 숨어 있었습니다. 정확히 어떤 패키지였는지는 더 이상 기억나지 않는데, Tailwind 관련 패키지였던 것 같습니다. 프로젝트를 실행하자, 제 컴퓨터에 `~/.node_modules` 폴더를 몰래 만들고 그 안에 axios와 socket.io-client를 넣어 제 데이터를 외부로 보내도록 설정해 두었습니다.

알아챘을 때는 이미 며칠째 백그라운드에서 돌고 있었습니다. 발견한 것도 순전히 운이었습니다. 영국에 있는 동료가 똑같은 일을 당했고, 그 이야기를 듣고 나서야 저도 당했을 수 있다는 걸 깨달았습니다.

## 두 번째: 2026년 10월

이번에는 리투아니아 사람이라며, Veyron Capital(veyron[.]capital)이라는 투자사 소속이라고 했습니다. 이 회사는 Upwork에 Web3 일자리를 잔뜩 올려 두었습니다.

그가 먼저 메시지를 보냈고, 이어서 Upwork에서 화상 통화를 잡았습니다. 카메라는 내내 꺼 두었고, 처음부터 끝까지 저에게 중국어로 말했습니다. 통화가 끝나자 Telegram으로 친구 추가를 해 달라며 저를 그룹에 넣었고, 그곳에서 Web3 데모를 만들어 회의에서 팀에게 발표해 달라는 요청을 받았습니다.

발표할 때가 되자, 동료 한 명이 출장 중이라 평소 쓰던 회의 도구를 쓸 수 없으니 "Zeff"(zeff[.]app)라는 회의 앱으로 바꿔야 한다고 했습니다. 그룹의 다른 사람이 설치를 "도와주겠다"며 두 가지 방법을 줬습니다. 터미널에서 `curl | bash` 명령을 실행하거나, DMG를 내려받거나.

저는 설치하지 않았습니다. 한 번 당해 봤기 때문에, "회의를 하려면 터미널에서 이 낯선 명령을 실행하세요"라는 말을 보는 순간 같은 수법이라는 걸 알았습니다.

## 돌아보면

두 번 모두 북한의 "Contagious Interview" 공격, 즉 가짜 채용과 가짜 면접이었습니다. 평범해 보이는 일자리로 신뢰를 쌓은 뒤, 당신 손으로 그들의 코드를 실행하게 만듭니다.

![두 공격 모두 같은 각본을 따랐습니다: 접촉, 신뢰 쌓기, 요청, 페이로드. 두 번째에는 페이로드 단계에서 멈췄습니다.](https://oliverz.dev/posts/upwork-contagious-interview/attack-flow.en.svg?v=4f6772d3)

가장 마음에 걸렸던 건, 두 번 모두 macOS 기본 XProtect도, 기존 백신도 아무 경고를 하지 않았다는 점입니다.

## 포렌식 조사관이 된 Claude Code

첫 번째 감염 뒤 실제로 문제를 파낸 것은 Claude Code였습니다. Fable 5(Max)를 쓰면서 필요한 권한을 주고, 조사관처럼 디스크 전체와 백그라운드 프로세스를 훑게 했습니다. 악성코드가 아직 돌고 있다는 걸 금방 찾아냈고, 이후 모든 것을 정리하는 과정을 한 단계씩 안내해 줬습니다.

## 잃은 것

다행히 없었습니다. 이런 악성코드가 가장 노리는 건 암호화폐 지갑인데, 그 컴퓨터에는 지갑이 하나도 없었습니다. 중요한 계정은 모두 2단계 인증을 켜 두었기 때문에, 비밀번호를 가져가도 아무도 로그인할 수 없었습니다.

그래도 한 가지는 경고해 두고 싶습니다. 이런 악성코드는 보통 브라우저에 저장된 로그인 세션(쿠키)도 훔칩니다. 쿠키가 있으면 공격자는 2단계 인증을 건너뛰고 바로 계정에 들어갈 수 있습니다. 그러니 당했다면 비밀번호를 바꾸는 것과 함께, 중요한 사이트에서 로그인된 모든 기기를 로그아웃하세요.

## 그래서 도구를 만들었습니다: Tsuba

두 번을 겪고 나니 빈틈이 어디인지 보였습니다. 이런 공격은 매번 새로운 포장으로 나타나고, node, curl, bash처럼 가장 평범한 도구를 쓰기 때문에 기존 백신이 수상하게 볼 이유가 없습니다.

그래서 Tsuba(鍔, 일본도의 손잡이 보호대)라는 작은 macOS 메뉴 막대 앱을 만들었습니다. 아이디어는 간단합니다. 낯선 코드가 처음 실행되기 전에 대신 한번 살펴봅니다. 그 코드가 무엇을 하려는지, 어디서 왔는지, 알려진 공격과 닮았는지를 파악한 뒤, 허용할지, 경고할지, 차단할지 결정합니다.

![낯선 코드는 실행되기 전에 Tsuba의 네 가지 검사를 거치고, 그 결과로 허용, 경고, 차단이 정해집니다.](https://oliverz.dev/posts/upwork-contagious-interview/tsuba-check.en.svg?v=b30d64d2)

제 두 사례에 대입하면 이렇습니다.

- **첫 번째 같은 가짜 면접 프로젝트**: `npm install`이나 `npm start`를 실행하기 전에, 의존성이 공개된 악성 패키지 목록에 있는지 확인하고, 프로젝트 소스에서 숨은 코드, 하드코딩된 원격 주소, 지갑이나 비밀번호 저장소를 읽는 코드를 찾습니다. 그래도 확신이 서지 않으면 샌드박스에서 프로젝트를 시험 실행해 실제로 무엇을 하는지 볼 수 있습니다.
- **두 번째 같은 가짜 회의 앱**: `curl | bash`를 발견하면 원격 스크립트를 실행하지 않고 내려받아 무엇을 하려는지 검사합니다. 내려받은 DMG도 서명, 공증, 출처를 확인합니다.

Tsuba는 무료이며 오픈 소스입니다([GitHub](https://github.com/chihyungchang/Tsuba), Apache 2.0). Apple 실리콘과 Intel Mac용 다운로드, 그리고 그 밖의 모든 내용은 [Tsuba 페이지](https://oliverz.dev/ko/products/tsuba)에 있습니다. Upwork 같은 플랫폼에서 일을 받거나, 다른 사람이 보낸 코드를 자주 실행한다면 한번 써 보세요.
