LinkedIn 채용 제안에 숨겨진 백도어

1 week ago 17
  • 리크루터가 링크드인 메시지로 접근해 리드 엔지니어 채용을 명분으로 공개 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을 조각으로 분할 조립해 은닉
  • 주석 처리된 테스트 더미 사이에 페이로드가 숨겨져, 서버가 보내는 무엇이든 사용자 머신에서 실행
    • 페이로드는 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에 신고했으나 현재까지 변화 없이 코드는 여전히 게시 중
Read Entire Article