2P by GN⁺ | ★ favorite | 댓글 1개
  • 리크루터가 링크드인 메시지로 접근해 리드 엔지니어 채용을 명분으로 공개 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.jsconst test = require('./test')를 실행해 app/test/index.js를 로드·구동
  • package.jsonapp/index.js시작 단계에 연결
  • 핵심은 prepare 스크립트로, npm은 npm installprepare를 자동 실행
    • 따라서 의존성 설치만으로 백도어가 실행
  • "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으로 바로 보내는 건 꽤 대담한 전략임
    • 최근 면접을 많이 보면서 명백한 사기꾼도 몇 번 만났는데, 내가 속을 만큼 멍청해 보여서가 아니라 이런 사기가 더 흔해졌기 때문이길 바람
  • 이건 범죄가 맞을 텐데, 이런 일을 신고하고 도움받을 수 있는 사이버범죄용 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 위반으로 신고했어야 함
      그러면 바로 내려갔을 것임
  • 같은 도메인을 여러 대상에게 쓰는 것 같음
    3개월 전 Reddit 스레드에도 비슷한 내용이 있음: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...

  • 왜 아직도 전 세계 모든 운영체제가 npm을 차단하지 않는지 이해가 안 됨
    이 사람들은 절대 배우지 않을 것 같음

    • npm 자체와는 상관없음
      이런 사기는 여러 기술로도 가능했고, 심지어 Makefile로도 먹혔을 것임
  • Mac에 드디어 제대로 된 가상화 프레임워크가 생기면 좋겠음
    1995년처럼 인터넷에서 보호 없이 무작위 스크립트를 내려받는 건 이제 꽤 지겨워졌음
    낯선 사람을 만나고 그들의 물건을 내 컴퓨터 깊숙이 넣을 때는 보호 장비를 쓰는 걸 잊지 말아야 함

    • GitHub, AUR, NPM에서 무작위 curl | bash 스크립트를 실행하는 것도 똑같이 나쁘지만, 여기 많은 개발자는 여전히 이 나쁜 관행에 대해 의심스러운 가정을 갖고 있음
      최근 몇 주간 돌아다닌 여러 작은 Shai-Hulud류 사건이 이게 얼마나 나쁜지 보여줌
    • Mac에는 이미 쓸 만한 방식이 있음
      IntelliJ에서 npm 명령을 Docker 컨테이너 안에서 실행하도록 설정할 수 있음
  • LinkedIn에서 받은 구인 제안들이 전부 너무 수상했음
    플랫폼으로 지원하라거나, 자기소개 영상을 녹화하라거나, 코드 플랫폼 뒤에 있는 보정용 코딩 테스트를 풀라는 식이었음

    • 내 형제는 병 때문에 오래 실직했다가 LinkedIn에서 그럴듯해 보이는 “구인 제안”을 받았음
      회사 노트북 보증금 명목으로 수표를 써 달라고 했는데, 겉으로 봐도 말이 안 되지만 오래 구직 중이라 절박했고 드디어 일자리를 얻었다고 정말 기뻐했음
      장기 실직자는 충분한 저축이 있거나 이직하려는 재직자라면 절대 속지 않을 심각한 위험 신호도 지나칠 만큼 절박해질 때가 많음
  • 요즘 대부분의 NPM 패키지 작성자가 이런 식으로 해킹당하는 것 아닌가?
    axios 담당자도 LinkedIn을 통한 같은 접근에 당했던 것 같음

    • 자기 꾀에 자기가 넘어간 느낌임
  • LinkedIn은 구인 공고 때문에만 쓰는데, 지난 몇 달 동안 쓸데없는 공고가 너무 많아졌음
    Ladders, Swooped 같은 곳과 비슷한 회사들의 공고가 잔뜩 보이고, 이제 LinkedIn을 완전히 버릴 때가 된 것 같음