Security Blog

수확할 것이 없어야 해요

#117

October 2, 2026 · By Marketing team

← All posts

변조된 Bitwarden CLI가 개발자 머신 334대에서 SSH 키, 클라우드 자격 증명, npm 토큰을 수확해 갔어요. 진짜 문제는 멀웨어가 어떻게 들어왔느냐가 아니에요. 모든 비밀 정보가 평문 파일로 그 자리에 놓여 있었고, 그저 읽히기를 기다리고 있었다는 게 문제예요.

어제, 변조된 버전의 Bitwarden CLI가 개발자 머신 334대에서 SSH 키, AWS 자격 증명, npm 토큰, 환경 변수, 셸 히스토리, Git 비밀 정보를 수집해 갔어요.

오늘은 Bitwarden이었고, 지난달은 Axios였어요. 그 전에는 Checkmarx였고요. 내일은 VS Code 확장 프로그램이거나, Acrobat이거나, Homebrew 포뮬러이거나, Docker 이미지일 거예요. 공격 벡터는 매주 바뀌지만 결과는 언제나 같아요.

멀웨어가 착륙해요. ~/.ssh/를 읽어요. ~/.aws/credentials를 읽어요. ~/.npmrc를 읽어요. ~/.git-credentials를 읽어요. 셸 히스토리와 환경 변수, 브라우저 비밀번호 저장소를 읽어요. 그리고 이 모든 걸 묶어서 C2 서버로 보내요.

그리고 매번 성공해요.

수확

Bitwarden 페이로드 — bw1.js라는 이름의 10MB 난독화 파일 — 는 암호 해독을 시도하지 않았어요. 그럴 필요도 없었고요. Socket과 Aikido가 기록한 대로 수집한 내용은 다음과 같아요.

  • SSH 키와 호스트 지문
  • AWS, GCP, Azure 클라우드 자격 증명
  • npm 인증 토큰
  • Git 자격 증명과 원격 URL
  • 환경 변수
  • 셸 히스토리
  • Claude Code 인증 정보와 MCP 구성

그다음 탈취한 npm 토큰으로 피해자가 유지 관리하던 다른 패키지를 재발행해서 스스로를 더 넓게 퍼뜨렸어요. 피해자가 공격 벡터가 된 셈이에요.

이 중 어느 것도 암호를 깨지 않아도 됐어요. 이 비밀 정보들은 전부 파일 시스템 위의 파일이었고, 사용자 권한으로 실행되는 어떤 프로세스든 읽을 수 있었어요.

Bitwarden에 관한 이야기가 아니에요

Bitwarden의 볼트 암호화가 뚫리지 않았어요. 제로 지식 아키텍처는 버텼어요. 멀웨어는 볼트에 손도 대지 않았어요.

그럴 필요도 없었거든요.

볼트는 그 안의 내용을 보호해요. 그런데 SSH 키는 원래 볼트에 없었어요. AWS 자격 증명도 볼트에 없었고요. npm 토큰, Git 자격 증명, .env 파일 속 API 키 — 이 중 어느 것도 비밀번호 관리자에 살지 않아요. 전부 도트파일에 평문으로, 모든 개발자의 머신에 살고 있어요.

공격자는 이걸 이해했어요. 이건 모든 서랍이 열려 있는 집 안에 놓인 잠긴 금고예요.

진짜 공격 표면

지금 터미널을 열어 보세요. 머신에 뭐가 있는지 살펴보세요.

~/.ssh/id_ed25519 — 개인 키예요. 평문 파일이에요.

~/.aws/credentials — 클라우드 접근 권한이에요. 평문 파일이에요.

~/.npmrc — 발행 토큰이에요. 평문 파일이에요.

~/.git-credentials — 저장소 접근 권한이에요. 평문 파일이에요.

프로젝트 디렉터리 열 곳에 흩어진 ~/.env — API 키, 데이터베이스 비밀번호, 서명용 비밀 정보예요. 전부 평문 파일이에요.

사용자 권한으로 실행되는 어떤 프로세스든 이 모든 걸 읽을 수 있어요. 권한 상승도 필요 없고, 익스플로잇도 필요 없어요. cat이면 충분해요.

2026년의 기본적인 개발자 환경이 이래요. 비밀번호는 암호화된 볼트에 넣어 두고, 나머지는 전부 열려 있는 곳에 놔두죠.

잘못된 질문

공급망 공격이 있을 때마다 업계는 같은 질문을 해요. 멀웨어가 들어오지 않게 하려면?

더 나은 CI/CD 보안. 코드 서명. 의존성 스캐닝. 샌드박스 런타임. 다 좋은 방법이에요. 하지만 어느 것도 충분하지 않아요. 공격 표면이 너무 넓어요. 패키지 관리자, 브라우저 확장 프로그램, IDE 플러그인, OAuth 앱, 변조된 빌드 도구처럼 벡터가 너무 많고요. 모든 진입점을 막을 수는 없어요.

올바른 질문은 이거예요. 멀웨어가 불가피하게 개발자의 머신에서 실행 권한을 얻었을 때, 거기서 뭘 발견하게 될까요?

답이 "예측 가능한 파일 시스템 위치에 놓인 수백 개의 평문 자격 증명"이라면, 아무리 공급망을 강화해도 소용없어요. 골문이 등 뒤로 활짝 열려 있는 상태에서 수비하고 있는 셈이니까요.

수확할 것이 없어야 해요

해결책은 더 나은 멀웨어 탐지가 아니에요. npm install을 샌드박스에 넣는 것도 아니고요. 사고 대응 시간을 줄이는 것도 아니에요.

해결책은 이거예요. 비밀 정보가 디스크 위의 파일로 존재해서는 안 돼요.

SSH 키는 인증 시점에 하드웨어에서 도출하고 — ~/.ssh/에 저장하지 않아요. 클라우드 자격 증명은 하드웨어에 귀속된 신원에서 세션마다 발급하고 — ~/.aws/에 쓰지 않아요. API 토큰은 범위가 한정되고, 일시적이며, 하드웨어로 통제돼야 해요 — .env 파일에 그냥 놓여 있지 않아요.

자격 증명이 하드웨어 보안 모듈 안과 사용 중인 일시적 프로세스 메모리에만 존재하면, 멀웨어가 읽을 게 없어요. 유출할 파일도, 긁어갈 도트파일도 없어요. 프로세스는 실행되고, 아무것도 못 찾고, 그냥 지나가요.

이건 이론이 아니에요. 하드웨어에 귀속된 자격 증명은 오늘 이미 존재해요. WebAuthn PRF는 물리적 인증기의 탭 한 번으로 암호화 키를 도출할 수 있어요 — 파일 시스템에 절대 닿지 않는 키를요. 기술은 이미 있어요. 업계가 아직 기본값으로 채택하지 않았을 뿐이에요.

지금 할 일

Bitwarden CLI 변조의 영향을 받았다면:

  • 그 머신의 모든 자격 증명을 교체하세요 — SSH 키, 클라우드 토큰, npm 토큰, API 키, 도트파일과 환경 변수에 있는 모든 것
  • 본인이 유지 관리하는 npm 패키지 중 재발행된 게 있는지 확인하세요
  • GitHub 활동과 CI/CD 워크플로에서 승인되지 않은 변경이 있었는지 감사하세요

영향을 받지 않았더라도 할 일은 같아요. 머신을 열어 보세요. 평문 비밀 정보가 몇 개인지 세어 보세요. 악성 코드가 사용자 권한으로 실행될 때 — 실행된다면이 아니라 실행될 때 — 무슨 일이 생기는지 스스로에게 물어보세요.

답은 "아무것도 없어요"여야 해요. 수확할 것이 없어야 해요.