LinkedIn 가짜 채용으로 위장한 npm 백도어 — 한국 개발자 방어 가이드

최근에 LinkedIn에서 “리드 엔지니어 채용” 메시지를 받아본 적이 있으신가요? 풀스택 Python 개발자 Roman Imankulov가 2026년 6월 15일에 공개한 사례는, 채용 담당자를 가장한 공격자가 GitHub 리포지토리 리뷰 요청에 npm 백도어를 심어 둔 전형적인 공급망 공격이었습니다. 원문: A backdoor in a LinkedIn job offer.

수상한 GitHub 리포지토리를 격리 환경에서 검토하는 한국 백엔드 개발자 워크스페이스 개념 이미지
Photo by James Harrison on Unsplash

본 글은 이 사건의 기술 메커니즘을 짚고, 한국 백엔드·풀스택 개발자에게 동일한 패턴이 어떻게 다가오는지, 그리고 5분 안에 적용할 수 있는 LinkedIn npm 백도어 방어 체크리스트를 정리합니다.

1. 사건 요약: LinkedIn DM 한 통으로 시작된 함정

Roman은 작은 크립토 스타트업의 리크루터를 자칭한 인물에게 LinkedIn 메시지를 받았습니다. 며칠에 걸쳐 DM이 오간 뒤, 상대방은 공개 GitHub 리포지토리 링크와 함께 “deprecated된 Node 모듈 이슈를 검토해 달라”고 요청했습니다.

요청 자체는 흔합니다. 시니어 채용 과정에서 “기존 코드베이스를 보고 의견을 달라”는 과제는 종종 있습니다. 다만 Roman은 평소 보안에 민감했기 때문에, 본인 PC에 클론·install하는 대신 Hetzner에 일회용 VPS를 띄우고 격리된 환경에서 코드만 정적 분석했습니다. 그 결정이 본인 자산을 살렸습니다.

2. 백도어가 작동하는 방식: npm prepare 트랩

npm prepare 라이프사이클 훅이 install 직후 자동 실행되는 공급망 공격 흐름 개념 이미지
Photo by Krishna Pandey on Unsplash

리포지토리는 React 프론트엔드 + Node 백엔드 구조였고, 트랩은 app/test/index.js에 약 250줄짜리 가짜 테스트 코드로 위장되어 있었습니다. 핵심 코드는 다음과 같이 도메인을 조각으로 쪼개 정적 분석을 회피합니다.

const protocol = "https",
  domain = "store",
  separator = "://",
  path = "/icons/",
  token = "77",
  subdomain = "rest-icon-handler",
  bearrtoken = "logo";
// 조합 결과: https://rest-icon-handler.store/icons/77

이 URL로부터 받은 응답을 그대로 실행하는 페이로드가 라인 225 부근에 한 줄로 minify된 채 박혀 있었습니다. 즉 외부 서버가 보내는 임의 코드가 개발자 머신에서 실행되는 구조입니다.

여기까지는 “테스트 안 돌리면 안전한 것 아닌가요?”라고 생각할 수 있습니다. 트랩의 두 번째 층은 package.jsonprepare 스크립트였습니다. npm 공식 문서에 따르면 preparenpm install 직후 자동 실행되는 라이프사이클 훅입니다 (npm scripts 공식 문서 기준). 즉 npm install 한 번이면 테스트를 명시적으로 실행하지 않아도 백도어가 발사됩니다.

“deprecated Node 모듈 이슈를 검토해 달라”는 안내 자체가 npm install을 유도하기 위한 미끼였던 셈입니다.

3. 두 겹의 신원 도용: 리크루터와 커밋 작성자

이 공격이 단순 스크립트 키디 수준이 아닌 이유는 사회공학 레이어에 있습니다. Roman이 확인한 두 가지 신원 도용은 다음과 같습니다.

  • 가짜 리크루터: LinkedIn 프로필 사진과 경력이 실존하는 예술 저널리스트의 것이었습니다. Roman이 “프로젝트가 install 단계에서 실패한다”고 떠보자, 비기술직 프로필이 갑자기 npm 버전과 Node.js v24 호환성을 능숙하게 답변했습니다.
  • 가짜 커밋 작성자: 리포지토리의 39개 커밋이 모두 실제로 활동 중인 풀스택 엔지니어 한 명의 이름·이메일로 위장돼 있었습니다. Roman이 직접 연락하니 본인은 그 리포지토리와 아무 관계가 없으며, GitHub에서 사칭을 당해 신고로 리포지토리가 내려간 전례도 있다고 답했습니다.

요약하면 “LinkedIn 리크루터 프로필 + GitHub 커밋 히스토리”라는, 한국 개발자가 1차로 신뢰성을 확인하는 두 채널이 모두 도용 가능합니다. 단순 프로필·커밋 조회만으로 안전을 판단하면 안 됩니다.

4. 한국 개발자에게 다가오는 가짜 채용 패턴

LinkedIn 가짜 채용 메시지를 받고 의심하는 한국 시니어 개발자의 사회공학 방어 개념 이미지
Photo by Zulfugar Karimov on Unsplash

한국 시장 관점에서 이 사례를 짚는 이유는, 동일한 캠페인이 이미 한국어권 개발자 풀을 노리고 있기 때문이에요. The Hacker News 2025년 6월 보도에 따르면 북한 연계 위협 그룹 Lazarus가 npm·PyPI 레지스트리에 192개의 악성 패키지를 배포하고 LinkedIn·Reddit·Facebook을 통한 가짜 채용 캠페인을 운영했습니다 (출처: The Hacker News).

한국 개발자가 받기 쉬운 변형 패턴은 다음과 같습니다.

  • 해외 크립토·DeFi 스타트업 리크루터를 자칭한 DM, 시장 평균보다 명확히 높은 USD 보상 언급
  • “코딩 테스트” 또는 “PoC 검토” 명목의 GitHub 리포지토리 링크 전달
  • “우리 시스템에서 정상 동작합니다, 일단 npm install 해보세요”라는 강한 푸시
  • 화상 인터뷰는 회피하거나, 음성·영상이 끊긴다고 둘러대는 행동 패턴

후배님이 한국 외부 기업과의 첫 접촉이라면, 이 네 가지 신호 중 두 개 이상이 겹치는 순간 그날은 install을 하지 않는 게 합리적인 선택이에요. 채용 기회를 놓치는 것보다 개발 머신과 보유한 토큰·시크릿을 잃는 비용이 훨씬 큽니다.

5. read-only AI 에이전트로 코드 리뷰하기

Roman의 글에서 인상적인 부분은, 그가 직접 코드를 줄별로 읽기 전에 read-only 모드의 AI 에이전트(Pi)를 사용해 의심 코드를 먼저 찾게 했다는 점입니다.

# 파일 읽기 권한만 부여, 실행·수정 도구는 제외
pi --tools read,grep,find,ls

에이전트는 수 초 안에 app/test/index.js에서 의심 패턴을 잡아냈습니다. 사람의 눈은 250줄짜리 위장 코드 사이에서 라인 225의 minify된 한 줄을 놓치기 쉽지만, 정적 분석에 특화된 에이전트는 “변수 조각으로부터 URL을 합성한 뒤 응답을 실행하는 패턴”을 키워드 검색만으로도 빠르게 식별합니다.

실무 적용 팁은 두 가지예요. 첫째, AI 에이전트에는 반드시 파일 시스템 read-only + 외부 네트워크 차단 옵션을 줘야 합니다. 둘째, 분석은 본인 PC가 아닌 격리된 VM·컨테이너에서 진행해야 합니다. AI 에이전트 자체가 또 다른 공급망 공격의 대상이 될 수 있기 때문이에요. 관련해서는 본 블로그의 자율 AI 에이전트 PR 리뷰 체크리스트도 함께 참고하면 좋습니다.

6. 방어 체크리스트 — 메시지를 받은 직후 5분 안에

아래 체크리스트는 LinkedIn 또는 이메일로 “리포지토리 리뷰” 요청을 받았을 때 install 버튼을 누르기 전에 점검하는 항목입니다. 한국 시니어 백엔드 개발자 기준으로 정리했습니다.

  • 1. 격리 환경 우선: 클라우드 VPS, Devcontainer, 또는 일회용 VM 위에서만 클론·install 진행. 본인 PC는 마지막 단계.
  • 2. install 전 정적 분석: package.jsonscripts 섹션, 특히 prepare·postinstall 훅에 명시된 실행 파일을 먼저 읽기. 외부 도메인 호출이 있다면 즉시 중단.
  • 3. 의심 파일 우선 검사: test/·scripts/·utils/처럼 평소 덜 보는 디렉터리의 진입 파일을 우선 확인. 변수를 조각으로 쪼갠 문자열 결합 패턴은 강한 신호.
  • 4. 커밋 작성자 교차검증: 단일 커밋자가 39커밋·4,470줄 추가 같은 비정상 커밋 그래프를 보였는지 확인. 가능하면 LinkedIn·개인 사이트로 본인에게 직접 연락해 진위 확인.
  • 5. 리크루터 신원 검증: 회사 도메인 이메일, 공식 채용 페이지의 채용 공고 존재 여부, 화상 인터뷰 응대 의사. 셋 중 둘 이상이 막히면 보류.
  • 6. read-only AI 에이전트 활용: 격리된 환경에서 read·grep·find 권한만 가진 에이전트로 의심 코드 1차 스캔.
  • 7. 환경 분리 유지: 클립보드·SSH 키·.npmrc·~/.aws/credentials가 마운트되지 않은 컨테이너에서 실험. 분석이 끝나면 컨테이너 즉시 폐기.

위 7개 항목은 다소 과하게 느껴질 수 있지만, 한 번이라도 공급망 공격에 당한 팀의 복구 비용에 비하면 5~10분 투자입니다. 특히 사이드 프로젝트·해외 contract를 동시에 운영하는 시니어일수록 머신에 깔린 시크릿의 총합이 크기 때문에, 더 보수적으로 가는 게 안전해요.

관련 글

이번 글의 보안·AI 코드 리뷰 맥락과 연결되는 본 블로그의 기존 글을 함께 보면 좋습니다.


📌 함께 보시면 좋은 글

※ 본 글은 AI(Claude)의 초안을 기반으로 편집자 검수를 거쳐 발행되었습니다. (한국 AI기본법 대응 고지)

이직·퇴사, 지금 움직여도 될지 헷갈리시나요?

막연히 불안한 건지, 정말 시점이 온 건지 판단이 어려울 때가 있습니다.

5분 체크리스트로 지금 상태를 먼저 정리해보세요.
결론을 대신 내리기보다, 스스로 판단할 기준을 잡는 데 도움을 드립니다.

무료 체크리스트 보기

아직 확신이 없다면, 지금이 ‘고민 단계’인지부터 먼저 점검해보세요