테크 저널리즘
북한 연계 정황 npm 악성코드, Rollup 위장 유포
북한 연계 정황이 제기된 공격자가 자바스크립트 빌드 도구 Rollup의 폴리필(polyfill)로 위장한 악성 npm 패키지 6종을 유포한 것으로 분석됐다. JFrog 분석 결과와 대응 방법을 정리했다.
북한 연계 정황이 제기된 공격자가 Rollup 빌드 도구로 위장한 악성 npm 패키지를 유포한 것으로 분석됐다. 목표는 개발자 PC와 빌드 서버에 남은 인증정보였다.
보안 매체 더해커뉴스는 7월 3일(현지시간) 이 사실을 보도했다. 근거는 보안업체 제이프로그 시큐리티 리서치(JFrog)의 기술 분석이다.
Rollup 폴리필로 위장
Rollup은 자바스크립트 번들러(bundler)다. 개발자는 빌드 과정에서 관련 플러그인을 자주 불러온다.
악성 진입 패키지는 rollup-packages-polyfill-core와 rollup-runtime-polyfill-core다. 두 패키지는 정상 프로젝트 rollup-plugin-polyfill-node와 유사하게 꾸며졌다. 설명문, 저장소 주소, 코드 구조까지 닮았다.
정상 패키지는 주간 다운로드 29만5000회에 달한다. 지난달 기준 다운로드는 120만회를 넘었다. 그만큼 개발자 신뢰도가 높은 프로젝트다.
JFrog 연구원 야이르 베나무(Yair Benamou)는 패키지 이름과 배치 방식이 빠른 의존성 검토를 통과하게 만들 수 있다고 지적했다. 확인된 악성 패키지는 모두 6개다.
rollup-packages-polyfill-corerollup-runtime-polyfill-coreswift-parse-streamquirky-tokenreact-icon-svgsrollup-plugin-polyfill-connect
더해커뉴스는 이 중 보조 패키지 4개가 npm에서 제거됐다고 전했다. 진입 패키지 2개의 삭제 여부는 별도로 확인되지 않았다. JFrog 분석 시점 기준으로는 6개 중 4개가 살아있었고 2개만 보안 조치 버전으로 교체된 상태였다.
2단계 구조로 감염 확장
rollup-packages-polyfill-core는 swift-parse-stream을 설치한다. rollup-runtime-polyfill-core는 quirky-token을 불러온다. react-icon-svgs는 rollup-plugin-polyfill-connect를 2단계로 이용했다.
2단계 패키지는 SVG 유틸리티로 위장했다. 실제로는 JSONKeeper 서버 주소에 접속해 model 필드값을 실행했다. 오타 사칭(typosquatting)보다 식별이 까다로운 구조다.
개발자 PC와 CI가 표적
Rollup 플러그인은 로컬 설정 파일과 CI(지속적 통합) 파이프라인에서 자주 실행된다. 이 지점에는 소스코드, npm 토큰, 깃 인증정보, 클라우드 키, SSH 키가 몰려 있다.
악성 코드는 실행 전 환경부터 검사했다. 클라우드 개발 환경, 샌드박스(sandbox), 서버리스(serverless), 분석 인프라를 피하려는 목적이다. 검사를 통과하면 외부 서버(216.126.236.244)에서 암호화된 페이로드를 내려받았다. JFrog는 복호화 후 페이로드 용량이 약 114킬로바이트(KB)였다고 밝혔다. 해당 IP는 침해 지표(IOC)로 공개됐다.
원격 제어와 4종 수집 기능
복호화된 코드는 임시 폴더에 pack, scdata, ldata 파일을 만들었다. 이후 기능은 4갈래로 나뉘었다.
첫째는 원격 제어다. 명령 실행, 터미널 세션, 스크린샷, 프로세스 종료가 가능했다. 스크린샷과 마우스·키보드 조작은 윈도우(Windows) 환경에서만 작동하도록 설계됐다.
둘째는 브라우저와 암호화폐 지갑(cryptocurrency wallet) 데이터 수집이다. 메타마스크 등 주요 지갑 확장 프로그램 저장소를 노렸다.
셋째는 파일 시스템 수집이다. VS Code, Windsurf, Cursor의 편집 기록을 뒤졌다. AWS, Azure, Google Gemini, Anthropic Claude, Foundry, SSH, Zsh 설정 파일도 대상이었다.
넷째는 클립보드 감시다. 복사한 값이 바뀔 때마다 외부 서버로 전송했다.
라자루스 캠페인과 유사한 흐름
더해커뉴스는 이번 사례가 북한 라자루스 연계 npm 캠페인과 닮았다고 전했다. 지난 4월 보안업체 Panther는 '컨테이저스 인터뷰(Contagious Interview)' 캠페인과 연계된 악성 npm 패키지 108개, 261개 버전 유포 사례를 분석했다. 당시에도 BeaverTail, OtterCookie 악성코드가 확인됐다.
다만 배후를 북한으로 특정한 근거는 기술적 유사성이다. 캠페인 구조와 페이로드 방식이 과거 사례와 겹친다는 분석일 뿐, 배후가 확정된 것은 아니다.
확인과 조치
해당 패키지를 설치한 개발자는 패키지 삭제만으로 안심하기 어렵다. 프로젝트와 PC를 함께 점검할 필요가 있다.
의심 패키지 6종은 프로젝트와 잠금 파일(lockfile)에서 제거 대상이다. 의존성 트리에 swift-parse-stream, quirky-token, rollup-plugin-polyfill-connect가 간접적으로 남아있는지도 확인 대상이다.
임시 폴더의 pack, scdata, ldata 흔적도 점검 대상이다. JFrog는 216.126.236.244와 관련 JSONKeeper 주소로의 통신 차단을 권고했다.
자격 증명 교체도 필요하다. npm, GitHub, 클라우드, SSH, 브라우저 저장정보, 지갑 관련 비밀값이 대상이다. 감염 흔적과 실행 중인 프로세스를 먼저 제거한 뒤 교체하는 순서가 권고된다.
이번 사례는 오픈소스 공급망의 구조적 위험을 다시 드러냈다. 이름과 설명만으로는 정상 패키지와 악성 패키지를 가려내기 어렵다는 사실이다.
같은 활동군이 여러 개발 생태계로 공격면을 넓힌 정황은 북한 연계 해킹 캠페인, npm 패키지 넘어 Go·Chrome 확장까지 악용에서 확인할 수 있다.
자주 묻는 질문
북한 소행으로 확정된 공격인가
아니다. 캠페인 구조와 페이로드가 과거 북한 연계 활동과 유사하다는 기술 분석이 제시됐다. 배후가 최종 확정된 것은 아니다.
확인해야 할 악성 npm 패키지는 무엇인가
기사에 나온 6종은 rollup-packages-polyfill-core, rollup-runtime-polyfill-core, swift-parse-stream, quirky-token, react-icon-svgs, rollup-plugin-polyfill-connect다. 직접 설치뿐 아니라 잠금 파일과 간접 의존성도 확인할 필요가 있다.
패키지만 삭제하면 조치가 끝나는가
패키지 삭제만으로 충분하지 않을 수 있다. 감염 흔적과 외부 통신을 점검한 뒤 npm, GitHub, 클라우드, SSH 등 노출 가능성이 있는 인증정보를 깨끗한 환경에서 교체하는 순서가 권고된다.
이 글의 무단 복제, 재배포, 자동 수집을 허용하지 않습니다. 인용이 필요한 경우 출처와 원문 링크를 함께 남겨주세요.
관련 글
테크 저널리즘
북한 연계 해킹 캠페인, npm 패키지 넘어 Go·Chrome 확장까지 악용
북한 연계 정황이 제기된 해커들이 npm을 넘어 Go, Packagist, 크롬 확장 프로그램까지 노린 PolinRider 캠페인을 벌인 것으로 확인됐다.
Platform
Linux 네트워크 보안 기초와 클라우드 운영 연결점
Linux 프로세스, 포트, DNS, 라우팅, SSH, UFW, 로그 확인을 클라우드 장애 분석 흐름으로 정리합니다.
Platform
웹 애플리케이션 보안과 클라우드 운영 방어선
웹 취약점 실습에서 확인한 공격 흐름을 Docker, 인증, 네트워크, 클라우드 책임 공유 모델의 운영 방어선으로 연결해 정리합니다.