Bitwarden CLI npm 패키지 하이재킹 – 개발자 인증정보 대규모 탈취 공격 발견
(research.jfrog.com)JFrog 보안 연구팀이 npm의 @bitwarden/cli 2026.4.0 버전이 하이재킹된 것을 발견했다. 정상적인 Bitwarden 메타데이터와 브랜딩을 그대로 유지하면서, preinstall 스크립트와 bw 바이너리 진입점만 악성 로더(bw_setup.js)로 교체한 형태다.
동작 방식
설치 시 로더가 먼저 Bun 런타임을 GitHub에서 다운로드한 뒤, 난독화된 JavaScript 페이로드(bw1.js)를 실행한다. Node.js 대신 Bun을 사용하는 것 자체가 탐지 우회 전략이다.
페이로드는 세 가지 수집기를 통해 개발자 워크스테이션과 CI 환경의 인증정보를 광범위하게 수집한다.
- 파일시스템 수집기: SSH 키(
~/.ssh/), Git 자격증명(.git-credentials), npm 토큰(~/.npmrc),.env, AWS 자격증명(~/.aws/credentials), GCP 크리덴셜(~/.config/gcloud/credentials.db) 등 - 셸/환경 수집기:
gh auth token명령 실행,process.env스캔을 통한 GitHub·npm 토큰 패턴 매칭 - GitHub Actions 수집기: 토큰 권한이 있는 레포에 워크플로우를 주입해 Actions 시크릿까지 추출
특히 주목할 점은 ~/.claude.json, ~/.claude/mcp.json, ~/.kiro/settings/mcp.json 등 AI 도구 및 MCP 설정 파일까지 수집 대상에 포함되어 있다는 것이다.
이중 유출 경로
탈취한 데이터는 gzip 압축 후 AES-256-GCM + RSA-OAEP 하이브리드 암호화를 거쳐 전송된다.
- 1차 경로:
audit.checkmarx.cx/v1/telemetry로 HTTPS POST (정상 보안 서비스처럼 위장) - 2차 경로 (GitHub 악용): 1차 실패 시 GitHub 커밋 메시지에서
LongLiveTheResistanceAgainstMachines라는 마커로 이중 Base64 인코딩된 PAT를 검색하여 추출.beautifulcastle이라는 마커와 RSA 서명 검증을 통해 대체 유출 도메인도 동적으로 복구한다. 최종적으로 피해자의 GitHub 계정에 새 레포를 생성하고 암호화된 JSON을results/디렉토리에 업로드한다.
감염 판별
내장된 정상 Bitwarden CLI 메타데이터는 2026.3.0인데 패키지 루트는 2026.4.0으로 되어 있어, 정상 빌드 파이프라인이 아닌 외부에서 악성 레이어를 씌운 것으로 분석된다.
대응 방법
해당 버전 설치 이력이 있다면 해당 호스트의 모든 인증정보가 유출되었다고 간주해야 한다.
npm uninstall -g @bitwarden/cli및 캐시 정리- GitHub PAT, npm 토큰, AWS 액세스 키 전체 로테이션
- Azure Key Vault / GCP Secret Manager 감사 로그 확인
- GitHub Actions 워크플로우에서 비인가 실행 이력 점검
audit.checkmarx.cx및94.154.172.43네트워크 차단- AI 도구 설정 파일(Claude, Kiro 등)의 민감 정보 노출 여부 확인
일반적인 npm 크리덴셜 스틸러를 넘어, 공급망 침해 + 다단계 시크릿 탈취 + GitHub 인프라 무기화를 결합한 정교한 공격이다.
댓글과 토론
THE MOST TRUSTED PASSWORD MANAGER
Defend against hackers and data breaches
회사 홈페이지 태그라인이 무의미해보여서 탈퇴했습니다
소름돋네요;; 매일 쓰던건데 운좋게 homebrew 쪽은 탈취가 안됐군요
허어… 모든 npm global 라이브러리는 일단 제거하든가 pre/postinstall을 끄든가 해야겠습니다
homebrew는 postinstall을 기본 비활성화하고 예외적으로 허용하게 바뀌었습니다. 운이 좋다고 해야할지, npm을 안보고 리포 태그로 업데이트하다보니 이번 버전은 비껴갔네요. 최근에는 npm 쿨다운도 들어가서 아마 npm을 바라봤어도 배포되진 않았을 것 같습니다.