Bitwarden CLI 공급망 공격 분석: 90분 만에 개발자 시크릿이 털린 방법
2026년 4월 22일, @bitwarden/cli@2026.4.0의 악성 빌드가 npm에 약 90분간 노출됐습니다. 그 사이 자기 전파 워엄이 CI 러너의 AWS·Azure·GCP·GitHub·npm·SSH·AI 도구 자격증명까지 public GitHub 저장소로 빨아 갔습니다. Bitwarden vault는 무사하지만, 여러분의 소프트웨어 공급망을 움직이는 NHI는 별개의 이야기입니다. 분 단위 타임라인, NHI Kill Chain 매핑, 10분 안에 끝내는 영향 점검 체크리스트를 정리했습니다.

목차(8)
목차
2026년 4월 22일. 어느 개발팀의 CI 파이프라인이 평소와 다름없이 npm install -g @bitwarden/cli로 시작합니다. 몇 달째 사용해 온 2026.4.0 버전이 받아지고, 빌드는 통과합니다. 테스트도 그린, 파이프라인도 그린. 평범한 화요일 오후의 CI 빌드입니다.
그 시점에 그 개발자가 알지 못했던 사실은, 방금 설치된 패키지가 러너에 있던 모든 클라우드 토큰과 SSH 키, 그리고 AI 도구 설정 파일까지 public GitHub 저장소로 조용히 유출하고 있었다는 것입니다.
이번 사건은 Shai-Hulud 공급망 캠페인의 세 번째 파장이며, 올해 들어 가장 시사점이 많은 사례 중 하나입니다. 기법이 새로워서가 아닙니다. 기법은 평범합니다. 다만 피해자가 보안에 진심인 벤더이고 엔지니어링 수준도 높은 회사인데도 당했다는 점, 그리고 워엄(worm)이 CI 러너에서 노린 모든 자산이 정확히 Cremit이 말하는 비인간 식별자(NHI, Non-Human Identity)에 해당한다는 점이 핵심입니다.
이 글에서는 사건의 흐름을 시간순으로 짚고, 이번 달에 연재 중인 NHI Kill Chain 관점에서 공격을 매핑한 뒤, 자기 조직이 영향권에 들어갔는지 10분 안에 점검할 수 있는 체크리스트를 제공합니다.
무엇이 일어났는가 — 분 단위 타임라인
악성 패키지 @bitwarden/cli@2026.4.0이 public npm 레지스트리에 노출돼 있던 시간은 약 90분입니다. Bitwarden 공식 발표에 따르면 악성 빌드는 2026년 4월 22일 미국 동부시간(ET) 오후 5시 57분에 publish됐고, 같은 날 오후 7시 30분에 제거됐습니다.
이 90분 동안 해당 패키지는 알 수 없는 수의 CI 파이프라인, 개발자 노트북, 컨테이너 빌드로 흘러 들어갔습니다. @bitwarden/cli의 npm 월간 다운로드는 약 25만 건 수준으로, 설치는 업무 시간대에 집중됩니다. 악성 버전이 떠 있던 시간이 정확히 그 시간대였습니다.
Bitwarden의 조사는 vault 데이터, 프로덕션 시스템, 최종 사용자 자격증명에 대한 접근 흔적을 찾지 못했다고 결론 내렸습니다. 침해는 npm 배포 경로에 한정됐다는 의미입니다. 이 구분이 중요합니다. 비밀번호 관리자 본체가 뚫린 게 아니라, 비밀번호 관리자의 CLI를 빌드해서 배포하는 파이프라인이 뚫린 사건입니다.
공격 체인의 분해
기법 자체는 단순합니다. 단순하다는 점이 이 사건의 무게이기도 합니다. 단계마다 성숙한 엔지니어링 조직이 막아야 한다고 여겨지는 통제 지점이 있는데, 모든 단계가 차례로 우회됐습니다.
1단계 — Checkmarx를 통한 초기 침투. Shai-Hulud 캠페인의 3차 파장은 Checkmarx 관련 개발자 도구의 침해를 통해 처음 확산됐습니다. 이 도구가 개발자 환경이나 CI에 설치되면, 거기 있던 자격증명을 수집했습니다. 패키지 메인테이너가 사용하는 npm publish 토큰도 그 수집 대상에 포함됩니다.
2단계 — GitHub Actions 워크플로 침해. 메인테이너의 토큰을 손에 넣은 공격자는 Bitwarden의 릴리스 자동화 워크플로에 악성 단계를 주입했습니다. 이 지점이 레버리지입니다. publish 권한이 있는 GitHub Actions 러너 하나를 장악하면, 해당 패키지를 사용하는 전 세계 모든 소비자에게 백도어가 박힌 패키지를 일제히 배포할 수 있습니다.
3단계 — 악성 npm publish. 공격자는 자격증명 탈취 페이로드가 포함된 @bitwarden/cli@2026.4.0을 빌드해 publish하고, 레지스트리가 늘 하던 일을 하기를 기다렸습니다. 즉, 버전을 핀하지 않은 전 세계의 CI 시스템으로 패키지를 fan-out시키는 것입니다.
4단계 — 워엄의 전파. 페이로드에는 세 종류의 수집기(collector)가 들어 있었습니다.
- 클라우드 공급자 토큰 — Azure, AWS, GCP의 서비스 프린시펄과 액세스 키
- 개발자 플랫폼 토큰 — GitHub PAT, npm publish 토큰
- 호스트 시크릿 — SSH 키, 셸 히스토리, 환경 변수
- AI 도구 설정 — MCP 서버 설정, AI 에이전트 자격증명
수집된 시크릿은 public GitHub 저장소로 유출됐습니다. 일부러 public을 고른 설계입니다. 누군가 그 저장소를 발견해서 유출된 토큰을 다시 사용하면, 캠페인이 한 단계 더 자기 전파합니다.
NHI Kill Chain 관점의 매핑
이번 달 연재 중인 NHI Kill Chain 단계 가운데 세 개가 이번 사건이 가능했던 이유와 정확히 맞물립니다. 암호학의 결함이나 런타임 제로데이의 문제가 아닙니다. 시간이 흐르면서 조직이 식별자를 어떻게 운영하는가의 문제입니다.
Ghost Key. @bitwarden/cli를 배포하는 데 쓰이던 npm publish 토큰은 그 자체로 NHI입니다. 모든 NHI가 그렇듯, 얼굴이 없습니다. 이상 징후가 보였을 때 핑할 슬랙 핸들도, 회수할 노트북도 없습니다. 공격자가 이 토큰으로 publish를 일으켰을 때, 다른 러너에서 다른 시간대에 발생한 그 publish 이벤트가 정상 릴리스와 통계적으로 거의 구분되지 않았을 가능성이 높습니다. (Ghost Key 자세히 보기)
Drifted Key. publish 토큰은 시간이 지나면서 권한 범위와 도달 거리가 무의식 중에 확장되는 경향이 있습니다. 처음에는 내부 도구 하나만 배포하라고 발급된 토큰이, 몇 년 뒤에는 최상위 public scope에 배포할 수 있게 진화해 있는 경우가 많습니다. 원래 의도에서 멀어진 만큼 토큰이 결국 탈취됐을 때의 폭발 반경이 커집니다. (Drifted Key 자세히 보기)
Unattributed Key. 워엄의 페이로드는 CI 러너에서 클라우드 토큰을 빨아 갔습니다. 대부분의 조직에서 그 토큰들은 특정 워크로드, 서비스 오너, rotation 정책에 매핑돼 있지 않습니다. 누출이 탐지되는 순간, rotation 플레이북은 고고학으로 변합니다. 이 토큰이 무슨 일을 하는 토큰인지부터 다시 파악해야 안전하게 폐기할 수 있고, 그 시간 지연이 곧 공격자의 산소입니다.
Kill Chain 매핑의 목적은 누구를 탓하기 위함이 아닙니다. 느리고 기회주의적인 공격에서 악용되는 식별자 관리 갭과, 90분짜리 공급망 공격에서 악용되는 갭이 사실 같은 갭이라는 사실을 보여주려는 것입니다.
MITRE ATT&CK 매핑
이 사건이 강제하는 질문
사후 담론에서 가장 깔끔하게 정리된 프레이밍은 대체로 이런 형태였습니다. "Bitwarden vault는 안전하니까 사용자가 추가 조치할 필요는 없다." 기술적으로는 정확하지만, 충분한 설명은 아닙니다.
워엄이 빨아 간 시크릿의 절대 다수는 애초에 Bitwarden vault에 들어 있던 적이 없습니다. 그것들은 CI 러너의 환경 변수로 살았고, 개발자 노트북의 ~/.aws/credentials에 살았고, GitHub Actions 워크플로의 메타데이터에 살았습니다. 여러분의 소프트웨어 공급망을 움직이는 NHI는 패스워드 매니저 안에 살지 않습니다. "패스워드 매니저는 무사하다"는 진술은 "우리 공급망은 무사하다"는 진술과 같지 않습니다.
세 차례에 걸친 Shai-Hulud 캠페인이 던진 구조적 교훈이 바로 여기에 있습니다. 공격 표면은 가치가 저장되는 곳이 아니라, 가치가 이동하는 곳입니다.
10분 안에 끝내는 점검 체크리스트
침해 시간 윈도우가 명확하게 정의된 사건이라, 즉시 대응이 일반적인 공급망 공격보다 훨씬 다루기 쉽습니다. 다음을 차례로 확인하세요.
1. 2026년 4월 22일 오후 5시 57분 ~ 7시 30분 ET 사이에 `@bitwarden/cli`를 설치한 흔적이 있는가?
# CI 로그에서 해당 윈도우의 install 흔적 검색
grep -r "@bitwarden/cli" /var/log/ci/ # CI 로그 경로에 맞게 조정
# 개별 머신의 npm install 시점 확인
npm list -g @bitwarden/cli --json2. lockfile에 `@bitwarden/cli` 버전을 핀하고 있는가? 핀하고 있다면 비교적 안전합니다. 윈도우 동안 npm update를 돌리지 않은 한 lockfile이 악성 버전을 거부했을 것입니다. 핀하지 않은 상태였다면, 윈도우 동안의 install은 침해된 것으로 간주하고 대응합니다.
3. 영향을 받았다면, 워엄의 수집 범위 내 자격증명을 모두 rotate하세요. 구체적으로:
- 영향받은 러너에 존재했던 모든 AWS 액세스 키
- 모든 Azure 서비스 프린시펄 자격증명
- 모든 GCP 서비스 계정 키
- 모든 GitHub PAT (특히
packages:write권한이 있는 fine-grained 토큰) - 모든 npm publish 토큰
~/.ssh/에 있던 SSH 키- AI 도구 자격증명 (Anthropic, OpenAI, MCP 서버 토큰 등)
4. public GitHub에 새로 push된, 구조화된 자격증명 덤프가 들어 있는 저장소가 자사 계정에서 발생하지 않았는지 감사하세요. 워엄은 public 저장소로 유출합니다. 캠페인의 유출 패턴과 일치하는 저장소 이름을 GitHub에서 검색하고, 그 어느 것도 자사 계정에서 비롯되지 않았음을 확인하세요.
5. 향후 대응 — npm 의존성을 핀하고 provenance를 검증하세요. npm은 컴플라이언트 CI에서 빌드된 패키지에 대해 provenance attestation을 제공합니다. @bitwarden/cli@2026.4.0은 유효한 provenance attestation을 갖고 있지 않았고, 같은 형태의 향후 악성 빌드 또한 갖고 있지 않을 것입니다.
Cremit Argus의 역할
Cremit의 Argus는 public GitHub, public 패키지 레지스트리, paste 사이트 등 개발자 생태계의 외부 노출 표면을 인덱싱하면서, 보호 대상 고객의 식별자 패턴 및 attribution 메타데이터와 일치하는 시크릿을 추적합니다. Shai-Hulud 캠페인이 유출 채널로 선택한 곳(public GitHub 저장소)이 정확히 Argus가 모니터링하는 표면입니다.
가장 좋은 시나리오에서는 공격자가 자격증명을 사용해 보기도 전에 탐지가 들어옵니다. 가장 나쁜 시나리오에서도, 사후에 로그를 뒤져서 도출해야 했을 rotation 대상 목록을 미리 손에 쥐여 줍니다.
자사가 어떤 형태로든 public 패키지 레지스트리에 소프트웨어를 배포하고 있다면, Argus가 자격증명 누출을 어떻게 표면화하는지 확인해 보세요. 침해가 공급망 아래로 더 전파되기 전에 끊는 것이 목표입니다.
함께 읽으면 좋은 글
- NHI Kill Chain — Public Key — 시리즈 도입부
- Ghost Key — 주인이 없는 NHI
- Drifted Key — 원래 범위를 벗어나 자라난 키
- Aged Key — rotate 됐어야 하는데 그러지 못한 키
출처: [Bitwarden 커뮤니티 발표](https://community.bitwarden.com/t/bitwarden-statement-on-checkmarx-supply-chain-incident/96127), [The Hacker News 보도](https://thehackernews.com/2026/04/bitwarden-cli-compromised-in-ongoing.html), [BleepingComputer 기술 분석](https://www.bleepingcomputer.com/news/security/bitwarden-cli-npm-package-compromised-to-steal-developer-credentials/), [OX Security의 Shai-Hulud 분석](https://www.ox.security/blog/shai-hulud-bitwarden-cli-supply-chain-attack/), [SecurityWeek 기사](https://www.securityweek.com/bitwarden-npm-package-hit-in-supply-chain-attack/).
다음 글을 메일로 받아보세요
Cremit 리서치 팀의 월간 NHI 브리프. 한 통에 핵심만 담습니다.