LinkedIn 채용 제안 백도어: 사회공학 공격 분석
소프트웨어 엔지니어가 최근 가짜 LinkedIn 리크루터가 "암호화 스타트업"이라고 가장해 자신의 머신에 백도어를 설치하려던 정교한 사회공학 공격을 상세히 밝혔습니다. 이 공격은 잠재적인 직무를 위해 코드베이스를 검토하는 일반적인 개발자 워크플로를 이용해 피해자를 npm install 실행으로 유인했으며, 이는 원격 코드 실행(RCE) 페이로드를 트리거했습니다.
공격 벡터: 트리거로서의 npm install
이 공격의 주요 메커니즘은 npm 라이프사이클 스크립트를 이용하는 것입니다. 공격자는 공개 GitHub 저장소를 제공하고 대상에게 "폐기된 Node 모듈 이슈를 확인"하라고 지시했으며, 이는 사실상 npm install을 실행해 환경을 설정하도록 유인하는 덫이었습니다.
제공된 저장소에서 package.json 파일은 다음과 같이 구성되었습니다:
prepare스크립트가npm run app:pre를 실행하도록 설정되었습니다.app:pre스크립트가node app/index.js를 실행했습니다.
npm은 npm install 후 자동으로 prepare 스크립트를 실행하기 때문에, 악성 코드는 의존성을 설치하는 즉시 실행되며 사용자가 애플리케이션을 직접 실행할 필요가 없습니다.
백도어의 기술적 분석
악성 페이로드는 app/test/index.js에 숨겨져 있었으며, 테스트 스위트로 위장되었습니다. 코드는 탐지를 피하기 위해 여러 난독화 기법을 사용했습니다:
문자열 조각화: C2(명령 및 제어) 서버 URL이 조각으로 조합되어 단순 문자열 검색을 회피했습니다:
const protocol = "https", domain = "store", separator = "://", path = "/icons/", token = "77", subdomain = "rest-icon-handler", bearrtoken = "logo";이는 최종 URL
https://rest-icon-handler.store/icons/77로 결합됩니다.주석을 통한 난독화: 실제 실행 페이로드는 주석 처리된 테스트 코드 벽에 둘러싸인 단일 압축 라인(225번째 라인)에 숨겨져 있어 수동 검토를 어렵게 만들었습니다.
실행 흐름: 진입점인
app/index.js는const test = require('./test')라인을 포함하고 있어, 시작 시app/test/index.js의 코드를 로드하고 실행합니다.
신원 도용 및 사칭
공격자는 도난하거나 빌린 신원을 사용해 신뢰를 구축했습니다. GitHub 저장소의 커밋 기록(39개 커밋)은 실제 풀스택 엔지니어에게 귀속되었으며, 이 엔지니어는 프로젝트와 전혀 관련이 없었습니다. 연락을 받은 엔지니어는 이전에 GitHub에서 사칭당한 적이 있으며 이 저장소와는 무관하다고 확인했습니다.
마찬가지로, 리크루터의 LinkedIn 프로필은 실제 예술 저널리스트의 것이었습니다. 공격자는 리크루터로 가장해 비기술적인 프로필에서 갑자기 특정 Node.js 버전(예: Node.js v24)에 대해 토론하는 등 기술적 숙련도가 급격히 변하는 모습을 보여, 피해자가 설치 문제에 직면했을 때 신뢰를 얻었습니다.
커뮤니티 인사이트와 패턴
Hacker News에서 개발자들 간의 논의를 보면, 이는 특히 암호화/ Web3 분야의 소프트웨어 엔지니어를 겨냥한 광범위한 패턴임이 드러났습니다.
흔히 쓰이는 전술
- 고압적인 채용: 공격자는 가짜 프로필을 사용해 후보자가 "깨진 PoC를 고치기 위해" 코드를 로컬에서 실행하도록 강요합니다.
- 사칭: 실제 인물의 신원을 이용해 커밋 기록을 정당화함으로써 저장소를 신뢰할 수 있게 보이게 합니다.
- AI 강화 사회공학: 일부 피해자는 카메라를 끈 채 진행된 영상 통화 등 장시간의 자연스러운 인터뷰 과정을 겪었다고 보고했으며, 이는 최종적으로 악성 코드를 설치하도록 유도합니다.
보안 권고사항
- 샌드박싱: 원본 보고서 작성자는 Hetzner의 일회용 VPS와 읽기 전용 AI 에이전트를 사용해 코드를 분석했으며, 몇 초 만에 백도어를 탐지했습니다.
- npm 사용 시 경계: 신뢰할 수 없는 저장소에서
npm install을 실행할 때는 매우 조심해야 합니다. 라이프사이클 스크립트가 임의 코드를 실행할 수 있기 때문입니다. - 신원 검증: 인터뷰 과정에서 로컬 코드 실행을 요구하는 리크루터는 특히 그들의 프로필이 기술 전문성과 일치하지 않을 경우 주의가 필요합니다.
"이제는 정상적인 인터뷰 과제와 너무 비슷해요. 누군가가 레포를 보내고 설치가 깨졌다고 말하면서 살펴보라고 합니다. 많은 개발자들이 피곤하거나 구직 중일 때 두 번 생각하지 않고 npm install을 실행하죠."
플랫폼 대응
작성자는 해당 저장소를 GitHub에, 리크루터를 LinkedIn에 신고했습니다. 그러나 GitHub과 LinkedIn은 이러한 악성 저장소와 프로필에 대해 조치를 취하는 데 종종 느리게 대응하며, 위협이 장기간 지속되는 경우가 많다고 보고되었습니다.
요약: 소프트웨어 엔지니어가 가짜 LinkedIn 채용 제안의 일환으로 제공된 GitHub 저장소에서 백도어를 발견했으며, npm install 스크립트를 이용해 피해자의 머신에서 원격 코드 실행(RCE)을 수행했습니다.
제목: LinkedIn 채용 제안 백도어: 사회공학 공격 분석