무슨 일이 일어났나
2026년 3월 8일, JFrog 보안 연구팀이 npm 레지스트리에서 @openclaw-ai/openclawai라는 악성 패키지를 찾아 공개했습니다. AI 에이전트 OpenClaw의 설치 도구 "OpenClaw Installer"로 위장한 패키지입니다. JFrog는 이 캠페인을 GhostClaw라 부르고, 악성코드는 내부에서 스스로를 GhostLoader라고 칭합니다.
The Hacker News 보도(3월 9일) 시점까지 다운로드는 178회였습니다. JFrog가 밝힌 악성 버전은 1.5.14와 1.5.15입니다.
공격자는 정상 도구처럼 보이도록 꾸몄습니다. package.json의 진입점(src/index.js)에는 평범한 유틸리티 코드를 두고, 실제 악성 코드는 scripts/ 폴더에 숨겼습니다.
피해 범위: 가짜 인증 창과 대부분의 탈취 기능은 macOS를 노립니다. 비밀번호 검증 코드에는 Windows·Linux용 분기도 들어 있습니다.
이 악성코드가 무서운 이유
JFrog 분석을 따라 공격 흐름을 세 단계로 나눠 보면 이렇습니다.
Stage 1. 전역 재설치와 가짜 설치 화면
postinstall 스크립트가 npm i -g @openclaw-ai/openclawai로 패키지를 전역에 다시 설치합니다. 그러면 openclaw 명령이 PATH에 올라갑니다. 이 명령을 실행하면 난독화된 scripts/setup.js가 돌면서 진행 바와 시스템 로그를 흉내 낸 가짜 설치 화면을 띄웁니다.
Stage 2. 가짜 Keychain 창으로 시스템 비밀번호 탈취
진행 바가 끝나면 "Keychain Authorization Required"라는 가짜 인증 창이 나옵니다. 입력한 비밀번호는 macOS dscl로 실제 비밀번호가 맞는지 확인하고, 틀리면 최대 5번까지 다시 묻습니다. 그사이 C2 서버(trackpipe[.]dev)에서 AES-256-GCM으로 암호화된 2단계 페이로드를 받아 백그라운드에서 실행합니다. 터미널에 Full Disk Access 권한이 없으면 권한을 주라는 가짜 대화상자도 띄웁니다.
Stage 3. GhostLoader 상주와 원격 제어
2단계 페이로드 GhostLoader는 약 11,700줄짜리 JavaScript 번들입니다. 자신을 ~/.cache/.npm_telemetry/monitor.js(Windows는 %APPDATA%/.npm_telemetry/)에 복사합니다. 이어 ~/.zshrc·~/.bashrc·~/.bash_profile에 # NPM Telemetry Integration Service 주석을 단 재실행 코드를 덧붙이고, Linux에서는 @reboot cron 항목도 등록합니다.
상주한 뒤에는 약 25초마다 C2에 명령을 묻습니다. 셸 명령 실행, 임의 파일 탈취, SOCKS5 프록시, 브라우저 프로필을 복제해 로그인된 세션을 공격자에게 넘기는 기능까지 갖췄습니다.
뭘 훔쳐가나
JFrog가 정리한 탈취 대상입니다.
- macOS Keychain:
login.keychain-db와 iCloud Keychain 데이터베이스 파일 - 브라우저: 받아 낸 시스템 비밀번호로 Chrome의 Safe Storage 키를 풀어, Chrome·Brave·Edge 같은 Chromium 계열 브라우저의 비밀번호·쿠키·카드·자동완성 정보를 복호화. Firefox 비밀번호도 복호화
- 암호화폐 지갑: Exodus·Electrum·Ledger Live 같은 데스크톱 지갑, MetaMask·Phantom 같은 확장 지갑, 바탕화면·문서·다운로드 폴더 속 시드 구문 파일
- 개발·클라우드 자격증명: SSH 키,
~/.aws/credentials, Azure·GCP·Kubernetes·Docker 설정,~/.npmrc,~/.git-credentials, GitHub CLI 토큰, 환경 변수 전체 - AI 에이전트 설정: OpenClaw·ZeroClaw·PicoClaw의 설정 파일과 자격증명 폴더
- Full Disk Access를 줬다면: Apple Notes, iMessage 기록, Safari 방문 기록, Mail 계정 설정
상주 모드에서는 3초마다 클립보드를 읽습니다. 개인 키, 지갑 주소, AWS·OpenAI·Stripe 키 패턴이 보이면 곧바로 빼 갑니다. 수집한 파일은 tar.gz로 묶어 C2 서버에 올리고, 약 49MB보다 작으면 Telegram 봇으로, 크면 GoFile로도 보냅니다.
지금 할 수 있는 대응법
아래 확인·제거 절차는 JFrog 권고를 옮긴 것입니다.
1단계: 상주 흔적 지우기
~/.zshrc, ~/.bashrc, ~/.bash_profile, ~/.zshenv, ~/.profile을 열어 npm_telemetry 또는 NPM Telemetry Integration Service가 들어간 줄을 지웁니다. cron에 .npm_telemetry를 참조하는 항목이 있는지도 확인하고 지웁니다.
crontab -l
2단계: 실행 중인 프로세스 종료
아래 명령으로 찾은 monitor.js·npm_telemetry 프로세스를 종료합니다.
ps aux | grep monitor.js
ps aux | grep npm_telemetry
3단계: 설치 폴더와 패키지 제거
설치 폴더 ~/.cache/.npm_telemetry/(Windows는 %APPDATA%/.npm_telemetry/)를 삭제한 뒤 패키지를 지웁니다.
npm uninstall -g @openclaw-ai/openclawai && npm uninstall @openclaw-ai/openclawai
4단계: 자격증명 교체와 세션 정리
시스템 비밀번호, SSH 키, AWS·GCP·Azure·OpenAI·Stripe·npm·GitHub CLI 토큰, 브라우저에 저장한 비밀번호를 모두 바꿉니다. 노출됐을 수 있는 시드 구문도 교체 대상입니다. 쿠키가 통째로 빠져나갔으므로 Google·GitHub처럼 세션 관리를 지원하는 서비스에서는 모든 세션을 로그아웃합니다. 교체는 감염된 기기가 아니라 깨끗한 다른 기기에서 합니다. 감염된 기기에서 바꾸면 새 값도 다시 빠져나갈 수 있습니다.
JFrog는 시스템 비밀번호·Keychain·브라우저 세션까지 넘어간 만큼, 가능하면 시스템을 새로 설치(re-image)하라고 권합니다.
예방 수칙:
- OpenClaw는 공식 패키지와 검증된 경로로만 설치합니다. 이름이 비슷한 대체 패키지는 쓰지 않습니다.
- 설치 중 시스템 비밀번호를 묻거나,
postinstall로 자신을 전역 설치하거나, 설치 시점에 원격 페이로드를 받는 패키지는 의심합니다. - 터미널 도구가 Keychain 인증이나 Full Disk Access를 요구하면 멈추고 출처부터 확인합니다.
- 설치 시점에 이런 행위를 잡아 주는 공급망 보안 도구를 씁니다. JFrog는 자사 Xray·Curation이 이 패키지를 탐지한다고 밝혔습니다.
참고 자료