테크 저널리즘

북한 연계 해킹 캠페인, npm 패키지 넘어 Go·Chrome 확장까지 악용

북한 연계 정황이 제기된 해커들이 npm을 넘어 Go, Packagist, 크롬 확장 프로그램까지 노린 PolinRider 캠페인을 벌인 것으로 확인됐다.

작성 수정 약 6분 읽기
#Security#Open Source#Supply Chain#North Korea#PolinRider#Contagious Interview#Socket#TaskJacker

최근 논란이 된 북한 해커 추정 세력이 유포한 Rollup 위장 npm 악성코드는 동일한 세력이 전개한 여러 사이버 공격 캠페인 가운데 하나였던 것으로 분석됐다.

보안 전문매체 더해커뉴스(The Hacker News)는 7월 4일(현지시간) 보안업체 소켓(Socket)의 분석을 인용해 폴린라이더(PolinRider) 활동을 보도했다. 북한 연계 정황이 제기된 공격자가 npm을 넘어 Go 모듈, Packagist, 크롬 확장 프로그램까지 공격면을 넓혔다는 내용이다.

더힐조는 앞서 북한 연계 정황 npm 악성코드, Rollup 위장 유포를 보도했다. 이번 분석에 따르면 이 사례는 PolinRider와 같은 캠페인이 아니라, 같은 컨테이저스 인터뷰(Contagious Interview) 활동군이 동시에 벌인 별개의 캠페인이다.

패키지 108개로 확산, "캠페인은 진행 중"

소켓 보안연구원 카를로 잔키(Karlo Zanki)는 "캠페인이 계속 진행 중이며, 새 악성 패키지가 계속 나올 가능성이 높다"고 밝혔다. 공격자가 프로젝트 유지관리 계정이나 패키지 등록소의 배포 권한을 확보하면, 정상 저장소를 수정하거나 감염된 새 버전을 올릴 수 있다는 설명이다.

소켓은 폴린라이더 활동에서 악성 릴리스 아티팩트 162개를 확인했다. 대상은 고유 패키지와 브라우저 확장 프로그램 108개다.

세부적으로는 Go 모듈 80개, Packagist 패키지 10개, 크롬 확장 프로그램 1개에서 침해 흔적이 나왔다. Socket 원문 수치를 기준으로 하면, 나머지 17개는 npm 관련 패키지에 해당한다.

더해커뉴스는 이 활동이 '컨테이저스 인터뷰(Contagious Interview)' 캠페인과 관련 있다고 전했다. 컨테이저스 인터뷰는 개발자와 가상자산 업계 종사자를 노린 활동군이다.

공격자는 채용 담당자나 협업 제안자로 위장한다. 이후 면접 과제나 개발 테스트를 명목으로 악성 코드를 실행하게 만든다.

MITRE ATT&CK는 이 활동군을 2023년부터 활동한 북한 연계 위협 그룹으로 설명한다. 대상 운영체제는 윈도우, 리눅스, 맥OS다. 주요 표적은 소프트웨어 개발자와 가상자산 관련 종사자다.

정상 저장소에 숨은 악성 코드

폴린라이더의 특징은 정상 저장소를 이용한다는 점이다. 공격자는 합법적으로 보이는 GitHub 저장소에 난독화된 자바스크립트 로더를 심는다. 일부 코드는 긴 공백 뒤에 배치돼 화면상으로 쉽게 드러나지 않는다.

오픈소스멀웨어(OpenSourceMalware)팀은 2026년 3월 폴린라이더 활동을 처음 공개했다. 당시 지목된 악성코드는 BeaverTail 변종이었다.

이 팀은 "공격자가 탈취한 깃허브 자격증명을 쓰지 않는다"고 밝혔다. 대신 악성 VS Code 확장 프로그램이나 npm 패키지로 피해자를 감염시켰다는 설명이다. 만료 도메인 탈취나 계정 복구 절차 악용이 계정 장악 경로일 수 있다고 봤다. 다만 구체적 침입 방식은 모든 사례에서 확인되지 않았다.

더해커뉴스는 4월 11일 기준 1047명 소유자의 공개 GitHub 저장소 1951개가 영향을 받은 것으로 집계됐다고 전했다. 이 활동은 이후 'TaskJacker'로 불리는 별도 클러스터와 병합됐다. TaskJacker는 기존 GitHub 저장소에 악성 VS Code 작업 파일을 심는 수법이다.

일부 사례에서는 Git 기록도 조작됐다. 공격자는 윈도우 배치 스크립트로 최신 커밋을 바꿨다. 원저작자가 수정한 것처럼 보이도록 위장했다. 리눅스와 맥OS에서도 유사한 도구가 쓰였을 것으로 추정된다.

공격자는 강제 푸시와 과거 날짜 커밋도 이용했다. 악성 변경이 오래전부터 있었던 것처럼 꾸미는 수법이다. GitHub 첫 화면과 최신 커밋만 보면 이상 징후를 놓칠 수 있는 구조다.

개발 도구가 실행 경로로 악용

악성 코드는 실행되면 감염 PC에서 특정 설정 파일을 찾는다. postcss.config.mjs, tailwind.config.js, eslint.config.mjs, next.config.mjs, babel.config.js, app.js가 대상이다. 파일을 찾으면 그 안에 악성 자바스크립트 코드를 덧붙인다.

최근 변종은 가짜 .woff2 글꼴 파일을 이용한다. VS Code 작업 설정에 runOn: "folderOpen" 옵션을 넣으면 폴더를 여는 순간 코드가 실행된다. VS Code나 Cursor 같은 개발 환경이 공격 경로가 되는 셈이다.

복호화된 로더는 블록체인 기반 공개 인프라에 접속한다. TRON, Aptos, BNB 스마트체인 관련 서비스가 쓰였다. 이후 암호화된 2단계 페이로드를 내려받아 실행한다.

소켓은 관찰된 후속 악성코드로 DEV#POPPER와 옴니스틸러(OmniStealer)를 지목했다. 두 악성코드는 명령 실행, socket.io-client 기반 명령제어(C2) 통신, 인증정보 탈취, 브라우저 데이터 탈취, 지갑 정보 탈취 기능을 갖췄다.

삭제보다 점검이 먼저

소켓은 영향을 받은 패키지나 확장 프로그램을 설치한 환경을 침해된 것으로 보고 점검하라고 권고했다. 단순 삭제만으로는 충분하지 않다는 취지다.

권고 절차는 이렇다. 먼저 정리 전에 포렌식 증거를 보존한다. 영향받은 패키지 버전을 설치한 모든 장비를 확인한다. 해당 버전을 제거하고 정상 잠금 파일(lockfile)을 기준으로 다시 빌드한다.

비밀값 교체 대상은 구체적이다. npm, GitHub, PyPI, RubyGems, 클라우드, Vault, 쿠버네티스, Docker, SSH, Slack, Twilio, CI/CD가 해당한다. 교체는 감염되지 않은 깨끗한 장비에서 해야 한다.

저장소 점검도 필요하다. .vscode/tasks.json, config.js, vite.config.js, eslint.config.js와 폰트·정적 자산 폴더에 낯선 커밋이 있는지 봐야 한다. 보이는 커밋 기록만 보지 말고 GitHub 활동 로그와 패키지 등록소 게시 이력도 함께 확인해야 한다.

이번 사례는 오픈소스 공급망 공격이 특정 언어 생태계에 머물지 않는다는 점을 보여준다. 공격자는 저장소, 패키지 등록소, 개발 도구를 함께 이용했다. 개발자가 신뢰하는 경로가 곧 공격 경로가 됐다.

자주 묻는 질문

PolinRider는 무엇인가

PolinRider는 npm, Go 모듈, Packagist 패키지와 크롬 확장 프로그램을 악용한 공급망 공격 활동이다. 컨테이저스 인터뷰로 알려진 북한 연계 활동군과 관련된 것으로 분석됐다.

108개는 무엇을 뜻하나

소켓이 구분한 고유 패키지와 브라우저 확장 프로그램 수다. Go 모듈 80개, Packagist 패키지 10개, 크롬 확장 프로그램 1개가 포함됐다. 나머지 17개는 소켓 원문 수치를 기준으로 계산한 npm 관련 패키지다.

감염된 패키지를 삭제하면 충분한가

충분하지 않을 수 있다. 실행된 악성코드가 인증정보와 브라우저·지갑 데이터를 노렸기 때문이다. 영향받은 장비와 저장소를 점검하고 깨끗한 환경에서 인증정보를 교체하는 절차가 필요하다.

이 글의 무단 복제, 재배포, 자동 수집을 허용하지 않습니다. 인용이 필요한 경우 출처와 원문 링크를 함께 남겨주세요.

관련 글