56초 만에 634개의 비밀번호
한 개발자가 가짜 회사와 두 차례 면접을 진행했습니다. 실제 웹사이트, 실제 얼굴, 실제 기술 대화였습니다. 그러다 코딩 과제를 실행했고, 1분도 안 되어 Chrome에 저장된 모든 비밀번호, macOS Keychain, 암호화폐 지갑 데이터가 사라졌습니다.
보안에 밝고 경험이 많으며, 늘 사기를 경계하는 한 개발자가 가짜 회사와 여러 단계의 면접 절차를 진행했습니다. HR 통화. 엔지니어 두 명과의 기술 면접. 팀 사진이 있는 실제 웹사이트. 실제 LinkedIn 프로필. 몇 주에 걸친 관계 쌓기.
그런 다음 화면 공유 중에 작은 코딩 과제를 실행해 달라는 요청을 받았습니다.
56초 후, 공격자들은 Chrome에 저장된 비밀번호 634개, macOS Keychain 파일(이를 복호화하는 키가 담긴), 그리고 MetaMask 지갑 데이터를 손에 넣었습니다.
공격은 어떻게 진행되었나
GitHub 저장소는 깨끗해 보였습니다. 백엔드 파일 몇 개, 수상한 점은 없었습니다. 하지만 winston-middleware라는 평범해 보이는 로깅 패키지 하나가 의존성을 하나 더 가지고 있었습니다. 바로 next-runtimejs입니다.
무기는 그 안에 있었습니다.
npm install이 실행되는 순간, 셸 스크립트가 조용히 실행되었습니다. 알림도, 경고도 없었습니다. Go로 작성된 백도어를 내려받아 매번 부팅 시 자동 시작되도록 등록했습니다.
이것은 아마추어 도구가 아니었습니다. RC4로 암호화된 맞춤형 C2 프로토콜. 셸 실행, 파일 탈취, Chrome 비밀번호 추출, Keychain 유출, 암호화폐 지갑 타기팅까지 지원하는 명령 체계. 전문적으로 만들어졌습니다.
백도어는 16:16:37에 시작됐습니다. Chrome 비밀번호는 16:17:33에 접근됐습니다. 개발자가 macOS에서 나가는 연결에 대한 팝업을 눈치채고 1분 안에 WiFi를 끊었지만, 피해는 이미 발생한 뒤였습니다.
왜 면접이 중요했나
이 공격은 차가운 이메일로는 실패했을 겁니다. 낯선 사람의 "이 저장소를 실행해 보세요"는 무시됩니다.
하지만 두 차례의 면접을 거친 후라면? 개발자들을 노리는 가짜 채용 사기가 얼마나 많은지 함께 웃은 후라면? 면접관 중 한 명이 웃으며 "백도어가 있는지 한번 찾아보셔도 좋아요"라고 말한 후라면?
바로 그때 경계가 풀립니다. 신뢰가 바로 그 취약점입니다. 악성코드는 페이로드에 불과합니다.
이 개발자가 가장 잘 말했습니다. "저에게 일어났다면, 여러분 팀의 누구에게든 일어날 수 있습니다."
Chrome 비밀번호가 실제로 의미하는 것
Chrome은 저장된 비밀번호를 AES로 암호화합니다. 복호화 키는 macOS Keychain에 저장됩니다. 공격자들은 두 파일을 1분 안에 모두 훔쳤습니다.
은행, 이메일, GitHub, 클라우드 콘솔까지 저장된 모든 비밀번호가 그들 쪽에서 읽을 수 있는 상태가 됐습니다. Keychain 파일은 속도 제한 없이 오프라인에서 해독할 수 있습니다. 개발자는 모든 것을 교체해야 했습니다.
브라우저에 저장된 비밀번호의 그림자가 여기 있습니다. 같은 기기에 존재하는 키로 암호화되기 때문입니다. 기기가 뚫리면 그 "암호화"는 장식에 불과합니다.
DPRK 패턴
이 개발자는 이전 회사도 3개월 전에 북한에게 해킹당했다고 언급했습니다. 이른바 "Contagious Interview" 캠페인입니다. 북한의 국가 지원 공격자들이 가짜 채용 면접을 운영하며 개발자 기기에 악성코드를 심는 방식입니다.
무작위가 아닙니다. 개발자를 노리는 이유는 개발자가 접근할 수 있는 것 때문입니다. 프로덕션 자격 증명, 서명 키, 클라우드 인프라, 그리고 점점 더 많이 — 그보다 더 많은 것에 접근할 수 있는 AI 에이전트 토큰까지.
규모는 산업 수준입니다. 생성된 얼굴의 가짜 회사. 정교한 웹사이트. 여러 주에 걸친 면접 절차. 투자하는 건 그만한 ROI가 있기 때문입니다.
"비밀번호 관리자는 도움이 안 된다"
이 개발자는 스레드에서 흥미로운 주장을 했습니다. "이런 백도어로 내 컴퓨터에 접근할 수 있다면 비밀번호 관리자도 도움이 안 됩니다. 나중에 어떤 파일이든 전송할 수 있고, 나만을 위한 특수 익스플로잇을 만들 수 있고, 키로거와 스크린샷도 가능하니까요."
이건 부분적으로 맞고 부분적으로 틀립니다.
볼트를 로컬 디스크에 저장하고, 직접 입력하는 마스터 비밀번호로 잠금을 해제하는 비밀번호 관리자라면 — 예, 키로깅과 파일 접근이 가능한 백도어가 그것을 뚫을 수 있습니다.
하지만 하드웨어에 바인딩된 키를 쓰는 비밀번호 관리자, 즉 복호화 키가 물리적 인증 장치에서 파생되며 디스크 상의 파일로는 절대 존재하지 않는다면 이야기는 근본적으로 다릅니다. 백도어는 파일을 훔치고 키 입력을 기록하고 스크린샷을 찍을 수 있습니다. 하지만 물리적인 탭이 있을 때만 하드웨어 보안 모듈 안에 존재하는 키는 꺼내올 수 없습니다.
Chrome 비밀번호 634개가 훔친 것은, 암호화된 데이터와 복호화 키가 모두 파일 시스템 위의 파일이었기 때문입니다. 복호화 키가 물리적 기기 소유를 요구한다면, 파일을 훔쳐봤자 얻는 건 암호화된 덩어리뿐입니다.
무엇을 해야 하나
- 면접용 코드를 절대 본인의 주력 기기에서 실행하지 마세요. VM이나 별도 기기를 사용하세요.
- 익숙하지 않은 저장소에서는 실행 전에
npm install --ignore-scripts로 확인하세요 - 새 연결이 발생하면 알려주는 아웃바운드 방화벽(Little Snitch, LuLu)을 사용하세요
- Chrome에 비밀번호를 저장하지 마세요. 그대로입니다.
- 암호화폐는 브라우저 확장 프로그램이 아니라 하드웨어 지갑에 보관하세요
- 몇 번의 통화를 했든, 리크루터가 주는 모든 코딩 과제를 잠재적으로 적대적으로 취급하세요
이 개발자가 살아남은 건 macOS 팝업이 나가는 연결을 제때 잡아냈기 때문입니다. 대부분은 아무 생각 없이 허용을 눌렀을 겁니다.
56초. 필요하건 전부입니다.