LinkedIn 채용 제안에 숨겨진 백도어
(roman.pt)- 리크루터가 링크드인 메시지로 접근해 리드 엔지니어 채용을 명분으로 공개 GitHub 저장소 리뷰를 요청한 소셜 엔지니어링 공격 사례
- 리뷰 요청 코드에는 테스트 스위트로 위장한 백도어가 숨겨져 있었으며, "deprecated Node modules 이슈를 확인해 달라"는 요청이
npm install실행을 유도하는 미끼 - 의심을 느껴 로컬 대신 일회용 VPS에서 읽기 전용 에이전트로 코드를 점검하자, 문제 파일이 수초 만에 탐지됨
- 저장소 커밋과 리크루터 프로필 모두 실존 인물의 신원을 도용한 것으로, 각각 실제 개발자와 예술 분야 저널리스트를 사칭
- 의심과 보안 위생(security hygiene), 그리고 읽기 전용 에이전트 활용이 직접 코드를 읽는 것보다 효과적이었다는 실질적 방어 교훈 제시
접근 경위
- 지난주 소규모 크립토 스타트업 리크루터로부터 링크드인 메시지를 받음
- 며칠에 걸쳐 몇 차례 메시지를 주고받았고, 리드 엔지니어가 필요한 고장 난 proof-of-concept를 설명
- 리뷰용으로 공개 GitHub 저장소를 전달하며 "deprecated Node modules 이슈를 확인해 달라"고 요청
- 기존 코드베이스 리뷰 요청 자체는 흔한 일이지만, 위화감을 느껴 한층 경계함
점검 방식
- 클론 후 의존성 설치 대신, Hetzner의 일회용 VPS를 띄워 그곳에서 저장소를 클론
- Pi를 읽기 전용 모드로 지정, 파일 읽기 도구만 활성화한 채 실행
- 사용 명령:
pi --tools read,grep,find,ls
- 사용 명령:
- 에이전트에 코드베이스 리뷰와 의심 항목 표시를 요청하자,
app/test/index.js에서 거의 즉시 멈춤
백도어 구조
- 저장소는 React 프론트엔드 + Node 백엔드 형태
- 함정은 약 250줄의
app/test/index.js로, 테스트 스위트로 위장됨 - 내부에서 URL을 조각으로 분할 조립해 은닉
- protocol, domain, separator, path, token, subdomain 등 변수를 결합해
https://rest-icon-handler.store/icons/77을 구성
- protocol, domain, separator, path, token, subdomain 등 변수를 결합해
- 주석 처리된 테스트 더미 사이에 페이로드가 숨겨져, 서버가 보내는 무엇이든 사용자 머신에서 실행
- 페이로드는 225번째 줄에 위치
트리거 메커니즘
- 파일은 테스트 실행을 기다리지 않음
app/index.js가const test = require('./test')를 실행해app/test/index.js를 로드·구동
package.json이app/index.js를 시작 단계에 연결- 핵심은
prepare스크립트로, npm은npm install후prepare를 자동 실행- 따라서 의존성 설치만으로 백도어가 실행됨
- "deprecated Node modules 이슈 확인" 지시는 결국
npm install실행을 유도하는 미끼 - 샌드박스에서 페이로드를 실행해 2단계 페이로드를 관찰할 수도 있었으나, 서버가 건네는 코드를 실행한다는 증거만으로 중단
첫 번째 도용된 신원
- 커밋은 실존 풀스택 개발자의 이름·이메일로 작성됨
- 평범한 링크드인 프로필, 개인 웹사이트, 오랜 이력의 GitHub 계정 보유
- 코드베이스를 물려받았다고 가장해 해당 개발자에게 문의
- 그는 해당 회사에서 일한 적 없으며, 이전에도 GitHub에서 사칭당해 저장소가 내려간 적 있고, 이 저장소와 무관하다고 답함
- 본인도 이런 저장소들을 신고하는 중이라고 밝힘
- 전체 커밋 이력 39개 커밋이 저장소를 한 번도 건드린 적 없는 한 개발자 명의로 귀속됨
두 번째 도용된 신원
- 리크루터 프로필은 실존 예술 분야 저널리스트의 것으로, 문화 분야 이력만 있고 기술적 요소는 전무
- 설치가 안 된다고 응수하자, 비기술직 저널리스트가 즉시 npm·Node 버전 전문가로 돌변해
npm install실행을 압박
누구에게나 일어날 수 있음
- 이런 공격을 들어왔고 HN에서도 읽었지만, 직접 표적이 되자 다소 허를 찔림
- 첫 메시지부터 의심했으나, 피곤하거나 급한 날이었다면 깊이 생각하기 전에
npm install을 실행했을 수 있음
- 첫 메시지부터 의심했으나, 피곤하거나 급한 날이었다면 깊이 생각하기 전에
- 저장소 리뷰 요청을 담은 링크드인 메시지에는 약간의 경계심과 보안 위생이 필요함
- 읽기 전용 에이전트로 코드를 리뷰한 것이 직접 읽는 것보다 효과적
- 백도어는 서툰 초보 코드처럼 위장됐으나, 에이전트가 수초 만에 탐지
- 저장소는 GitHub에, 리크루터는 LinkedIn에 신고했으나 현재까지 변화 없이 코드는 여전히 게시 중
댓글과 토론
Hacker News 의견들
-
작은 암호화폐 스타트업 리크루터가 고장 난 개념증명 저장소를 검토해 달라며 공개 GitHub 저장소를 보냈고, “deprecated Node modules issue”를 확인하라고 했다는 흐름이 npm install 유도 피싱이었음
prepare스크립트가npm install뒤 자동 실행되어 서버가 내려주는 임의 코드를 로컬에서 실행하는 백도어였고, LinkedIn에서 이런 피싱을 당할 수 있다는 게 놀라울 정도로 심각해 보임- LinkedIn은
$company에서 일한다고 주장하는 사용자를 회사가 부인할 방법을 제공하지 않고, 프로필에만 적혀 있으면 공식 회사 페이지에 나타남
우리 회사도 같은 사기를 치는 가짜 리크루터들이 있었고, LinkedIn Premium에 관련 글도 많은 꽤 그럴듯한 가짜 프로필이었지만 실제 직원은 아니었음
신고를 아무리 해도 내려가지 않았고, 결국 LinkedIn에서 일하는 지인에게 술을 사주고 해결했지만 모든 스타트업이 그런 연결고리를 가진 건 아님 - 친구라면 친구가 NPM을 쓰게 두지 말아야 함
지금처럼 사람들이 계속 털리는 걸 보면, PNPM 같은 도구를 쓰고 코드를 내려받는 과정에서 임의 코드 실행이 되는 가장 뻔하고 자주 악용되는 구멍을 막지 않는 게 이해되지 않음
코드를 다운로드하려는 순간 임의 코드를 실행하는 도구들은 이제 멈춰야 함 - 이런 방식은 특히 2021~2022년 암호화폐/NFT 붐 때 Upwork에서 검증된 수법이었고, 어느 시점부터 암호화폐 프로젝트를 넘어 여러 범주로 넓게 퍼졌음
마지막으로 기억나는 건 Windows.scr화면보호기 파일처럼 위장한 다운로드였고, LinkedIn까지 온 건 더 나쁜 단계임
플랫폼은 “일자리 증가”처럼 보일 테니 별로 신경 쓰지 않을 것 같고, Google이나 Meta 같은 광고 네트워크가 사기 광고를 크게 신경 쓰지 않는 것과 비슷함 - 이메일을 캐내고
bullshitpowershellladendoucument.pdf.docx같은 걸 보내는 피싱은 겪어봤지만, LinkedIn DM으로 바로 보내는 건 꽤 대담한 전략임 - 최근 면접을 많이 보면서 명백한 사기꾼도 몇 번 만났는데, 내가 속을 만큼 멍청해 보여서가 아니라 이런 사기가 더 흔해졌기 때문이길 바람
- LinkedIn은
-
이건 범죄가 맞을 텐데, 이런 일을 신고하고 도움받을 수 있는 사이버범죄용 911 같은 잘 알려진 창구가 왜 없는지 모르겠음
사회가 실제 위험을 따라잡고 지원망을 빨리 만들어야 하며, 조직범죄에는 조직적인 방어가 필요함- 안타깝게도 악성 사이버범죄자들은 “범죄에 신경 쓰지 않는 나라에서 범죄를 저지르기”라는 한 가지 이상한 트릭을 알고 있음
- https://www.ic3.gov
답장은 못 받을 가능성이 크지만, 미국 시민에게는, 어쩌면 누구에게나, 내가 아는 한 인터넷 911에 가장 가까운 곳임 - 핵심 문제는 전 세계적으로 통하는 글로벌 911이 없다는 것임
두 번째 문제는 이런 사기를 만드는 데 드는 노력은 거의 0에 가깝지만, 잡고 기소하는 데는 큰 노력과 천문학적 비용이 든다는 비대칭성임 - 냉소적으로 말하면, 사람들이 서로에게 저지르는 나쁜 일의 나무에서 이건 꽤 손대기 어려운 높은 가지에 있음
Microsoft 지원인 척하며 노인을 노리는 사기 전화와 비슷한 위치이고, 용의자를 잡기는 거의 불가능함
흔적을 아주 잘 숨기거나, 더 자주로는 서구인을 상대로 사기 치는 걸 정부가 신경 쓰지 않거나 심지어 묵인하는 나라에 살기 때문임 - FBI에도 IC3가 있지만 사이버범죄 대응은 형편없고 사실상 쓸모없음
범죄를 신고해도 도와주거나 연락해 주지 않을 가능성이 큼
-
이건 이제 평범한 면접 과제와 불편할 정도로 가까움
누군가 저장소를 보내며 설치가 깨졌다고 하고 살펴봐 달라고 하는 상황은 자연스럽고, 많은 개발자가 피곤하거나 구직 중이면 깊게 생각하기 전에npm install을 실행할 수 있음- 면접 맥락이라 더 나쁨
느려 보이고 싶지 않아서, 애초에 실행해도 되는지 물어보는 단계를 건너뛰게 됨
- 면접 맥락이라 더 나쁨
-
“저장소는 GitHub에, 리크루터는 LinkedIn에 신고했지만 아직 아무것도 바뀌지 않았고 코드는 그대로 올라와 있다”니, 아, Microsoft
- LinkedIn에서 CBC 캐나다 뉴스처럼 꾸민 광고를 본 적이 있음
캐나다 총리가 모든 캐나다인을 위한 암호화폐 투자 계획을 발표하는 가짜 영상으로 연결되고 가입 링크까지 있었는데, 신고했더니 조사 결과 정책 위반을 찾지 못했다는 답이 왔음 - 이상하지 않나? Microsoft는 LinkedIn, GitHub, NPM을 모두 소유하고 있음
셋 다 보안이나 안정성 문제가 있고, Microsoft가 AI에 더 깊이 들어갈수록 나아지기는커녕 악화되는 것처럼 보임
회사 내부의 AI 생산성, 어떤 말로는 10배라던 그 생산성은 어디로 가고 있는지 모르겠음 - DMCA 위반으로 신고했어야 함
그러면 바로 내려갔을 것임
- LinkedIn에서 CBC 캐나다 뉴스처럼 꾸민 광고를 본 적이 있음
-
같은 도메인을 여러 대상에게 쓰는 것 같음
3개월 전 Reddit 스레드에도 비슷한 내용이 있음: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t... -
왜 아직도 전 세계 모든 운영체제가 npm을 차단하지 않는지 이해가 안 됨
이 사람들은 절대 배우지 않을 것 같음- npm 자체와는 상관없음
이런 사기는 여러 기술로도 가능했고, 심지어 Makefile로도 먹혔을 것임
- npm 자체와는 상관없음
-
Mac에 드디어 제대로 된 가상화 프레임워크가 생기면 좋겠음
1995년처럼 인터넷에서 보호 없이 무작위 스크립트를 내려받는 건 이제 꽤 지겨워졌음
낯선 사람을 만나고 그들의 물건을 내 컴퓨터 깊숙이 넣을 때는 보호 장비를 쓰는 걸 잊지 말아야 함- GitHub, AUR, NPM에서 무작위
curl | bash스크립트를 실행하는 것도 똑같이 나쁘지만, 여기 많은 개발자는 여전히 이 나쁜 관행에 대해 의심스러운 가정을 갖고 있음
최근 몇 주간 돌아다닌 여러 작은 Shai-Hulud류 사건이 이게 얼마나 나쁜지 보여줌 - Mac에는 이미 쓸 만한 방식이 있음
IntelliJ에서 npm 명령을 Docker 컨테이너 안에서 실행하도록 설정할 수 있음
- GitHub, AUR, NPM에서 무작위
-
LinkedIn에서 받은 구인 제안들이 전부 너무 수상했음
플랫폼으로 지원하라거나, 자기소개 영상을 녹화하라거나, 코드 플랫폼 뒤에 있는 보정용 코딩 테스트를 풀라는 식이었음- 내 형제는 병 때문에 오래 실직했다가 LinkedIn에서 그럴듯해 보이는 “구인 제안”을 받았음
회사 노트북 보증금 명목으로 수표를 써 달라고 했는데, 겉으로 봐도 말이 안 되지만 오래 구직 중이라 절박했고 드디어 일자리를 얻었다고 정말 기뻐했음
장기 실직자는 충분한 저축이 있거나 이직하려는 재직자라면 절대 속지 않을 심각한 위험 신호도 지나칠 만큼 절박해질 때가 많음
- 내 형제는 병 때문에 오래 실직했다가 LinkedIn에서 그럴듯해 보이는 “구인 제안”을 받았음
-
요즘 대부분의 NPM 패키지 작성자가 이런 식으로 해킹당하는 것 아닌가?
axios 담당자도 LinkedIn을 통한 같은 접근에 당했던 것 같음- 자기 꾀에 자기가 넘어간 느낌임
-
LinkedIn은 구인 공고 때문에만 쓰는데, 지난 몇 달 동안 쓸데없는 공고가 너무 많아졌음
Ladders, Swooped 같은 곳과 비슷한 회사들의 공고가 잔뜩 보이고, 이제 LinkedIn을 완전히 버릴 때가 된 것 같음